Imported buildbot 0.7.12 source
authorChris AtLee <catlee@mozilla.com>
Mon, 25 Jan 2010 07:47:48 -0500
changeset 57 3ba62037c0824a949d390b10496adc852059946c
parent 22 6515c595f2aa98d10f945b2d024ecaa9f9965488
child 58 a7f9f6fae58c276de6b5dc0ee1c64f336465eca7
child 68 82459341e442823e6dd8ba2bd050a221706fef77
push id19
push usercatlee@mozilla.com
push dateFri, 12 Feb 2010 20:14:00 +0000
Imported buildbot 0.7.12 source
CREDITS
ChangeLog-0.7.10
ChangeLog-0.7.11
ChangeLog-0.7.12
MANIFEST.in
NEWS
PKG-INFO
README
buildbot.egg-info/PKG-INFO
buildbot.egg-info/SOURCES.txt
buildbot/__init__.py
buildbot/buildset.py
buildbot/buildslave.py
buildbot/changes/bonsaipoller.py
buildbot/changes/changes.py
buildbot/changes/mail.py
buildbot/changes/p4poller.py
buildbot/changes/pb.py
buildbot/changes/svnpoller.py
buildbot/clients/sendchange.py
buildbot/config.py
buildbot/ec2buildslave.py
buildbot/interfaces.py
buildbot/locks.py
buildbot/master.py
buildbot/pbutil.py
buildbot/process/base.py
buildbot/process/builder.py
buildbot/process/buildstep.py
buildbot/process/factory.py
buildbot/process/mtrlogobserver.py
buildbot/process/properties.py
buildbot/process/step_twisted2.py
buildbot/process/subunitlogobserver.py
buildbot/scheduler.py
buildbot/scripts/checkconfig.py
buildbot/scripts/logwatcher.py
buildbot/scripts/runner.py
buildbot/scripts/sample.cfg
buildbot/scripts/tryclient.py
buildbot/slave/bot.py
buildbot/slave/commands.py
buildbot/slave/commands.py.orig
buildbot/sourcestamp.py
buildbot/status/base.py
buildbot/status/builder.py
buildbot/status/client.py
buildbot/status/mail.py
buildbot/status/web/auth.py
buildbot/status/web/base.py
buildbot/status/web/baseweb.py
buildbot/status/web/bg_gradient.jpg
buildbot/status/web/build.py
buildbot/status/web/builder.py
buildbot/status/web/buildstatus.py
buildbot/status/web/console.py
buildbot/status/web/console_html.py
buildbot/status/web/console_js.py
buildbot/status/web/default.css
buildbot/status/web/extended.css
buildbot/status/web/feeds.py
buildbot/status/web/grid.py
buildbot/status/web/index.html
buildbot/status/web/logs.py
buildbot/status/web/slaves.py
buildbot/status/web/step.py
buildbot/status/web/tests.py
buildbot/status/web/waterfall.py
buildbot/status/web/xmlrpc.py
buildbot/status/words.py
buildbot/steps/master.py
buildbot/steps/shell.py
buildbot/steps/source.py
buildbot/steps/transfer.py
buildbot/steps/trigger.py
buildbot/stringTemplate.py
buildbot/test/.test_run.py-FQj8J6
buildbot/test/mail/launchpad.1
buildbot/test/mail/launchpad.2
buildbot/test/mail/launchpad.3
buildbot/test/mail/launchpad.4
buildbot/test/mail/launchpad.5
buildbot/test/mail/launchpad.6
buildbot/test/runutils.py
buildbot/test/subdir/__init__.py
buildbot/test/test_buildstep.py
buildbot/test/test_changemaster.py
buildbot/test/test_changes.py
buildbot/test/test_config.py
buildbot/test/test_console.py
buildbot/test/test_control.py
buildbot/test/test_dependencies.py
buildbot/test/test_ec2buildslave.py
buildbot/test/test_limitlogs.py
buildbot/test/test_locks.py
buildbot/test/test_mailparse.py
buildbot/test/test_mergerequests.py
buildbot/test/test_ordering.py
buildbot/test/test_package_rpm.py
buildbot/test/test_properties.py
buildbot/test/test_reconfig.py
buildbot/test/test_run.py
buildbot/test/test_runner.py
buildbot/test/test_scheduler.py
buildbot/test/test_slavecommand.py
buildbot/test/test_slaves.py
buildbot/test/test_status.py
buildbot/test/test_steps.py
buildbot/test/test_transfer.py
buildbot/test/test_util.py
buildbot/test/test_vc.py
buildbot/test/test_web.py
buildbot/util.py
contrib/bitbucket_buildbot.py
contrib/bzr_buildbot.py
contrib/darcs_buildbot.py
contrib/git_buildbot.py
contrib/github_buildbot.py
contrib/svn_buildbot.py
contrib/trac/README.md
contrib/trac/TODO.md
contrib/trac/bbwatcher/__init__.py
contrib/trac/bbwatcher/api.py
contrib/trac/bbwatcher/model.py
contrib/trac/bbwatcher/templates/bbw_allbuilders.html
contrib/trac/bbwatcher/templates/bbw_builder.html
contrib/trac/bbwatcher/templates/bbw_welcome.html
contrib/trac/bbwatcher/web_ui.py
contrib/trac/setup.py
contrib/webhook_status.py
dist/buildbot-0.7.10p1-py2.5.egg
docs/Makefile
docs/buildbot.html
docs/buildbot.info
docs/buildbot.info-1
docs/buildbot.info-2
docs/buildbot.texinfo
docs/epyrun
docs/gen-reference
docs/images/Makefile
docs/images/icon.blend
setup.py
--- a/CREDITS
+++ b/CREDITS
@@ -13,16 +13,17 @@ Baptiste Lepilleur
 Bear
 Ben Hearsum
 Benoit Sigoure
 Brad Hards
 Brandon Philips
 Brett Neely
 Charles Lepple
 Chad Metcalf
+Chris AtLee
 Christian Unger
 Clement Stenac
 Dan Locks
 Dave Liebreich
 Dave Peticolas
 Dobes Vandermeer
 Dustin Mitchell
 Dustin Sallings
@@ -51,26 +52,28 @@ Mark Dillavou
 Mark Hammond
 Mark Pauley
 Mark Rowe
 Mateusz Loskot
 Nathaniel Smith
 Neal Norwitz
 Nick Mathewson
 Nick Trout
+Nicolas Sylvain
 Niklaus Giger
 Neil Hemingway
 Olivier Bonnet
 Olly Betts
 Paul Warren
 Paul Winkler
 Phil Thompson
 Philipp Frauenfelder
 Rene Rivera
 Riccardo Magliocchetti
+Robert Collins
 Rob Helmer
 Roch Gadsdon
 Roy Rapoport
 Scott Lamb
 Stephen Davis
 Steve 'Ashcrow' Milner
 Steven Walter
 Ted Mielczarek
new file mode 100644
--- /dev/null
+++ b/ChangeLog-0.7.10
@@ -0,0 +1,1814 @@
+commit 3f82bdf779ab16857667f450f11f0dc84049c015
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Feb 25 13:35:37 2009 -0500
+
+    set BuildStatus.requests to an empty value in constructor
+
+commit 48a0947ad8e829963f9564ab27848a66230f381a
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Feb 25 13:22:05 2009 -0500
+
+    (refs #176) use buildmaster_service.master, not ..parent, so that cached web connections can still get reasonable info
+
+commit cc9abfe46e718a3f91fec51c7091c8698f6f41bf
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Feb 25 13:10:39 2009 -0500
+
+    (fixes #435) stub out BuildStepStatus.setColor
+
+commit 5fc70886bef753aae96dbfa065e481017ee9b82a
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Feb 25 12:55:30 2009 -0500
+
+    (refs #390) properly handle a return value of SKIPPED from step.start()
+
+commit 865abf5d98dda8ee71d64b6b700a5f5f0601f62d
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Feb 25 12:23:54 2009 -0500
+
+    (refs #302) start the missing-slave timer when buildbot starts up, so that we hear about slaves missing at startup, too
+
+commit 9fd150f60ac717757273caaaddaebc9b8de46d31
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Feb 25 13:02:11 2009 -0500
+
+    don't pickle BuildStatus.requests
+
+commit 73c9a5df3b61e9d2743a9ffcdd8f4a6075cda7df
+Merge: 1476fa7... 0f6a0f0...
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Feb 25 11:51:27 2009 -0500
+
+    Merge commit 'catlee/request_status'
+
+commit 1476fa7bba8fb80d24be94d6325d1394b0af2ed9
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Feb 25 11:35:38 2009 -0500
+
+    remove refs to sf.net
+
+commit d7f085e7e7a31824e268c0464a7b3da79fe3ecbf
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Feb 25 11:21:30 2009 -0500
+
+    (refs #41) add ability to send username and password to the svn command
+
+commit 2fcf745a96bfef89ac886b50e4ea0c8d6fdc692d
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Tue Feb 24 19:49:39 2009 -0500
+
+    (refs #41) add ability to obfuscate a ShellCommand argument on the slave side
+
+commit 3738c26455bc8a25bee78672d3e51eb7313c83a1
+Author: Neil Hemingway <neil.hemingway@greyhavens.org.uk>
+Date:   Tue Feb 24 22:09:34 2009 +0000
+
+    Resolve #379 - Use makedirs rather than mkdir to create intermediate directories
+
+commit 0f6a0f019f2259a00cfa7c8f87a7734ce3da504a
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Tue Feb 24 15:46:16 2009 -0500
+
+    Allow access to build requests from build status.
+    
+    Also, allow status plugins to get notified when new build requsts
+    arrive.
+
+commit 9c4712b11e05fef06796af5eacffd7648b943143
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Tue Feb 24 15:11:08 2009 -0500
+
+    Fix status where change object's comments field is None
+    
+    Signed-off-by: Dustin J. Mitchell <dustin@zmanda.com>
+
+commit c42b681aad38bed2ae7ae952c5a465a9f70c62bf
+Merge: 4ae3012... 436c2a6...
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Mon Feb 23 16:57:21 2009 -0500
+
+    Merge branch 'bug388' of git://github.com/nhemingway/buildbot
+
+commit 436c2a6cca8ef4943798cdaf6b0a4125c231fa5f
+Author: Neil Hemingway <neil.hemingway@googlemail.com>
+Date:   Mon Feb 23 21:54:06 2009 +0000
+
+    Resolve  #388
+    
+    builder events now have an exception firewall between them and the status plugins they call
+
+commit 0f8c4061603bce5904f3192cfddb7134636a071f
+Author: Neil Hemingway <neil.hemingway@googlemail.com>
+Date:   Mon Feb 23 21:28:08 2009 +0000
+
+    Don't just subscribe when told via IRC - do so when configured via config file
+
+commit 4ae30126d58ea6f0690a9bc482f65078c29adf32
+Author: Scott Lawrence <scott.lawrence@nortel.com>
+Date:   Mon Feb 23 15:11:04 2009 -0500
+
+    (refs #376) prettify the ETA in the waterfall
+
+commit 2ee1e9f05b0f89c599eb3417b656f2445426e9a7
+Author: John Saxton <spiff@sonic.net>
+Date:   Mon Feb 23 14:55:28 2009 -0500
+
+    (fixes #170) add addLogs=[list] to MailNotifier
+
+commit b79fbb8dad3dbc0f061dd08cb79ae641af86ca24
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Mon Feb 23 14:22:42 2009 -0500
+
+    (refs #349, #85) reset a builder's status after a ping is done
+
+commit 419470c07038cb55ed06faf07bc9d1f3eb7ac69c
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Mon Feb 23 11:53:00 2009 -0500
+
+    (fixes #160) create parent dirs before invoking 'cp'
+
+commit b9610e17915a69c7e7462a849035c2449702c0aa
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Mon Feb 23 10:00:58 2009 -0500
+
+    fix typo
+
+commit ca9fb9a865475c39039bfd01cb048f7051a5dd68
+Author: Robin Eckert <eckert@ive.uni-hannover.de>
+Date:   Sun Feb 22 20:02:12 2009 -0500
+
+    (refs #312) only set LC_MESSAGES for source steps
+
+commit 99a18de59ae61cf2198dac52a37d8e9606c269bf
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Feb 22 19:08:31 2009 -0500
+
+    fix broken argument parsing
+
+commit 35f44b1c2a14d1f20193f0357087501e2ee4def6
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Feb 22 18:59:53 2009 -0500
+
+    fix non-2.4 syntax
+
+commit 071564761f46ea7089bbd6301589eeb466c3ec31
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Feb 22 13:23:53 2009 -0500
+
+    (refs #158) make usePTY a step parameter; change default to no
+    
+    The default for --usepty becomes 0 (no), and by default, ShellCommands
+    obey that setting.  Shell commands run from Source subclasses set this
+    to False, as it's seldom necessary to use a PTY for these commands.
+    
+    Add a new command_version, 2.7, indicating slave support for this flag
+
+commit bf24d16f1f163d386d0470e41fc2d0f954b9daf8
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Feb 22 12:08:16 2009 -0500
+
+    (tweak) better debugging output
+
+commit 5bd3d78c613ac9fff056e7e2c12783fc1fe9bd82
+Merge: 6dab63a... 71c3097...
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Feb 22 08:53:09 2009 -0500
+
+    Merge branch 'bug420' of git://github.com/nhemingway/buildbot
+
+commit 71c309759447f7619779080c5848542e7c76e9af
+Author: Neil Hemingway <neil.hemingway@googlemail.com>
+Date:   Sat Feb 21 21:11:36 2009 +0000
+
+    Resolve #420 - urlencode builder names
+
+commit 6dab63af9fc97d78f8968c92b9bdbc47a40aaa5c
+Merge: 56cb1e4... f0ea815...
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Feb 20 17:05:27 2009 -0500
+
+    Merge branch 'bug314' of git://github.com/nhemingway/buildbot
+
+commit f0ea815bf83b1c3d6daf0568f70ad7f1c9ba2f55
+Author: Neil Hemingway <neil.hemingway@googlemail.com>
+Date:   Fri Feb 20 21:44:16 2009 +0000
+
+    Resolve #314 by not setting expectations unless the build was successful
+
+commit 56cb1e4dc77ab17c6854cbcd0f14ded3470d5792
+Author: Gary Poster <gary@imposter.local>
+Date:   Fri Feb 20 13:37:15 2009 -0500
+
+    add Canonical copyright messages, per discussion with Dustin.
+
+commit a362a5b7788f7339e0aa1e8f7fdad64f7819a4dc
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu Feb 19 00:03:27 2009 -0500
+
+    (fixes #279) document and clean up step argument parsing
+
+commit 9879e94d540ea216debcfeac1c5dab0b72c077b1
+Merge: cdefef4... 2335e76...
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Feb 18 22:51:11 2009 -0500
+
+    Merge branch 'graceful' of http://atlee.ca/software/buildbot
+
+commit 2335e76c1c2b34b84de015af6b667d9067c3a64b
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Wed Feb 18 15:24:10 2009 -0500
+
+    Making error handling clearer on the error callback from remote
+    shutdown.
+    
+    Adding test cases.
+    
+    Moving buildFinished from AbstractSlaveBuilder to SlaveBuilder.
+    
+    remote shutdown callback needs to call reactor.callLater(0,
+    maybeStartAllBuilds) in order to get unittests to pass.
+
+commit cdefef4eebd45cf6bc17b58f605cb24987ab619d
+Merge: 620c248... d1190bd...
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Feb 18 16:26:26 2009 -0500
+
+    Merge branch 'bug251' of git://github.com/nhemingway/buildbot
+
+commit 620c2487bddc693a52368d4c9dcb5fd37e995a6c
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Feb 18 16:23:29 2009 -0500
+
+    (refs #259) add docs for PyLint step
+
+commit da4954b47a89a95ace7a6896c259ad4f812e568c
+Author: strank <list-ener@strank.info>
+Date:   Wed Feb 18 16:21:04 2009 -0500
+
+    (refs #259) PyLink command, similar to PyFlakes
+
+commit d1190bd358845fe38204e89d8399f95a83309334
+Author: Neil Hemingway <neil.hemingway@googlemail.com>
+Date:   Wed Feb 18 21:14:36 2009 +0000
+
+    Resolve #251 by removing colour setting from the internals of buildbot
+    
+    Colour is now controlled with CSS for all areas of buildbot
+    presentation with the sole exception of the statusgui
+
+commit 38810ee44a3169bfe801ae8036226b37bd22c471
+Merge: 2f4c3f6... aa3a5bc...
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Tue Feb 17 08:51:58 2009 -0500
+
+    Merge branch 'master' into graceful
+
+commit 2f4c3f6408cc2b2822ac24623039ddd991687aee
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Mon Feb 16 09:18:30 2009 -0500
+
+    Adding some documentation for graceful shutdown.
+    
+    Also having the slave object add itself as a watcher of the graceful
+    status when the slave is attached, and removing itself as a watcher when
+    the slave is detached.
+
+commit 25023479d910bdc9184d68a6cb4d0cb185608ebe
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Mon Feb 16 10:32:25 2009 -0500
+
+    Revert "(refs #218) point buildbot.bat to the right python"
+    This reverts commit aa3a5bc6ee13859022b4ad13283b34f7ccf78781.
+
+commit aa3a5bc6ee13859022b4ad13283b34f7ccf78781
+Author: Marcus Lindblom <macke@yar.nu>
+Date:   Mon Feb 16 10:04:33 2009 -0500
+
+    (refs #218) point buildbot.bat to the right python
+
+commit 18876cf80207769ff180dc0a0964921a117e1536
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Mon Feb 16 08:54:21 2009 -0500
+
+    Restored call to maybeStartAllBuilds into a reactor.callLater call.
+
+commit c4096f3e06d01167c860487068067c26bf1fbb07
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Sun Feb 15 19:15:56 2009 -0500
+
+    Use getGraceful() instead of slave.graceful_shutdown where appropriate
+
+commit 350632aa2276350494b0b65107acbdfc4f6c63b2
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Fri Feb 13 23:44:32 2009 -0500
+
+    Adding graceful shutdown support for slaves.
+
+commit fd47ba60dcdfdab2cdb70b62c30d8f130fe13d5b
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Feb 15 23:44:24 2009 -0500
+
+    (refs #361) add docs
+
+commit b97fd526c4b19d411fbcea6fc0b7520d339afc40
+Author: Chad S Metcalf <cmetcalf@archrock.com>
+Date:   Sun Feb 15 23:37:41 2009 -0500
+
+    (refs #361) add a logEnviron parameter to ShellCommand
+
+commit cc8a6401f4eb5aa0b0ec632210c5ffcc25d6f69f
+Author: Jeremy Gill <jeremy.gill@gmail.com>
+Date:   Sun Feb 15 23:34:04 2009 -0500
+
+    (refs #327) fetch git tags, too
+
+commit 03b635a8d25efd63921d607fde30772b75f58f4d
+Author: Christian Lins <christian.lins@sun.com>
+Date:   Sun Feb 15 23:18:05 2009 -0500
+
+    (fixes #345) add CSS class for SKIPPED
+
+commit cd6a16c614b8de9af7c6a2b978f48e64fa8cde20
+Author: Charles Lepple <clepple@gmail.com>
+Date:   Sun Feb 15 22:00:07 2009 -0500
+
+    (refs #362) docs changes (fileIsImportant)
+
+commit 5d057803fd13cc4e6bf43ae22347a355e2a9e611
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Feb 15 20:54:10 2009 -0500
+
+    (fixes #353) revision and got_revision are strings; if no revision is gotten, don't set the property
+
+commit 67b00c8459c1a6846f51a0dcb2ec007b39b3eb4a
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Feb 15 20:10:36 2009 -0500
+
+    fix docs typo
+
+commit 77b386426c2ee498e43185553b756224db74fea8
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Feb 15 20:05:32 2009 -0500
+
+    Add MasterShellCommand
+
+commit 4573cc224e7f8fc9df144e5c5ca33f86cc935cdf
+Author: René Müller <rene.mueller@tracetronic.de>
+Date:   Sun Feb 15 18:14:45 2009 -0500
+
+    (refs #393) add DirectoryUpload
+
+commit 242e5836cc9fa35142d98e1a3904f494a322a10b
+Author: Shimizukawa <shimizukawa+buildbot@gmail.com>
+Date:   Sun Feb 15 18:01:57 2009 -0500
+
+    (refs #307) allow missing svn author
+
+commit 3bbab2da2597ae2537be3a6d17ef9be0f6ff5af3
+Author: Ben Hearsum <bhearsum@bitters-2.local>
+Date:   Fri Feb 13 10:27:28 2009 -0500
+
+    Update documentation for real this time
+
+commit f461caf049311f49354e0b87dc4e6f1639cb7e87
+Author: Ben Hearsum <bhearsum@bitters-2.local>
+Date:   Fri Feb 13 10:17:01 2009 -0500
+
+    Updated documentation for new haltOnFailure behaviour; update existing BuildSteps that haltOnFailure to explictly flunkOnFailure.
+
+commit b04b9f22eed91e64b018f49ecfe722ba6203051c
+Author: Ben Hearsum <bhearsum@bitters-2.local>
+Date:   Thu Feb 12 17:48:25 2009 -0500
+
+    haltOnFailure shouldn't imply flunkOnFailure (ticket #425)
+
+commit 4517900fe039fe64cb736a41e7bca5e5a94c6384
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu Feb 12 17:08:41 2009 -0500
+
+    only attach the text of a patch, not the level
+
+commit 999ba134b2a4847615ce0c45cffe93bca8e5afc0
+Author: Gerard Escalante <gescalante@dev-int.wordstream.com>
+Date:   Thu Feb 12 02:51:21 2009 -0800
+
+    Changed Git VC operations class to clobber less frequently.
+    
+    Git now clobbers the repo only if the repourl changes.
+    As a part of doVCUpdate, it runs "git clean" if the branch has
+    changed (but not the repourl), which, combined with "git reset",
+    does effectively does the same thing as clobbering the repo.
+
+commit addafaaa66c5fd040c6daad636cd50453a7ab700
+Merge: ee1f1c8... c1ab365...
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Feb 11 12:53:08 2009 -0500
+
+    Merge branch 'master' of git://github.com/dustin/buildbot
+
+commit ee1f1c8dee8a446809fa6b9123f643350bfa9ab8
+Author: Albert Hofkamp <a.t.hofkamp@tue.nl>
+Date:   Tue Feb 10 23:37:19 2009 -0500
+
+    (refs #306) fix trigger documentation
+
+commit 36438a46b808b9e83f09e54970c9bfa7e1186ab3
+Author: Marcus Lindblom <macke@yar.nu>
+Date:   Tue Feb 10 23:25:54 2009 -0500
+
+    (refs #272) use correct path to classic.css for windows setup
+
+commit 894bb2a9f50949f8d97f496b27bb99cbfba3f261
+Author: Julien Boeuf <julien.boeuf@gmail.com>
+Date:   Tue Feb 10 23:17:00 2009 -0500
+
+    (refs #256) allow COMSPEC to have spaces
+
+commit 18f6700d42153501d22936045931757d0a49bb6a
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Tue Feb 10 22:58:30 2009 -0500
+
+    (refs #207) offline is now gray
+
+commit 1213ad89fd88ac9219aba9a860d1999466143e67
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Tue Feb 10 22:51:47 2009 -0500
+
+    (fixes #202) don't save changes from a test ChangeMaster
+
+commit 77d2abaaadce968db730871769ee7e17e2407ca0
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Tue Feb 10 21:34:40 2009 -0500
+
+    (fixes #165) remove references to --recursive from python_twisted docstrings
+
+commit 44046f8d851d54c8dcd0325774e841f368362243
+Merge: 7e3cc24... 1b42980...
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Tue Feb 10 21:27:32 2009 -0500
+
+    Merge branch 'master' of git://github.com/gward/buildbot
+
+commit 7e3cc24c66e48b1cdd124459ca33d2fe76b754f7
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Tue Feb 10 21:21:01 2009 -0500
+
+    update rbosetti's patch to cover patches added since then
+
+commit c1ab365b6ed986396831849e7bf37c53ee35526f
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Fri Feb 6 20:32:45 2009 -0800
+
+    Added ping method to stats builders.
+    
+    I had a lot of network instabilities that would cause my status client
+    to believe it was connected and functioning properly when it wasn't.
+    I started sending pings across periodically and flagging the
+    connection on the (error) result.  That wasn't a big deal, but it ends
+    up dumping a bunch of stuff into logs.
+    
+    This makes a simple ping possible without error.
+
+commit e1479500f378f1793098f244ecde75c604257ca3
+Merge: 7fb7fa4... 0a488bf...
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Tue Feb 10 19:11:14 2009 -0500
+
+    Merge branch 'master' of git://github.com/rbosetti/buildbot
+
+commit 7fb7fa4210d1c9eff86c4f63835dc95ea6c5e937
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Tue Feb 10 19:05:27 2009 -0500
+
+    (refs #421) 'nightly_factory' instead of 'checkin_factory'
+
+commit 37bae4efa8fd084201f0cb0cf2a7395a89df12aa
+Merge: d5b417f... ee5c7b6...
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Tue Feb 10 19:04:02 2009 -0500
+
+    Merge branch 'bug421' of git://github.com/ashcrow/buildbot
+
+commit d5b417f04710187250593c2698d0100c1c3fb8d9
+Merge: be3c8d5... 36fc85c...
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Tue Feb 10 18:44:59 2009 -0500
+
+    Merge branch 'bug368' of git://github.com/nhemingway/buildbot
+
+commit be3c8d5327796047d31204e645fe9ce3996e9212
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Tue Feb 10 18:43:08 2009 -0500
+
+    (refs #329) close the test config file before removing the temporary directory
+
+commit 6d20b06f1e8af8025586be03a9714f277ef780a6
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Tue Feb 10 18:40:10 2009 -0500
+
+    (refs #182) documentation tweaks
+
+commit 589b39c0708aecfaa1677dbc8fbc6fa8b73cd642
+Author: Daniel Svensson <daniel.svensson@purplescout.se>
+Date:   Sun Jan 11 22:20:22 2009 +0100
+
+    (closes #182) Add category support to Schedulers and Changes.
+    
+    Signed-off-by: Dustin J. Mitchell <dustin@zmanda.com>
+
+commit ee5c7b61e6efc8dbbec841f740b924a4f492cfac
+Author: Steve 'Ashcrow' Milner <smilner+buildbot@redhat.com>
+Date:   Tue Feb 10 15:29:32 2009 -0500
+
+    fix for http://buildbot.net/trac/ticket/421 where documentation is missing code information
+
+commit 36fc85cd80599a3d04a9a344dcd133d6a553d3f6
+Author: Neil Hemingway <neil.hemingway@googlemail.com>
+Date:   Tue Feb 10 19:37:05 2009 +0000
+
+    Add a test and a doc-tweak for bug368
+
+commit 6a59c18982b6581b598fc7cf3489313906755011
+Author: Neil Hemingway <neil.hemingway@googlemail.com>
+Date:   Tue Feb 10 17:47:29 2009 +0000
+
+    BuildPrioritization tests failed unless CVS was installed
+
+commit a0930b69ac2a8ba75fb1690e68b7df3a6af9dc72
+Author: Greg Ward <gerg.ward+buildbot@gmail.com>
+Date:   Fri Feb 6 18:21:28 2009 -0500
+
+    Fix some typos in the manual.
+    
+    Signed-off-by: Dustin J. Mitchell <dustin@zmanda.com>
+
+commit 1b42980f33b57bf333dbe423e94dc914581f209d
+Author: Greg Ward <gerg.ward+buildbot@gmail.com>
+Date:   Fri Feb 6 18:21:28 2009 -0500
+
+    Fix some typos in the manual.
+
+commit 57cccfd1edf2813c2c8083dac8ff7731f55d8d67
+Merge: f03f8d1... cbdacb4...
+Author: Greg Ward <gerg.ward+buildbot@gmail.com>
+Date:   Fri Feb 6 18:09:18 2009 -0500
+
+    Merge branch 'master' of git://github.com/djmitche/buildbot
+
+commit cbdacb41fcf892587251c6e39e08958fc4a49f59
+Author: Greg Ward <gerg.ward+buildbot@gmail.com>
+Date:   Thu Feb 5 11:02:19 2009 -0500
+
+    sample.cfg: fix out-of-date comments and typos.
+    
+    Signed-off-by: Dustin J. Mitchell <dustin@zmanda.com>
+
+commit f03f8d105824ee89bac21490ab2dcfd0de3a074d
+Author: Greg Ward <gerg.ward+buildbot@gmail.com>
+Date:   Thu Feb 5 11:02:19 2009 -0500
+
+    sample.cfg: fix out-of-date comments and typos.
+
+commit 6edd056d6b81183c8f4692c964942eb66c58ba92
+Author: Gareth Armstrong <gareth.armstrong@hp.com>
+Date:   Thu Feb 5 15:27:13 2009 +0100
+
+    Add provenance header to feeds.py
+
+commit 82da60b668335080640bf2d0417eac703ef4506d
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu Feb 5 08:46:56 2009 -0500
+
+    fix test_web failures where no projectName is specified
+
+commit 0d12fff51af47503720840321054fb2408fdb2bc
+Author: Gareth Armstrong <gareth.armstrong@hp.com>
+Date:   Thu Feb 5 10:48:47 2009 +0100
+
+    (refs #382) Add ATOM and RSS feeds to webstatus
+    
+    The addtion of ATOM and RSS feeds to webstatus is based on "feeder.py" which
+    was part of the Buildbot configuration for the Subversion project. The original
+    file was created by Lieven Gobaerts and
+    later adjusted by API (apinheiro@igalia.coma) and also here
+    http://code.google.com/p/pybots/source/browse/trunk/master/Feeder.py
+    
+    All subsequent changes to feeder.py where made by Chandan-Dutta Chowdhury
+    <chandan-dutta.chowdhury@hp.com> and Gareth Armstrong <gareth.armstrong@hp.com>.
+    
+    Those modifications are as follows:
+    1) the feeds are now based on baseweb.WebStatus
+    2) feeds are fully validated ATOM 1.0 and RSS 2.0 feeds, verified with code from
+       http://feedvalidator.org
+    3) nicer xml output
+    4) feeds can be filtered as per the /waterfall display with the builder and category filters
+    5) cleaned up white space and imports
+    
+    Finally, the code was directly integrated into the status/web/base.py and
+    status/web/baseweb.py.
+
+commit e9f180c167a9e1ba8e1f8442b056eb48796d2599
+Author: jpittman <jpittman@qali14.moleflow.com>
+Date:   Wed Feb 4 12:14:08 2009 -0800
+
+    Updated p4bin documentation to indicate that it's optional and what it defaults to.
+
+commit 2249b70cdbcfbbf9117752a0a5aa52fbc86a9dd6
+Author: jpittman <jpittman@qali14.moleflow.com>
+Date:   Wed Feb 4 12:06:48 2009 -0800
+
+    Fixed a comment in an example to represent the correct amount of time for a given variable.
+    
+    Added documentation for an argument found in p4poller.
+
+commit 966747f09029f8bbc267cff5e9b35d3853de855a
+Author: Darragh Bailey <dbailey@hp.com>
+Date:   Tue Feb 3 15:10:13 2009 -0500
+
+    (fixes #39) patch to print the correct order
+
+commit 265265830c19967b545cea2193195af1759add6d
+Author: Greg Ward <gerg.ward+buildbot@gmail.com>
+Date:   Tue Feb 3 11:06:25 2009 -0500
+
+    (refs #210) render properties to FileUpload and FileDownload's workdir (patch updated by djmitche)
+
+commit d554bff93efb780f6ad09c559bad2402fa1fd217
+Author: Greg Ward <gerg.ward+buildbot@gmail.com>
+Date:   Tue Feb 3 10:42:37 2009 -0500
+
+    (refs #209) patch 3/3: factor out _TransferBuildStep for common workdir logic.
+
+commit 4210d6c33a31df925a75b1903f5435a833243e9d
+Author: Greg Ward <gerg.ward+buildbot@gmail.com>
+Date:   Tue Feb 3 10:41:35 2009 -0500
+
+    (refs #209) patch 2/3: add tests to ensure that calling setDefaultWorkdir() actually affects 'workdir' of FileUpload and FileDownload objects
+
+commit 5a42c47726a91efec0fad46c91865f02bc7c9d45
+Author: Greg Ward <gerg.ward+buildbot@gmail.com>
+Date:   Tue Feb 3 10:38:12 2009 -0500
+
+    (refs #209) patch 1/3: fix FileUpload and FileDownload to support setDefaultWorkdir()
+
+commit 1ad3d25decd1cc4e563cd0fc82bd0aacbc8bee2a
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Tue Feb 3 10:36:28 2009 -0500
+
+    add .orig and .rej to .gitignore
+
+commit bab759f199c583d669975d5410e02a89a58e570f
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Tue Feb 3 09:22:31 2009 -0500
+
+    (fixes #417) use 'call' with *.cmd on windows
+
+commit 42eececea1158fbc525c0f0404bf04b183c616a4
+Author: Marcus Lindblom <macke@yar.nu>
+Date:   Mon Feb 2 10:17:56 2009 -0500
+
+    (fixes #185) (MercurialInRepo) send the branch from the changeset, not the working directory
+
+commit 42d86154cbcb5e7e1c1faf1680aafa8ae3075e86
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Feb 1 13:39:42 2009 -0500
+
+    fix version length check - 40 bytes lets git revisions appear, but nothing longer
+
+commit 2825dbf3380732c0300a0934b9842783b80971aa
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Feb 1 12:13:46 2009 -0500
+
+    (fixes #415) doc tweaks to Pike's patch
+
+commit 38e7a00e1e4f1a6520a88abb89a444c51352e2e8
+Merge: 6240a8f... a811624...
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Feb 1 11:46:24 2009 -0500
+
+    Merge branch 'bug415' of git://github.com/Pike/buildbot into bug415
+
+commit 6240a8f30fdd178f4331e63e1caa38982994721f
+Author: Zooko Wilcox-O'Hearn <zooko@zooko.com>
+Date:   Sat Jan 31 17:57:39 2009 -0500
+
+    (fixes #215) log the usage of shutil.copytree() instead of a cp subprocess
+
+commit 7f49a7b1cf5812f43befdef902821ec1770d6bb3
+Author: Sergey Lipnevich <sergey+buildbot@optimaltec.com>
+Date:   Sat Jan 31 17:41:56 2009 -0500
+
+    (refs #146) doc fixes
+
+commit 7e348bc48c3d32c475f0daf7242b3a2535853079
+Merge: 3aed3fe... 1649957...
+Author: Neil Hemingway <neil.hemingway@googlemail.com>
+Date:   Sat Jan 31 10:42:41 2009 +0000
+
+    Merge branch 'master' of git://github.com/djmitche/buildbot into bug368
+
+commit 16499575e6777012e77b6cab6494c15efc97dd36
+Merge: 80fac85... d2d57ef...
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Jan 30 20:56:17 2009 -0500
+
+    Merge branch 'master' of git://github.com/ashcrow/buildbot
+
+commit a811624c1fcd4b06298016cead6533fc22fa5214
+Author: Axel Hecht <axel@pike.org>
+Date:   Sat Jan 31 00:16:12 2009 +0100
+
+    (fixes ticket #415) moving over to a configurable function on botmaster from the loadmaster concept
+
+commit 80fac85380bdd98aaafe93bfc821449d3328e8d1
+Author: Arkadiusz Miskiewicz <arekm@maven.pl>
+Date:   Fri Jan 30 22:39:19 2009 +0100
+
+    Example on how to run it from post-merge hook
+    
+    Signed-off-by: Arkadiusz Miskiewicz <arekm@maven.pl>
+    Signed-off-by: Dustin J. Mitchell <dustin@zmanda.com>
+
+commit d2d57ef70fd5a95ebbbcde2bb92948f5b995d2a7
+Author: Steve 'Ashcrow' Milner <smilner+buildbot@redhat.com>
+Date:   Fri Jan 30 14:43:01 2009 -0500
+
+    Added a package module as well as rpm steps and a tests.
+
+commit 46d08a75a263eb9d886195e21ad1b5a52a290d13
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Jan 30 13:12:14 2009 -0500
+
+    allow a treeStableTimer < 1 second
+
+commit 77a6cbeb32200e5fddba2a6a1d8c90e874facc37
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Fri Jan 30 11:34:57 2009 -0500
+
+    Adding docs for --maxdelay
+    
+    Signed-off-by: Dustin J. Mitchell <dustin@zmanda.com>
+
+commit 73f2ee55f2f3cfdf104860e7021c278b8bb1bb46
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Fri Jan 30 11:11:52 2009 -0500
+
+    Make maximum delay between slave retries configurable
+    
+    Signed-off-by: Dustin J. Mitchell <dustin@zmanda.com>
+
+commit 1e7ac29a4aac4ed896c40f0c353e11af000a6d56
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu Jan 29 18:27:22 2009 -0500
+
+    (refs #407) encode unicode strings to ASCII using 'replace', so that any invalid characters don't cause the script to crash
+
+commit 19cd2f50422e2c59d3741cdbd5e0d35abd8d2602
+Merge: 5262a02... b34e5cb...
+Author: Axel Hecht <axel@pike.org>
+Date:   Thu Jan 29 23:49:44 2009 +0100
+
+    Merge branch 'master' of git://github.com/djmitche/buildbot into bug415
+
+commit b34e5cb43d2d24ce443cecabce6198d32bdefdca
+Author: Gary Poster <gary@imposter.home>
+Date:   Thu Jan 29 15:58:49 2009 -0500
+
+    fixes for running latent slave tests on mac
+
+commit a8148a25469e6572838a564186e33573de36f2e8
+Author: Gary Poster <gary@imposter.home>
+Date:   Thu Jan 29 15:48:41 2009 -0500
+
+    add my name to the list of glory
+
+commit 5262a02e88d4a4b63149eb7aad01e591814d9be7
+Merge: 1954bae... dfb18e6...
+Author: Axel Hecht <axel@pike.org>
+Date:   Thu Jan 29 18:07:06 2009 +0100
+
+    Merge branch 'master' of git@github.com:Pike/buildbot into bug415
+
+commit fb2c1c6d745deadec357e4eda17629d5fcf344a0
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu Jan 29 00:14:38 2009 -0500
+
+    document onlyIfChanged
+
+commit a8a4dfea8eafcb34b19760c62dd1f0aea5caff80
+Author: claude vittoria <vittoric@wanadoo.fr>
+Date:   Thu Jan 29 00:14:28 2009 -0500
+
+    add onlyIfChanged support to the Nightly scheduler
+
+commit dfb18e6c177d490da9dcab29e431eff22cfedfec
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Wed Jan 28 20:26:00 2009 -0800
+
+    Allow users to specify the remote git branch.
+    
+    This allows for a case where someone has a repository that tracks
+    someone else's repository, has arbitrary local branches, but wants to
+    run tries with the delta from the reference repository (i.e. the one
+    the master knows about) to the local changes.
+    
+    Without this, it's likely the reference repository will not have the
+    necessary objects to pull down a base revision to be able to apply
+    patches for the try to succeed.
+    
+    This also ensures that the current client's view of the reference
+    repository is honored.  That is, if the reference repository has moved
+    forward, the trier's current tip of the remote is used to compute the
+    delta, and that's sent along as the baserev.
+
+commit 38a9c7fc719b44e2cdfa47884182da7128b369d2
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Wed Jan 28 16:30:08 2009 -0800
+
+    Added --dry-run (-n) support to buildbot try.
+    
+    Need to be able to try try when I just want to know what it's even
+    going to consider doing.
+
+commit f43143835cba3ca5963e07874da17c1416a031c2
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Wed Jan 28 08:34:04 2009 -0800
+
+    Refactored try buildName validation for reuse.
+
+commit a88238cae5000c3481877aa354e3c76fc45770b8
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Wed Jan 28 08:25:52 2009 -0800
+
+    Don't require a list of builders for buildbot try.
+    
+    This maintains the current restrictions around builder lists that
+    prevent one from trying a build that isn't in the list, but allows the
+    user to delegate the selection to the server by not listing the
+    builders at all.
+    
+    I want my users to always try their builds on every build
+    configuration, but I don't want to be sending out buildbot options all
+    the time.
+
+commit 5d0baa29aaa7dfd1344074fc72e214a8d10a8902
+Merge: bd30ff1... deca9f4...
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Jan 28 14:08:07 2009 -0500
+
+    Merge branch 'latentslaves' of git://github.com/garyposter/buildbot
+
+commit bd30ff18d29a839f333a88cdea9b4ba9d55403dd
+Merge: 7c37a7a... 12af51c...
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Jan 28 14:02:56 2009 -0500
+
+    Merge branch 'master' of git://github.com/bhearsum/buildbot
+
+commit 7c37a7a2b388f012fa9f59b2db0d2b35c4adf40b
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Jan 28 14:00:58 2009 -0500
+
+    spell logCompressionLimit right
+
+commit ad871a197c0a5ad93706249b0e9a5fca935e6f1c
+Merge: 1754c3f... 3fa61ba...
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Jan 28 13:15:48 2009 -0500
+
+    Merge branch 'bug26' of git://github.com/Pike/buildbot
+
+commit 12af51c23e84f760627d362b3c027cadf8b8dc5f
+Author: Ben Hearsum <bhearsum@bitters-2.local>
+Date:   Wed Jan 28 11:29:33 2009 -0500
+
+    Bump max steps-with-same-name to 1000, handle that failure better.
+
+commit 3fa61ba3d9b00fd5c4be6ddcba92ae8d083e7b73
+Author: Axel Hecht <axel@pike.org>
+Date:   Wed Jan 28 13:12:57 2009 +0100
+
+    (ticket #26) only try to remove compressed log on failure if it's actually there
+
+commit deca9f41a08692ae194372c38fb46a92673e1b41
+Merge: b3ad016... 1754c3f...
+Author: Gary Poster <gary@gary-ubuntu.(none)>
+Date:   Tue Jan 27 14:30:16 2009 -0500
+
+    merge from upstream master
+
+commit b3ad016e13e2ef0c46f5085e3f3489c16363ef5d
+Author: Gary Poster <gary@gary-ubuntu.(none)>
+Date:   Tue Jan 27 14:17:03 2009 -0500
+
+    docs now render properly
+
+commit 1095c1cc7729dd3775baf1259d7ea09961ad58f5
+Author: Gary Poster <gary@gary-ubuntu.(none)>
+Date:   Tue Jan 27 13:39:36 2009 -0500
+
+    texinfo is not formatting correctly in the ToC, but I do not want to lose the work while I try to fix it, so committing.
+
+commit 2936e491ec11ead88de7a508b6f0864913198286
+Author: Gary Poster <gary@gary-ubuntu.(none)>
+Date:   Tue Jan 27 12:35:49 2009 -0500
+
+    add test for elastic ips
+
+commit 5d0675d2e163818813022271b6c9a5d0b9980872
+Author: Axel Hecht <axel@pike.org>
+Date:   Tue Jan 27 13:59:15 2009 +0100
+
+    (update to ticket #26) fix testcases to not use log compression, or to wait for compressed logs, otherwise reactors can close unlcean
+
+commit ec51679762093a98b0adea472f713ad55ab2abc3
+Author: Axel Hecht <axel@pike.org>
+Date:   Tue Jan 27 12:02:53 2009 +0100
+
+    (fixes #26) add bz2 log compression for LogFiles, triggered from stepFinished, by default for logs bigger than 4k. Configurable via logCompressionLimit in master.cfg
+
+commit 0a488bf26aeb085a5ad2fa151b919b3b17574096
+Author: rlb <rbosetti+gh@gmail.com>
+Date:   Mon Jan 26 22:45:00 2009 -0800
+
+    Removed name=None from BuildRequest.
+    
+    All tests have been cleaned up. All tests pass
+
+commit 155e6f5d58b44a803a4b36287b8cdff19529c26f
+Author: rlb <rbosetti+gh@gmail.com>
+Date:   Mon Jan 26 21:06:18 2009 -0800
+
+    Fix repr for RemoteShellCommand. fixes #352
+    
+    New testcase in test_buildstep.py, runs each case for repr
+
+commit f93732c3aa0d8b5b28e52cccc033d5b4a2cb6ef4
+Author: Gary Poster <gary@gary-ubuntu.(none)>
+Date:   Mon Jan 26 16:41:45 2009 -0500
+
+    bugfix for bzr_buildbot poller: branch_name was not honored for initial branch in a given poll.
+
+commit e29f183fa6945b068b3e4c14072798613dbaf285
+Author: Gary Poster <gary@gary-ubuntu.(none)>
+Date:   Mon Jan 26 15:22:07 2009 -0500
+
+    shut down ec2 instances when the reactor shuts down.  at the same time, use constants for ec2 instance states.
+
+commit c8334e7ea0010dd0e86cacebccc9124110ce9ea2
+Author: Gary Poster <gary@gary-ubuntu.(none)>
+Date:   Mon Jan 26 15:20:20 2009 -0500
+
+    fix typo
+
+commit 53e44cefbae4d5c71024db9624623c743c19a2f1
+Author: Gary Poster <gary@gary-ubuntu.(none)>
+Date:   Mon Jan 26 15:19:12 2009 -0500
+
+    make the test not rely on Python 2.5 (and my editor did some whitespace cleanup).
+
+commit 67f08a4addae5c9f4fef38473e000b4d512328f0
+Author: Gary Poster <gary@gary-ubuntu.(none)>
+Date:   Mon Jan 26 14:51:43 2009 -0500
+
+    add mention of bzr_buildbot.py to PBChangeSource doc string.
+
+commit 1754c3fdc5f412c94046aca1d9257d1a184432e0
+Author: Marcus Lindblom <macke@yar.nu>
+Date:   Mon Jan 26 13:38:18 2009 -0500
+
+    (fixes #418) correctly handle git versions that have hashes in them
+
+commit 00bcee2a9899c6da06fbbe6de8d5b1ac3808dbe5
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Mon Jan 26 13:19:24 2009 -0500
+
+    remove unnecessary python-2.5 syntax
+
+commit 3aed3fe9bdd73bf64b2c3e7dc3bed5f82d2ad28b
+Author: Neil Hemingway <neil.hemingway@greyhavens.org.uk>
+Date:   Mon Jan 26 09:45:45 2009 +0000
+
+    Resolve #368 - Enable IRC notification setup from the config file
+    
+    This patch allows the config file to specify which events the
+    IrcStatusBot will notify you about.  You can now have a notify_events
+    parameter to the constructor to IRC:
+    
+    c['status'].append(words.IRC(
+            host="somehost.test.com",
+            nick="BobTheBuilder",
+            channels=["#buildbot"],
+    	notify_events={
+                'exception': 1,
+                'successToFailure': 1,
+                'failureToSuccess': 1,
+                },
+            ))
+
+commit 1252f2e13dde53c52d3b2df0af0669305dc6c222
+Author: Neil Hemingway <neil.hemingway@googlemail.com>
+Date:   Sat Jan 24 12:30:35 2009 +0000
+
+    Add IRC notification on transitions between the other two result states
+    
+    Previously, we could only notify on transitions between success and failure.
+    Warnings and exceptions were ignored.  No longer.
+    Also the spelling of failed has gone back to failure (as that is what the
+    state is called).  Dittoish for warnings.
+
+commit c7f45657516e304f0b15b8e9d1082f94ce42d0d0
+Author: Gary Poster <gary@gary-ubuntu.(none)>
+Date:   Mon Jan 26 10:02:34 2009 -0500
+
+    remove a docstring reference to paramiko
+
+commit 71ab027cd57db4800c453eeb956a2b6212f2a7d0
+Author: Gary Poster <gary@gary-ubuntu.(none)>
+Date:   Mon Jan 26 09:58:53 2009 -0500
+
+    remove XXX in favor of TODO
+
+commit f4e1ac528c1f620e65ff2820ebf447ce5ae4d719
+Author: Gary Poster <gary@gary-ubuntu.(none)>
+Date:   Mon Jan 26 09:12:52 2009 -0500
+
+    remove dependency on paramiko.  It is not necessary ATM.
+
+commit ba4fddbdf0bcbe4946202cc4d46d5cad4188ed8f
+Author: Gary Poster <gary@gary-ubuntu.(none)>
+Date:   Sun Jan 25 16:10:45 2009 -0500
+
+    tests and fixes for ec2 slave initialization
+
+commit 8aa0c9bb5f4e9a5879b686fa829ae3d8b0453be2
+Merge: 99240ad... 28b77b9...
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Jan 25 14:22:57 2009 -0500
+
+    Merge branch 'customMesg' of git://github.com/jgraff/buildbot
+
+commit 99240ada38677a143971fe390beb714c3017c20b
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Sun Jan 25 10:47:57 2009 -0800
+
+    git_buildbot should show the author, not the committer
+    
+    When I'm looking at my waterfall, I'd like to see the names of the
+    people who wrote code, not just mine because I happened to have
+    cherry-picked or am'd a bunch of changes.
+
+commit 28b77b98aec06d7816721e368ea58a5954d2f35d
+Author: gollum <gollum@staticfoo-2.local>
+Date:   Sat Jan 24 19:05:23 2009 -0800
+
+    Added the ability to create custom messages in MailNotifier using the
+    customMesg argument. A customMesg function can be used to solve issues:
+    
+    Documentation (MailNotifier section) and unit tests (test_status.py)
+    were added for this feature.
+
+commit acfd9a07270adeeeb962687a013288609f0f8180
+Author: Gary Poster <gary@gary-ubuntu.(none)>
+Date:   Sat Jan 24 20:19:59 2009 -0500
+
+    add a test of the separate key file
+
+commit 5510acaea5d1fdcd9b6683ec0b69279de9dd2cda
+Author: Gary Poster <gary@gary-ubuntu.(none)>
+Date:   Sat Jan 24 15:52:49 2009 -0500
+
+    add initial tests for EC2 latent slave, with resulting fixes.
+
+commit 57d2aa1fc0a91083cced6970a98724f8278a3c60
+Merge: 61cef05... 901fb73...
+Author: Gary Poster <gary@gary-ubuntu.(none)>
+Date:   Fri Jan 23 21:07:09 2009 -0500
+
+    Merge branch 'master' of git://github.com/djmitche/buildbot into latentslaves
+
+commit 61cef05037f26cd025391d8272b0321c1981e137
+Author: Gary Poster <gary@gary-ubuntu.(none)>
+Date:   Fri Jan 23 21:04:09 2009 -0500
+
+    add status messages to latent slaves; handle error conditions more carefully; add features to ec2 implementation to be able to specify a set of slaves.  ec2 version still needs tests.
+
+commit 901fb739488ea5de5fded3acbd5cfcedf53480a0
+Merge: d8e0dda... ab61561...
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Jan 23 11:54:08 2009 -0500
+
+    Merge branch 'myfixes' of git://github.com/jgraff/buildbot
+
+commit d8e0dda3eec2840a9f37639aa0374904425756af
+Merge: 8bcf3d1... a735db8...
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Jan 23 11:53:55 2009 -0500
+
+    Merge branch 'issue_392' of git://github.com/jgraff/buildbot
+
+commit 8bcf3d1e40d38536eb75fc262482317fec0b085e
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Jan 23 11:12:41 2009 -0500
+
+    (fixes #190) add docs for using 'call' when running batch files
+
+commit 25db279eea689e34b400a925ad0c6bee0ee07639
+Merge: 36ea32f... 9c78973...
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu Jan 22 23:59:39 2009 -0500
+
+    Merge branch 'bug187' of git://github.com/marcusl/buildbot
+
+commit 36ea32f4c2a9515037921f7a618ff5d00a6a6e3d
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Thu Jan 22 17:12:49 2009 -0500
+
+    (refs #334) prioritize builds submitted first, and add a unit test to
+    verify
+    
+    Signed-off-by: Dustin J. Mitchell <dustin@zmanda.com>
+
+commit a735db87befa0f5980623ab2131e38d1e5dd98c9
+Author: gollum <gollum@staticfoo-2.local>
+Date:   Thu Jan 22 14:23:04 2009 -0800
+
+    Fix for #392. Triggered builders now inherit set_properties.
+
+commit ab61561c9bc98d69b64db2b3bdb5c05dce969264
+Author: gollum <gollum@staticfoo-2.local>
+Date:   Thu Jan 22 13:09:43 2009 -0800
+
+    Fix for issue #127. The "got_revision" property in perforce is now set after a P4 source
+    step. This fix consists of the patch in issue #229 (with cleanup) and adjustments to
+    the p4 tests (test_vc.py). p4 tests now support newer versions of p4d and check the
+    "got_revision" value via (has_got_revision = True)
+
+commit 2c6865d83e967ca135acd3810e08af2dfab727b3
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Wed Jan 21 20:23:35 2009 -0800
+
+    Look at the remote tracking branch in git for buildbot try.
+    
+    This allows us to try committed, but not pushed code.
+
+commit a079d84d4056dbf5ab3489cb7f2f8f0e20d91b87
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Thu Jan 22 09:59:59 2009 -0800
+
+    Try to reclobber on retry.
+    
+    On a failed git update in clobber mode, I was getting the following
+    error on the second try:
+    
+    exceptions.OSError: [Errno 17] File exists: '/path/to/build'
+    
+    It seems that the clobber only occurs once, and any error that happens
+    during the checkout should redo the clobber.
+
+commit 9c789732b84c631861189a337003d3d5fa776cb8
+Author: marcusl <macke@yar.nu>
+Date:   Thu Jan 22 19:27:14 2009 +0100
+
+    Fix testCheckoutHTTP for Mercurial and MercurialInRepo, see #187
+    
+    Added extra callback at MercurialServerPP.processEnded()
+
+commit 1954bae871290df636b4a0b7936329ab506cecee
+Author: Axel Hecht <axel@pike.org>
+Date:   Thu Jan 22 19:10:47 2009 +0100
+
+    (working on ticket #415) Make merging of buildrequests configurable, with code ready to only merge on matching source stamps, reasons, and properties
+
+commit 4ac626cbc44be973f2a2f7a606923d571159a696
+Author: Axel Hecht <axel@pike.org>
+Date:   Thu Jan 22 19:08:48 2009 +0100
+
+    backout http://github.com/djmitche/buildbot/commit/86f5cab0fc5a4c4ef79886901bbe2913c63d6d55, that conflicts with what the tests intend to do, even though they hardly do it. Going back to previous behaviour and making this a configurable option
+
+commit 273cbd2866de94920ce15079749a2e0968134686
+Author: Gary Poster <gary@gary-ubuntu.(none)>
+Date:   Tue Jan 20 20:36:38 2009 -0500
+
+    ignore generated doc files
+
+commit e863275f5142f178f28b5c5338c0ba083a4d03ca
+Author: Gary Poster <gary@gary-ubuntu.(none)>
+Date:   Tue Jan 20 20:33:18 2009 -0500
+
+    merge from master
+
+commit 02a501b455721d9a991f8c605bfd066b15d54587
+Merge: 4473348... 32a0182...
+Author: Gary Poster <gary@gary-ubuntu.(none)>
+Date:   Tue Jan 20 16:59:41 2009 -0500
+
+    Merge branch 'master' of git://github.com/djmitche/buildbot into latentslaves
+
+commit 4473348bb839b63d020ba407a0c8789349568c88
+Author: Gary Poster <gary@gary-ubuntu.(none)>
+Date:   Tue Jan 20 16:58:08 2009 -0500
+
+    add docs for another example of a latent build slave subclass
+
+commit 8ed8e5e8421d1fd826a750a4347723d212093045
+Author: Axel Hecht <axel@pike.org>
+Date:   Tue Jan 20 16:17:35 2009 +0100
+
+    (working on #26) compress logs after the fact with bz2, sporadic test failures in buildbot.test.test_slavecommand.ShellPTY.testInterrupt1 on twisted 2.5.0, no specific tests for mixing compressed and uncompressed logs
+
+commit 32a01826fbc560e431546f404c65a6a6389d1d57
+Author: Marc-Antoine Ruel <maruel@chromium.org>
+Date:   Sun Jan 18 21:04:21 2009 -0500
+
+    (fixes #405) Permit mixed mode user names/email addresses for buildbot.status.mail.Domain
+
+commit e75b4e1eaf905992f136033cd4523b0e45bd9c38
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Jan 18 20:55:56 2009 -0500
+
+    (refs #411) convert messages to ASCII, stripping unrepresentable characters, when sending to IRC
+
+commit 35857686646c6ca66759ee32574447b52b52c31e
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Jan 18 20:49:52 2009 -0500
+
+    (fixes #413) don't suggest automatically purging BASEDIR/public_html
+
+commit 0ba158a65ce98783b31fe663886d3fb5e6cc6143
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Sun Jan 18 20:33:49 2009 -0500
+
+    (fixes #416) sort buildslave in web display
+
+commit 762902ceced304ac97feda93600ad1dbed894436
+Author: Marcus Lindblom <macke@yar.nu>
+Date:   Sun Jan 18 14:11:16 2009 -0500
+
+    (fixes #250) use 'tail -f' instead of 'tail -F'
+
+commit 261f0d79498f75fae57b87099463500e084d4994
+Author: Thijs Triemstra <info@collab.nl>
+Date:   Sun Jan 18 14:08:02 2009 -0500
+
+    (fixes #280) use convertTime in IRC conversations
+
+commit 06ce8e7e79b2ffa1a301ac45c7155899d6a0e6da
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sat Jan 17 20:54:32 2009 -0500
+
+    (refs #35) fix up re-parenting of dependent schedulers to not depend on sched.running (fixes broken unit tests)
+
+commit 7ee5afcb94e506e2e38173945ccb6e7dcc8d695d
+Merge: 799dc13... 8881c3f...
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sat Jan 17 19:52:29 2009 -0500
+
+    Merge branch 'bug35' of git://github.com/Pike/buildbot
+
+commit 799dc135357b3cea8abb0756ca9881a7ac2bc240
+Merge: 7c2ee0b... ebb7c93...
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sat Jan 17 15:19:51 2009 -0500
+
+    Merge branch 'master' of git://github.com/rbosetti/buildbot
+
+commit ebb7c938a871e48289ff2b853de2eb9134e43acc
+Author: rlb <rbosetti+gh@gmail.com>
+Date:   Sat Jan 17 11:40:35 2009 -0800
+
+    Reverted some changes for backwards compatibilty.
+    
+     * XML-RPC methods attempt to return '' instead of None
+     * New Trac plugin added to contrib/
+       * Adds builds to the Timeline
+       * Extends Etienne's summary
+       * Uses XML-RPC to allow for private BuildBot masters
+
+commit 7c2ee0b490e602a7c5518e14456829612f952b5b
+Author: Neil Hemingway <neil.hemingway@googlemail.com>
+Date:   Sat Jan 17 19:18:29 2009 +0000
+
+    Resolve #381.  Standardize on successToFailed and failedToSuccess
+
+commit 0a5194f1af8911d4c9c4dcccb7d6d9fadb6a5e0a
+Author: Neil Hemingway <neil.hemingway@googlemail.com>
+Date:   Sat Jan 17 17:02:26 2009 +0000
+
+    buildbot needs to be executable
+
+commit b65abd888cefe6ce4a4009bb876de9d480e669b3
+Author: Gary Poster <gary@gary-ubuntu.(none)>
+Date:   Fri Jan 16 16:23:58 2009 -0500
+
+    fix code to work with existing tests, and add tests and fixes for the latent slaves.
+
+commit 8881c3f174927e5d1c349d1be481c98ba64b793c
+Author: Axel Hecht <axel@pike.org>
+Date:   Fri Jan 16 17:51:00 2009 +0100
+
+    (fixes #35) add IDownstreamScheduler to mark up schedulers that need to learn about other schedulers starting or stopping during reconfig. Use that to make Dependent scheduler robust on reconfigs
+
+commit b1a49d8e3591b3f94e70cf0b2b0ad169598bc4fc
+Merge: e81b4e0... a6b3d23...
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Jan 16 11:12:21 2009 -0500
+
+    Merge branch 'bug108' of git://github.com/Pike/buildbot
+
+commit 932d76060852bce9900bf3d1d7cc239c2fd04e8e
+Author: Axel Hecht <axel@pike.org>
+Date:   Fri Jan 16 16:41:58 2009 +0100
+
+    testcase for #35, dependent schedulers lost on reconfig; reconfigure without changes, when changing upstream, and when changing dependent
+
+commit c2e84cb080eb310151cb6a5b942a5619ff947fb6
+Author: Axel Hecht <axel@pike.org>
+Date:   Fri Jan 16 16:40:23 2009 +0100
+
+    fixing silly bugs when comparing schedulers, add logging to see them get changed on reconfig in the log
+
+commit e81b4e0f0aec5e1c432279196ab335b7c2cc6adc
+Author: Neil Hemingway <neil.hemingway@greyhavens.org.uk>
+Date:   Fri Jan 16 13:59:15 2009 +0000
+
+    Resolve #378 and #384
+    
+    Watched builds use watchedBuildFinished wheras notified ones use
+    buildFinished.
+    
+    Signed-off-by: Dustin J. Mitchell <dustin@zmanda.com>
+
+commit a6b3d232b6aa9222bf877b8414c1affa909ae6f5
+Author: Axel Hecht <axel@pike.org>
+Date:   Fri Jan 16 13:55:56 2009 +0100
+
+    follow up for #108, skip the test if buildbot script can't be found
+
+commit e070b9a918d00c53697bae0d21edb3faa48cfc96
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Thu Jan 15 22:41:19 2009 -0500
+
+    (fixes #334) Prioritize build requests based on the time they were submitted
+
+commit 5f5d928d1881d88e1adf41367980d5e3e89aec8c
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Thu Jan 15 16:07:43 2009 -0500
+
+    (refs #414) docs for alwaysRun flag
+
+commit 1f0a149b067a67b44b8a7f9954d480ba48012ef9
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Thu Jan 15 16:06:47 2009 -0500
+
+    (refs #414) implement alwaysRun flag
+
+commit c56935133ac342cda66d9e65f12c4eda3ed729e8
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu Jan 15 16:03:55 2009 -0500
+
+    don't create the 'owners' property unless it has some values
+
+commit 138fb858b6172782e9e148a39b4350061ca75e61
+Merge: 86f5cab... 2143ddf...
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu Jan 15 15:15:00 2009 -0500
+
+    Merge branch 'buildowners2' of git://github.com/nobrowser/buildbot
+
+commit 2143ddf36cd0f68180e8594ba8ef046a9a5f0ea2
+Author: Ian Zimmerman <itz@dell-itz.office.sproutsys.com>
+Date:   Thu Jan 15 11:51:24 2009 -0800
+
+    BuildRequest is created with optional Properties.  Make one
+    of these, 'owner', collected by the resultant Build and
+    added to the set of *interested users* to which status
+    notifications will be sent, depending on the configuration for each
+    status object.
+
+commit 0a9ca9decf6c513f72e1f11dc5661a59030782d2
+Author: Gary Poster <gary@gary-ubuntu.(none)>
+Date:   Thu Jan 15 08:56:33 2009 -0500
+
+    initial working sketch
+
+commit 68803aa6338097c3c48a52ee0125eaeab3c3c4eb
+Merge: 45ae4ba... 8aa4bde...
+Author: rlb <rbosetti+gh@gmail.com>
+Date:   Thu Jan 15 03:26:13 2009 -0800
+
+    Merge branch 'master' of git://github.com/nobrowser/buildbot
+
+commit 86f5cab0fc5a4c4ef79886901bbe2913c63d6d55
+Author: Ian Zimmerman <itz@dell-itz.office.sproutsys.com>
+Date:   Wed Jan 14 16:19:28 2009 -0800
+
+    We have schedulers that schedule repeated builds of the same source,
+    triggered by a maildir mechanism similar to Try_Jobdir.
+    For that to work, this patch must be in place or all the requests
+    will be merged.
+
+commit 45ae4ba5646ad8aac09247f9cebc7be3583f448e
+Author: rbosetti <randall@alyosha.(none)>
+Date:   Mon Jan 12 19:41:16 2009 -0800
+
+    Modified xmlrpc_getBuild to return '' instead of None.
+    
+    None is not serializable, apparently
+
+commit 8aa4bde9dc1f9dedc264c433c1d6b5aae820e3a8
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Mon Jan 12 16:33:19 2009 -0500
+
+    (refs #110) add /buildslave/$slavename to web status
+
+commit 26fb369dbab279e9a76237781b58b9f9dccd845e
+Merge: 5b95b97... 4a18471...
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Mon Jan 12 11:48:07 2009 -0500
+
+    Merge branch 'bug108' of git://github.com/Pike/buildbot
+
+commit 4a18471b24cfdd0a8323624c4eee43101f9f6fd3
+Author: Axel Hecht <axel@pike.org>
+Date:   Mon Jan 12 16:36:38 2009 +0100
+
+    address Dustin's review comment, make new parameters variables in the .tac files (re #108)
+
+commit 803a610b08f81c8d15c4d91b689396950caeb81b
+Author: Randall Bosetti <randall@alyosha.(none)>
+Date:   Mon Jan 12 03:31:41 2009 -0800
+
+    modified the xmlrpc getBuild(...) call to return the branch, revision, and build number
+
+commit 5b95b97adf714c152c04d3a711f366c7326e4ff1
+Merge: 7c8ea99... 2eaafd5...
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Jan 7 18:04:36 2009 -0500
+
+    Merge branch 'badtests'
+
+commit 2eaafd591a4df5ceed5b7451861f9b844ab25a82
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Jan 7 18:04:26 2009 -0500
+
+    (refs #402) fix tests to correspond
+
+commit 7c8ea9996df12d58111f8fc372fb60f327059d44
+Merge: a3c7af3... 0da7664...
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Jan 7 11:12:25 2009 -0500
+
+    Merge branch 'bzr' of git://github.com/garyposter/buildbot
+
+commit 0da76648effcfbf8e82100b349871b992f02216e
+Author: Gary Poster <gary@gary-ubuntu.(none)>
+Date:   Tue Jan 6 23:15:12 2009 -0500
+
+    initial additions of bzr hooks and poller.
+
+commit a3c7af35410d2ed4aa4a238f653ebf51197f7760
+Author: Brian Warner <warner-buildbot@lothar.com>
+Date:   Tue Jan 6 11:49:18 2009 -0500
+
+    (closes #347) I removed the append ("no test results") call because a lot of installations use the Test step without a test parser, and "no test results" is not really adding a lot of information.
+
+commit a756ff37f07227f986e7f7a78a6ea976dab92172
+Author: Axel Hecht <axel@pike.org>
+Date:   Mon Jan 5 19:50:13 2009 +0100
+
+    add support for twisted 8.2.0's log limits to both create-master and create-slave, includes test for master side and some documentation markup fixes (fixes #108)
+
+commit c88c9fbf79555ad46617cba07e85f37f5e1be753
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu Jan 1 14:48:32 2009 -0500
+
+    add buildbot.egg-info to .gitignore
+
+commit 95811cca698a64382eb99c4c7866b6f043b486e9
+Merge: 688ada7... 531cdd7...
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu Jan 1 14:47:27 2009 -0500
+
+    Merge branch 'master' of git://github.com/ashcrow/buildbot
+
+commit 688ada73888c526ede24f7482fb8a0150fb4835b
+Author: Mark A. Grondona <mgrondona@llnl.gov>
+Date:   Thu Jan 1 14:44:28 2009 -0500
+
+    The scheduler properties should be copied to the "branch" scheduler
+    instance in AnyBranchScheduler->addChange()
+    
+    Signed-off-by: Dustin J. Mitchell <dustin@zmanda.com>
+
+commit c223f877090fe41f9c300b3f9e24949a2316697b
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu Jan 1 14:37:35 2009 -0500
+
+    failing test case replicating bug discovered by Mark A. Grondona <mgrondona@llnl.gov>, with fix
+
+commit 37c24a94a3f2d7151ffa3f8504190ce682305c83
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu Jan 1 12:27:46 2009 -0500
+
+    (refs #402) sort changed files for easier display
+
+commit 226d12fcdb5f0cace71f481fa06d0544be7121ff
+Author: Marcus Lindblom <macke@yar.nu>
+Date:   Thu Jan 1 11:42:15 2009 -0500
+
+    (closes #401) contrib/windowsbuildbot.bat that is python-version agnostic
+
+commit 9a4feaf985d37d55f1b9bba0a6d21337bf63bf9b
+Author: marcusl <macke@yar.nu>
+Date:   Thu Jan 1 14:15:00 2009 +0100
+
+    Allow spaces in vcexe path (fixes #398)
+
+commit b5c072c66c311589ea08c948b7d93fb9e8647755
+Author: marcusl <macke@yar.nu>
+Date:   Thu Jan 1 13:43:07 2009 +0100
+
+    Remove accidentally left comment from cleanup step in MercurialInRepo test
+
+commit 1023a7e60f67c103dd96072852b83863936a634b
+Author: marcusl <macke@yar.nu>
+Date:   Thu Jan 1 13:32:35 2009 +0100
+
+    Add MercurialInRepo-branch support + testcase (fixes #187) and support spaces in vcexe-path (fixes #398)
+
+commit 531cdd76f8b9a18514bc0493c7dfe351cd3f8bac
+Author: Steve 'Ashcrow' Milner <smilner+buildbot@redhat.com>
+Date:   Wed Dec 31 17:51:59 2008 -0500
+
+    created a simple contrib script called generate_changelog.py to help in generating changelog entries.
+
+commit f2338d4a2c12bfba965d921374f65d121f7949fd
+Author: Steve 'Ashcrow' Milner <smilner+buildbot@redhat.com>
+Date:   Wed Dec 31 17:14:12 2008 -0500
+
+    made setup,py executable by default
+
+commit f5067523dfae9c7cdefc828721ec593ac7be62db
+Author: Steve 'Ashcrow' Milner <smilner+buildbot@redhat.com>
+Date:   Wed Dec 31 17:08:52 2008 -0500
+
+    Updated CREDITS matching it against git log --pretty="format:%an" | sort | uniq
+
+commit 13e65d4cf521c087166056ecf4ed06828fb6e718
+Author: Steve 'Ashcrow' Milner <smilner+buildbot@redhat.com>
+Date:   Wed Dec 31 16:59:00 2008 -0500
+
+    added a .gitignore to avoid checkin of commonly generated files
+
+commit 43af8ef199bdb30c0a786e3ae88f7bfee0051a4d
+Author: Steve "Ashcrow" Milner <smilner@redhat.com>
+Date:   Wed Dec 31 16:08:23 2008 -0500
+
+    Align contrib/*.py to PEP8
+
+commit 436bc550968c8bb69a75f69e9e8f75c698c8ba65
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Dec 31 13:14:30 2008 -0500
+
+    (trivial) fix buildbot.test.test_status.testMail
+
+commit 4f3a0905bfbc0b2b8f2b672078266648b37befca
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Dec 31 13:12:24 2008 -0500
+
+    (refs #178) fix tests to correspond to Chad's changes
+
+commit ba76ffcc532110e6d41856e3c6ce77786b3200c7
+Merge: a6f799c... 947a6a3...
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Dec 31 12:51:23 2008 -0500
+
+    Merge branch 'bug410' of git://github.com/Pike/buildbot
+
+commit a6f799c5eda000c5ceaf04f8a4daf00f4ca7eb0d
+Merge: 50312db... 3ad2fb9...
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Dec 31 12:47:26 2008 -0500
+
+    Merge branch 'bug409' of git://github.com/Pike/buildbot
+
+commit 50312db3d30c23dfaba276e487ac6754e8d35081
+Merge: a949400... fabc4c6...
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Dec 31 12:39:19 2008 -0500
+
+    Merge branch 'minorfixes' of git://github.com/metcalfc/buildbot into metcalfc/minorfixes
+
+commit 947a6a3ffb74a1df479fe7437fa06f252f1825c7
+Author: Axel Hecht <axel@pike.org>
+Date:   Wed Dec 31 16:42:43 2008 +0100
+
+    Add hooks for StepStatus.text and test2 to IStatusReceiver and test that they're called (fixed #410)
+
+commit 3ad2fb926a649accce9ce369dd733b7d5a49da51
+Author: Axel Hecht <axel@pike.org>
+Date:   Wed Dec 31 15:28:21 2008 +0100
+
+    follow up fix, add comment to parser subclass
+
+commit f3b4f43b8a03937ec2103084abf02652a9ce7fab
+Author: Axel Hecht <axel@pike.org>
+Date:   Wed Dec 31 14:59:40 2008 +0100
+
+    Don't display non-std channels in logfiles (fixed #409)
+
+commit fabc4c6c70928ce18d80ecb66717cdd59e4278aa
+Author: Chad Metcalf <cmetcalf@archrock.com>
+Date:   Tue Dec 30 15:17:57 2008 -0800
+
+    Handle an odd email from git
+
+commit f633bf556791f3774916af3fd17c322b0e711ede
+Author: Chad Metcalf <cmetcalf@archrock.com>
+Date:   Tue Dec 30 15:15:10 2008 -0800
+
+    (implements #178): extraRecipients in CC not TO
+
+commit fe78fa182ebe0b9c4bf04265fc1ae50c36e0d406
+Author: Chad Metcalf <cmetcalf@archrock.com>
+Date:   Tue Dec 30 15:03:30 2008 -0800
+
+    (addresses #373) Validate emails
+
+commit 97240c6cdd527f5414e98336274e0652368cce3b
+Author: Chad Metcalf <cmetcalf@archrock.com>
+Date:   Tue Dec 30 14:56:37 2008 -0800
+
+    (addresses: #255) rm commands can't use usePTY
+    
+    Just fixes one instance of the problem as discussed in http://buildbot.net/trac/ticket/255
+
+commit a9494007ed2f225b81d3054ebf45cc781fb4878d
+Merge: 6c36579... 529740e...
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Tue Dec 30 17:32:59 2008 -0500
+
+    Merge branch 'bug181'
+
+commit 6c36579a63b58bc986ec56e0272362038be08112
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Wed Nov 19 04:56:38 2008 +0800
+
+    Get rid of git- commands in git_buildbot.
+    
+    Signed-off-by: Dustin J. Mitchell <dustin@zmanda.com>
+
+commit ac70a83fa05c2b1b31dd9411ffc28876fb9e9f20
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Sat Apr 19 08:40:20 2008 +0800
+
+    Send merge changes from git.
+    
+    Signed-off-by: Dustin J. Mitchell <dustin@zmanda.com>
+
+commit 1a1fa349572b9d4bbb2e4b147138bed9691fbf57
+Merge: b2632e1... b9f17e3...
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Tue Dec 30 16:42:26 2008 -0500
+
+    Merge commit 'github/dustin-changes' into dustin
+
+commit b9f17e310430d9841c58be76b2f252ed7a92da47
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Wed Nov 19 04:56:38 2008 +0800
+
+    Get rid of git- commands in git_buildbot.
+    
+    Signed-off-by: Dustin J. Mitchell <dustin@zmanda.com>
+
+commit 7898e903f36b39b9ea20abcfbcaf367e41237476
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Sat Apr 19 08:40:20 2008 +0800
+
+    Send merge changes from git.
+    
+    Signed-off-by: Dustin J. Mitchell <dustin@zmanda.com>
+
+commit 529740e0cb4d8641317397f550fa6cf94f869f90
+Author: Dustin J. Mitchell <dustin@v.igoro.us>
+Date:   Wed Dec 31 04:32:45 2008 +0800
+
+    from paulegan's patch on bug 181
+    
+    Signed-off-by: Dustin J. Mitchell <dustin@cs.uchicago.edu>
+
+commit b2632e170180e071db77b5d82abb4bfbaa7a77f6
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Tue Dec 30 16:02:42 2008 -0500
+
+    Revert "(fixes #277) fix mercurial checkouts with a revision"
+    This reverts commit a9306037e46335ff9c097c5187c0dfb1053c1fa9.
+
+commit 0c76275c417d5e684ba16211fa25c151bc0c1ade
+Author: Dustin J. Mitchell <dustin@v.igoro.us>
+Date:   Wed Dec 31 04:32:45 2008 +0800
+
+    from paulegan's patch on bug 181
+    
+    Signed-off-by: Dustin J. Mitchell <dustin@cs.uchicago.edu>
+
+commit a9306037e46335ff9c097c5187c0dfb1053c1fa9
+Author: Ben Hearsum <bhearsum@mozilla.com>
+Date:   Mon Dec 29 00:32:31 2008 -0500
+
+    (fixes #277) fix mercurial checkouts with a revision
+    (patch fixed by Benjamin Smedberg <bsmedberg@mozilla.com>)
+
+commit fb9fecdf30ea10116a5f73257edff0bbe1c6e0cb
+Author: Igor Slepchin <igor@roundbox.com>
+Date:   Mon Dec 29 00:12:41 2008 -0500
+
+    (refs #315) remove unnecessary loop in MailNotifier
+
+commit 98a9a7e8b0035253ff4d1a7c5f96352ccf10de50
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sat Aug 30 18:16:54 2008 -0400
+
+    (close #179) artificially set $PWD correctly in child environment
+
+commit 9be879f9b48189effc2ee3e956fd9448182e0af0
+Author: Steve "Ashcrow" Milner <smilner@redhat.com>
+Date:   Mon Dec 29 00:02:58 2008 -0500
+
+    (closes #154) allowing for more control over the site object by
+    providing an optional site argument. This allows a person to define
+    their own site object and pass it in rather than using the default one.
+
+commit 4aa4a65aedf3c9269dd59abe2919710c3c36eb57
+Author: Marcus Lindblom <macke@yar.nu>
+Date:   Sun Dec 28 23:57:27 2008 -0500
+
+    (refs #186) Non-throwing key-in-dict checks for Mercurial + use
+    'default' as branch if none set
+
+commit dbf2790433efc82838944a65fd741ed01b8913ac
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Sun Dec 28 23:55:08 2008 -0500
+
+    (refs #186) Mercurial:  Separate clone and update to ensure we end up
+    with the correct revision.
+
+commit a1ea47119b805ab8a681567b3fe8bb7d1639d50b
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Dec 28 22:47:49 2008 -0500
+
+    (closes #317) add a factory.addSteps([..]) method
+
+commit 2c22a9d47fc54444e4757de1cc610c09f820092c
+Author: Neil Hemingway <neil.hemingway@googlemail.com>
+Date:   Fri Sep 26 20:35:28 2008 +0100
+
+    Refs #346; Pick up the correct total number of tests run
+    
+    The "Tests: 999" part of the line reporting the results for each failing
+    test is the number of tests run *by that test*, it is not the total
+    number of tests run by the entire test run.  *That* is reported by the
+    line immediately before the PASS|FAIL line
+
+commit 7438ebd891bff32b500d70f8f92b7720cfe4877a
+Author: Neil Hemingway <neil.hemingway@googlemail.com>
+Date:   Wed Sep 24 22:38:27 2008 +0100
+
+    and tests for #330 and #357
+    
+    this also highlighted that typos aren't going away any time soon
+
+commit 6cc47c1f179a740091c4f0b9058e2a88f3707d06
+Author: Neil Hemingway <neil.hemingway@googlemail.com>
+Date:   Wed Sep 24 21:23:55 2008 +0100
+
+    Resolve #330 and #357 (both trivial changes to the IRC bot)
+
+commit 9ac9609420e013fd96bee2a1f9651799b7abfbc8
+Author: Neil Hemingway <neil.hemingway@googlemail.com>
+Date:   Thu Sep 18 13:30:24 2008 +0100
+
+    Resolve #346
+    
+    Look for output matching the latest version of Test::Harness.  Failing
+    that assume the older version.  Either way, try to pick out the relevant
+    values.
+
+commit 8c7a1cc7d28a45be84e3ed27203d085898444977
+Author: Steve "Ashcrow" Milner <smilner@redhat.com>
+Date:   Sun Dec 28 21:44:35 2008 -0500
+
+    (closes #370) Update setup.py to follow pep8
+
+commit e952c40d2b916e71b1a497d3902bdd1faae6438a
+Author: A. T. Hofkamp <a.t.hofkamp@tue.nl>
+Date:   Sat Dec 6 17:44:18 2008 -0500
+
+    (fixes #313) update documentation for locks
+
+commit fa908fee3f8ceac913646f4133321db998ef27e1
+Author: Ben Hearsum <bhearsum@mozilla.com>
+Date:   Sat Dec 6 17:54:01 2008 -0500
+
+    (closes #100) add ability to specify environment variables at the builder level
new file mode 100644
--- /dev/null
+++ b/ChangeLog-0.7.11
@@ -0,0 +1,1722 @@
+commit 310110318db06fdba7e03239331760b03b93a8b8
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Jul 15 15:26:12 2009 -0400
+
+    inc version number
+
+commit 6a5d73d6be3454709a7647e96739ee7f65610546
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Mon Jul 13 12:28:01 2009 -0400
+
+    add a default value for branchType, per Marcus and Marijn
+
+commit 3208e2b58d8ddf601df980474238fd1ae4642b2e
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Jul 12 20:09:58 2009 -0400
+
+    disable buggy test
+
+commit 66c92bbe78b57af05ccf75fa2f3c7e46c3cbd7de
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Jul 12 10:25:54 2009 -0400
+
+    inc to 0.7.11p1
+
+commit f3aa8c78aba7e0ae1a193b49d44efe158278bc68
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Jul 12 10:25:16 2009 -0400
+
+    remove accidentally merged test change
+
+commit f5400aa136442ad5c2c2faba18d3368190cab319
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Jul 5 16:23:47 2009 -0400
+
+    fix tests to reflect new behavior
+
+commit 6bef012f58925b40bfcb9939732eea2d4ba208c2
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Jul 10 22:49:42 2009 -0400
+
+    new version #
+
+commit 66d20cda094340d4a5dafb9477d5607a92c368de
+Author: Stefan Seefeld <seefeld@sympatico.ca>
+Date:   Fri Jul 10 22:45:50 2009 -0400
+
+    (fixes #582) This patch fixes the test failures by injecting an extractall method into TarFile if not already present.
+
+commit 86c41f28bca73f6e1b81dbaae7bf607eb9501dd4
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Jul 10 22:43:08 2009 -0400
+
+    (refs #585) try adding an __init__.py to see if it fixes RPM builds
+
+commit 494ad2f5299245fd60be969900a48771a703fa68
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu Jul 9 21:34:42 2009 -0400
+
+    fix always-true assertions
+
+commit 94c3fcb398a1db500098fdf134faa47b5e450341
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Jul 8 15:22:54 2009 -0400
+
+    fix typo: getUpstreamScheduler vs findUpstreamScheduler
+
+commit 685cf09a661e62b0e8e7a8d856388646c7ae3e54
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Jul 8 17:33:37 2009 -0400
+
+    update NEWS
+
+commit fed8b33c305a5884991942b9272ba36e89d1460a
+Author: Benjamin Smedberg <benjamin@smedbergs.us>
+Date:   Wed Jul 8 11:53:29 2009 -0400
+
+    (fixes #584) add default value for clobberOnBranchChange
+
+commit ccb20186449e12ba7bcdfe86c8ee380df292b036
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Jul 5 16:19:09 2009 -0400
+
+    fix texinfo typo
+
+commit 0a3e2d5e6f010884716c4bae23fbe624350f77a2
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Sat Jul 4 00:33:29 2009 -0700
+
+    Fix for log URL generation.
+
+commit 1b80f86cdea1b3c271fa7a9be10477a4e6d05ef6
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sat Jul 4 15:45:24 2009 -0400
+
+    next RC
+
+commit e6394ce9445ac49ab85ae1554dbe230da7ffb352
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sat Jul 4 01:16:52 2009 -0400
+
+    inc version #
+
+commit 22461696998e1e7399750a57669028782fb1f6d2
+Author: Sidnei da Silva <sidnei.da.silva@gmail.com>
+Date:   Fri Jul 3 22:43:01 2009 -0400
+
+    close the tarfile before removing it
+
+commit ecab6139b85ed59f61a98be3b12b547f73346f59
+Merge: 9f32d6e 577f998
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Jul 3 22:35:06 2009 -0400
+
+    Merge branch 'newcss' of git://github.com/nsylvain/buildbot
+
+commit 9f32d6e5ef929801655953642bf7cf680491297a
+Merge: e00f34d a312727
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Jul 3 22:34:46 2009 -0400
+
+    Merge branch 'categories' of git://github.com/dustin/buildbot
+
+commit e00f34d00f082d0e6a53d4ea99cf05bccd63f587
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Jul 3 22:34:29 2009 -0400
+
+    version 0.7.11-rc1
+
+commit a312727fbe15b5e6b73b50d9e67aac5c0619422b
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Fri Jul 3 01:14:46 2009 -0700
+
+    Support categories from BzrPoller
+
+commit 6979e585b1df13d3227160e8ac0c963fa319a135
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Wed Jul 1 14:41:44 2009 -0700
+
+    More category filtering.
+
+commit 30db5e0b7b158a8dd96efde38a25db89b5a3313a
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Wed Jul 1 11:08:38 2009 -0700
+
+    Allow git_buildbot to specify a change category.
+
+commit eb5fb01bc8b0fc70234aeda06e40eaba6c85e99a
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Tue Jun 30 13:59:52 2009 -0700
+
+    Add category to builder status.
+
+commit 4066acfdd6477e59b00767c1c5607e4666e15d6d
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Jul 3 17:54:04 2009 -0400
+
+    (refs #35) fix dependent scheduler re-checking: make calculation of upstream lazier
+
+commit 0c97e6e56f2e6c5976afdd8a65f48588b647034a
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Jul 3 17:52:44 2009 -0400
+
+    fix typo, remove outcommented debug stuff
+
+commit 715f729b88f439d02c2d04234856c1fe248c8033
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Fri Jul 3 17:31:57 2009 -0400
+
+    (fixes #489) make got_revision work for perforce builds
+    
+    This only works in the case where a build was attempted under a
+    specific revision, but that is the most common use case at least where I
+    am.
+
+commit c4de4851668847e9235a363f706a2634489e6f28
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Jul 3 17:26:38 2009 -0400
+
+    (closes #493) convert remaining GET form to use POST
+
+commit 1a5ff348ccdabe89618330412d2698030575c811
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Jul 3 15:30:58 2009 -0400
+
+    (refs #318) simplify slave shutdown; doesn't fix dangling reference
+
+commit 4b66939bd836f16455384800771a1b3a7f689658
+Author: Darragh Bailey <dbailey@hp.com>
+Date:   Fri Jul 3 12:45:41 2009 -0400
+
+    (closes #576) use a list comp, not a generator, for py2.3
+
+commit 4403e6c1fe364e6782dc18e1a5861c08974cfdb3
+Author: Darragh Bailey <dbailey@hp.com>
+Date:   Fri Jul 3 12:43:49 2009 -0400
+
+    (closes #575) explicitly import set() on py2.3
+
+commit 02c2d2468842ef6802f41c39bb5b609e0c8ccc20
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Jul 3 12:39:49 2009 -0400
+
+    (closes #574) don't use keyword arguments to List.sort
+
+commit 6a773f6697c398c43d330dfa1e151ed2e5ae4a55
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Jul 3 12:31:15 2009 -0400
+
+    (fixes #573) fix documentation typos
+
+commit 577f99813b8a249323b2e62b5c56b53c1f3c04c9
+Author: Nicolas Sylvain <nsylvain@chromium.org>
+Date:   Thu Jul 2 12:57:22 2009 -0700
+
+    Add a new css file. It is similar to classic.css, but has less bright colors, and
+    does border rounding if the browser supports it. build.chromium.org and build.webkit.org
+    are using a similar css file.
+    
+    Copying this css to public_html/buildbot.css should work.
+
+commit b4f187dc07682d865fdf47edf74ea6604c9327dc
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Jul 1 10:15:42 2009 -0400
+
+    fix Trial step use in sample.cfg and fix texinfo documentation of same to match the docstrings
+
+commit d33d7d884ac6c28bd60fb0d227118744e73d7e44
+Merge: 88d1548 b303acb
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Tue Jun 30 14:36:08 2009 -0400
+
+    Merge branch 'master' of git://github.com/bbangert/buildbot
+
+commit b303acbe73b6f4a61436b4885ffa67df8a4ac2c5
+Author: Ben Bangert <ben@groovie.org>
+Date:   Tue Jun 30 11:22:44 2009 -0700
+
+    Updated xmlrpc patch to address comments
+
+commit 88d15481f17fb61ffa2708836a2dd576ab999a0a
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Tue Jun 30 11:29:09 2009 -0400
+
+    rename old extra_args in commands.py to svn_args to avoid confusion
+
+commit 66d3453b04fae019ce7c19b01b14dcd0dfb2d39c
+Merge: bf4ef54 595160b
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Tue Jun 30 11:17:57 2009 -0400
+
+    Merge branch 'master' of git://github.com/zellyn/buildbot
+
+commit 0fc76a1fca3603a1ac91d5c62eb4ab01a96b6126
+Author: Ben Bangert <ben@groovie.org>
+Date:   Mon Jun 29 20:24:12 2009 -0700
+
+    Updating for custom xmlrpc functions and additional info used for
+    PylonsHQ queries.
+
+commit 595160b9db79b168417fbebbed7e13e920212ab1
+Author: Zellyn Hunter <zhunter@ajc.com>
+Date:   Mon Jun 29 15:34:36 2009 -0400
+
+    added extra_args to SVN docs
+
+commit 68b66bf19ffb2e61716390cfc7f7d25537225312
+Author: Zellyn Hunter <zhunter@ajc.com>
+Date:   Mon Jun 29 15:16:30 2009 -0400
+
+    Added extra_args parameter to SVN buildstep.
+
+commit bf4ef54b4bf47e576953c40b14cb282937c4c3e0
+Author: Nicolas Sylvain <nsylvain@chromium.org>
+Date:   Fri Jun 26 14:20:31 2009 -0700
+
+    Add a new argument to the waterfall page: "failures_only". If this
+    argument is set to True, the waterfall will be showing only the
+    builders that are failing.
+    
+    This is useful when you have many builders and want to monitor
+    only the failures.
+    
+    A builder is "failing" if:
+    - If the last build is not successful, or
+    - A step for the current build(s) failed, or
+    - The builder is offline.
+
+commit 4c4df020732a9acb19451bfa3cff5a4d34f8e241
+Author: Nicolas Sylvain <nsylvain@chromium.org>
+Date:   Wed Jun 24 16:31:06 2009 -0700
+
+    Add a new status resource "BuildStatus" that shows a waterfall-like
+    display of a single build for a single builder. This is to be used
+    by the console view that I am working on. (It appears when you click
+    on a box for a given build.)
+    
+    Example: http://build.chromium.org/buildbot/waterfall/buildstatus?builder=Vista%20Tests&number=8013
+    
+    Also add the documentation, and my name to the CREDITS file.
+
+commit 3a95b1107d23a0baf06f0075319ec6b774291690
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Fri Jun 12 15:14:14 2009 -0400
+
+    Adding tests for changeHorizon parameter
+
+commit 27e0b4426aaed8da386378e1ac4fb287d1311feb
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Fri Jun 12 15:14:08 2009 -0400
+
+    Fixing docs
+
+commit 8efdfd9cd4937d344d34f3e50ebb6dd8c1110b0c
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Fri Jun 12 15:13:54 2009 -0400
+
+    Adding some simple tests
+
+commit b87e59e450b0bffeb64868940c62c170334b9d2a
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Fri Jun 12 14:49:45 2009 -0400
+
+    Adding docs for changeHorizon parameter
+
+commit fe750e3a2c9cdb1fa11da3241363caa7a950d17b
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Fri Jun 12 13:28:34 2009 -0400
+
+    Implement changeHorizon
+
+commit 1890c7ae3b7b4500f6971c53e6b89a1f3cf2ab1f
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Mon Jun 22 12:11:04 2009 -0400
+
+    insert a cross-reference to allowForce to help users find the option
+
+commit 6f7ea917fc5cc3e2d2bdf7aaabdc1c8bf7e0ba8f
+Author: Stefan Seefeld <seefeld@sympatico.ca>
+Date:   Mon Jun 22 11:42:25 2009 -0400
+
+    (closes #577) users can add a 'compress' attribute (either None, 'gz', or 'bz2') to the DirectoryUpload step
+
+commit 635e107e20596b848682a1910591601f6298fac5
+Merge: 42a690c 2932ebd
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Jun 21 15:02:49 2009 -0400
+
+    Merge branch 'master' of git://github.com/geraud/buildbot
+
+commit 2932ebd6c51151f38e78f8c13c72e97594db34b3
+Merge: 33cf574 6b18471
+Author: Geraud Boyer <geraud@sparkle.(none)>
+Date:   Fri Jun 19 18:03:51 2009 -0700
+
+    Merge commit 'djmitche/master'
+
+commit 33cf57462396807e6d9e23c17054651b0f666b46
+Author: Geraud Boyer <geraud@gbox.local>
+Date:   Fri Jun 19 17:43:40 2009 -0700
+
+    fixed typo
+
+commit 42a690c4e2af19cee8e8a7cefd1f09b5cfa906da
+Author: Nicolas Sylvain <nsylvain@google.com>
+Date:   Fri Jun 19 16:07:57 2009 -0700
+
+    Fix mail.py to be backward compatible with python 2.4. In python 2.4 the "x if y else z" syntax is not supported.
+
+commit 6b184718ee9576c0577c4fd9fb8dda7a2edf8754
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Wed Jun 17 21:06:38 2009 -0400
+
+    Fix unicode handling in waterfall
+
+commit b93ff4719b4ea4f8a85bbf3059a6484524c70844
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Jun 12 15:40:25 2009 -0400
+
+    make *horizon update on restart and reconfig
+
+commit 4ff018e9817b63fc901ebf3d0a158f7504d1dee5
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Jun 12 15:18:41 2009 -0400
+
+    add config for the BuilderStatus *Horizon options
+
+commit e05ef33118fb4ac756bc4096369c711b6a57092e
+Merge: 742aa73 75b1b51
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Jun 12 16:21:15 2009 -0400
+
+    Merge branch 'horizonconfig'
+
+commit 75b1b517d07c9d553e992347ed9c158583f62705
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Jun 12 15:40:25 2009 -0400
+
+    make *horizon update on restart and reconfig
+
+commit 742aa73b2e7d5763db89c29e5e74b05f67ca704b
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Jun 12 15:22:13 2009 -0400
+
+    fix typo
+
+commit 40d989095d3fa49f6e81588402736a9a8bd3821e
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Jun 12 15:18:41 2009 -0400
+
+    add config for the BuilderStatus *Horizon options
+
+commit a88fca767b12cfaa72d4a103973308195eb533a2
+Merge: c46e007 2ff2739
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Fri Jun 12 14:13:42 2009 -0400
+
+    Merge branch 'master' of git@github.com:djmitche/buildbot
+
+commit 2ff2739aa936c5d9ef212861111aea1dc1ba01c4
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Jun 12 13:04:49 2009 -0400
+
+    make the 'force build' option a little more obvious
+
+commit d9a3212a9f3eef0ee2aeec7bc8dc1badc8cbf4d5
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Jun 12 12:56:28 2009 -0400
+
+    add para about grid/
+
+commit 8430a9fd113d3184cf07bb69a3e89a57417c5385
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Jun 12 12:53:07 2009 -0400
+
+    point people to buildbot.net, not buildbot.sourceforge.net
+
+commit 9fb4486a4f74085122a6a15b482d66dceb0b9ff9
+Merge: ffd553b c462bf8
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Jun 12 12:34:03 2009 -0400
+
+    Merge branch 'web-improvements' of git://github.com/catlee/buildbot
+
+commit ffd553b859572da55b626570133b84d893cfa887
+Merge: 2f32e15 53075cc
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Jun 12 11:49:01 2009 -0400
+
+    Merge branch 'master' of git://github.com/geraud/buildbot
+
+commit c46e00762df4aa63995f641039b9bdf97ef3243a
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Fri Jun 12 11:09:20 2009 -0400
+
+    Fixing up whitespace
+
+commit 53075cc177b0c442f3714c9762209075c5c03a4f
+Author: Geraud Boyer <geraud@sparkle.(none)>
+Date:   Thu Jun 11 21:46:35 2009 -0700
+
+    Added substantiating state for Latent slaves.
+    The problem is that a booting EC2/Latent instance could be chosen more than once
+    since its state while booting is still latent
+
+commit 2f32e1558d7ad40fbc385c3822059ed88d57089c
+Merge: f826187 6286468
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu Jun 11 20:52:06 2009 -0400
+
+    Merge branch 'master' of git://github.com/geraud/buildbot
+
+commit f8261872a9aecdfef7d5c93f265b0ba2bb4155b1
+Merge: 964bcb3 b4de984
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu Jun 11 20:45:14 2009 -0400
+
+    Merge branch 'master' of git://github.com/bdbaddog/buildbot
+
+commit 964bcb3facf6263ae249a1a25b978bae87086550
+Merge: f857fdb 75e2cf7
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu Jun 11 20:43:41 2009 -0400
+
+    Merge branch 'master' of git://github.com/roder/buildbot
+
+commit 62864685e7a24f2040ce36830867ff56be881b76
+Merge: 92fb825 f857fdb
+Author: Geraud Boyer <geraud@gbox.local>
+Date:   Thu Jun 11 13:27:02 2009 -0700
+
+    Merge commit 'djmitche/master'
+
+commit 92fb825b799245e7f39d412e5343805446465917
+Merge: fe39c5f b7d66f0
+Author: Geraud Boyer <geraud@gbox.local>
+Date:   Thu Jun 11 13:18:07 2009 -0700
+
+    Merge commit 'mirkoboehm/master'
+
+commit f857fdb82ba9af3d095d4acd3c95c7f629464fb0
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Wed Jun 10 19:54:34 2009 -0400
+
+    If allowForce is False, don't allow graceful shutdowns
+
+commit b4de984bb8a0c5db5d1aa01f826692c266bb6789
+Author: William Deegan <bdbaddog@gmail.com>
+Date:   Sun Jun 7 19:20:52 2009 -0700
+
+    More changes for cvs checkout_options
+
+commit acd56acd7dbfebf1aa0f28f78b6942f2ac6ca3b8
+Author: William Deegan <bdbaddog@gmail.com>
+Date:   Sun Jun 7 18:48:31 2009 -0700
+
+    Add checkout_options argument to CVS build step.
+    This will allow adding cvs checkout specific arguments.
+    This is needed to add -N to the cvs checkout command line when the user has a cvs module alias.
+
+commit 75e2cf7ce75c6b3ff9e9f138175311ccd9c22360
+Author: Matt Heitzenroder <mheitzenroder@gmail.com>
+Date:   Fri Jun 5 19:19:16 2009 -0400
+
+    switched from subprocess to commands, added logging
+
+commit c462bf85fc86c1710c23026231f56deb90b317f3
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Fri Jun 5 16:58:06 2009 -0400
+
+    Distinguish between requests being removed because they've been started,
+    and requests being removed because they've been cancelled.
+    
+    Create a new function on the status plugin that receive the
+    requestCancelled notification.
+
+commit 76f4ebd3dbafb9231cc435fb93b962c862aa7922
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Tue Jun 2 12:40:10 2009 -0400
+
+    Return a "No Resource" page if requesting to view a non-existent slave
+
+commit b9d93c391369d24f6bb36b3d17075c80dd45bb97
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Tue Jun 2 12:31:29 2009 -0400
+
+    Adding a "Cancel All" button for pending builds
+
+commit 2f44d5d3129070aa212feea0aca24636405f9478
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Tue Jun 2 12:21:37 2009 -0400
+
+    Add reload= support to one_line_per_build page
+
+commit ab7716e4387e116eaecd5c39b1309f756607943d
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Fri May 29 13:16:33 2009 -0400
+
+    Fix up current build display on per-slave page.
+    
+    Also rename 'builds' parameter to 'numbuilds' to be similar to other
+    pages
+
+commit 0dffaf24e05429b18dce168e83ff9b716a08b259
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Fri May 22 22:29:02 2009 -0400
+
+    Punting on BuildRequestControl.subscribe/unsubscribe
+
+commit cd93b20f3dbf847de08d06bd2ddf0b071a4d54ba
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Fri May 22 22:19:16 2009 -0400
+
+    Clean up display of pending builds with changes
+
+commit d4da984c0cb18adebee5e52624b4dcce3b7c316e
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Fri May 22 22:09:14 2009 -0400
+
+    Adding support for cancelling pending build requests
+
+commit 6acb528c1ca5a3aa44a5b5e2b7c130f865a88063
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Fri May 22 17:48:42 2009 -0400
+
+    Add elapsed time for incomplete steps and builds
+
+commit a5dbadf03862d2f399b654a8309acecdc68df3a2
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Tue Apr 7 11:26:15 2009 -0400
+
+    Web page tweaks
+    
+    - Don't throw an exception when trying to stop an already stopped build
+    
+    - Display pending builds on builder pages
+    
+    - Show Stop Build button on buildslave page
+
+commit 2f1b0744c724b91f7abf77847163acb270c72b93
+Merge: c13c9e8 3b99ed9
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Jun 5 13:44:20 2009 -0400
+
+    Merge branch 'master' of git://github.com/roder/buildbot
+
+commit c13c9e886a0db3af60ce612d1241ed17629c87a7
+Merge: cc53ddf b7d66f0
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Jun 5 13:42:28 2009 -0400
+
+    Merge branch 'master' of git://github.com/mirkoboehm/buildbot
+
+commit b7d66f05e55ff26ca5735fcded4df03a18820d9f
+Author: Mirko Boehm <mirko@celeron-400.(none)>
+Date:   Fri Jun 5 15:31:55 2009 +0200
+
+    - path for the undefined global variable in web/builder.py
+
+commit fe39c5fd5f0d4af2078638766d7384f9dea98ad5
+Author: Geraud Boyer <geraud@gbox.local>
+Date:   Thu Jun 4 15:45:32 2009 -0700
+
+    Added user_param as a param for an EC2LatentSlave
+
+commit 3b99ed96e13a0d7aa8480ef8bd00cd196a77054f
+Author: Matt Heitzenroder <mheitzenroder@gmail.com>
+Date:   Thu Jun 4 09:28:11 2009 -0400
+
+    added remote & branch to the pull
+
+commit cc53ddf043cad572b0451e9e4a8eb11877bbd092
+Author: Kristian Nielsen <knmeister@gmail.com>
+Date:   Thu Jun 4 10:50:28 2009 +0200
+
+    Fix reloading of configuration file with new mail change sources.
+    
+    Some significant object attributes were not being compared, causing
+    reload to not realise that the new config contained changed change
+    sources.
+
+commit 2cf869b3c96e8c0394047e599d3137232e938f05
+Merge: b19e6c5 8b4388b
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Jun 3 17:01:41 2009 -0400
+
+    Merge branch 'myfixes' of git://github.com/mlyle/buildbot
+
+commit 8b4388b198e63007478a050022722dfd18ef4bf9
+Author: Michael Lyle <mlyle@translattice.com>
+Date:   Wed Jun 3 12:45:42 2009 -0700
+
+    Add appropriate documentation for the revlinktmpl parameter to svnpoller. -mpl
+
+commit b19e6c5c16b73ae7cbe550578f9520b595722c64
+Merge: f6b012f 9ae29f5
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Jun 3 12:28:19 2009 -0400
+
+    Merge branch 'master' of git://github.com/roder/buildbot
+
+commit 9ae29f5c22bc6b49998881155f09ffba53913fb5
+Author: Matt Heitzenroder <mheitzenroder@gmail.com>
+Date:   Wed Jun 3 12:04:40 2009 -0400
+
+    changed payload from an object property to an parameter for process_change()
+
+commit f6b012ffc2f49b43780470904aacfe530f102c59
+Merge: 0d0a8fc 790577a
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Jun 3 02:53:37 2009 -0400
+
+    Merge branch 'myfixes' of git://github.com/mlyle/buildbot
+
+commit 790577a52823299e605c2de924f8354fa6509945
+Author: Michael Lyle <mlyle@translattice.com>
+Date:   Tue Jun 2 23:32:11 2009 -0700
+
+    Add infrastructure so that revisions may have an associated URL, that displays
+    in the web interface and elsewhere.  This is so buildbot can integrate against
+    things like websvn which present very nice views of changes in a revision.
+    
+    1) Update changes.py constructor to take a revlink string -- containing an
+    url to a webpage for the revision.
+    2) Update changes.py HTML generation to link that from where revision numbers
+    occur; also was careful so that if past objects exist without that property
+    everything remains OK.
+    3) Update svnpoller to take a revision link template-- a pattern to build
+    URLs for specific revisions when creating new changes.
+    
+    -mpl
+
+commit 0d0a8fc9c7b7267b4adf346ade973949b3cfdc99
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Jun 3 02:14:19 2009 -0400
+
+    refs #552 - detect 'http:' prefix in create-slave invocation and fail
+
+commit 0839deb2dd349f7df172524900bff672f83c704d
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Jun 3 02:07:58 2009 -0400
+
+    (refs #499) make testNightly more resilient to DST funniness
+
+commit b9cf37ec576a54e0611958b363bda2c4cdd168c1
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Jun 3 02:04:05 2009 -0400
+
+    fixes #493 - use POST method; thanks to Minesh Patel (mpatel20 on SourceForge)
+
+commit 82fec61ffbab69a154f5c10b55255da595ec9f5e
+Merge: e8f292b f0b1311
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Jun 3 01:54:00 2009 -0400
+
+    Merge branch 'master' of git://github.com/adamv/buildbot
+
+commit e8f292ba89fba6fb1731a1bb33aa5fb62e6ac829
+Author: Jose Dapena Paz <jdapena@igalia.com>
+Date:   Wed Jun 3 01:49:10 2009 -0400
+
+    (refs #476) Add a link in builder view to get the waterfall view of just one builder
+
+commit f5ad08fab97bd3f3ea17654f6a81b363238e8bf0
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Jun 3 01:45:17 2009 -0400
+
+    (refs #475) automatically create workdir if it doesn't exist
+
+commit f0b1311801a1c5c7b7caefeb6d4933425b7f10ef
+Author: Adam Vandenberg <flangy@gmail.com>
+Date:   Mon Jun 1 15:20:42 2009 -0700
+
+    Fix p4poller import in sample code.
+
+commit f16742cfd7a9255ce4364adee7579748eaaaabb5
+Author: Matt Heitzenroder <mheitzenroder@gmail.com>
+Date:   Sat May 30 15:00:39 2009 -0400
+
+    Added service for github's post-receive service hook
+
+commit 259012aed1f94213e398823173bb5816f9d10937
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed May 27 10:39:29 2009 -0400
+
+    remove .stgit-edit.txt and add it to .gitignore
+
+commit 0cae8a1711aa153ac7e0b226ea742333a540aaec
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Wed May 27 11:48:34 2009 -0400
+
+    Fixing bad identation from 77ca3ff84ffc8a2f40d060ef628984e1b684cffe
+
+commit fae36ba27d5262cf6bc6a099e80a6bde2ac067a8
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Tue May 26 17:41:44 2009 -0400
+
+    Preserve unicode strings in commands
+
+commit e6b00e9cc02e0bd797b0cc0f37847435acc62326
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Mon May 25 07:38:29 2009 -0400
+
+    Force commands to be composed of strings.
+    
+    Fixes: #569
+
+commit a421d38875b41e38d9a7a976235d80a1e9cd2415
+Author: Marcus Lindblom <macke@yar.nu>
+Date:   Mon May 25 21:27:41 2009 +0200
+
+    Fixes #267. Add 'change' mode to MailNotifier to notify on all build status changes
+
+commit 77ca3ff84ffc8a2f40d060ef628984e1b684cffe
+Author: Stefan Seefeld <seefeld@sympatico.ca>
+Date:   Sun May 24 22:09:00 2009 -0400
+
+    (refs #557, #559) use tarfile to upload multiple files from the master
+
+commit 900816e30f37199019e83a0247b9bb957367b853
+Author: Kristian Nielsen <knmeister@gmail.com>
+Date:   Sat May 23 07:25:57 2009 +0200
+
+    Add the missing sample test emails for the testing of class
+    BzrLaunchpadEmailMaildirSource.
+
+commit 6cd1fc4528c562ea7c0a542c8f3fe029acb9b88d
+Merge: 99fec93 530c657
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri May 22 17:36:32 2009 -0400
+
+    Merge branch 'myfixes' of git://github.com/cpeyer/buildbot
+
+commit 530c65792e6b4dbea952b936c952ed7216bfcfd5
+Author: Chris Peyer <cpeyer@adobe.com>
+Date:   Fri May 22 14:12:16 2009 -0700
+
+    Fix "TypeError: cannot concatenate 'str' and 'NoneType' objects" error when repourl is None and branch is None.
+
+commit c389208618ca4eb026cf3b3d7c9c87859bb86ca1
+Author: Chris Peyer <cpeyer@adobe.com>
+Date:   Fri May 22 14:00:06 2009 -0700
+
+    When dealing with multiple changes, set the branch and revision to the last change in the tuple instead of the first in case the changes are from different branches.
+
+commit 99fec93331026348dda885a36ac0364807051d65
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri May 22 16:59:24 2009 -0400
+
+    don't fail when launchpad emails are missing (like they are now)
+
+commit a121e67925839023eb8f93ad0b75307d6c1a3be6
+Merge: 9b4ede2 3896d0c
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri May 22 16:55:31 2009 -0400
+
+    Merge branch 'bzr_launchpad_mail' of git://github.com/knielsen/buildbot
+
+commit 9b4ede2f3f646323b9f5723f5a10b23b1031685b
+Merge: e60bc33 fb62037
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri May 22 16:51:59 2009 -0400
+
+    Merge branch 'myfixes' of git://github.com/adamac/buildbot
+
+commit e60bc33375c876a8526797aad528d7eb98c7865e
+Author: Nicolas Sylvain <nsylvain@chromium.org>
+Date:   Fri May 22 16:47:34 2009 -0400
+
+    (fixes #560) chromium patch to show step times
+
+commit b1fbfff9ac8d413ffb538384be03468dd8d6b7e8
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri May 22 16:41:14 2009 -0400
+
+    whitespace fix
+
+commit 52d1ccc30d25f28051f3724e0ab49ebc6757f44c
+Author: William Siegrist <wsiegrist@apple.com>
+Date:   Fri May 22 16:34:38 2009 -0400
+
+    Add support for logfiles to contain dicts with the follow option
+    
+    Enable LogFileWatcher to "follow" only logfile entries added during
+    a buildstep's execution, ignoring previous contents.
+
+commit bad05d51ce35c54b850c9222fb8597d2d5edd01e
+Author: Neil Hemingway <neil.hemingway@greyhavens.org.uk>
+Date:   Fri May 22 21:30:04 2009 +0100
+
+    getResults can return 5 differen status(es).  Resolves #567
+
+commit 0d445057e07937e1aa8f8a0719d11f622b333e77
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri May 22 14:21:32 2009 -0400
+
+    don't kill a non-integer pid
+
+commit eee8d5cce2991d535d12eb5703537774d4c88a0e
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Tue May 19 21:57:52 2009 -0400
+
+    Revert "xmlrpc_getLastBuilds now returns the correct number of builds when the current build is not finished."
+    
+    This reverts commit eb6c3a4b37cddd175fe2843ebe4013216939e4af.
+
+commit fb62037664ffc91145a2e7b3108493d60eb1fbd0
+Author: adam <adam@adams-macbook.local>
+Date:   Tue May 19 16:14:36 2009 -0700
+
+    xmlrpc_getLastBuilds now returns the correct number of builds when the current build is not finished.
+
+commit c6bffbce006177310930756c97a711fe116555e5
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Tue May 19 11:54:57 2009 -0400
+
+    include docs/Makefile in the source dist
+
+commit eb6c3a4b37cddd175fe2843ebe4013216939e4af
+Author: adamac <amacbeth@gmail.com>
+Date:   Mon May 18 21:41:23 2009 -0700
+
+    xmlrpc_getLastBuilds now returns the correct number of builds when the current build is not finished.
+
+commit 2c197929544210b7e88ccf92234f66a87b02c45b
+Author: Ben Hearsum <bhearsum@bitters-2.local>
+Date:   Tue May 19 10:29:29 2009 -0400
+
+    Properly iterate throw MailNotifier's extraHeaders dict.
+
+commit 3896d0c64af6c2b9758d9ad13c5b9f008f9425ae
+Author: Kristian Nielsen <knmeister@gmail.com>
+Date:   Tue May 19 16:07:06 2009 +0200
+
+    Implement class BzrLaunchpadEmailMaildirSource
+    
+    This is a change source that picks up changes from email subscriptions
+    to Launchpad-hosted bzr branches.
+
+commit 617bc8d4f4aa1eddd750c3ada0dee8068c4ed717
+Author: adamac <amacbeth@gmail.com>
+Date:   Mon May 18 21:41:23 2009 -0700
+
+    xmlrpc_getLastBuilds now returns the correct number of builds when the current build is not finished.
+
+commit 483a6043ed2cab2436009eeb7465269b7a48e65f
+Author: Marcus Lindblom <macke@yar.nu>
+Date:   Sun May 17 11:19:38 2009 +0200
+
+    See #446. Mercurial should clone to specific rev when in clobber and dirname-branch mode
+
+commit f120bbacc35d6cec11e96a2307b852d412fcbcd4
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Fri May 15 07:38:09 2009 -0400
+
+    Fix logging calls from build prioritization code.
+    
+    Was using log.err(None, "message...") to log exceptions.  Older versions
+    of twisted do not support this, so switched to use this format:
+    
+        log.msg("message...")
+        log.err(Failure())
+
+commit 9b228778b5fe57d537b07ce31a966472f3c63400
+Merge: 003c6fd 56f439b
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu May 14 14:23:52 2009 -0400
+
+    Merge branch 'bzr_puller_fix' of git://github.com/knielsen/buildbot
+
+commit 56f439b542f00e223e3c5dacdf941c0ac03f602f
+Author: Kristian Nielsen <knmeister@gmail.com>
+Date:   Thu May 14 19:35:38 2009 +0200
+
+    Fix two bugs in the BzrPoller:
+    
+     - When re-loading a configuration file where an extra BzrPoller is added,
+       there was a race condition that would cause the poller to run before
+       initialisation was done, causing an exception and failing to add the
+       new poller.
+    
+     - When specifying an explicit branch name for the BzrPoller, it used
+       the wrong branch name when looking at old revisions during restart,
+       causing it to think that the tip of every branch was new and consequently
+       re-build every branch at every restart (the code for when branch_name is
+       specified as SHORT also looks wrong, but is not fixed in this commit. I
+       don't know if everyone uses SHORT anywat).
+
+commit 003c6fd89c54f4fc0090c25dbcb531e663eec97d
+Merge: fd2ed11 cc98611
+Author: Ben Hearsum <bhearsum@bitters-2.local>
+Date:   Thu May 14 11:00:40 2009 -0400
+
+    Merge branch 'master' of git@github.com:djmitche/buildbot
+
+commit fd2ed117457bca374b23a7232c7cf40f1761b15a
+Author: Ben Hearsum <bhearsum@bitters-2.local>
+Date:   Thu May 14 10:58:54 2009 -0400
+
+    Adding extraHeaders parameter to MailNotifier
+
+commit cc98611d9416da0116844aa9dd0a81f340097245
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Sat May 9 18:05:04 2009 -0400
+
+    Adding docs for hook functions
+
+commit 44376b8a91241d1b780fb1ffc5fc56fcc09fefa3
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Sat May 9 18:04:51 2009 -0400
+
+    Handle returning None from nextBuild
+
+commit 9158117ce62e0d9a4e7c4008fc7c14969b5755f5
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Sat May 9 11:34:04 2009 -0400
+
+    doc fixes
+
+commit 8850f0b18f22b34a9b225cd0af4c7a984a4c03d1
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Sat May 9 01:25:52 2009 -0400
+
+    Adding test cases for slave, build, and builder ordering
+
+commit a29752ca27f3ba173baf9587ce3f2bf75ec1e96b
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Fri May 8 23:44:49 2009 -0400
+
+    Change builderOrder to prioritizeBuilders
+    
+    Hooks are now called with extra information like the builder object or
+    buildmaster.
+    
+    Hooks are now updated after a reconfig
+
+commit 69f4453c8d9d67cd31284bf5027f6b99b701818c
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Fri May 8 22:12:31 2009 -0400
+
+    verify that nextSlave is callable
+
+commit 5ac41cb19956bf3501cab5d57ff125658dfa89b4
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Fri May 8 22:09:25 2009 -0400
+
+    Wrapping call to nextSlave in try..excep
+
+commit 5f34b27bca07d3e3da4d2da8c490df611399dd42
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Wed Apr 22 10:50:22 2009 -0400
+
+    Updating function names again
+
+commit 48fd23dbb0aa02e1db6030fc221c3664383c565d
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Thu Mar 19 07:52:51 2009 -0400
+
+    Adding functions to allow modification of slave selection,
+    builder order, and build request ordering
+
+commit 2e6199f0ba5fd1eedf6c2d8e4efae51d9c17a6f4
+Author: Rene Müller <rene@spiwi.tracetronic.de>
+Date:   Fri May 8 16:02:30 2009 +0200
+
+    fix wrong import in example (refs #487)
+
+commit 163a3fad119dd6076e24d2af0afcedd0c023777d
+Merge: 4056797 d175036
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed May 6 09:26:28 2009 -0400
+
+    Merge branch 'transposed_grid' of git://github.com/jkugler/buildbot
+
+commit d175036fa3800901a4c1fd5e1c759a82e339a810
+Author: Joshua Kugler <joshua@eeinternet.com>
+Date:   Tue May 5 20:19:10 2009 -0800
+
+    Backed out changes to build_td (no "extra")
+    tgrid no longer uses "extra" in build_td
+    Added some doc strings to baseweb.py
+    Added link to tgrid in index.html
+    Added docs about grid and tgrid in buildbot.texinfo
+
+commit 40567976ba4b8795379ced23496975d850fed03f
+Author: Kristian Nielsen <knmeister@gmail.com>
+Date:   Thu Apr 30 15:26:04 2009 +0200
+
+    Improvements for the Bzr Source step.
+    
+    Add option `forceSharedRepository' to make slave call `bzr init-repo .'
+    if needed. Also add test case and documentation.
+    
+    Show the actual branch name for checkout rather than the somewhat
+    unhelpful '[branch]'.
+
+commit 1a256392eeda443ebcc53508c9f7764071e90cb7
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Mon May 4 09:36:18 2009 -0400
+
+    (refs #559) split pathnames using str.split, rather than os.path.split
+
+commit e3abd0739af2408d676817f6d5b091ee5a4d49dd
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Tue Apr 7 16:14:27 2009 -0400
+
+    (refs #342) partial fix
+
+commit 5223ea4a44b68cdf009dc78810e2023ee9488007
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sat May 2 17:33:36 2009 -0400
+
+    (refs #544) support copy_properties for Trigger steps
+
+commit 248f9915533b7929db15028ddf98435ccdf1115d
+Merge: 522e103 fcd89df
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun May 3 23:42:53 2009 -0400
+
+    Merge branch 'bug559' of git://github.com/marcusl/buildbot
+
+commit 522e103fa10ddf969a7a766582bfda3a4ed0ebe9
+Author: Andrew Straw <strawman@astraw.com>
+Date:   Mon Apr 27 01:25:20 2009 +0000
+
+    implement support for git submodules
+
+commit f5406cd30b939799581d38838d3cfe3998d261d0
+Merge: 84ee95a 7fa87aa
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun May 3 23:24:16 2009 -0400
+
+    Merge branch 'auth'
+
+commit 7fa87aa3f53f85ce3c038e24f1918f6e3f51b81c
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun May 3 23:23:53 2009 -0400
+
+    Auth: cleanup typos, add an 'authfail' page and redirect to it on failure
+
+commit 84ee95a47f56fdd4eb5b4348bb724bf5ec5f1f43
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sat May 2 19:49:13 2009 -0400
+
+    don't assume change.revision is an integer in buildbot/scheduler.py (thanks to Darragh Bailey and Andrew Lawrence)
+
+commit aa64ff3b96139f401da893379be1ee5eb9384d94
+Author: Quentin Raynaud <buildbot@undoso.eu>
+Date:   Sat May 2 19:46:06 2009 -0400
+
+    (refs #456) don't set PWD on msys
+
+commit 997609d3e3373d56f74b9b6ea06864a616f674c2
+Author: Chris Rivera <chrismrivera@gmail.com>
+Date:   Sat May 2 19:41:52 2009 -0400
+
+    use a dictionary to count steps, and impose no artificial upper limit on the number of steps with the same name
+
+commit 19fcf45c60d3058b2ed3688d78f33979ba9fe001
+Author: Joshua Kugler <jkugler@hosanna.kugler.localdomain>
+Date:   Wed Apr 29 12:34:35 2009 -0800
+
+    Further work on a transposed grid
+    I think it's done
+
+commit fcd89df102ccb16bb7862a23bc116788fd3b8558
+Author: marcusl <macke@yar.nu>
+Date:   Wed Apr 29 22:15:11 2009 +0200
+
+    Send filenames as list of path components. (See #579)
+
+commit be8104c5d979fce8c9cee0bc178e6eed9b982297
+Author: Joshua Kugler <jkugler@hosanna.kugler.localdomain>
+Date:   Tue Apr 28 13:57:03 2009 -0800
+
+    Fixed tabs in commands.py
+    Also removed some trailing spaces, since my editor does that automatically
+    See #558
+
+commit 8763836af826d2190814c2b196c2bbb2d5015cc4
+Author: Joshua Kugler <joshua@eeinternet.com>
+Date:   Tue Apr 28 13:33:02 2009 -0800
+
+    Initial file reorganization for TransposedGrid
+
+commit 45cebb3c0e3f3bf870c3393d827c3da946836d17
+Merge: 82cbf2c 951a6e2
+Author: Doug Goldstein <cardoe@gentoo.org>
+Date:   Tue Apr 28 12:27:47 2009 -0500
+
+    Merge branch 'master' of git://github.com/djmitche/buildbot
+
+commit 951a6e2d234b4999aee0070bcfe20c83a38ace6f
+Author: Matt Heitzenroder <mheitzenroder@gmail.com>
+Date:   Mon Apr 27 22:50:00 2009 -0400
+
+    Added  a sample configuration to enabled Force Build in the Web UI for clarification
+
+commit 2886b61d2c98533c9c777bb057db7dfe9373ce0f
+Merge: 18cea84 688a92d
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu Apr 23 09:39:02 2009 -0400
+
+    Merge branch 'custommessage-properties' of git://github.com/catlee/buildbot
+
+commit 18cea847214963d948e354041fb7c2f48fe5a06a
+Author: Mikael Lind <elemel@elemel.se>
+Date:   Wed Apr 22 22:32:28 2009 +0200
+
+    additional buildmaster@buildmaster fallback for feed GUIDs
+
+commit 8d0acfdd88e5ef0ce8bd5cdf5ad443f467b5d6cd
+Author: Mikael Lind <elemel@elemel.se>
+Date:   Wed Apr 22 21:37:07 2009 +0200
+
+    environment variable fallbacks for feeds on Windows
+
+commit 688a92df2c5b1dd274ea3d3d2588f0c17bed5bfa
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Wed Apr 22 10:50:45 2009 -0400
+
+    Adding buildProperties to custom message attributes
+
+commit d0585c63a52e279846b8201dbbee2400e7f7e73d
+Merge: ee22333 36c6687
+Author: Neil Hemingway <neil.hemingway@greyhavens.org.uk>
+Date:   Thu Apr 16 20:38:22 2009 +0100
+
+    Merge branch 'master' of git@github.com:djmitche/buildbot
+
+commit ee223330da4726815ebc755a92bf2d77bf97f567
+Author: Neil Hemingway <neil.hemingway@greyhavens.org.uk>
+Date:   Thu Apr 16 20:35:01 2009 +0100
+
+    Resolve #445
+    
+        self.notify_for('started')
+    
+    is *not* equivalent to
+    
+        not self.notify_for(list of all other states)
+    
+    (what happens if notification is on for started *and* finished?)
+
+commit 36c66875e8f47d64c1a6b07fda84da1214ef9671
+Merge: 850a5bd 6c11817
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Wed Apr 15 16:38:14 2009 -0400
+
+    Merge branch 'master' of git://github.com/djmitche/buildbot
+
+commit 850a5bd6e449c2a9d4fd52309450e348676fb467
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Wed Apr 15 16:37:13 2009 -0400
+
+    Don't copy twistd log files when doing checkconfig
+
+commit 6c11817c330833d76e0202e45acc69973ab28839
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sat Apr 11 17:42:42 2009 -0400
+
+    remove decorators, sorted()
+
+commit 6be58d751a9903766f54000b7a96fa01d691da0c
+Merge: 3ab25cd 4caa96a
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Mon Apr 13 14:44:55 2009 -0400
+
+    Merge branch 'master' of git://github.com/dustin/buildbot
+
+commit 4caa96ac83982a2444b7deb33a7bb00ade14f3bf
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Thu Mar 26 11:32:52 2009 -0700
+
+    Always clean the source tree before doing a fetch.
+    
+    Trying to be too fancy about when to clean the tree leaves us with a
+    dirty tree sometimes.
+    
+    If someone wants to conditionally *not* have a clean tree when doing a
+    build, that's probably a good time for a configuration parameter.
+
+commit 3ab25cdcbc3c1a4f98e6c480891d660d40381ac3
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Apr 12 13:52:22 2009 -0400
+
+    (refs #547) give defer.fail an error message
+
+commit 830cb403ad59dff5da6102000827f90349dbfedd
+Author: Jason Hoos <jason.hoos@syclo.com>
+Date:   Sun Apr 12 13:39:41 2009 -0400
+
+    (refs #428) add doStepIf parameter to buildsteps
+
+commit 1a7e940d249dd91f270e0ce311426819d5dfe90e
+Author: marcusl <macke@yar.nu>
+Date:   Sun Apr 12 14:36:09 2009 +0200
+
+    Don't use cmd.exe when executing other exes. Fixes CVS tests on Windows
+
+commit d6c3c6eb84e071aea6fd44491fb2fa58faa9652e
+Author: marcusl <macke@yar.nu>
+Date:   Sun Apr 12 14:35:33 2009 +0200
+
+    See #483: Fix date-format recognition on Windows + use dovc
+
+commit 29af5a3428fcf05ae7cfcfbfb3ff33311911665a
+Author: marcusl <macke@yar.nu>
+Date:   Sun Apr 12 13:24:17 2009 +0200
+
+    Fixes #479. Fix tests on Windows: CVS version detection and directory creation
+
+commit fdf95c643bb7046462562e912595395660cfabf1
+Author: marcusl <macke@yar.nu>
+Date:   Sun Apr 12 12:50:03 2009 +0200
+
+    Fix Mercurial repo-URL check on file:// URLs on Windows
+
+commit 5b5e0f468d4719bdefd36f9dbc80a6e26f15fcc4
+Merge: 9e26de7 71d7032
+Author: marcusl <macke@yar.nu>
+Date:   Sun Apr 12 11:21:04 2009 +0200
+
+    Merge commit 'catlee/sendchange-when'
+
+commit 9e26de736ffe396d0fcaf544dbbc81baecbd2a0d
+Merge: 941aac0 33f5d24
+Author: marcusl <macke@yar.nu>
+Date:   Fri Apr 10 18:20:09 2009 +0200
+
+    Merge commit 'catlee/build-priority'
+
+commit 941aac05ad9e9b8cd2df954d35007f175b341dc5
+Author: Ben Hearsum <bhearsum@bitters-2.local>
+Date:   Thu Apr 9 17:10:23 2009 -0400
+
+    Fix transfer steps to handle subclasses returning SKIPPED in start()
+
+commit 2cda2ea9435e9df31d58aaa00c953e03da1426fc
+Author: Ben Hearsum <bhearsum@bitters-2.local>
+Date:   Thu Apr 9 17:10:08 2009 -0400
+
+    Fix transfer steps to handle subclasses returning SKIPPED in start()
+
+commit d9d8dc9115478fbba318e35ac300d87ef3021c9d
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Tue Apr 7 01:50:03 2009 -0400
+
+    fix failure to purge build 0
+
+commit 82cbf2cea97455c39590b2dc6dc0c2a6cca08e44
+Author: Doug Goldstein <cardoe@gentoo.org>
+Date:   Mon Apr 6 17:17:10 2009 -0500
+
+    Support .htpasswd files for authentication
+    
+    Add support for .htpasswd files for authentication
+    
+    Signed-off-by: Doug Goldstein <cardoe@gentoo.org>
+
+commit d2d70510123419edee648867f6db9da23eaef16f
+Author: Doug Goldstein <cardoe@gentoo.org>
+Date:   Mon Apr 6 10:31:03 2009 -0500
+
+    Password protect option to force build and stop forms.
+    
+    Provides a method to require authentication for the force build, stop
+    build, and rebuild forms.
+    
+    This patch is based on the patch by tsuna available at
+    http://buildbot.net/trac/ticket/138
+    
+    Signed-off-by: Doug Goldstein <cardoe@gentoo.org>
+
+commit 10b964ccfeb90e55a87b9b0db36bf45c23832a45
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Thu Mar 26 11:23:36 2009 -0700
+
+    Git source dirs are always updatable when they have a .git
+    
+    Since we're doing cleans and hard resets, the tree can always be
+    placed into a pristine state, so we don't care if we've patched it.
+    Everything goes.
+
+commit c9e362a8ebc8c6bb810b0b8db08553f7176992f2
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Thu Mar 26 10:48:51 2009 -0700
+
+    Add -x to git clean.
+    
+    -x removes all build artifacts that are specifically ignored, thus
+    required for returning a tree to its pristine state.
+
+commit 33f5d243e239aeb7464cc389a8b047fc0f1a019f
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Sat Apr 4 14:51:34 2009 -0400
+
+    Fix build prioritization when new slaves connect
+    
+    Builds weren't being assigned to newly connected slaves in FIFO order.
+    Instead, the slave would be assigned a pending build from whichever
+    builder it was attached to first.
+    
+    This patch fixes that problem by calling the botmaster's
+    maybeStartAllBuilds method after the slave has been connected to all its
+    builders.
+    
+    The test case for build prioritization has also been updated to test for
+    this.
+
+commit 71d703250a712b159e491f4b06e8b32d86650e81
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Wed Apr 1 15:01:31 2009 -0400
+
+    Add support for setting 'when' attribute for changes via sendchange
+
+commit 0ab7da979c507fdc2af7f6345f68ec4d8371941c
+Author: marcusl <macke@yar.nu>
+Date:   Tue Mar 31 20:49:46 2009 +0200
+
+    (see #444) Fix small typo in docs
+
+commit 0e9a78a0fe5fde0857bb376df91f567df6a726bb
+Author: marcusl <macke@yar.nu>
+Date:   Tue Mar 31 18:47:01 2009 +0200
+
+    (fixes #444) Added docs for new arguments to Mercurial source step
+
+commit 0dce6389260b98080850b8a243cff27dfbff1fd4
+Author: Brian Warner <warner@lothar.com>
+Date:   Mon Mar 30 22:34:46 2009 -0500
+
+    test_limitlogs: fix SIGCHLD warning, change quotes to upset editors less
+
+commit 79596ce42a5fd37c75b077d10700d252608c1bae
+Merge: dadadea 2410d7d
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Mon Mar 30 23:25:54 2009 -0400
+
+    Merge branch 'bug443'
+
+commit 2410d7d9360bb2d0a5b15621825c4c39f84d143c
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Mon Mar 30 23:25:33 2009 -0400
+
+    (refs #443) fix deprecations in tests with Twisted-8.2.0
+
+commit dadadea7a9c480302cc4b8db25e71ed4bf75bf6b
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Mon Mar 30 22:42:11 2009 -0400
+
+    remove spurious 'print'
+
+commit d9175aa037edc16d634191a00119601f3c1f1895
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Mon Mar 30 21:24:15 2009 -0400
+
+    remove __name__ == __main__ from checkconfig.py
+
+commit 176ee2f9bd8e477cf559fdf29f8e094b94f488bf
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Mon Mar 30 21:03:42 2009 -0400
+
+    (refs #463) checkconfig should take either a dir or a config file
+
+commit d0bd9feb2645fa26ef9a53539aa3af7e1d5f4509
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Mon Mar 30 21:42:51 2009 -0400
+
+    (refs #453) send a revision only for the last change from
+    darcs_buildbot.py, but put it in the right format
+
+commit 0b8cdb4ec994588182d250876778831fb82ba0d1
+Merge: 59e5802 f73e0ad
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Mon Mar 30 22:13:47 2009 -0400
+
+    Merge branch 'bug347' of git://github.com/dwlocks/buildbot
+
+commit f73e0adaf029cd87b692867799da75e4a915aebd
+Author: Dan Locks <dwlocks@dwlocks-laptop.zmanda.com>
+Date:   Mon Mar 30 20:49:07 2009 -0500
+
+    (refs #347) Colorizes the state of each buildstep
+
+commit 59e580263b66b1a8ba64caafa4095f4b9e666094
+Author: Brian Warner <warner@lothar.com>
+Date:   Mon Mar 30 19:59:35 2009 -0500
+
+    buildslave.py AbstractLatentBuildSlave: fix undefined name in error case
+
+commit 6d833167aace6ee51b478b7bb53d7547558fe312
+Author: Brian Warner <warner@lothar.com>
+Date:   Mon Mar 30 19:57:05 2009 -0500
+
+    test_status.py: fix out-of-date-interface problem in tests
+
+commit a99efafcc32ef066282f104ec8188266f92470da
+Merge: 90dfd47 7773be2
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Mon Mar 30 19:54:16 2009 -0400
+
+    Merge branch 'master' of git@github.com:djmitche/buildbot
+
+commit 90dfd4763c924b5ecfd60b82d39f4eb274aa339a
+Author: Dan Locks <dwlocks@dwlocks-laptop.zmanda.com>
+Date:   Mon Mar 30 18:46:35 2009 -0500
+
+    (refs #455) fix typo numbuilds should be num_builds
+
+commit 7773be2090444e8ae9bb7a171f53b7a0dd737804
+Merge: 267a178 367c9ad
+Author: marcusl <macke@yar.nu>
+Date:   Tue Mar 31 00:17:17 2009 +0200
+
+    Merge branch 'bug446'
+
+commit 367c9ad949430d8ec6ef3bd2a60dd3309adb7a11
+Author: marcusl <macke@yar.nu>
+Date:   Tue Mar 31 00:16:19 2009 +0200
+
+    (See #446) Added check for default path to Mercurial and MercurialInRepo tests
+
+commit 267a1783e039d4d2a460f0597932a36e9ae174ae
+Author: Ian Zimmerman <itz@sproutsys.com>
+Date:   Sun Mar 29 20:29:34 2009 -0400
+
+    (refs #454) pass a ref to the logStatus object for each logfile, for
+    better reporting.
+
+commit daa8c7e9b7a8ff560f182cb484a41123844a2a7f
+Author: Ian Zimmerman <itz@sproutsys.com>
+Date:   Sun Mar 29 20:18:53 2009 -0400
+
+    (refs #455) add numbuilds=xx parameters to one_line_per_builds, use
+    numbuilds as a consistent parameter name
+
+commit c25635a8b678f45f2bde93ed065c1b7bf35f8e51
+Merge: b94b919 07fcc32
+Author: marcusl <macke@yar.nu>
+Date:   Mon Mar 23 21:18:23 2009 +0100
+
+    Merge commit 'djmitche/master'
+
+commit b94b919dbeb25335affeb4ef32eb345574f4c20b
+Author: quentin <quentin@LAYLA.KUBUNTU>
+Date:   Mon Mar 23 19:02:23 2009 +0100
+
+    (see #462): Fixing addFactoryArguments call.
+
+commit 487f4f14515e16c43078c8b3aa87b98a3fd8256a
+Author: quentin <quentin@LAYLA.KUBUNTU>
+Date:   Mon Mar 23 14:44:26 2009 +0100
+
+    (see #412): Handling patches with purge too. Avoiding code duplication. Add some logging.
+
+commit 409b3ea0a5b462d8f7f40b91f8d9efd0b78fa0ad
+Author: quentin <quentin@LAYLA.KUBUNTU>
+Date:   Mon Mar 23 13:53:21 2009 +0100
+
+    (see #412): use the purge extension if possible instead of rm -Rf to clobber.
+
+commit bdde64f98574b2481c50a497e1da3a97a03b230a
+Author: quentin <quentin@LAYLA.KUBUNTU>
+Date:   Mon Mar 23 12:04:54 2009 +0100
+
+    (see #462) Adding a 'clobberOnBranchChange' argument to the Mercurial object.
+
+commit 90cf61d4ebd4dafe791313b6fce7898a8f720f96
+Author: marcusl <macke@yar.nu>
+Date:   Sun Mar 22 21:39:09 2009 +0100
+
+    (See #462) Remove clobber on inrepo branch change
+
+commit 07fcc32319f323e07e522c8743e77155efa03073
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu Mar 19 13:02:36 2009 -0400
+
+    (refs #459) use already-existing hasContents, rather than the duplicate logfileExists
+
+commit aea14d3f245badd92c5e197803cf56cc4e6d96be
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu Mar 19 12:31:10 2009 -0400
+
+    (refs #459) actually prune old logfiles and builds
+    
+    Builds older than buildbot.status.builder.BuilderStatus.buildHorizon are
+    deleted entirely, while logfiles in builds older than logHorizon are
+    deleted, leaving the builds and steps intact.
+    
+    The existing stepHorizion was removed, as it's too time-consuming to open
+    each build pickle to determine whether the steps have been removed.
+
+commit 76ec281aa32e1387624e9657c29da1dc193fb100
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Mar 18 17:56:21 2009 -0400
+
+    add a nice repr for BuildStatus objects
+
+commit 23e2d797ae6350d6bf19a811590e1a0f9d74f3ae
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Mar 18 17:53:40 2009 -0400
+
+    (refs #459) use a WeakValueDictionary for the build cache
+
+commit 4ee1fe318a01dfd31551dc8401bc155e9458de17
+Merge: f4ffcd2 a653374
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Mar 18 16:06:06 2009 -0400
+
+    Merge branch 'master' of git://github.com/garetharmstronghp/buildbot
+
+commit f4ffcd29a4266ff977de0f050162c8bcd4e08f14
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Mar 18 16:02:38 2009 -0400
+
+    (refs #461) add an eventHorizon to BuilderStatus, and purge ancient events
+
+commit a653374dc76fe4e804ff0c171d2faf9816f3e7a3
+Author: Gareth Armstrong <gareth.armstrong@hp.com>
+Date:   Wed Mar 18 18:44:17 2009 +0100
+
+    Clean up the over zealous clean up
+
+commit c445807274e82e35eed694ca6ff6d4cf77aa828f
+Author: Gareth Armstrong <gareth.armstrong@hp.com>
+Date:   Tue Mar 17 11:45:08 2009 +0100
+
+    Fix feeds when title=None and minor tidy up
+
+commit 389f9c251b11e9258e7d25938b6dff1e8d1a51b8
+Author: marcusl <macke@yar.nu>
+Date:   Sat Mar 14 19:09:42 2009 +0100
+
+    Fixes #277: Remove unnecessary test
+
+commit d4ec886c3740a4f97ab172b81c9a9b94eb6f00d3
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu Mar 12 17:07:17 2009 -0400
+
+    (refs #19) Add code suggested by simonp to the sample config
+
+commit 726bf7b0e397e91ec4a4ad2b6ab8b84c8983fabd
+Merge: 8031d50 715e52a
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu Mar 12 16:39:01 2009 -0400
+
+    Merge branch 'bug451' of git://github.com/marcusl/buildbot
+
+commit 8031d50b0246fbe34412cc491dd362285d1459cd
+Merge: 0bc7247 557c497
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu Mar 12 16:38:52 2009 -0400
+
+    Merge branch 'bug446' of git://github.com/marcusl/buildbot
+
+commit 0bc724735a1b0f8fc937e8cc7b59c41ede060493
+Merge: 5b1dddd 53db18a
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu Mar 12 16:30:28 2009 -0400
+
+    Merge branch 'bug452' of git://github.com/marcusl/buildbot
+
+commit 53db18ae032fe1cd81d2125bd79e534fa0d578a3
+Author: marcusl <macke@yar.nu>
+Date:   Wed Mar 11 19:26:16 2009 +0100
+
+    Fixes #452: Create correct source stamp in email in all cases (including branch)
+
+commit 5b1ddddd9cf519fdd9b5a590c45b3f5ae460e68c
+Author: Steve 'Ashcrow' Milner <smilner+buildbot@redhat.com>
+Date:   Mon Mar 9 23:43:57 2009 -0400
+
+    added a test and sdist_test commands to setup.py
+
+commit 715e52a026755515a2c0fe324c80e050ace4c2ac
+Author: marcusl <macke@yar.nu>
+Date:   Mon Mar 9 21:12:43 2009 +0100
+
+    Fixed #451: Mercurial source step now clobbers if repo URL has changed
+
+commit 557c49750d4fea2c2b977bb2c0b4a3db447ab447
+Author: marcusl <macke@yar.nu>
+Date:   Sun Mar 8 14:16:48 2009 +0100
+
+    Fixes #446. Use 'hg clone --noupdate' instead of 'hg init' + 'hg pull' to get remote repo url as path in hgrc.
+
+commit 93e3fc5e37498ed1b066330b4e913740f44b1927
+Merge: c8ec211 6fa59f0
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu Mar 5 14:32:57 2009 -0500
+
+    Merge branch 'master' of git://github.com/lambda/buildbot
+
+commit 6fa59f0366fcccd0913a8d720260c409096046aa
+Author: Brian Campbell <brian.p.campbell@dartmouth.edu>
+Date:   Thu Mar 5 14:12:18 2009 -0500
+
+    contrib/git_buildbot.py: Accept a --master paramater
+    
+    git_buildbot.py had a hard-coded master that it would report to.  This
+    meant that if there were multiple git repos on a server that needed to
+    report to different buildbot masters, they would each need a separate
+    copy of git_buildbot.py.  This patch adds a --master (or -m) parameter
+    for setting the buildbot master to talk to, which can be passed in
+    from the hooks/post-receive script in each git repo.
+
+commit 2d640ccd6b5c78f5cd44f0f8efaf13d03e2f177d
+Author: Brian Campbell <brian.p.campbell@dartmouth.edu>
+Date:   Thu Mar 5 14:07:22 2009 -0500
+
+    contrib/git_buildbot.py: Exit normally on --help
+    
+    OptionParser will print out help text and exit with status 0 if -h or
+    --help is passed in.  git_buildbot.py was catching all exception in the
+    option parser, and reporting the exception as an error, which caught
+    the SystemExit exception that OptionParser threw.  This patch simply
+    passes SystemExit exception up to be handled normally, so that --help
+    won't print extra exception information and terminate abnormally.
+
+commit c8ec211e2e893f02fb3b559294c3cd267dc8cd14
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Mon Mar 2 20:10:19 2009 -0500
+
+    mark as 5 - Production/Stable, and add me as a maintainer
+
+commit a7b00983fd79a16ed9f107ab9820eecec2855b61
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Mon Mar 2 19:44:33 2009 -0500
+
+    add images to the repo
+
+commit 518520af5676b295f403e634237d0e0902fe40e2
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Mar 1 14:11:37 2009 -0500
+
+    add missing requestSubmitted method
+    
+    (this method is a newly-added callback for BuilderStatus watchers)
+
+commit c8ba89796e235b7bf311d8206fea0ba56d2b9217
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Feb 27 18:34:56 2009 -0500
+
+    add Chris AtLee to CREDITS
+
+commit 580b9b6c855595107342f747a2b16ff3cf96707a
+Author: Steve 'Ashcrow' Milner <smilner+buildbot@redhat.com>
+Date:   Thu Feb 26 22:19:51 2009 -0500
+
+    setup.py needs a reference to the rpm steps
+
+commit 11774d7ec484e7d2da233841eb4313bfa7534f2b
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu Feb 26 14:16:30 2009 -0500
+
+    serve buidlbot.css as text/css
+
+commit a579da68af5b6df737a4aba294810e607531a753
+Author: Łukasz Jernaś <deejay1@srem.org>
+Date:   Thu Feb 26 19:06:37 2009 +0100
+
+    Fix typo.
new file mode 100644
--- /dev/null
+++ b/ChangeLog-0.7.12
@@ -0,0 +1,2132 @@
+commit 71584a4d81973d2a90300e9d46ccde1cb6b7c703
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu Dec 31 19:21:48 2009 -0600
+
+    set version number
+
+commit 7fa5137bbc449144d76334bd366920d8b6a7c2c0
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu Dec 31 19:08:58 2009 -0600
+
+    (refs #632) Revert "Always clean the source tree before doing a fetch."
+    
+    This reverts commit 4caa96ac83982a2444b7deb33a7bb00ade14f3bf
+
+commit 2e875cedbcb52a0d85ce779131112c7db8abc664
+Author: Aviv Ben-Yosef <aviv.by@gmail.com>
+Date:   Thu Dec 31 17:14:26 2009 +0200
+
+    Fixing ticket #609
+    
+    The problem in the ticket is that Git does not checkout the wanted branch, but simply checks out master branch and resets it to the HEAD of the given branch. This means that any scripts in the build that rely on the name of the git-branch in the repo will not see the name they expect to see.
+    
+    We do not want to simply checkout the branch every time, as that will leave a lot of "dangling" branches if the branch names are changed with time.
+    So, the decision is to do the same thing we did till now, but also add a step for renaming the branch to the expected name, and make sure the fetching will reset to the wanted revision.
+
+commit a9fc66b44c6002f9467d321a6a1a66895a3023ba
+Merge: 22f923d cbef2cd
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Dec 30 19:35:01 2009 -0600
+
+    Merge branch 'xmlrpc' of git://github.com/kzys/buildbot
+
+commit 22f923d15b8a8b9dddfc81cd62bae7a3cc2328ec
+Author: Tom Fogal <tfogal@alumni.unh.edu>
+Date:   Wed Dec 30 11:41:24 2009 -0700
+
+    Make it clear that `workdir' is an option to ShellCommand.
+
+commit 2b69157655f299d8459ecbc92637a6ffd0e9130f
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Tue Dec 29 17:39:44 2009 -0600
+
+    refs #286, #492 - fix optionfile parsing for buildbot subcommands, with improved docs
+
+commit 9296935cd849fcd600e55b392bcc0c79a3d50346
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Tue Dec 29 11:21:44 2009 -0600
+
+    mention #buildbot
+
+commit e9b44bfb18f7db96bdeb01de26641c72ed975ad2
+Merge: 7e4e948 9bbedb5
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Tue Dec 29 11:10:00 2009 -0600
+
+    Merge branch 'bug664'
+
+commit 7e4e948a49b2f511367caac0ea91f91501fee546
+Author: Marcus Lindblom <macke@yar.nu>
+Date:   Tue Dec 29 11:45:02 2009 +0100
+
+    Remove user/passwd when comparing Mercurial URLs (fixes #640)
+    Thanks to Milton Pividon for doing most of the work. :)
+
+commit 9bbedb5a02c55d0d97ddfee6d40576d254491762
+Author: Daniel Dunbar <daniel@zuster.org>
+Date:   Mon Dec 28 15:53:23 2009 -0800
+
+    #664: Remove Builder.ping timeout support, the implementation was not robust enough and could cause the master to unexpectedly disconnect the slave.
+
+commit 25729e4e57174b2fbaea23f09f938611f4e79e39
+Author: Daniel Dunbar <daniel@zuster.org>
+Date:   Mon Dec 28 15:32:38 2009 -0800
+
+    Change RunMixin.killSlave to optionally take the slave and builder names as arguments.
+
+commit bd845d3b18fc5760fee6e657b12d6cb43003e472
+Author: Daniel Dunbar <daniel@zuster.org>
+Date:   Mon Dec 28 14:53:25 2009 -0800
+
+    Add a test for mixed exclusive/counting access on builders.
+
+commit 6561a0802f2526f23e53cf4dd3038f99f62ef37c
+Author: Daniel Dunbar <daniel@zuster.org>
+Date:   Sun Dec 27 17:09:41 2009 -0800
+
+    Tweak buildbot --help / doc for basedir change.
+
+commit 9c37ea82e518de7524f572ac222922d9f794baa7
+Author: Daniel Dunbar <daniel@zuster.org>
+Date:   Sun Dec 27 14:46:24 2009 -0800
+
+    LogWatcher: Create log files before trying to tail them; this makes the watch code work when twistd.log isn't preexisting.
+
+commit af5c745b6a8a8332a4d73caaef5ba9c43491d60a
+Author: Daniel Dunbar <daniel@zuster.org>
+Date:   Sun Dec 27 14:04:05 2009 -0800
+
+    Trac #527: make "buildbot start" directory optional.
+
+commit 95a2433e397985d4705c647c789718ab2bddcf71
+Author: Daniel Dunbar <daniel@zuster.org>
+Date:   Sun Dec 27 13:09:52 2009 -0800
+
+    Revert change to include SlaveLock.maxCountForSlave in compare_attrs, it isn't
+    hashable and we rely on this. This fixes several buildbot.test.test_locks.Locks
+    I introduced.
+
+commit 801803f0e55adc70a175433e189c15ba596d2f81
+Merge: c8b2133 5d65dc6
+Author: Daniel Dunbar <daniel@zuster.org>
+Date:   Sun Dec 27 12:27:13 2009 -0800
+
+    Merge commit 'upstream/master'
+
+commit 5d65dc65a03ec3a38648c42407f3163de3310aa6
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sat Dec 26 19:22:05 2009 -0600
+
+    document doStepIf
+
+commit a70a00b22c920ae2c1e95f7bc614a7a94ded861a
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sat Dec 26 12:13:35 2009 -0600
+
+    (refs #10) add BuilderConfig class, use it in tests, and doc it
+
+commit cbef2cde1940272881aff15c29ef9c4f48fb3e86
+Author: KATO Kazuyoshi <kzys@8-p.info>
+Date:   Thu Dec 24 19:51:23 2009 +0900
+
+    Added tests of buildbot.status.web.xmlrpc.
+
+commit a4b19bb3e96e14c32b446617faf3da306a3deaef
+Author: Aviv Ben-Yosef <aviv.by@gmail.com>
+Date:   Wed Dec 23 01:27:43 2009 +0200
+
+    Removing the comment that is no longer true
+
+commit 6c5ae79608a6db370a07cb44f7ca66bd4e4679b9
+Author: Aviv Ben-Yosef <aviv.by@gmail.com>
+Date:   Wed Dec 23 01:22:39 2009 +0200
+
+    Adding flag for choosing ordering scheme
+
+commit 939588b066b0b30dc52f0417196a35f07446b47b
+Author: Aviv Ben-Yosef <aviv.by@gmail.com>
+Date:   Wed Dec 23 01:10:59 2009 +0200
+
+    Apparantly this is needed
+
+commit 83a1c283cf17793f816aab1e2af1f75dc4ea4356
+Author: Aviv Ben-Yosef <aviv.by@gmail.com>
+Date:   Wed Dec 23 01:06:23 2009 +0200
+
+    Using the created classes
+
+commit 6fba2d38e1a8d86914d694f400227c191e8116f2
+Author: Aviv Ben-Yosef <aviv.by@gmail.com>
+Date:   Tue Dec 22 23:54:23 2009 +0200
+
+    Adding ability to validate revisions
+
+commit 4824989af1a9786c959c3f986733999d68535e19
+Author: Aviv Ben-Yosef <aviv.by@gmail.com>
+Date:   Tue Dec 22 23:29:37 2009 +0200
+
+    Removing useless methods
+    
+    At first, I saw that the changes list was being sorted by the revisions, and thought that because of that
+    it will be necessary to allow sorting by time for the other VCSs. But, then I realized that the sorting
+    was being done simply so that duplicate changes with same revision will be grouped for removing. This works
+    no matter if the revision is a number or not.
+
+commit 98f39c12bb8cf60b7e003c2effc9a47def2c2645
+Author: Aviv Ben-Yosef <aviv.by@gmail.com>
+Date:   Tue Dec 22 22:58:05 2009 +0200
+
+    Removing useless conversion to int
+    
+    This simple comparison between revisions uses a conversion to int that breaks if the revision is not an int (like in Git). There's no difference simply comparing the strings directly, so I removed this.
+
+commit 2835d4c7a33c4f1d47f9f5f5025b822ca5bee65c
+Author: Aviv Ben-Yosef <aviv.by@gmail.com>
+Date:   Tue Dec 22 22:57:02 2009 +0200
+
+    adding comparators
+
+commit 5264eda6284dcc8209f8e00a40b9698643bcfc47
+Author: Aviv Ben-Yosef <aviv.by@gmail.com>
+Date:   Tue Dec 22 21:08:22 2009 +0200
+
+    removing unused imports
+
+commit 3cfc460d40dca32cac2dac168cc51e9751da81a2
+Author: Aviv Ben-Yosef <aviv.by@gmail.com>
+Date:   Tue Dec 22 21:04:34 2009 +0200
+
+    Removed unused import
+
+commit 668c83e6e0082a3be1919aa9ed8e961d974071ce
+Merge: c28838e e092d24
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Dec 20 19:26:30 2009 -0600
+
+    Merge branch 'master' of git://github.com/ddunbar/buildbot
+
+commit c8b2133950e50e7a79dc3f67c945209fde940735
+Merge: c28838e e092d24
+Author: Daniel Dunbar <daniel@zuster.org>
+Date:   Sun Dec 20 17:01:31 2009 -0800
+
+    Merge commit 'origin/master'
+
+commit c28838ef1d66bd7d39b806a9310780a977e52474
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Dec 20 15:57:58 2009 -0600
+
+    add colon
+
+commit 864430a024d92d07ff4c012d14fcf3b3d4f50a6e
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Dec 20 14:49:16 2009 -0600
+
+    (fixes #638) add a requestCancelled method (that does nothing) to IRCContact
+
+commit a901bfd6caf637731a894298fa6e7b6bcc2bb02e
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sat Dec 19 11:45:46 2009 -0600
+
+    fixes #464 replace customMesg with messageFormatter
+
+commit 2ce63d429f8ce04b6aa57b8fa25a1c185f5263bc
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sat Dec 19 10:33:36 2009 -0600
+
+    (fixes #220) spell shlex right
+
+commit fb70a1dd799ff16ef9b3002707ed3613c5780c0d
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sat Dec 19 09:52:55 2009 -0600
+
+    (fixes #645) remove tail recursion
+
+commit 0c51ff9e5b3e358d3f2e268f5f3cf81a9ac1eb3f
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sat Dec 19 09:49:32 2009 -0600
+
+    (fixes #220) use shlex.split everywhere in the IRC bot
+
+commit 79b289d5abe33a7183f4ac2da7476662c4b98fdf
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Dec 18 22:37:48 2009 -0600
+
+    refs #626 -- use -s submitted in p4 changes invocation
+
+commit 1c030ed5c477feed5e1c15210d5d15f49e983bc3
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Dec 18 21:48:59 2009 -0600
+
+    refs #617 - add 'passing' to the list of possible modes
+
+commit f6397a8a733f54ac808d086606f78a2101ea375e
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Dec 18 21:47:10 2009 -0600
+
+    refs #602 - use os.makedirs
+
+commit 676b0c38115deb2edb19ade9dc02c406e310d4b3
+Author: Dan Locks <dwlocks@dwlocks-laptop.zmanda.com>
+Date:   Fri Dec 18 21:45:21 2009 -0600
+
+    (refs #620) Web status pages should use HtmlResource.footer
+
+commit d1b2ea31841ee2daae9718c64e25d695d5966cf2
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Thu Dec 17 10:10:54 2009 -0500
+
+    Cleanup maybeStartBuild messages
+
+commit 85a84d7f99cb463235849b150f91031cd5fec442
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Wed Nov 25 07:12:49 2009 -0500
+
+    Stop duplicate attach/detach messages
+
+commit 53bff455df74b6127dcf6dee9006bc0acaa1646b
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Thu Dec 17 09:57:40 2009 -0500
+
+    Check that the change exists before returning it
+
+commit 1d658d06ed6abc31222d1e7b6f76454709aeed25
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Thu Dec 17 09:30:31 2009 -0500
+
+    Handling cases where the builder directory on the master is gone
+
+commit fa93c4907a54495d106983633a37473ab2da8139
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Dec 16 23:42:46 2009 -0600
+
+    (bug #646) remove the non-functional 'mode' argument from DirectoryUpload
+
+commit ea17f9cf8c95867da1eb015ed07b7037b2232b3b
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Dec 16 23:33:13 2009 -0600
+
+    (fixes #641) change default style
+
+commit fadc2b8611522c35364870e7ea398b716a61173f
+Merge: 6748148 1c8c37d
+Author: Jonathan S. Romero <jonnyro@jonnyro-desktop.(none)>
+Date:   Mon Dec 14 10:48:25 2009 -0500
+
+    Merge commit 'upstream/master'
+
+commit 674814844fda31c2e9d15a7044b785fa903a7f47
+Author: Jonathan S. Romero <jonnyro@jonnyro-desktop.(none)>
+Date:   Mon Dec 14 10:37:44 2009 -0500
+
+    Correct syntax error in source.py
+
+commit 297e3e6465f3aef3139eecd78f143ecc812dad1b
+Author: Jonathan S. Romero <jonnyro@jonnyro-desktop.(none)>
+Date:   Mon Dec 14 10:26:22 2009 -0500
+
+    Correct syntax error in source.py
+
+commit 3e395a187eb560c1f0d1d93a513a327b47fb8894
+Author: Jonathan S. Romero <jonnyro@jonnyro-desktop.(none)>
+Date:   Mon Dec 14 10:25:00 2009 -0500
+
+    Improve documentation for depth argument in SVN buildstep
+
+commit 0fd7b31b562a444244f4ab03a0d0a866ef82de47
+Author: Jonathan Romero <jonnyro@rumega.cfl.rr.com>
+Date:   Sat Dec 12 02:48:40 2009 -0500
+
+    Specify that depth argument requires subversion 1.5 or higher.
+
+commit 04302b410288107f17759d36f0191f23cc8e7d1d
+Author: Jonathan Romero <jonnyro@rumega.cfl.rr.com>
+Date:   Sat Dec 12 02:47:03 2009 -0500
+
+    Describe depth argument to SVN checkout step.
+
+commit f29b5e8028b22b60f6a49958bdb5cff059d49da3
+Author: Jonathan Romero <jonnyro@rumega.cfl.rr.com>
+Date:   Sat Dec 12 02:39:27 2009 -0500
+
+    Attempt to check buildslave version properly when depth argument is specified to SVN checkout step.
+
+commit 7a6ea4afbe8c607f36c78793ea60dc0bf17cc1c0
+Author: Jonathan S. Romero <jonnyro@jonnyro-desktop.(none)>
+Date:   Fri Dec 11 15:06:20 2009 -0500
+
+    Check that svn is not older than 1.5 before adding --depth argument
+
+commit 1c8c37ddca5a347ae00bf138dbef370886cdb62b
+Author: William Deegan <bdbaddog@gmail.com>
+Date:   Fri Dec 11 11:55:37 2009 -0800
+
+    Fix issue with perforce submissions with no comment.
+    This currently causes p4poller to throw an exception, which hangs further buildbot builds on that branch.
+    Now blank comments are allowed.
+
+commit e3f5d30cb0c507cd592e2467f5f3b1a060ffd54d
+Author: Jonathan S. Romero <jonnyro@jonnyro-desktop.(none)>
+Date:   Fri Dec 11 14:55:20 2009 -0500
+
+    Only set depth arg if not none
+
+commit 080a25ee21f37838c8f2cb3bad723577c89dd5fe
+Author: Jonathan S. Romero <jonnyro@jonnyro-desktop.(none)>
+Date:   Fri Dec 11 14:42:11 2009 -0500
+
+    Fix depth argument in SVN source step
+
+commit eae7d56bae3d5e3711fc470cac9a138ad7b47cbe
+Author: Jonathan S. Romero <jonnyro@jonnyro-desktop.(none)>
+Date:   Fri Dec 11 14:22:33 2009 -0500
+
+    Make sure the depth argument makes it into the args array for the svn command
+
+commit 0e859e2396c7af54d9ecf9c299b75eef5c9600f7
+Author: Jonathan S. Romero <jonnyro@jonnyro-desktop.(none)>
+Date:   Fri Dec 11 13:50:43 2009 -0500
+
+    Attempt to add depth argument to source checkout steps
+
+commit acb279a3bbb484d1120f37e97ab7b69d8240cf04
+Author: Kristian Nielsen <knielsen@knielsen-hq.org>
+Date:   Tue Dec 8 12:48:50 2009 +0100
+
+    Fix ticket #643: extra rows and empty cells in grid displays.
+    
+    Problem was that sourcestamp comparison was too fine-grained; we want
+    to assign builds to same rows if the underlying code version is the
+    same, even if there are minor differences in build properties or the
+    like.
+
+commit 10e051422660c9d0b873991cb0890ebf55cfdc80
+Author: Kristian Nielsen <knielsen@knielsen-hq.org>
+Date:   Tue Dec 8 10:26:10 2009 +0100
+
+    Fix ticket #642: Specifying extra build properties for force/resubmit
+    build does not work.
+    
+    Fix naming of form parameters to be consistent between the code that
+    generates the form and the code that handles the submitted HTTP request.
+    
+    Implement code for resubmit build to handle extra custom build
+    properties in the submitted HTTP request (this was missing in the
+    existing code).
+
+commit efac01b5d653443f11065a728f3bb5a7aee9e9a1
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Tue Dec 8 10:02:24 2009 -0600
+
+    (fixes #630) stringify revision in mail formatting
+
+commit 08172aba45ebd827fe3351329a310403ca0f42a5
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Mon Dec 7 09:37:33 2009 -0600
+
+    trivial change to test notification
+
+commit 0a26b31a14ffe2c0941b8fde9528a4fff2f01ea4
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Fri Dec 4 17:10:34 2009 -0500
+
+    Fix getChunks when reading gzip files.
+    
+    Since gzip files are always finished, we don't need to freeze the state
+    of the logfile by determining where the end of the file is.
+
+commit dcbf829e332577709d7b426fa411e746845943f4
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Fri Dec 4 15:16:00 2009 -0500
+
+    Fix viewing buildsteps when logfile.hasContents() is False
+
+commit c34b07026d91f9c2904f261e916bf5600aab16f4
+Author: maruel@chromium.org <maruel@chromium.org>
+Date:   Wed Dec 2 07:30:58 2009 -0800
+
+    Fix removal of files when purge try changes.
+    
+    Was broken in f77caa6937e5f1e2e5e473187ca12fdc42816059.
+
+commit 09260e6c0375a03b8148000e2362627e9905c4be
+Author: maruel@chromium.org <maruel@chromium.org>
+Date:   Wed Dec 2 07:29:42 2009 -0800
+
+    Fix removal of symlinks in rmdirRecursive().
+    
+    os.chmod fails on Mac with symlinks so skip this step.
+
+commit cc174f0c20ca2a91c85f71328ca1cbd46f3110c9
+Author: maruel@chromium.org <maruel@chromium.org>
+Date:   Tue Dec 1 13:49:15 2009 -0800
+
+    Add more unicode support and unit tests.
+
+commit cd1a02e696629a21ff00e4f9b1c8d031916f5f98
+Merge: 765c1da 99d65c9
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Tue Dec 1 14:40:55 2009 -0600
+
+    Merge branch 'slavedir2' of git://github.com/maruel/buildbot
+
+commit 99d65c9ad09e68327a758efe8eaf099051f8cc37
+Author: maruel@chromium.org <maruel@chromium.org>
+Date:   Tue Dec 1 12:22:17 2009 -0800
+
+    Restore support for unicode builder name.
+    
+    The regression was introduced in 0c60cf7040b6595766a6509be4faa47ce77fbe5b.
+    
+    Add a regression unit test.
+
+commit 765c1da7d71f3229881dc980609f2461572e00bd
+Author: Marius Gedminas <marius@gedmin.as>
+Date:   Tue Dec 1 19:53:08 2009 +0200
+
+    Fix small Python syntax error in example in docs.
+
+commit 34c1935c9e69392c1c5e0935173b027832a076e1
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Nov 27 10:41:55 2009 -0600
+
+    add an optional clickable access_uri for each slave
+
+commit 5746904b70556eefee3636b5e6081b972f3332df
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Nov 27 10:21:50 2009 -0600
+
+    prevent HTML injection via buildslave host info
+
+commit 2aec827cd7aa915b2a9bb16fa6434535a847e65a
+Merge: 2b6f38a c829d3d
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Tue Nov 24 16:19:31 2009 -0600
+
+    Merge commit 'c829d3d'
+
+commit c829d3d651bf51dd8baa47741f124ae917a3d0e7
+Author: maruel@chromium.org <maruel@chromium.org>
+Date:   Tue Nov 24 13:12:32 2009 -0800
+
+    Add documentation and flag accessibility on the master side.
+
+commit 2b6f38ae0b7ac454bfdc274830ceba45e9211929
+Merge: b8bf3d5 985c0bd
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Tue Nov 24 14:46:50 2009 -0600
+
+    Merge branch 'epyrun' of git://github.com/maruel/buildbot
+
+commit 985c0bd878df0e200853770bf16f31e317e956d6
+Author: maruel@chromium.org <maruel@chromium.org>
+Date:   Tue Nov 24 12:36:01 2009 -0800
+
+    Fix docs/gen-reference to work with epydoc 3.0.1
+
+commit b8bf3d5ef60f6158688f7aaeee186fe37ce64336
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Tue Nov 24 14:33:19 2009 -0500
+
+    Don't do os.fsync when we're done with a log.
+
+commit f171c13c456a4cd418b9463138324c36945456ab
+Author: Kristian Nielsen <knielsen@knielsen-hq.org>
+Date:   Tue Nov 24 09:28:30 2009 +0100
+
+    Fix test failure in test_buildstep.SubunitLogObserverTests
+    Skip the test when the subunit module is not available.
+
+commit 71f8aa9a01a9f858c5fec616375c108f56f587c4
+Author: Kristian Nielsen <knielsen@knielsen-hq.org>
+Date:   Mon Nov 16 20:16:22 2009 +0100
+
+    In clobber source step, if permissions prevent rm -rf from deleting all,
+    run a recursive chmod and re-try the rm -rf.
+    
+    This avoids failures that require manual fixup if a step leaves behind
+    subdirectories with chmod 0 permissions.
+    
+    This fixes ticket#29 for Posix systems (previous fix is blocking, and only
+    used on Windows).
+
+commit 8d6d4b7001b6b52dd9be104abc0e0dd9cf2e7ea0
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Wed Sep 23 23:54:51 2009 -0400
+
+    Adding support for gz compressed log files
+
+commit df5a96f1963f302c601a30f2e5b3771b2b2096f3
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Mon Nov 23 18:33:25 2009 -0500
+
+    Fixing typo
+
+commit dfa162c82060b6d2b169ec892e397ba8702ed5b8
+Merge: f8baa32 cadbb9d
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Mon Nov 23 18:24:58 2009 -0500
+
+    Merge branch 'master' of github.com:djmitche/buildbot
+
+commit cadbb9df35b08a09fec895d0fc42f3cc55cb62af
+Author: John Ford <john@johnford.info>
+Date:   Mon Nov 23 17:20:56 2009 -0600
+
+    specify a default num_events value for the waterfall in the master
+    config file instead of changing a hard coded value, and add a
+    configurable limit, too
+
+commit f8baa326abef1b8b15a4bfb1d1c04e09e1f827cb
+Merge: 2e5edf0 281207c
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Mon Nov 23 18:15:13 2009 -0500
+
+    Merge branch 'master' of github.com:djmitche/buildbot
+
+commit f77caa6937e5f1e2e5e473187ca12fdc42816059
+Author: maruel@chromium.org <maruel@chromium.org>
+Date:   Sun Nov 22 17:06:25 2009 -0800
+
+    Add patched checkout cleanup for SVN checkout. This removes the need to do a fresh svn checkout on each try job.
+    
+    Add 'keep_on_purge', 'ignore_ignores' and 'always_purge' to SVN.
+    
+    Add 'ignore_ignores' to Git.
+    
+    Small cleanups.
+
+commit e092d24fe9fdf4d01d2d9c8752c7036982973af1
+Author: Daniel Dunbar <ddunbar@smooshlab.apple.com>
+Date:   Fri Nov 20 12:40:09 2009 -0800
+
+    Switch Builder.compareToSetup function to just use a comparison on the locks list.
+    
+    This is more uniform and fixes a crash trying to access the .name field of LockAccess variables; I'm not sure why this was doing the comparison manually in the first place...
+
+commit a6081f8e361aea7765be8a0bac45fdf880cacc4d
+Author: Daniel Dunbar <ddunbar@smooshlab.apple.com>
+Date:   Fri Nov 20 12:38:19 2009 -0800
+
+    Add util.ComparableMixin to LockAccess, and also use
+    SlaveLock.maxCountForSlave as a compare attr for SlaveLock (since it
+    could conceivably be used independently from the
+    _maxCountForSlaveList).
+
+commit 281207c6d3e5171bf0457bf86c1a48c69efaf8c1
+Author: maruel@chromium.org <maruel@chromium.org>
+Date:   Fri Nov 20 12:25:02 2009 -0800
+
+    Replace self.srcdir to self.workdir where appropriate
+
+commit d8fddfa5b0250204a0fa0820d6864e14f09e1bed
+Author: Daniel Dunbar <ddunbar@lordcrumb.apple.com>
+Date:   Fri Nov 20 10:50:29 2009 -0800
+
+    Fix crash when viewing a step which hasn't started (invalid subtraction).
+    
+    This also tweaks the output a bit, for unstarted steps:
+    --
+    Timing
+    Start	Not Started
+    End	Not Started
+    Elapsed	Not Started
+    --
+    
+    For in progress steps:
+    --
+    Timing
+    
+    Start	Fri Nov 20 10:48:47 2009
+    End	Not Finished
+    Elapsed	39 secs
+    --
+    
+    For completed steps:
+    --
+    Timing
+    
+    Start	Fri Nov 20 10:48:47 2009
+    End	Fri Nov 20 10:48:47 2009
+    Elapsed	0 secs
+    --
+
+commit 010f37dda88168c12b6f22895741a85312d513e2
+Author: maruel@chromium.org <maruel@chromium.org>
+Date:   Thu Nov 19 11:28:28 2009 -0800
+
+    Added SourceBase.sourcedirIsPatched()
+
+commit 0fc8eade38879945b0f2193e37a08a061b8569e0
+Author: Kristian Nielsen <knielsen@knielsen-hq.org>
+Date:   Wed Nov 18 10:58:27 2009 +0100
+
+    Fix transposed grid to not crash when specifying categories.
+
+commit 138c831f1bc4340b7043dd74b3081d201abdef18
+Author: Kristian Nielsen <knielsen@knielsen-hq.org>
+Date:   Wed Nov 18 10:20:12 2009 +0100
+
+    Fix typo that breaks category argument to grid web status page.
+
+commit 7db28fc8b69cb8d59dbf548cbb7493368fda0d15
+Author: maruel@chromium.org <maruel@chromium.org>
+Date:   Mon Nov 16 13:37:48 2009 -0800
+
+    Fix multiple unit tests broken by 0c60cf7040b6595766a6509be4faa47ce77fbe5b.
+
+commit 1688df9a0576dbcf63be2bb9c81d8898c393d830
+Merge: 84a0c8a 2b00a49
+Author: Matt Heitzenroder <mheitzenroder@gmail.com>
+Date:   Wed Nov 4 21:22:38 2009 -0500
+
+    simplified the code so it doesn't have to clone locally
+
+commit 2e5edf03dfa6fc72ae353a4b5aabdd7fe2685077
+Merge: 514823b 2b00a49
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Wed Nov 4 19:38:16 2009 -0500
+
+    Merge branch 'master' of github.com:djmitche/buildbot
+
+commit 2b00a49451bad833f609b383747dcd1f9f947f3f
+Author: maruel@chromium.org <maruel@chromium.org>
+Date:   Wed Nov 4 07:13:38 2009 -0800
+
+    Clarify documentation about builder's 'builddir' and 'slavebuilddir'.
+
+commit 0c60cf7040b6595766a6509be4faa47ce77fbe5b
+Author: maruel@chromium.org <maruel@chromium.org>
+Date:   Mon Nov 2 18:36:56 2009 -0800
+
+    Add support for slavebuilddir in builder's dictionnary.
+    
+    builddir defaults to builder's name (escaped)
+    
+    This permits sharing a slave checkout across multiple builders
+    
+    Includes unit test update and doc.
+
+commit 1d76022c164583bd81b206ecb715ee9105f8b9b9
+Merge: 6785c24 c2dc58a
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Oct 30 21:25:48 2009 -0400
+
+    Merge branch 'attach2' of git://github.com/maruel/buildbot
+
+commit c2dc58add0ca2efc7a804b71fef7cab9fba8ecc7
+Author: maruel@chromium.org <maruel@chromium.org>
+Date:   Fri Oct 30 13:49:28 2009 -0700
+
+    Add 'addPatch' parameter to mail.MailNotifier, unit test and doc.
+    
+    Defaults to True to keep previous behavior. Can be set to False to disable attaching patches to the emails.
+
+commit d64156aa120fc756df198baae0b5e9e24d80a40e
+Author: Nicolás Alvarez <nicolas.alvarez@gmail.com>
+Date:   Mon Oct 26 00:49:25 2009 -0300
+
+    Fix use of WithProperties in documentation example.
+
+commit 7e458eda777f59ec1457dcb4eff75a07b60a2cf8
+Author: Robert Collins <robertc@robertcollins.net>
+Date:   Sun Oct 25 21:11:34 2009 -0400
+
+    (closes #610) add subunit log watcher
+
+commit c95253dd1e429f11bb0e5b71c64a8b06941fff5d
+Author: Brian Warner <warner@lothar.com>
+Date:   Thu Oct 22 15:23:02 2009 -0700
+
+    addStep(): reject spurious kwargs when using the BuildStep-instance form.
+    
+    Without this, the args are silently ignored, which is a hassle to debug.
+
+commit 910d7558ca0276af163685aa376f84107ac679a2
+Author: KATO Kazuyoshi <kzys@8-p.info>
+Date:   Wed Oct 21 22:08:18 2009 +0900
+
+    Revert misc changes.
+
+commit b8d2a5cad7d1abf1f9829bc39c9cddc6d7066cd2
+Author: KATO Kazuyoshi <kzys@8-p.info>
+Date:   Wed Oct 21 21:59:44 2009 +0900
+
+    Cleanup.
+
+commit df9cf59632b1a5db88dd0fa6eb3fc01d02668e11
+Author: KATO Kazuyoshi <kzys@8-p.info>
+Date:   Wed Oct 21 02:44:42 2009 +0900
+
+    Be configurable.
+
+commit 57607e8c7de3e944b79299861685915e53515003
+Author: Kristian Nielsen <knmeister@gmail.com>
+Date:   Sun Oct 18 07:32:26 2009 +0200
+
+    In MTR buildstep, use the type of test in the description and descriptionDone on the waterfall page.
+    This makes it easier to distinguish diffferent test runs in the same build.
+
+commit a69297d5fdfd3f12f7660482a7a8ef1bc48014b0
+Author: maruel@chromium.org <maruel@chromium.org>
+Date:   Wed Oct 14 18:47:44 2009 -0700
+
+    Update comment
+
+commit 776deed181395407c33b17d94ab344bc57f6740b
+Author: KATO Kazuyoshi <kzys@8-p.info>
+Date:   Fri Oct 9 08:18:37 2009 +0900
+
+    Show "blamelist" on failed to build.
+
+commit 5c9202b8c1bbdfc67ad0aa6c438e78a0de4ce18a
+Author: KATO Kazuyoshi <kzys@8-p.info>
+Date:   Fri Oct 9 03:10:51 2009 +0900
+
+    Cleanup.
+
+commit 7f95beec26f19baf7c5de65f90f365d52ffcf257
+Author: KATO Kazuyoshi <kzys@8-p.info>
+Date:   Fri Oct 9 02:40:12 2009 +0900
+
+    DRY
+
+commit 3ba244d413013ee70d9c3a48554a250566e5dc1e
+Author: KATO Kazuyoshi <kzys@8-p.info>
+Date:   Fri Oct 9 02:11:38 2009 +0900
+
+    Use "notice" to public messages.
+
+commit 6e6fb276e9d139323d993b867909a5066651303c
+Author: KATO Kazuyoshi <kzys@8-p.info>
+Date:   Fri Oct 9 01:53:52 2009 +0900
+
+    Extract a little method.
+
+commit 25a6b1a86dbab09c6e23329b35a82d710c20df0d
+Author: Brian Warner <warner@lothar.com>
+Date:   Wed Oct 7 17:03:31 2009 -0700
+
+    builder.py: start cleanup by adding SlaveBuilder.prepare() and moving the
+    substantiate() call into it, rather than having Builder switch on the
+    slavebuilder's class
+
+commit 514823b5bc23547c7f456a6b8fce81332fda161f
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Mon Oct 26 07:52:35 2009 -0400
+
+    Add a css class for when there are no results
+
+commit 6785c245689c8cdfe7d5341b9bc1677a2207ce5f
+Merge: 778f316 0236a3e
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Mon Oct 26 00:09:15 2009 -0400
+
+    Merge branch 'master' of git://github.com/nicolas17/buildbot
+
+commit 0236a3eaaa20cc6eb53fb6c99662d59a99f2506b
+Author: Nicolás Alvarez <nicolas.alvarez@gmail.com>
+Date:   Mon Oct 26 00:49:25 2009 -0300
+
+    Fix use of WithProperties in documentation example.
+
+commit 778f316fe30d8a17c7f2d541d502253038d69faa
+Author: Robert Collins <robertc@robertcollins.net>
+Date:   Sun Oct 25 21:11:34 2009 -0400
+
+    (closes #610) add subunit log watcher
+
+commit 3c372f4e360415322e8c01bc68879b73f403504d
+Merge: db55e15 1d591e9
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Oct 23 18:13:40 2009 -0400
+
+    Merge branch 'irc' of git://github.com/kzys/buildbot into irc-stuff
+
+commit db55e151a9e5a373a4b720b02099ac9e66ec73ad
+Merge: 1974aef 265143f
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu Oct 22 23:31:41 2009 -0400
+
+    Merge branch 'doRevert1' of git://github.com/maruel/buildbot
+
+commit 1974aef0690fe52b37f8b4a7c331f9459cd518de
+Author: Brian Warner <warner@lothar.com>
+Date:   Thu Oct 22 15:23:02 2009 -0700
+
+    addStep(): reject spurious kwargs when using the BuildStep-instance form.
+    
+    Without this, the args are silently ignored, which is a hassle to debug.
+
+commit 5c516dacfa118434eaaca80072af5a8d0e18dcd0
+Merge: 20c2099 11c59aa
+Author: Brian Warner <warner@lothar.com>
+Date:   Wed Oct 21 16:48:04 2009 -0700
+
+    Merge branch 'master' of github.com:djmitche/buildbot
+
+commit 11c59aa0c41b554d7bcdc9866fb927fcba9ede02
+Merge: 391b33d 62ddce3
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Oct 21 18:01:56 2009 -0400
+
+    Merge branch 'warner-cleanup'
+
+commit 20c2099a07b72b7026d6d7099e2dfd7566b0837d
+Merge: 62ddce3 391b33d
+Author: Brian Warner <warner@lothar.com>
+Date:   Wed Oct 21 14:28:07 2009 -0700
+
+    Merge branch 'master' of github.com:djmitche/buildbot
+
+commit 1d591e945dfc518a2b547d387344cb539041787b
+Author: KATO Kazuyoshi <kzys@8-p.info>
+Date:   Wed Oct 21 22:08:18 2009 +0900
+
+    Revert misc changes.
+
+commit 95f7a0e4f86c9052236e195ead6346545db778fd
+Author: KATO Kazuyoshi <kzys@8-p.info>
+Date:   Wed Oct 21 21:59:44 2009 +0900
+
+    Cleanup.
+
+commit c56bd20cb96a2e363f5f85aa9a935187abab680a
+Author: KATO Kazuyoshi <kzys@8-p.info>
+Date:   Wed Oct 21 02:44:42 2009 +0900
+
+    Be configurable.
+
+commit 391b33dbae39b54689aedc345edf64e860d61a37
+Author: Kristian Nielsen <knmeister@gmail.com>
+Date:   Sun Oct 18 07:32:26 2009 +0200
+
+    In MTR buildstep, use the type of test in the description and descriptionDone on the waterfall page.
+    This makes it easier to distinguish diffferent test runs in the same build.
+
+commit 29c61a55a54bfcc7a1dbf831ca10ebd99f33d9ab
+Author: maruel@chromium.org <maruel@chromium.org>
+Date:   Thu Oct 15 08:21:01 2009 -0700
+
+    Update SourceStamp doc
+
+commit 5cd289ba4762b5ca146dfdbe64b19782a75362dc
+Author: maruel@chromium.org <maruel@chromium.org>
+Date:   Thu Oct 15 08:02:25 2009 -0700
+
+    Revert "Add buildbot try support code, untested"
+    
+    This reverts commit 9137a5c0d107ac97b2ba6bf373e984096178c9c8.
+    
+    Better to not add untested stuff in.
+
+commit 265143fce8f4375e58598389ca1f3bb6df7cfa30
+Author: maruel@chromium.org <maruel@chromium.org>
+Date:   Wed Oct 14 18:47:44 2009 -0700
+
+    Update comment
+
+commit 1bf0ddaaff54e2e55af1c96f56e178d37177cfed
+Author: maruel@chromium.org <maruel@chromium.org>
+Date:   Wed Oct 14 17:19:03 2009 -0700
+
+    Add tests for --root and for --patchlevel.
+
+commit 9137a5c0d107ac97b2ba6bf373e984096178c9c8
+Author: maruel@chromium.org <maruel@chromium.org>
+Date:   Tue Oct 13 11:52:35 2009 -0700
+
+    Add buildbot try support code, untested
+
+commit 17e919571571e5c0428b42133f7695fe0029ee90
+Author: maruel@chromium.org <maruel@chromium.org>
+Date:   Tue Oct 13 07:54:53 2009 -0700
+
+    Add support for 'root' option for self.patch, used as the third parameter.
+    
+    Add these flags to patch invocation: --remove-empty-files --force --forward
+
+commit 11dc5912ce79b10caf28e325fc3f247b5a161ce2
+Author: William Siegrist <wsiegrist@apple.com>
+Date:   Wed Oct 14 09:57:01 2009 -0400
+
+    (fixes #627) add category support to AnyBranchScheduler
+
+commit be1431f727129133ce86ed61021469f387dc9644
+Merge: 33a0d6a 791014d
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Oct 9 18:10:53 2009 -0400
+
+    Merge branch 'master' of git://github.com/gldnspud/buildbot
+
+commit 791014d99c5b7f440419ef8325d58a91d6f1403a
+Author: Matthew Scott <gldnspud@gmail.com>
+Date:   Fri Oct 9 21:57:14 2009 +0000
+
+    Change source forwarder for bitbucket.org POST service
+
+commit 33a0d6a76f83a6c3464db7cc8a27b0e65a8b2e41
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Oct 9 10:57:18 2009 -0400
+
+    (closes #607) make revision a string
+
+commit 74bdccc691c9be31464111f919851f13ce4b24bd
+Author: KATO Kazuyoshi <kzys@8-p.info>
+Date:   Fri Oct 9 08:18:37 2009 +0900
+
+    Show "blamelist" on failed to build.
+
+commit ee197b5bc2ac331226753d92074be230f5762ce6
+Author: Nicolas Sylvain <nsylvain@chromium.org>
+Date:   Fri Oct 9 00:48:23 2009 +0800
+
+    Fix a regression introduced in 32ebee2a2adf0a1824c21982f50ca18648073d64 where
+    projectURL is used but not defined.
+
+commit f77912c9d5dfc6576a94ad08a6783a91d1468cbc
+Author: Lital Natan <procscsi@gmail.com>
+Date:   Wed Oct 7 22:53:24 2009 +0800
+
+    use os.makedirs in the git source step, to create intervening directories
+
+commit 4b8c68c068a1c54711878f5e6abff7df575838c2
+Author: Brian Warner <warner@lothar.com>
+Date:   Wed Oct 7 05:29:22 2009 +0800
+
+    cleanup: remove dead code from the era of pickled BuildMasters
+    
+    (remove __setstate__, __getstate__, and styles.Versioned calls from
+    everything but Status and Change classes)
+
+commit 4404f7c643dda228f3565065cc753638edca79b8
+Author: KATO Kazuyoshi <kzys@8-p.info>
+Date:   Fri Oct 9 03:10:51 2009 +0900
+
+    Cleanup.
+
+commit a44126372ee671af2e3c50b30c25f486d8a34400
+Author: KATO Kazuyoshi <kzys@8-p.info>
+Date:   Fri Oct 9 02:40:12 2009 +0900
+
+    DRY
+
+commit 8b5cf831456ba3fd7c78b8027b5d60b57beb1d71
+Author: KATO Kazuyoshi <kzys@8-p.info>
+Date:   Fri Oct 9 02:11:38 2009 +0900
+
+    Use "notice" to public messages.
+
+commit 5eed0f9ccb8fc69a0763eff665cdacd6d98f4646
+Author: KATO Kazuyoshi <kzys@8-p.info>
+Date:   Fri Oct 9 01:53:52 2009 +0900
+
+    Extract a little method.
+
+commit 1fc591ea18fe72d1cc8594182308d2aeb51634e0
+Author: Nicolas Sylvain <nsylvain@chromium.org>
+Date:   Thu Oct 8 11:48:23 2009 -0500
+
+    Fix a regression introduced in 32ebee2a2adf0a1824c21982f50ca18648073d64 where
+    projectURL is used but not defined.
+
+commit 62ddce3d6ba671bfd84c231ce6b0d4e0226bf58f
+Author: Brian Warner <warner@lothar.com>
+Date:   Wed Oct 7 17:03:31 2009 -0700
+
+    builder.py: start cleanup by adding SlaveBuilder.prepare() and moving the
+    substantiate() call into it, rather than having Builder switch on the
+    slavebuilder's class
+
+commit b92e6705de666e55517d37c801461038f9dfc689
+Merge: 210dcf6 4c8e215
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Oct 7 16:29:29 2009 -0400
+
+    Merge branch 'master' of git://github.com/warner/buildbot
+
+commit 210dcf66260cb2ca77ecd0992f4274b4994302f6
+Author: Lital Natan <procscsi@gmail.com>
+Date:   Wed Oct 7 10:53:24 2009 -0400
+
+    use os.makedirs in the git source step, to create intervening directories
+
+commit 4c8e215a8a178e32a440158f31300a6eb7ab75a3
+Author: Brian Warner <warner@lothar.com>
+Date:   Tue Oct 6 14:29:22 2009 -0700
+
+    cleanup: remove dead code from the era of pickled BuildMasters
+    
+    (remove __setstate__, __getstate__, and styles.Versioned calls from
+    everything but Status and Change classes)
+
+commit bfe60159e63288cc68e3ee0ee05ff0c4a54edaba
+Merge: cb7215e 93ab18d
+Author: Matthew Scott <gldnspud@gmail.com>
+Date:   Sun Oct 4 16:25:38 2009 -0700
+
+    Merge branch 'master' of git://github.com/djmitche/buildbot
+
+commit cb7215ef3d364b17a945d714c027ad5e66c7c1a0
+Author: Matthew Scott <gldnspud@gmail.com>
+Date:   Sun Oct 4 23:24:54 2009 +0000
+
+    Pass repository information from github changes; pass url of commit as revlink
+
+commit 4e61e409707451df1b2194ac9903ccaa8c0b1e68
+Author: Matthew Scott <gldnspud@gmail.com>
+Date:   Sun Oct 4 23:24:14 2009 +0000
+
+    Allow revlinks to pass through PB-sourced changes
+
+commit 93ab18dc2d8a346fafbe9998802860d1edf46c54
+Merge: 2fc57d2 32ebee2
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Oct 4 15:38:05 2009 -0400
+
+    Merge branch 'bug365' of git://github.com/dwlocks/buildbot
+    
+    Conflicts:
+    	buildbot/status/web/build.py
+
+commit 2fc57d26910afa2224de901697d74e67d8a4df59
+Author: Matthew Scott <gldnspud@gmail.com>
+Date:   Sun Oct 4 18:30:09 2009 +0000
+
+    Properly accept --port as integer in github_buildbot cmd line options
+
+commit 7320da808e575f082ae7b903c01db258f31c196a
+Merge: 101be40 bfb1d06
+Author: Ben Hearsum <bhearsum@voot.(none)>
+Date:   Sun Oct 4 12:59:54 2009 -0400
+
+    Merge branch 'master' of git@github.com:djmitche/buildbot
+
+commit 101be400a03e00403debe3bd08b7c1ca68085c5a
+Author: Ben Hearsum <bhearsum@voot.(none)>
+Date:   Sun Oct 4 12:59:30 2009 -0400
+
+    Ticket #579: Resubmitted builds do not include properties set by Triggers.
+
+commit bfb1d06a8a2a8732c2801b90517bef2665e90424
+Merge: 08263a9 e5b037c
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Oct 4 12:51:09 2009 -0400
+
+    Merge branch 'misc-fixes' of git://github.com/knielsen/buildbot
+
+commit 08263a9a97dc2dcd7162e369e3b92feb4282a2ab
+Author: Ben Hearsum <bhearsum@voot.(none)>
+Date:   Sun Oct 4 03:51:24 2009 -0400
+
+    Make sure version is always defined in SlaveStatus, just like host and admin.
+
+commit b4e332c9268c293343b0de1ed3c4d80cd1b8c3d9
+Author: Ben Hearsum <bhearsum@voot.(none)>
+Date:   Sun Oct 4 03:43:19 2009 -0400
+
+    Ticket #197: show version number of buildslave buildbot code on the /buildslaves page.
+
+commit 51149daa8af82b1ffa2c4a6bca41929bab5bdef1
+Author: Ben Hearsum <bhearsum@voot.(none)>
+Date:   Sun Oct 4 02:50:55 2009 -0400
+
+    Ticket #365 (custom properties via force build) refactor and addition. Patch by dwlocks
+
+commit e5b037c9d3be4e54e5091e7f63602c3d025374d0
+Author: Kristian Nielsen <knmeister@gmail.com>
+Date:   Fri Oct 2 21:14:14 2009 +0200
+
+    Implement that server log files can be found in subdirectory with MTR buildstep.
+    
+    To allow this to support WithProperties, implement that LoggingBuildStep can
+    take logfiles to watch dynamically as well as in constructor.
+
+commit c51709d4e7f2b5163213a7af7df5d4ad45e73769
+Author: Kristian Nielsen <knmeister@gmail.com>
+Date:   Fri Oct 2 19:56:37 2009 +0200
+
+    Implement WithProperties support in two places where it was missing.
+
+commit 9ec7f18e0b673f63962f744a2739338ed67265d4
+Author: Kristian Nielsen <knmeister@gmail.com>
+Date:   Fri Oct 2 19:55:15 2009 +0200
+
+    Update mysql-test-run parsing regexps for latest MySQL 5.1.38 changes.
+    (the variants of a test may now contain spaces).
+
+commit 72b0abc0c56e9f2047964df1f20059885cfcd595
+Author: Kristian Nielsen <knmeister@gmail.com>
+Date:   Thu Sep 17 10:05:15 2009 +0200
+
+    Add sane default for MTR buildstep's warningPattern.
+    
+    The default warningPattern now matches when mysql-test-run detects
+    that a test case succeeds, but does not properly clean up the
+    environment for the following test. This is much better than getting
+    random warnings when a test case name or output contains the word
+    "warning" :-)
+
+commit 9bd4602fbe4b526418ff8451ebe614c4db9a201b
+Author: Kristian Nielsen <knmeister@gmail.com>
+Date:   Wed Aug 26 10:13:37 2009 +0200
+
+    Fix matching of directory enter/leave paths.
+
+commit 32ebee2a2adf0a1824c21982f50ca18648073d64
+Author: Dan Locks <dwlocks@dwlocks-laptop.zmanda.com>
+Date:   Thu Oct 1 23:08:08 2009 -0500
+
+    Bugid: 365, add custom properties fields to force and resubmit forms.
+    
+        * buildbot/status/web/base.py: Part of this fix was already
+          commited, but was funky to use in more than one place.  Refactored
+          the change into a function.
+        * buildbot/status/web/build.py: use the refactored function to add
+          property fields to the resubmit form.
+
+commit e177c92e706ef2e27022ccd86174041a26ff051f
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Sep 30 20:44:33 2009 -0400
+
+    don't try to HTML escape None when branch=None
+
+commit 07b8e3df43a7b8cddd8e9df34a48ae298cd79bed
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Thu Sep 24 00:43:39 2009 -0400
+
+    Fix for test failures, and improved log limit test
+
+commit 4c8769fbec698c066c8b2c5ea2241dd1b7769fec
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Wed Sep 23 23:32:27 2009 -0400
+
+    Warn about log truncation immediately when it happens
+
+commit 593f20e00e6f8740088cdff316dd757fcb9aebce
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Wed Sep 23 17:16:02 2009 -0400
+
+    Drop entire chunks at a time from the tail buffer
+
+commit 169077861a3e3974fcb38bb78e01c3561953cbed
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Wed Sep 23 15:49:58 2009 -0400
+
+    Adding docs for logMaxTailSize.
+
+commit 17d1487f2d41be31aa1bb5026d9727d4907ee18c
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Wed Sep 23 15:45:31 2009 -0400
+
+    Adding logMaxTailSize parameter
+    
+    Also making internal variables match their configuration parameter names
+    for consistency.
+
+commit b8ccc08d4bb4e80244503cf37b6c8e73fb764f48
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Tue Sep 22 11:18:49 2009 -0400
+
+    Handle updates to logMaxSize and logCompressionLimit parameters on a
+    reconfig
+
+commit 7b2b7f797518b71eacd9381b556b566b3a7977e9
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Wed Sep 16 12:15:31 2009 -0400
+
+    Adding docs for logMaxSize parameter
+
+commit 115760d9b4282f5f177e547270acb23824fe6ac4
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Tue Sep 15 17:29:16 2009 -0400
+
+    Initial implementation of logMaxSize
+
+commit 3beff6a98dacdfe05e8b525cb3fcb3409d16bfc8
+Author: Ben Hearsum <bhearsum@bitters-2.local>
+Date:   Fri Sep 18 09:41:57 2009 -0400
+
+    Fix Change Properties patch to be backwards compatible to already pickled Changes.
+
+commit c3055ec7b2da2937a6b7553b2c1625681405be5b
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Thu Sep 17 15:58:00 2009 -0400
+
+    Cancel the maxTime timer when the command exits.
+
+commit ae77a085a2f5afc616394bfac879c6ca99d9eea4
+Merge: 29eb918 f9bfc42
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Sep 13 01:09:01 2009 -0400
+
+    Merge branch 'irc_extend' of git://github.com/dhubler/buildbot
+
+commit 29eb918e2e32f0ec03f405cbb9b57741f0f1dcbf
+Author: Nicolas Sylvain <nsylvain@chromium.org>
+Date:   Fri Sep 11 13:08:08 2009 -0700
+
+    Make changes to the test_console.py requested during the code
+    review by maruel and djmitche.
+
+commit 1800aae52289f27bd01655ff35a42a4460670474
+Author: Nicolas Sylvain <nsylvain@chromium.org>
+Date:   Fri Sep 11 12:49:41 2009 -0700
+
+    Add new tests for the console status page.
+
+commit baed1a3ee0627b80756cf1ab8f25840c23f4f193
+Merge: 702d705 e67b8e0
+Author: Nicolas Sylvain <nsylvain@chromium.org>
+Date:   Fri Sep 11 12:47:14 2009 -0700
+
+    Merge branch 'master' of git://github.com/djmitche/buildbot into console_clean
+
+commit f9bfc42de358360e330adc3d1062a4658704dbb7
+Author: Douglas Hubler <dhubler@localhost.(none)>
+Date:   Tue Sep 8 16:40:42 2009 -0400
+
+    Remove files that are related to holding builds, not to extending IRC
+
+commit e67b8e0e5ec570a9f8e9f09b7606d02e63c62d49
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Sun Sep 6 19:14:40 2009 -0700
+
+    Move git submodule logic into initSubmodules
+
+commit fabad2476cebc077d58c9293ce389d465648b019
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Sun Sep 6 18:48:09 2009 -0700
+
+    Avoid git fetches by optimistically trying requested revisions.
+    
+    If we have the necessary objects already to perform a build, don't
+    bother trying to contact what is most likely a central resource to
+    perform this build.
+    
+    In my case, *most* of my builds unnecessarily contact github to
+    perform a fetch that does not bring down new objects.
+
+commit f5761d0b31ed96288e38e6119a0b73219b077be5
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Sun Sep 6 18:28:41 2009 -0700
+
+    Further git submodule support.
+    
+    Using a more backwards-compatible sequence as well as a submodule
+    clean, we can ensure more consistent builds with a wider variety of
+    versions of git.
+
+commit c6445b504569ec4543eb6a192665bea16f787c4c
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Sun Sep 6 17:53:38 2009 -0700
+
+    Use vcexe for git commands.
+
+commit ce79ca4fd4215711cdafdb2c55467795937b4035
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Sun Sep 6 17:52:13 2009 -0700
+
+    Remove a lot of redundant shell command code from the git commands.
+
+commit 8d18923c268fdca01d5aff2ae485ecc8c51ffd00
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Mon Sep 7 13:46:07 2009 -0400
+
+    fix typo and always set revision to something interesting; thanks to Tim Couper <tim@tizmoi.net>
+
+commit d1ed8ce990f74bf35041444658e32c265a67c1a1
+Author: Nicolás Alvarez <nicolas.alvarez@gmail.com>
+Date:   Fri Sep 4 20:36:58 2009 -0300
+
+    Add try-topfile and try-topdir to TryOptions.
+
+commit 08978a3f5bc99487e0f93a78d7ade3723547957b
+Author: Ben Hearsum <bhearsum@bitters-2.local>
+Date:   Wed Sep 2 14:04:06 2009 -0400
+
+    whitespace change to trigger testruns.
+
+commit bfebe10f06c1187d1f07dea467c59f0eef2d6f96
+Author: Ben Hearsum <bhearsum@bitters-2.local>
+Date:   Wed Sep 2 13:11:14 2009 -0400
+
+    Improve plain-text output of Change Properties
+
+commit 69520ab844a8383a01560d17fea9a1c3d8841006
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Tue Sep 1 10:28:38 2009 -0700
+
+    Test fix for bzr try (complement of 8f494663)
+    
+    The repo from which the try was being tried was not very realistic.
+    Replacing a checkout with a clone for the working repo allows it have
+    a submit location it can reference for constructing a patch.
+
+commit 07d7040ecc7fd2a4195111b7eb26dd0cbe0f2781
+Author: Ben Hearsum <bhearsum@bitters-2.local>
+Date:   Tue Sep 1 09:55:19 2009 -0400
+
+    Whitespace change to trigger another testrun.
+
+commit 724ef5a59ae8c5b4dfeea3148a2c1f8d9db0ef30
+Author: Ben Hearsum <bhearsum@bitters-2.local>
+Date:   Tue Sep 1 09:24:59 2009 -0400
+
+    Adding docs for Change Properties.
+
+commit 702d705598444e0ed37b182eac12ec8bd8bcd24b
+Author: Daniel Dunbar <ddunbar@smooshlab.apple.com>
+Date:   Sun Jul 19 19:21:39 2009 -0700
+
+    Minor bug fix, got_rev may not be an integer.
+
+commit 65ee78a12f9e8af09339d181c9abe59ef8b50a74
+Author: Daniel Dunbar <daniel@zuster.org>
+Date:   Sun Jul 19 18:40:48 2009 -0700
+
+    Use Change's 'revlink' property in the console view.
+
+commit 474be07e38461cb7313fe44fa505115e4b4eb118
+Author: Daniel Dunbar <daniel@zuster.org>
+Date:   Thu Jul 23 22:59:48 2009 -0700
+
+    Workaround for #601 in console.
+     - This should really be fixed by fixing getBuild()...
+
+commit 16ec41a6a1500d0117007fcd84ca89cf530a03aa
+Author: Nicolas Sylvain <nsylvain@chromium.org>
+Date:   Thu Jul 16 19:20:19 2009 -0700
+
+    Initial commit of the new console view.
+    
+    The console view is a new StatusResource that displays
+    a developer-oriented view. It makes it easy to know
+    what was the result of a given change on all the builders.
+    
+    This is still a work in progress, but this version
+    should be working. It supports only integer-based
+    SCM at this point (svn, perforce, etc..., not git).
+
+commit 37adcb35c19c3e89846060f78b2eb4632124b6f1
+Author: Ben Hearsum <bhearsum@bitters-2.local>
+Date:   Mon Aug 31 16:51:35 2009 -0400
+
+    Disable testLock4 because it is intermittent/flakey.
+
+commit bcd04d730f38cd9303e7e22efce7e21778b2c35b
+Author: Ben Hearsum <bhearsum@bitters-2.local>
+Date:   Mon Aug 31 11:47:13 2009 -0400
+
+    Add Properties support to Change objects and Force Build form.
+    
+    Make Properties on the Force Build form actually work.
+    
+    Add support for sending properties through sendchange, changes.Change bugfix.
+    
+    Bugfix for pb.py
+    
+    Better arg handling of properties with sendchange command.
+    
+    Formatting fixes
+
+commit 59757549a7a3a608dc90aa51c848c45a813526e6
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Aug 26 20:49:51 2009 -0400
+
+    master version is 'latest'
+
+commit 2fe9e61ca08f0d9e3c52cbb97c5c1a8ca001293c
+Author: Douglas Hubler <dhubler@localhost.(none)>
+Date:   Tue Aug 25 14:42:17 2009 -0400
+
+    Dont need to pass in ircstatusfactory when we can already control the protocol class
+
+commit dc38ae91b13ba42a6361cde689974375f22ac4f8
+Author: Douglas Hubler <dhubler@localhost.(none)>
+Date:   Tue Aug 25 14:41:15 2009 -0400
+
+    Use a dict to store builds, to reduce chances of duplicates
+
+commit 8f494663cb889fda7ac290728ec72c5e5ef49bee
+Author: Monty Taylor <mordred@inaugust.com>
+Date:   Thu Jul 23 00:24:37 2009 -0700
+
+    Changed the way we get patch and revid.
+
+commit 5565d333475d1a904f40e1c37a5c8b561cd03c47
+Author: Kristian Nielsen <knmeister@gmail.com>
+Date:   Tue Aug 18 13:08:38 2009 +0200
+
+    Implement suppression of specific warnings in WarningCountingShellCommand
+    
+    Warnings to be suppressed can be matched by regexp against filename or
+    warning text, and against line number range.
+    
+    Suppressions can be parsed from a file downloaded from the slave build
+    directory (so warnings to suppress are tracked in revision control
+    along with the source code being compiled).
+
+commit 98578726636b4b401724fde0a553596e6064724c
+Author: Nicolás Alvarez <nicolas.alvarez@gmail.com>
+Date:   Thu Aug 13 01:46:01 2009 -0300
+
+    Fix XSS in waterfall help.
+
+commit efc31f82990b385be67c37a704fe523a0d7d4a61
+Author: Nicolás Alvarez <nicolas.alvarez@gmail.com>
+Date:   Thu Aug 13 01:35:59 2009 -0300
+
+    Yet another XSS, in tests/<nonexistent>
+
+commit e7424607fec8e9528add2d0aeffb2f18402bd6b2
+Author: Nicolás Alvarez <nicolas.alvarez@gmail.com>
+Date:   Thu Aug 13 01:30:59 2009 -0300
+
+    Fix another XSS bug, in /buildslaves/.
+
+commit 5a240f967bc22d58f29d090a42a0071b699375b4
+Author: Nicolás Alvarez <nicolas.alvarez@gmail.com>
+Date:   Thu Aug 13 01:04:19 2009 -0300
+
+    one_box_per_builder?branch was still vulnerable after djmitche's change.
+    Change to use correct variable.
+
+commit 9c57635edf6f8678f9b28472baa7cfef2d278712
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Aug 12 23:57:16 2009 -0400
+
+    fix a few dozen additional XSS vulnerabilities
+
+commit 71740dd877b5aaa46cc7425f55c9c8ad4da5162f
+Author: Brandon Ehle <azverkan@yahoo.com>
+Date:   Wed Aug 12 11:13:49 2009 -0700
+
+    Fix the waterfall help page to work with the new show_events default being default.
+
+commit ad13a16bbdec535c8edebdbba4f77ae39b19c84c
+Author: Nicolas Sylvain <nsylvain@google.com>
+Date:   Wed Aug 12 14:04:23 2009 -0400
+
+    fix XSS vulnerability reported by Nicolas Sylvain <nsylvain@google.com>
+
+commit 39dafd5ebabef96466f0885f4474497196588957
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Tue Aug 11 13:48:02 2009 -0400
+
+    fix typo in docs
+
+commit 16e657eb93731f6a2b69746db4c0e4e8d2e9d224
+Merge: 549ce4a 00b2fac
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu Aug 6 14:48:19 2009 -0400
+
+    Merge branch 'mtrlogobserver' of git://github.com/knielsen/buildbot
+
+commit 549ce4a109a2b269b7f33121a5a3c88f34c44b16
+Merge: 5be6259 02de002
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu Aug 6 12:21:32 2009 -0400
+
+    Merge branch 'max_time' of git://github.com/catlee/buildbot
+
+commit 02de0024fefa0fbf4f983d850c8d4254dfbd01cb
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Thu Aug 6 12:04:30 2009 -0400
+
+    Adding documentation for the maxTime parameter
+
+commit e8cc193af97fe15e7c54f24dfce09c45a08d60da
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Thu Jul 16 18:11:27 2009 -0700
+
+    Adding maxTime parameter to relevent classes, and fixing up tests
+
+commit 00b2fac1f3f75c7431cd9aa6b06dfc993e56b5d6
+Author: Kristian Nielsen <knmeister@gmail.com>
+Date:   Thu Aug 6 15:59:30 2009 +0200
+
+    Implement new buildbot.process.mtrlogobserver.MTR buildstep, for running mysql-test-run test suites.
+    
+    Implement a new BuildStep MTR.
+    
+    It parses the output of a test run with mysql-test-run.
+    
+    Test cases are counted and used to provide better completion time
+    estimates. Test failures are summarised on the Waterfall
+    Display. Server error logs are made available for debugging problems.
+    
+    Optionally, information about test runs is inserted into an external database.
+
+commit 1328d648c24cef58c39c63a8c9f5601bbbeeef96
+Author: Kristian Nielsen <knmeister@gmail.com>
+Date:   Fri Jul 10 17:36:55 2009 +0200
+
+    Implement `lazylogfiles' option for LoggingBuildStep.
+    
+    This suppresses entries in the `logfiles' argument where no data is
+    ever written to the logfile on the slave.
+
+commit 8d0c97d620daf5490120e5c613d667a01d47670e
+Author: Douglas Hubler <dhubler@localhost.(none)>
+Date:   Wed Aug 5 10:37:19 2009 -0400
+
+    A feature to put a failed build into a holding pattern, extends IRC bot to hold and free builds
+
+commit e17a4dd8dcd41e37fa052eac3cae7827a693ee73
+Author: Douglas Hubler <dhubler@localhost.(none)>
+Date:   Wed Aug 5 10:34:15 2009 -0400
+
+    Allow extending IRC bit to add custom commands
+
+commit 5be625970d5675860ea297e9b31af50a23a0b2e6
+Merge: 50bdb99 97aa04a
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Tue Aug 4 15:35:24 2009 -0400
+
+    Merge branch 'master' of git://github.com/zellyn/buildbot
+
+commit f9103c5d9fb98a4929246c51b5c4a1664e942d95
+Merge: a5545f6 50bdb99
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Tue Aug 4 10:51:00 2009 -0400
+
+    Merge branch 'master' of git@github.com:djmitche/buildbot
+
+commit 50bdb99e1f3f5f2182a435ee0bf5c9674e90733f
+Author: Douglas Hubler <dhubler@bigbird.(none)>
+Date:   Sat Aug 1 01:35:29 2009 -0400
+
+    Fix bugs and documentation for SVNPoller w/catagory fix
+
+commit 95cd7089babe1d7c1bc6cc679e430e24df62782f
+Author: Douglas Hubler <dhubler@bigbird.(none)>
+Date:   Sat Aug 1 01:09:41 2009 -0400
+
+    Allow SVNPoller to accept a category so it branch schedulers can filter properly
+
+commit f15ebee1c64a549a01c508783784f889325501ef
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sat Aug 1 10:46:17 2009 -0400
+
+    fix whitespace
+
+commit 15bd807777ad2f998589b8463abb40642513be20
+Merge: dc73c81 6aed4aa
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sat Aug 1 10:44:55 2009 -0400
+
+    Merge branch 'myfixes' of git://github.com/lurker99/buildbot
+
+commit dc73c811eb497caae18477f3f7f23bb5a636d64f
+Merge: 198220f 98b64bf
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sat Aug 1 10:37:00 2009 -0400
+
+    Merge branch 'trac-601' of git://github.com/ddunbar/buildbot
+
+commit 198220f9a7c68aa11dce96be96aaef88c36f8d35
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sat Aug 1 10:14:35 2009 -0400
+
+    move the waterfall down in the default index.html
+
+commit dcd8fad0fccafef1f837a8f93325b6d9778b18f1
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu Jul 30 15:13:49 2009 -0400
+
+    recommend using keyword arguments for Dependent constructor
+
+commit 9dfbb1649537f863b8354470a9e4bc05ee9b5d39
+Merge: 57b6539 1123175
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Jul 29 23:48:19 2009 -0400
+
+    Merge branch 'master' of git://github.com/nicolas17/buildbot
+
+commit 6aed4aaaa8361a39176309bd5f179770f84e2cac
+Author: lurker99 <boris.vaisburd@.metistec.local>
+Date:   Wed Jul 29 18:26:14 2009 +0300
+
+    Added urls list to the build property page
+
+commit 57b6539af70556c4fe07ac92209756dd5b2302c3
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Jul 26 14:48:47 2009 -0400
+
+    make the Mercurial tests more reliable by not trying to invent a username with gethostname()
+
+commit 57e75139a85aeb753aad74dbf6d8fbca31fef8a6
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Jul 26 14:48:25 2009 -0400
+
+    make all VC tests more reliably clean up before running
+
+commit 7689937a5f88d7f6023b0f82cc29371bd6bae51a
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Jul 26 14:14:04 2009 -0400
+
+    disable buildbot.test.test_locks.Locks.testLock3
+
+commit d38df8c6b9a9a192b7282f9abd5d799698a4cd76
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Jul 26 13:18:09 2009 -0400
+
+    fix UnboundLocalError
+
+commit 112317504d29f379f1d8bdf1b8c74c782af0a456
+Author: Nicolás Alvarez <nicolas.alvarez@gmail.com>
+Date:   Sat Jul 25 00:32:45 2009 -0300
+
+    Fix typo in comment.
+
+commit 98b64bf101e12b457bf3805c663407d3772bf43d
+Author: Daniel Dunbar <daniel@zuster.org>
+Date:   Thu Jul 23 22:39:46 2009 -0700
+
+    Workaround for #601, when a build is locked it may not be in currentBui
+    lds, but also not in the cache or on disk. In that case, the BuilderStatus eventGenerator ends up not returning any builds.
+     - I'm not sure of the correct fix, so just ignore failures looking up the most
+       recent build.
+
+commit c47a9f5f10c7679bfe852038585e26c03728e5a9
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu Jul 23 18:01:56 2009 -0400
+
+    fix tests for MasterShellCommand use of WithProperties
+
+commit 19ae4719c10e05f696714a90781f0b3e9c732a6e
+Author: Aloisio Almeida Jr <aloisio.almeida@openbossa.org>
+Date:   Thu Jul 23 14:45:58 2009 -0300
+
+    steps/master.py: Adding WithProperties support to MasterShellCommand (fixes #450)
+    
+    Just calling properties.render() function to attribute 'command' of MasterShellCommand class in start().
+    MasterShellCommand unit test updated.
+    
+    Signed-off-by: Aloisio Almeida Jr <aloisio.almeida@openbossa.org>
+
+commit 8174ed96f3a291cd0e9057b79617ee6dc80c7a22
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Mon Jul 20 13:59:45 2009 -0400
+
+    don't test compression if it's not supported
+
+commit 31534817fecfa929113fd95dffd5745e3d432d86
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Mon Jul 20 13:50:19 2009 -0400
+
+    don't add Nones to a DeferredList
+
+commit 4dcda7197e346f8dba56978f670cddca34cca340
+Author: Daniel Dunbar <daniel@zuster.org>
+Date:   Sun Jul 19 20:19:30 2009 -0700
+
+    Fix for RSS quoting issues.
+
+commit 497aa6cc5a0ede348b16e2f299d81f1585c576e2
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Mon Jul 20 10:29:33 2009 -0400
+
+    (fixes #599) make bz2 module optional
+
+commit 7d71ae0f2c167e90c79e6bafa6150568c2a22624
+Author: Daniel Dunbar <daniel@zuster.org>
+Date:   Sun Jul 19 14:35:05 2009 -0700
+
+    Fix #597, show all failing steps (instead of last step), and include the tail
+    ends of all logs for the failing steps.
+
+commit df2e0842949f8cd05a4a14f3567be5aa4268b36d
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Jul 17 21:07:17 2009 -0400
+
+    (fixes #592) store allChanges, rather than trying to concatenate {un,}importantChanges and thereby losing the order of changes
+
+commit 28b86b7719658b24f806fb8bd5b483f819fca9a6
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Jul 17 16:55:06 2009 -0400
+
+    (fixes #588) don't show 'Cancel All' if allowForce=False
+    
+    Note that the check for allowForce when this button is clicked is
+    already present in the source, so this is a cosmetic change to not show
+    a button that will lead the user to an error message.
+
+commit a5545f6d878d70bd3ed91fbf7e0e2938c46667f8
+Merge: cbb5c0a 64773c1
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Fri Jul 17 16:20:52 2009 -0400
+
+    Merge branch 'master' of git@github.com:djmitche/buildbot
+    
+    Conflicts:
+    	buildbot/scripts/runner.py
+
+commit 64773c1a0d77eaf675e8eb25c7f0d2bc60f605cd
+Author: Nicolas Sylvain <nsylvain@chromium.org>
+Date:   Thu Jul 16 11:51:31 2009 -0700
+
+    Call head() on the StatusResource pages only once per request.
+    
+    The html <head> element contains duplicated content
+    when there is other parameters to the requests because
+    it is being called inside a for loop. It needs to be out
+    of the loop.
+    
+    For example, see the duplicated meta refresh on this page :
+    http://buildbot.net/metabuildbot/waterfall?branch=&builder=docs&reload=60
+
+commit 18f19ae8ee8393398eba09f5537a304eed12d9e2
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu Jul 16 13:52:00 2009 -0400
+
+    add increased timeout for buildbot.test.test_vc.Bzr.testCheckout
+
+commit 2c75b327c43650bfc15fdee09f61667de7342cb2
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu Jul 16 11:28:58 2009 -0400
+
+    add link to the NetBSD pkgsrc bug
+
+commit f064c5d7a01b8e5ea7459c475cc86ac22999455e
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu Jul 16 10:28:11 2009 -0400
+
+    work around NetBSD bug that breaks 'git init'
+
+commit 57bfa26a075dae5f00aed83d8bf9c127e80e8490
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu Jul 16 09:59:17 2009 -0400
+
+    inc version number to 0.7.11p1, edit NEWS and add ChangeLog
+
+commit 707a8203d164e8f73c2135f974343374620464e5
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Jul 12 20:09:58 2009 -0400
+
+    disable buggy test
+
+commit 84a0c8acccbf6074cd62904542b6467bb75741d4
+Author: Matt Heitzenroder <mheitzenroder@gmail.com>
+Date:   Wed Jul 15 19:31:55 2009 -0400
+
+    removed references to dir
+
+commit 7d8a46f9a488da60df945e8c95efb3c6c7bc68ce
+Author: Matt Heitzenroder <mheitzenroder@gmail.com>
+Date:   Wed Jul 15 19:29:13 2009 -0400
+
+    No need to bulid a mirror of the directory.
+
+commit aedd1e71b573ba613adc4399d1e10d895174c4af
+Merge: 5d0cafd c68db6d
+Author: Matt Heitzenroder <mheitzenroder@gmail.com>
+Date:   Tue Jul 14 03:22:56 2009 -0400
+
+    Merge branch 'master' of git://github.com/djmitche/buildbot
+
+commit 5d0cafd7979284c8c0adc605ae8203eb8a7be36a
+Author: Matt Heitzenroder <mheitzenroder@gmail.com>
+Date:   Tue Jul 14 03:20:10 2009 -0400
+
+    corrected KeyError with Private vs private
+
+commit b5049437028c2f303535a99d894c187f0a3f670c
+Author: Matt Heitzenroder <mheitzenroder@gmail.com>
+Date:   Tue Jul 14 02:57:10 2009 -0400
+
+    catch all exceptions when receiving a post
+
+commit 19882836a96e263029b056b7f9f27c30d52ee8ae
+Author: Matt Heitzenroder <mheitzenroder@gmail.com>
+Date:   Tue Jul 14 02:51:59 2009 -0400
+
+    updated docstrings
+
+commit 8111ba893d41a3b768ea048be003702fe62cbd27
+Author: Matt Heitzenroder <mheitzenroder@gmail.com>
+Date:   Tue Jul 14 02:50:38 2009 -0400
+
+    set private attributed based on value of private attribute in GitHub JSON.  cleaned per pylint.
+
+commit c68db6d3fca22d211675ec2652f6d7a5cff5689a
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Mon Jul 13 12:28:01 2009 -0400
+
+    add a default value for branchType, per Marcus and Marijn
+
+commit 85d3fa6633a07efa882f47e591abe9f3c6c73eba
+Author: Matt Heitzenroder <mheitzenroder@gmail.com>
+Date:   Sun Jul 12 16:40:59 2009 -0400
+
+    adding the remote is no longer necessary
+
+commit 0e1d465c2739f84806f218452380d3c3acf3e1f3
+Author: Matt Heitzenroder <mheitzenroder@gmail.com>
+Date:   Sun Jul 12 16:23:51 2009 -0400
+
+    switched clone from bare to mirror
+
+commit e2190bf5aaf825123ee93b739c694891a040dbca
+Merge: ed573ab 515ea72
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sat Jul 11 12:16:21 2009 -0400
+
+    Merge branch 'master' of git://github.com/nicolas17/buildbot
+
+commit ed573ab910d484ad5303794da00dd396d0667f79
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Fri Jul 10 22:49:01 2009 -0700
+
+    Add warning support to PerlModuleTest.
+    
+    PerlModuleTest completely ignored the warningPattern directive and
+    failed to otherwise communicate any warnings that occurred during test
+    time.
+    
+    It now should do what one might expect when configured to check for
+    warnings.
+
+commit 515ea7289455704c7bad89a9d0d6410f52f26f9e
+Author: Nicolás Alvarez <nicolas.alvarez@gmail.com>
+Date:   Sat Jul 11 01:23:03 2009 -0300
+
+    Replaced tabs (ew\!) in Python code.
+
+commit c7a38d331b869a23cad3001724feae3055c80455
+Author: Stefan Seefeld <seefeld@sympatico.ca>
+Date:   Fri Jul 10 22:45:50 2009 -0400
+
+    (fixes #582) This patch fixes the test failures by injecting an extractall method into TarFile if not already present.
+
+commit bd24cdbaaa1fc76cebb06cdb4793aa76cd152b6c
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Jul 10 22:43:08 2009 -0400
+
+    (refs #585) try adding an __init__.py to see if it fixes RPM builds
+
+commit bee810e56b03d835ba7178cafcf004a83a3e9980
+Merge: 1a914f4 0be8a1c
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Jul 10 10:11:42 2009 -0400
+
+    Merge branch 'fixes' of git://github.com/catlee/buildbot
+
+commit 1a914f467dc997d1a9ce483f8a20f1e7e61139dc
+Merge: 35f9555 9f9d8ed
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Jul 10 10:10:54 2009 -0400
+
+    Merge branch 'changesfix' of git://github.com/catlee/buildbot
+
+commit 35f9555f498788abdb343d2b057876c32d08ec73
+Merge: 8014dd5 2f0b4ea
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Fri Jul 10 10:07:28 2009 -0400
+
+    Merge branch 'master' of git://github.com/roder/buildbot
+
+commit 8014dd5bc3c4d0a3ef463496e10e41fe378f90dc
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Thu Jul 9 21:34:42 2009 -0400
+
+    fix always-true assertions
+
+commit 9b1d41b2b6eb5d89cea39a6994ae289a6bb1b1b1
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Jul 8 17:33:37 2009 -0400
+
+    update NEWS
+
+commit 95aac8dd6ae964b8692698ae3ce966b0fcf7bb70
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Jul 8 15:22:54 2009 -0400
+
+    fix typo: getUpstreamScheduler vs findUpstreamScheduler
+
+commit 926a593430dd46317b33fab7a83ab79ee9962995
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Wed Jul 8 12:41:53 2009 -0400
+
+    add error checking and a --private flag to use git@github.com:user/repo.git instead of git://
+
+commit 71a4942d409cd9ea647c7d0bc25e61ab4d71e06e
+Author: Benjamin Smedberg <benjamin@smedbergs.us>
+Date:   Wed Jul 8 11:53:29 2009 -0400
+
+    (fixes #584) add default value for clobberOnBranchChange
+
+commit 2f0b4ea6c8cd60e4075ae34d16757839fc374349
+Merge: 8a41298 3a3f751
+Author: Matt Heitzenroder <mheitzenroder@gmail.com>
+Date:   Tue Jul 7 12:55:08 2009 -0400
+
+    Merge branch 'master' of git://github.com/djmitche/buildbot
+
+commit 8a412980bd4f868b663ada0f7775b109fbac355f
+Author: Matt Heitzenroder <mheitzenroder@gmail.com>
+Date:   Tue Jul 7 12:54:59 2009 -0400
+
+    fixed typo
+
+commit 3a3f751fdae220230cd24dc65d01b8458eab7acd
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Tue Jul 7 12:49:35 2009 -0400
+
+    log the exception too
+
+commit 81d3acbd914ba9c365483e5b95902de1cde7fe55
+Merge: 8e260fd 564c443
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Tue Jul 7 12:48:46 2009 -0400
+
+    Merge branch 'master' of git://github.com/roder/buildbot
+
+commit 564c443565c0f331d15e6d7f8ca1f02accc96809
+Author: Matt Heitzenroder <mheitzenroder@gmail.com>
+Date:   Tue Jul 7 02:29:00 2009 -0400
+
+    fail gracefully, well... stumble a bit and make a joke about it, but don't faceplant.
+
+commit c4fb6105538f93accd8734ef40c11930410a1d75
+Author: Matt Heitzenroder <mheitzenroder@gmail.com>
+Date:   Tue Jul 7 00:01:07 2009 -0400
+
+    simplified, removed local globals, added cmd line options
+
+commit 8e260fdb91a99056a569f05ba9d9e61c7fad1875
+Merge: 157198e 43c720c
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Mon Jul 6 10:08:15 2009 -0400
+
+    Merge branch 'master' of git://github.com/dustin/buildbot
+
+commit 43c720c778acaec59eacf51abdd0c97902d73e2b
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Mon Jul 6 00:45:51 2009 -0700
+
+    Disable waterfall misc events by default.
+
+commit b51cef36a8d3fa4aececae8bb55ef63f6f69a797
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Mon Jul 6 00:35:43 2009 -0700
+
+    Fix waterfall display when showing events.
+
+commit 157198e10f58228e87b549bd0dd7d29e843d7a4d
+Author: Nicolás Alvarez <nicolas.alvarez@gmail.com>
+Date:   Sun Jul 5 21:54:30 2009 -0300
+
+    Fix some docstring typos.
+
+commit 1e130b0160f3e22b3147f37ee2f7a49d65a78b97
+Author: Nicolás Alvarez <nicolas.alvarez@gmail.com>
+Date:   Sun Jul 5 19:48:53 2009 -0300
+
+    Fix typo in documentation.
+
+commit a6df44b0260334a4c9039fe8fd43d9588d1bc636
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Sun Jul 5 15:10:39 2009 -0700
+
+    Retry on delivery failure.
+
+commit e595f9c0ccf9aac794935e4dd836a19b3533a60f
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Sun Jul 5 14:37:59 2009 -0700
+
+    First pass at webhook retries.
+
+commit dd9f28106f6621b47523c2dd8286a4c41c72d8bc
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Jul 5 16:23:47 2009 -0400
+
+    fix tests to reflect new behavior
+
+commit 0f40bc1bb79470dc13a614cd96e28b96de06b4bb
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Jul 5 16:19:09 2009 -0400
+
+    fix texinfo typo
+
+commit 2834f58f2f7a47336679eed9ff93995be859ab36
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Jul 5 13:48:09 2009 -0400
+
+    (refs #361) thread the already-documented logEnviron the rest of the way through to the SlaveCommand step
+
+commit 9b4c509b762c429ce53e930b31e6d4ef3f18f260
+Merge: 1b80f86 3043fbc
+Author: Dustin J. Mitchell <dustin@zmanda.com>
+Date:   Sun Jul 5 09:25:22 2009 -0400
+
+    Merge branch 'webhook-retries' of git://github.com/dustin/buildbot
+
+commit 3043fbcadccb24f58183e42fdd2dd4c484446626
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Sat Jul 4 16:18:57 2009 -0700
+
+    Documented WebHookTransmitter
+
+commit 6239fd6bf389bdb82609b7b01613ccafa79027b7
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Sat Jul 4 14:35:28 2009 -0700
+
+    Better version info on builds.
+
+commit 602ef714247a0b456d3e1193fa6616619cfb1598
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Sat Jul 4 13:57:45 2009 -0700
+
+    Implement the category filtering.
+
+commit 954124677269a6109fb3456c0b9d4c1b1f8d5a1a
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Sat Jul 4 12:58:07 2009 -0700
+
+    Allow status 204.
+
+commit 9cfecc5a308ff993211b614172534839c123f15f
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Sat Jul 4 12:56:19 2009 -0700
+
+    Allow for more than one webhook destination URL.
+
+commit 466b4b7e6f8f48ae63f131b4c072df341fc05912
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Sat Jul 4 03:56:40 2009 -0700
+
+    A webhook status listener.
+
+commit 57c0aeba02570aa78601b53a5d816844e17c8b2c
+Author: Dustin Sallings <dustin@spy.net>
+Date:   Sat Jul 4 00:33:29 2009 -0700
+
+    Fix for log URL generation.
+
+commit 97aa04aa47a4ae3074446d22b377ef9a4f8ebbf2
+Author: Zellyn Hunter <zhunter@ajc.com>
+Date:   Wed Jul 1 14:11:47 2009 -0400
+
+    make alwaysUseLatest=True blank out revision before calling startVC
+
+commit cbb5c0a2f2113bf870bb415814eae5b31f4cb8e1
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Tue Jun 23 08:07:26 2009 -0400
+
+    On buildbot stop, don't die if the process doesn't exist any more.
+
+commit 9f9d8ed3a964df2e5fe27cec8e14a6d31f2509b3
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Fri May 22 17:30:40 2009 -0400
+
+    Make changes.links safer.
+    
+    Mutable objects shouldn't be used as the defaults in method arguments.
+
+commit 0be8a1cc660537043a45cd0d207fd59621c61d4f
+Author: Chris AtLee <catlee@mozilla.com>
+Date:   Thu May 14 18:33:51 2009 -0400
+
+    If the process doesn't exist anymore, just ignore it
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -1,14 +1,17 @@
 
 include MANIFEST.in README README.w32 NEWS CREDITS COPYING
 include docs/examples/*.cfg
 include docs/buildbot.texinfo docs/buildbot.info* docs/buildbot.html
 include docs/*.png docs/images/*.png docs/images/*.svg docs/images/*.txt
-include docs/epyrun docs/gen-reference
+include docs/images/icon.blend docs/images/Makefile
+include docs/epyrun docs/gen-reference docs/Makefile
 include buildbot/test/mail/* buildbot/test/subdir/*
 include buildbot/scripts/sample.cfg
-include buildbot/status/web/*.css buildbot/status/web/*.html
+include buildbot/status/web/*.css buildbot/status/web/*.html buildbot/status/web/*.jpg
 include buildbot/status/web/robots.txt
 include buildbot/clients/debug.glade
 include buildbot/buildbot.png
+include ChangeLog*
 
 include contrib/* contrib/windows/* contrib/OS-X/* contrib/CSS/*
+include contrib/trac/* contrib/trac/bbwatcher/* contrib/trac/bbwatcher/templates/*
--- a/NEWS
+++ b/NEWS
@@ -1,19 +1,146 @@
-User visible changes in Buildbot.             -*- outline -*-
-
-* Release 0.7.10p1 (2 Mar 2009)
-
-This is a bugfix release for 0.7.10, fixing a few minor bugs:
-
-** Bugs Fixed
-
-*** add a missing method to the IRC status plugin
-
-*** add RPM-related buildsteps to setup.py
+Major User visible changes in Buildbot.             -*- outline -*-
+  (see ChangeLog for a detailed list of changes)
+
+* Release 0.7.12 (January 21, 2010)
+
+** New 'console' display
+
+This is a new web status view combining the best of the (t)grid and waterfall
+views.
+
+** New 'extended' stylesheet
+
+Buildbot has a new, much nicer stylesheet available.  Copy the file
+buildbot/status/web/extended.css over your existing public_html/buildbot.css to
+se it.
+
+** Builders can be configured with an object
+
+Instead of a list of dictionaries, builders can now specified using a
+BuilderConfig object in the configuration file.  This will allow for better
+argument checking and default values, and also makes it easier for users to
+create subclasses to handle site-specific builder details.  The old,
+dictionary-based method of configuration is still supported.
+
+** Check for common mis-configuration in addStep
+
+When adding a new step to a factory, either of these are acceptable:
+
+  f.addStep(ShellCommand(command="echo hello, world", description="say hi"))
+  f.addStep(ShellCommand, command="echo hello, world", description="say hi")
+
+but trying to mix these syntaxes is a common misconfiguration:
+
+  f.addStep(ShellCommand(command="echo hello, world"), description="say hi")
+
+in which case the description argument was silently ignored.  This is now an
+error.
+
+** Support for log compression
+
+Log files can be compressed on the master side using either gzip or bzip2.
+
+** Builder.ping no longer accepts timeout argument (bug #664).
+
+The implementation was not robust enough and could cause the master to
+unexpectedly disconnect the slave.
+
+** MailNotifier's customMesg replaced by messageFormatter
+
+The customMesg mechanism had the unfortunate side effect of loading all data
+for a build into memory simultaneously, which for some builds could cause
+memory exhaustion.
+
+** Suppression of selected compiler warnings
+
+The WarningCountingShellCommand class has been extended with the ability to
+upload from the slave a file contain warnings to be ignored. See the
+documentation of the suppressionFile argument to the Compile build step.
+
+** New buildstep `MTR'
+
+A new class buildbot.process.mtrlogobserver.MTR was added. This buildstep is
+used to run test suites using mysql-test-run. It parses the stdio output for
+test failures and summarises them on the waterfall page. It also makes server
+error logs available for debugging failures, and optionally inserts
+information about test runs and test failures into an external database.
+
+** Python API Docs
+
+The docstrings for buildbot are now available in a web-friendly format:
+  http://djmitche.github.com/buildbot/docs/latest/reference
+
+** Many, many bugfixes
+
+* Release 0.7.11p (July 16, 2009)
+
+Fixes a few test failures in 0.7.11, and gives a default value for branchType
+if it is not specified by the master.
+
+* Release 0.7.11 (July 5, 2009)
+
+Developers too numerous to mention contributed to this release.  Buildbot has
+truly become a community-maintained application.  Much hard work is not
+mentioned here, so please consult the git logs for the detailed changes in this
+release.
+
+** Better Memory Performance, Disk Cleanup
+
+Buildbot handles its memory usage a bit better, and can automatically purge old
+history to keep memory and disk usage low.  Look for eventHorizon,
+buildHorizon, logHorizon, and changeHorizon.
+
+** Password Protection for Force Build and Stop actions
+
+It is now possible to require authentication to force build and stop via the
+WebStatus interface. To use this, set the 'auth' field of WebStatus to a valid
+IAuth implementation. Current implementations are:
+	BasicAuth with a list of user/passwords
+	HTPasswdAuth with an .htpasswd file
+By default, the unauthenticated behavior will occur.
+
+** Web Status changes
+
+The "Graceful Shutdown" feature, as a kind of "force", now obeys allowForce.
+
+The waterfall and other pages are more deeply interlinked.
+
+Pending builds can be individually cancelled, or cancelled in bulk.
+
+** Fixed Transfer Steps
+
+Transfer step classes are more reliable; DirectoryUpload and DirectoryDownload
+use tarfile instead of manually framing files.  The DirectoryUpload step also
+now supports compression.
+
+** Conditional Steps
+
+Steps now take a doStepIf parameter which can be used to implement simple
+conditional execution of a step.
+
+** Colorized Steps
+
+Steps are now hilighted with a color in the build view to indicate their
+success or failure.
+
+** Improved build prioritization
+
+Bugfixes and fairer scheduling
+
+** Transposed Grid
+
+Similar to the grid view, but with the axes reversed and showing different
+info.  Located at /tgrid.
+
+** Trigger steps improvements
+
+Trigger now supports copy_properties, to send selected properties to the
+triggered build.
 
 * Release 0.7.10 (25 Feb 2009)
 
 This release is mainly a collection of user-submitted patches since
 the last release.
 
 ** New Features
 
--- a/PKG-INFO
+++ b/PKG-INFO
@@ -1,30 +1,30 @@
 Metadata-Version: 1.0
 Name: buildbot
-Version: 0.7.10p1
+Version: 0.7.12
 Summary: BuildBot build automation system
 Home-page: http://buildbot.net/
-Author: Brian Warner
-Author-email: warner-buildbot@lothar.com
+Author: Dustin J. Mitchell
+Author-email: dustin@v.igoro.us
 License: GNU GPL
 Description: 
         The BuildBot is a system to automate the compile/test cycle required by
         most software projects to validate code changes. By automatically
         rebuilding and testing the tree each time something has changed, build
         problems are pinpointed quickly, before other developers are
         inconvenienced by the failure. The guilty developer can be identified
         and harassed without human intervention. By running the builds on a
         variety of platforms, developers who do not have the facilities to test
         their changes everywhere before checkin will at least know shortly
         afterwards whether they have broken the build or not. Warning counts,
         lint checks, image size, compile time, and other build parameters can
         be tracked over time, are more visible, and are therefore easier to
         improve.
         
 Platform: UNKNOWN
-Classifier: Development Status :: 4 - Beta
+Classifier: Development Status :: 5 - Production/Stable
 Classifier: Environment :: No Input/Output (Daemon)
 Classifier: Environment :: Web Environment
 Classifier: Intended Audience :: Developers
 Classifier: License :: OSI Approved :: GNU General Public License (GPL)
 Classifier: Topic :: Software Development :: Build Tools
 Classifier: Topic :: Software Development :: Testing
--- a/README
+++ b/README
@@ -48,24 +48,23 @@ the best guide to use for setup instruct
 turned into printed documentation. An HTML representation is available on the
 Buildbot home page.
 
 REQUIREMENTS:
 
  Python: http://www.python.org
 
    Buildbot requires python-2.3 or later, and is primarily developed against
-   python-2.4 . It is also tested against python-2.5 .
+   python-2.4 . It is also tested against python-2.5 and python-2.6.
 
  Twisted: http://twistedmatrix.com
 
-   Both the buildmaster and the buildslaves require Twisted-2.0.x or later.
+   Both the buildmaster and the buildslaves require Twisted-2.5.x or later.
    As always, the most recent version is recommended. It has been tested
-   against Twisted-2.5.0, Twisted-8.0.1, Twisted-8.1.0, and Twisted SVN as of
-   the date of release.
+   against Twisted-2.5.0 and Twisted-8.0.1 through Twisted-8.2.0.
 
    Certain versions of Twisted are delivered as a collection of subpackages.
    You'll need at least "Twisted" (the core package), and you'll also want
    TwistedMail, TwistedWeb, and TwistedWords (for sending email, serving a
    web status page, and delivering build status via IRC, respectively). You
    might also want TwistedConch (for the encrypted Manhole debug port). Note
    that Twisted requires ZopeInterface to be installed as well.
 
@@ -75,23 +74,23 @@ Please read the User's Manual in docs/bu
 complete instructions. This file only contains a brief summary.
 
  RUNNING THE UNIT TESTS
 
 If you would like to run the unit test suite, use a command like this:
 
  PYTHONPATH=. trial buildbot.test
 
-This should run up to 221 tests, depending upon what VC tools you have
-installed. On my desktop machine it takes about six minutes to complete.
+This should a whole bunch of tests, depending upon what VC tools you have
+irstalled. On my desktop machine it takes about six minutes to complete.
 Nothing should fail (at least under unix), a few might be skipped. If any of
-the tests fail, you should stop and investigate the cause before continuing
-the installation process, as it will probably be easier to track down the bug
-early. There are a few known failures under windows and OS-X, but please
-report these to the mailing list so we can isolate and resolve them.
+the tests fail, you should stop and investigate the cause before continuing the
+installation process, as it will probably be easier to track down the bug
+early. There are a few known failures under windows and OS-X, but please report
+these to the mailing list so we can isolate and resolve them.
 
 Neither CVS nor SVN support file based repositories on network filesystem
 (or network drives in Windows parlance). Therefore it is recommended to run
 all unit tests on local hard disks.
 
  INSTALLING THE LIBRARIES:
 
 The first step is to install the python libraries. This package uses the
--- a/buildbot.egg-info/PKG-INFO
+++ b/buildbot.egg-info/PKG-INFO
@@ -1,30 +1,30 @@
 Metadata-Version: 1.0
 Name: buildbot
-Version: 0.7.10p1
+Version: 0.7.12
 Summary: BuildBot build automation system
 Home-page: http://buildbot.net/
-Author: Brian Warner
-Author-email: warner-buildbot@lothar.com
+Author: Dustin J. Mitchell
+Author-email: dustin@v.igoro.us
 License: GNU GPL
 Description: 
         The BuildBot is a system to automate the compile/test cycle required by
         most software projects to validate code changes. By automatically
         rebuilding and testing the tree each time something has changed, build
         problems are pinpointed quickly, before other developers are
         inconvenienced by the failure. The guilty developer can be identified
         and harassed without human intervention. By running the builds on a
         variety of platforms, developers who do not have the facilities to test
         their changes everywhere before checkin will at least know shortly
         afterwards whether they have broken the build or not. Warning counts,
         lint checks, image size, compile time, and other build parameters can
         be tracked over time, are more visible, and are therefore easier to
         improve.
         
 Platform: UNKNOWN
-Classifier: Development Status :: 4 - Beta
+Classifier: Development Status :: 5 - Production/Stable
 Classifier: Environment :: No Input/Output (Daemon)
 Classifier: Environment :: Web Environment
 Classifier: Intended Audience :: Developers
 Classifier: License :: OSI Approved :: GNU General Public License (GPL)
 Classifier: Topic :: Software Development :: Build Tools
 Classifier: Topic :: Software Development :: Testing
--- a/buildbot.egg-info/SOURCES.txt
+++ b/buildbot.egg-info/SOURCES.txt
@@ -1,30 +1,34 @@
 COPYING
 CREDITS
+ChangeLog-0.7.10
+ChangeLog-0.7.11
+ChangeLog-0.7.12
 MANIFEST.in
 NEWS
 README
 README.w32
-setup.cfg
 setup.py
 bin/buildbot
 buildbot/__init__.py
 buildbot/buildbot.png
 buildbot/buildset.py
 buildbot/buildslave.py
+buildbot/config.py
 buildbot/dnotify.py
 buildbot/ec2buildslave.py
 buildbot/interfaces.py
 buildbot/locks.py
 buildbot/manhole.py
 buildbot/master.py
 buildbot/pbutil.py
 buildbot/scheduler.py
 buildbot/sourcestamp.py
+buildbot/stringTemplate.py
 buildbot/util.py
 buildbot.egg-info/PKG-INFO
 buildbot.egg-info/SOURCES.txt
 buildbot.egg-info/dependency_links.txt
 buildbot.egg-info/requires.txt
 buildbot.egg-info/top_level.txt
 buildbot/changes/__init__.py
 buildbot/changes/base.py
@@ -45,19 +49,21 @@ buildbot/clients/debug.glade
 buildbot/clients/debug.py
 buildbot/clients/gtkPanes.py
 buildbot/clients/sendchange.py
 buildbot/process/__init__.py
 buildbot/process/base.py
 buildbot/process/builder.py
 buildbot/process/buildstep.py
 buildbot/process/factory.py
+buildbot/process/mtrlogobserver.py
 buildbot/process/process_twisted.py
 buildbot/process/properties.py
 buildbot/process/step_twisted2.py
+buildbot/process/subunitlogobserver.py
 buildbot/scripts/__init__.py
 buildbot/scripts/checkconfig.py
 buildbot/scripts/logwatcher.py
 buildbot/scripts/reconfig.py
 buildbot/scripts/runner.py
 buildbot/scripts/sample.cfg
 buildbot/scripts/startup.py
 buildbot/scripts/tryclient.py
@@ -73,22 +79,30 @@ buildbot/status/client.py
 buildbot/status/html.py
 buildbot/status/mail.py
 buildbot/status/progress.py
 buildbot/status/tests.py
 buildbot/status/tinderbox.py
 buildbot/status/words.py
 buildbot/status/web/__init__.py
 buildbot/status/web/about.py
+buildbot/status/web/auth.py
 buildbot/status/web/base.py
 buildbot/status/web/baseweb.py
+buildbot/status/web/bg_gradient.jpg
 buildbot/status/web/build.py
 buildbot/status/web/builder.py
+buildbot/status/web/buildstatus.py
 buildbot/status/web/changes.py
 buildbot/status/web/classic.css
+buildbot/status/web/console.py
+buildbot/status/web/console_html.py
+buildbot/status/web/console_js.py
+buildbot/status/web/default.css
+buildbot/status/web/extended.css
 buildbot/status/web/feeds.py
 buildbot/status/web/grid.py
 buildbot/status/web/index.html
 buildbot/status/web/logs.py
 buildbot/status/web/robots.txt
 buildbot/status/web/slaves.py
 buildbot/status/web/step.py
 buildbot/status/web/tests.py
@@ -113,26 +127,27 @@ buildbot/test/__init__.py
 buildbot/test/emit.py
 buildbot/test/emitlogs.py
 buildbot/test/runutils.py
 buildbot/test/sleep.py
 buildbot/test/test__versions.py
 buildbot/test/test_bonsaipoller.py
 buildbot/test/test_buildreq.py
 buildbot/test/test_buildstep.py
+buildbot/test/test_changemaster.py
 buildbot/test/test_changes.py
 buildbot/test/test_config.py
+buildbot/test/test_console.py
 buildbot/test/test_control.py
 buildbot/test/test_dependencies.py
 buildbot/test/test_ec2buildslave.py
-buildbot/test/test_limitlogs.py
 buildbot/test/test_locks.py
 buildbot/test/test_maildir.py
 buildbot/test/test_mailparse.py
-buildbot/test/test_mergerequests.py
+buildbot/test/test_ordering.py
 buildbot/test/test_p4poller.py
 buildbot/test/test_package_rpm.py
 buildbot/test/test_properties.py
 buildbot/test/test_reconfig.py
 buildbot/test/test_run.py
 buildbot/test/test_runner.py
 buildbot/test/test_scheduler.py
 buildbot/test/test_shell.py
@@ -151,66 +166,89 @@ buildbot/test/mail/freshcvs.1
 buildbot/test/mail/freshcvs.2
 buildbot/test/mail/freshcvs.3
 buildbot/test/mail/freshcvs.4
 buildbot/test/mail/freshcvs.5
 buildbot/test/mail/freshcvs.6
 buildbot/test/mail/freshcvs.7
 buildbot/test/mail/freshcvs.8
 buildbot/test/mail/freshcvs.9
+buildbot/test/mail/launchpad.1
+buildbot/test/mail/launchpad.2
+buildbot/test/mail/launchpad.3
+buildbot/test/mail/launchpad.4
+buildbot/test/mail/launchpad.5
+buildbot/test/mail/launchpad.6
 buildbot/test/mail/svn-commit.1
 buildbot/test/mail/svn-commit.2
 buildbot/test/mail/syncmail.1
 buildbot/test/mail/syncmail.2
 buildbot/test/mail/syncmail.3
 buildbot/test/mail/syncmail.4
 buildbot/test/mail/syncmail.5
+buildbot/test/subdir/__init__.py
 buildbot/test/subdir/emit.py
 contrib/README.txt
 contrib/arch_buildbot.py
 contrib/bb_applet.py
+contrib/bitbucket_buildbot.py
 contrib/bzr_buildbot.py
 contrib/darcs_buildbot.py
 contrib/fakechange.py
 contrib/generate_changelog.py
 contrib/git_buildbot.py
+contrib/github_buildbot.py
 contrib/hg_buildbot.py
 contrib/run_maxq.py
 contrib/svn_buildbot.py
 contrib/svn_watcher.py
 contrib/svnpoller.py
 contrib/viewcvspoll.py
+contrib/webhook_status.py
 contrib/CSS/sample1.css
 contrib/CSS/sample2.css
 contrib/OS-X/README
 contrib/OS-X/net.sourceforge.buildbot.master.plist
 contrib/OS-X/net.sourceforge.buildbot.slave.plist
+contrib/trac/README.md
+contrib/trac/TODO.md
+contrib/trac/setup.py
+contrib/trac/bbwatcher/__init__.py
+contrib/trac/bbwatcher/api.py
+contrib/trac/bbwatcher/model.py
+contrib/trac/bbwatcher/web_ui.py
+contrib/trac/bbwatcher/templates/bbw_allbuilders.html
+contrib/trac/bbwatcher/templates/bbw_builder.html
+contrib/trac/bbwatcher/templates/bbw_welcome.html
 contrib/windows/buildbot.bat
 contrib/windows/buildbot2.bat
 contrib/windows/buildbot_service.py
 contrib/windows/setup.py
+docs/Makefile
 docs/buildbot.html
 docs/buildbot.info
 docs/buildbot.info-1
 docs/buildbot.info-2
 docs/buildbot.texinfo
 docs/epyrun
 docs/gen-reference
 docs/hexnut32.png
 docs/hexnut48.png
 docs/hexnut64.png
 docs/examples/hello.cfg
 docs/examples/twisted_master.cfg
+docs/images/Makefile
+docs/images/icon.blend
 docs/images/master.png
 docs/images/master.svg
 docs/images/master.txt
 docs/images/overview.png
 docs/images/overview.svg
 docs/images/overview.txt
 docs/images/slavebuilder.png
 docs/images/slavebuilder.svg
 docs/images/slavebuilder.txt
 docs/images/slaves.png
 docs/images/slaves.svg
 docs/images/slaves.txt
 docs/images/status.png
 docs/images/status.svg
-docs/images/status.txt
+docs/images/status.txt
\ No newline at end of file
--- a/buildbot/__init__.py
+++ b/buildbot/__init__.py
@@ -1,1 +1,1 @@
-version = "0.7.10p1"
+version = "0.7.12"
--- a/buildbot/buildset.py
+++ b/buildbot/buildset.py
@@ -26,16 +26,19 @@ class BuildSet:
         self.status = bss = builder.BuildSetStatus(source, reason,
                                                    builderNames, bsid)
 
     def waitUntilSuccess(self):
         return self.status.waitUntilSuccess()
     def waitUntilFinished(self):
         return self.status.waitUntilFinished()
 
+    def getProperties(self):
+        return self.properties
+
     def start(self, builders):
         """This is called by the BuildMaster to actually create and submit
         the BuildRequests."""
         self.requests = []
         reqs = []
 
         # create the requests
         for b in builders:
--- a/buildbot/buildslave.py
+++ b/buildbot/buildslave.py
@@ -10,16 +10,19 @@ from twisted.application import service
 import twisted.spread.pb
 
 from buildbot.pbutil import NewCredPerspective
 from buildbot.status.builder import SlaveStatus
 from buildbot.status.mail import MailNotifier
 from buildbot.interfaces import IBuildSlave, ILatentBuildSlave
 from buildbot.process.properties import Properties
 
+import sys
+if sys.version_info[:3] < (2,4,0):
+    from sets import Set as set
 
 class AbstractBuildSlave(NewCredPerspective, service.MultiService):
     """This is the master-side representative for a remote buildbot slave.
     There is exactly one for each slave described in the config file (the
     c['slaves'] list). When buildbots connect in (.attach), they get a
     reference to this instance. The BotMaster object is stashed as the
     .botmaster attribute. The BotMaster is also our '.parent' Service.
 
@@ -189,24 +192,36 @@ class AbstractBuildSlave(NewCredPerspect
 
         def _get_info(res):
             d1 = bot.callRemote("getSlaveInfo")
             def _got_info(info):
                 log.msg("Got slaveinfo from '%s'" % self.slavename)
                 # TODO: info{} might have other keys
                 state["admin"] = info.get("admin")
                 state["host"] = info.get("host")
+                state["access_uri"] = info.get("access_uri", None)
             def _info_unavailable(why):
                 # maybe an old slave, doesn't implement remote_getSlaveInfo
                 log.msg("BuildSlave.info_unavailable")
                 log.err(why)
             d1.addCallbacks(_got_info, _info_unavailable)
             return d1
         d.addCallback(_get_info)
 
+        def _get_version(res):
+            d1 = bot.callRemote("getVersion")
+            def _got_version(version):
+                state["version"] = version
+            def _version_unavailable(why):
+                # probably an old slave
+                log.msg("BuildSlave.version_unavailable")
+                log.err(why)
+            d1.addCallbacks(_got_version, _version_unavailable)
+        d.addCallback(_get_version)
+
         def _get_commands(res):
             d1 = bot.callRemote("getCommands")
             def _got_commands(commands):
                 state["slave_commands"] = commands
             def _commands_unavailable(why):
                 # probably an old slave
                 log.msg("BuildSlave._commands_unavailable")
                 if why.check(AttributeError):
@@ -214,25 +229,28 @@ class AbstractBuildSlave(NewCredPerspect
                 log.err(why)
             d1.addCallbacks(_got_commands, _commands_unavailable)
             return d1
         d.addCallback(_get_commands)
 
         def _accept_slave(res):
             self.slave_status.setAdmin(state.get("admin"))
             self.slave_status.setHost(state.get("host"))
+            self.slave_status.setAccessURI(state.get("access_uri"))
+            self.slave_status.setVersion(state.get("version"))
             self.slave_status.setConnected(True)
             self.slave_commands = state.get("slave_commands")
             self.slave = bot
             log.msg("bot attached")
             self.messageReceivedFromSlave()
             self.stopMissingTimer()
 
             return self.updateSlave()
         d.addCallback(_accept_slave)
+        d.addCallback(lambda res: self.botmaster.maybeStartAllBuilds())
 
         # Finally, the slave gets a reference to this BuildSlave. They
         # receive this later, after we've started using them.
         d.addCallback(lambda res: self)
         return d
 
     def messageReceivedFromSlave(self):
         now = time.time()
@@ -300,39 +318,31 @@ class AbstractBuildSlave(NewCredPerspect
             log.msg("failed to accelerate the shutdown process")
             pass
         log.msg("waiting for slave to finish disconnecting")
 
         return d
 
     def sendBuilderList(self):
         our_builders = self.botmaster.getBuildersForSlave(self.slavename)
-        blist = [(b.name, b.builddir) for b in our_builders]
+        blist = [(b.name, b.slavebuilddir) for b in our_builders]
         d = self.slave.callRemote("setBuilderList", blist)
         return d
 
     def perspective_keepalive(self):
         pass
 
     def addSlaveBuilder(self, sb):
-        if sb.builder_name not in self.slavebuilders:
-            log.msg("%s adding %s" % (self, sb))
-        elif sb is not self.slavebuilders[sb.builder_name]:
-            log.msg("%s replacing %s" % (self, sb))
-        else:
-            return
         self.slavebuilders[sb.builder_name] = sb
 
     def removeSlaveBuilder(self, sb):
         try:
             del self.slavebuilders[sb.builder_name]
         except KeyError:
             pass
-        else:
-            log.msg("%s removed %s" % (self, sb))
 
     def canStartBuild(self):
         """
         I am called when a build is requested to see if this buildslave
         can start a build.  This function can be used to limit overall
         concurrency on the buildslave.
         """
         # If we're waiting to shutdown gracefully, then we shouldn't
@@ -518,20 +528,21 @@ class AbstractLatentBuildSlave(AbstractB
                 del self._shutdown_callback_handle
                 reactor.removeSystemEventTrigger(handle)
             return failure
         d.addCallbacks(stash_reply, clean_up)
         return d
 
     def attached(self, bot):
         if self.substantiation_deferred is None:
-            log.msg('Slave %s received connection while not trying to '
-                    'substantiate.  Disconnecting.' % (self.slavename,))
+            msg = 'Slave %s received connection while not trying to ' \
+                    'substantiate.  Disconnecting.' % (self.slavename,)
+            log.msg(msg)
             self._disconnect(bot)
-            return defer.fail()
+            return defer.fail(RuntimeError(msg))
         return AbstractBuildSlave.attached(self, bot)
 
     def detached(self, mind):
         AbstractBuildSlave.detached(self, mind)
         if self.substantiation_deferred is not None:
             self._substantiate()
 
     def _substantiation_failed(self, failure):
@@ -539,16 +550,17 @@ class AbstractLatentBuildSlave(AbstractB
         self.substantiation_deferred = None
         self.missing_timer = None
         d.errback(failure)
         self.insubstantiate()
         # notify people, but only if we're still in the config
         if not self.parent or not self.notify_on_missing:
             return
 
+        buildmaster = self.botmaster.parent
         status = buildmaster.getStatus()
         text = "The Buildbot working for '%s'\n" % status.getProjectName()
         text += ("has noticed that the latent buildslave named %s \n" %
                  self.slavename)
         text += "never substantiated after a request\n"
         text += "\n"
         text += ("The request was made at %s (buildmaster-local time)\n" %
                  time.ctime(time.time() - self.missing_timeout)) # approx
--- a/buildbot/changes/bonsaipoller.py
+++ b/buildbot/changes/bonsaipoller.py
@@ -33,22 +33,22 @@ class BonsaiResult:
             return False
         for i in range(len(self.nodes)):
             if self.nodes[i].log != other.nodes[i].log \
               or self.nodes[i].who != other.nodes[i].who \
               or self.nodes[i].date != other.nodes[i].date \
               or len(self.nodes[i].files) != len(other.nodes[i].files):
                 return -1
 
-	        for j in range(len(self.nodes[i].files)):
-	            if self.nodes[i].files[j].revision \
-	              != other.nodes[i].files[j].revision \
-	              or self.nodes[i].files[j].filename \
-	              != other.nodes[i].files[j].filename:
-	                return -1
+                for j in range(len(self.nodes[i].files)):
+                    if self.nodes[i].files[j].revision \
+                      != other.nodes[i].files[j].revision \
+                      or self.nodes[i].files[j].filename \
+                      != other.nodes[i].files[j].filename:
+                        return -1
 
         return 0
 
 class CiNode:
     """I hold information baout one <ci> node, including a list of files"""
     def __init__(self, log="", who="", date=0, files=[]):
         self.log = log
         self.who = who
--- a/buildbot/changes/changes.py
+++ b/buildbot/changes/changes.py
@@ -1,32 +1,35 @@
-
 import sys, os, time
 from cPickle import dump
 
 from zope.interface import implements
 from twisted.python import log
 from twisted.internet import defer
 from twisted.application import service
 from twisted.web import html
 
 from buildbot import interfaces, util
+from buildbot.process.properties import Properties
 
 html_tmpl = """
 <p>Changed by: <b>%(who)s</b><br />
 Changed at: <b>%(at)s</b><br />
 %(branch)s
 %(revision)s
 <br />
 
 Changed files:
 %(files)s
 
 Comments:
 %(comments)s
+
+Properties:
+%(properties)s
 </p>
 """
 
 class Change:
     """I represent a single change to the source tree. This may involve
     several files, but they are all changed by the same person, and there is
     a change comment for the group as a whole.
 
@@ -44,67 +47,91 @@ class Change:
     Changes should be submitted to ChangeMaster.addChange() in
     chronologically increasing order. Out-of-order changes will probably
     cause the html.Waterfall display to be corrupted."""
 
     implements(interfaces.IStatusEvent)
 
     number = None
 
-    links = []
     branch = None
+    category = None
     revision = None # used to create a source-stamp
 
-    def __init__(self, who, files, comments, isdir=0, links=[],
-                 revision=None, when=None, branch=None, category=None):
+    def __init__(self, who, files, comments, isdir=0, links=None,
+                 revision=None, when=None, branch=None, category=None,
+                 revlink='', properties={}):
         self.who = who
         self.comments = comments
         self.isdir = isdir
+        if links is None:
+            links = []
         self.links = links
         self.revision = revision
         if when is None:
             when = util.now()
         self.when = when
         self.branch = branch
         self.category = category
+        self.revlink = revlink
+        self.properties = Properties()
+        self.properties.update(properties, "Change")
 
         # keep a sorted list of the files, for easier display
         self.files = files[:]
         self.files.sort()
 
+    def __setstate__(self, dict):
+        self.__dict__ = dict
+        # Older Changes won't have a 'properties' attribute in them
+        if not hasattr(self, 'properties'):
+            self.properties = Properties()
+
     def asText(self):
         data = ""
-        data += self.getFileContents() 
+        data += self.getFileContents()
         data += "At: %s\n" % self.getTime()
         data += "Changed By: %s\n" % self.who
-        data += "Comments: %s\n\n" % self.comments
+        data += "Comments: %s" % self.comments
+        data += "Properties: \n%s\n\n" % self.getProperties()
         return data
 
     def asHTML(self):
         links = []
         for file in self.files:
             link = filter(lambda s: s.find(file) != -1, self.links)
             if len(link) == 1:
                 # could get confused
                 links.append('<a href="%s"><b>%s</b></a>' % (link[0], file))
             else:
                 links.append('<b>%s</b>' % file)
-        revision = ""
         if self.revision:
-            revision = "Revision: <b>%s</b><br />\n" % self.revision
+            if getattr(self, 'revlink', ""):
+                revision = 'Revision: <a href="%s"><b>%s</b></a>\n' % (
+                        self.revlink, self.revision)
+            else:
+                revision = "Revision: <b>%s</b><br />\n" % self.revision
+        else:
+            revision = ''
+
         branch = ""
         if self.branch:
             branch = "Branch: <b>%s</b><br />\n" % self.branch
 
-        kwargs = { 'who'     : html.escape(self.who),
-                   'at'      : self.getTime(),
-                   'files'   : html.UL(links) + '\n',
-                   'revision': revision,
-                   'branch'  : branch,
-                   'comments': html.PRE(self.comments) }
+        properties = []
+        for prop in self.properties.asList():
+            properties.append("%s: %s<br />" % (prop[0], prop[1]))
+
+        kwargs = { 'who'       : html.escape(self.who),
+                   'at'        : self.getTime(),
+                   'files'     : html.UL(links) + '\n',
+                   'revision'  : revision,
+                   'branch'    : branch,
+                   'comments'  : html.PRE(self.comments),
+                   'properties': html.UL(properties) + '\n' }
         return html_tmpl % kwargs
 
     def get_HTML_box(self, url):
         """Return the contents of a TD cell for the waterfall display.
 
         @param url: the URL that points to an HTML page that will render
         using our asHTML method. The Change is free to use this or ignore it
         as it pleases.
@@ -147,16 +174,22 @@ class Change:
             else:
                 data += "File: %s\n" % self.files[0]
         else:
             data += "Files:\n"
             for f in self.files:
                 data += " %s\n" % f
         return data
         
+    def getProperties(self):
+        data = ""
+        for prop in self.properties.asList():
+            data += "  %s: %s" % (prop[0], prop[1])
+        return data
+
 class ChangeMaster(service.MultiService):
 
     """This is the master-side service which receives file change
     notifications from CVS. It keeps a log of these changes, enough to
     provide for the HTML waterfall display, and to tell
     temporarily-disconnected bots what they missed while they were
     offline.
 
@@ -186,16 +219,18 @@ class ChangeMaster(service.MultiService)
     
     """
 
     implements(interfaces.IEventSource)
 
     debug = False
     # todo: use Maildir class to watch for changes arriving by mail
 
+    changeHorizon = 0
+
     def __init__(self):
         service.MultiService.__init__(self)
         self.changes = []
         # self.basedir must be filled in by the parent
         self.nextNumber = 1
 
     def addSource(self, source):
         assert interfaces.IChangeSource.providedBy(source)
@@ -217,25 +252,28 @@ class ChangeMaster(service.MultiService)
         log.msg("adding change, who %s, %d files, rev=%s, branch=%s, "
                 "comments %s, category %s" % (change.who, len(change.files),
                                               change.revision, change.branch,
                                               change.comments, change.category))
         change.number = self.nextNumber
         self.nextNumber += 1
         self.changes.append(change)
         self.parent.addChange(change)
-        # TODO: call pruneChanges after a while
+        self.pruneChanges()
 
     def pruneChanges(self):
-        self.changes = self.changes[-100:] # or something
+        if self.changeHorizon and len(self.changes) > self.changeHorizon:
+            log.msg("pruning %i changes" % (len(self.changes) - self.changeHorizon))
+            self.changes = self.changes[-self.changeHorizon:]
 
-    def eventGenerator(self, branches=[]):
+    def eventGenerator(self, branches=[], categories=[]):
         for i in range(len(self.changes)-1, -1, -1):
             c = self.changes[i]
-            if not branches or c.branch in branches:
+            if (not branches or c.branch in branches) and (
+                not categories or c.category in categories):
                 yield c
 
     def getChangeNumbered(self, num):
         if not self.changes:
             return None
         first = self.changes[0].number
         if first + len(self.changes)-1 != self.changes[-1].number:
             log.msg(self,
@@ -243,17 +281,20 @@ class ChangeMaster(service.MultiService)
                     (self.changes[0].number,
                      len(self.changes) - 1,
                      self.changes[-1].number))
             for c in self.changes:
                 log.msg("c[%d]: " % c.number, c)
             return None
         offset = num - first
         log.msg(self, "offset", offset)
-        return self.changes[offset]
+        if 0 <= offset <= len(self.changes):
+            return self.changes[offset]
+        else:
+            return None
 
     def __getstate__(self):
         d = service.MultiService.__getstate__(self)
         del d['parent']
         del d['services'] # lose all children
         del d['namedServices']
         return d
 
--- a/buildbot/changes/mail.py
+++ b/buildbot/changes/mail.py
@@ -1,14 +1,15 @@
 # -*- test-case-name: buildbot.test.test_mailparse -*-
 
 """
 Parse various kinds of 'CVS notify' email.
 """
 import os, re
+import time, calendar
 from email import message_from_file
 from email.Utils import parseaddr
 from email.Iterators import body_line_iterator
 
 from zope.interface import implements
 from twisted.python import log
 from buildbot import util
 from buildbot.interfaces import IChangeSource
@@ -16,17 +17,17 @@ from buildbot.changes import changes
 from buildbot.changes.maildir import MaildirService
 
 class MaildirSource(MaildirService, util.ComparableMixin):
     """This source will watch a maildir that is subscribed to a FreshCVS
     change-announcement mailing list.
     """
     implements(IChangeSource)
 
-    compare_attrs = ["basedir", "pollinterval"]
+    compare_attrs = ["basedir", "pollinterval", "prefix"]
     name = None
 
     def __init__(self, maildir, prefix=None):
         MaildirService.__init__(self, maildir)
         self.prefix = prefix
         if prefix and not prefix.endswith("/"):
             log.msg("%s: you probably want your prefix=('%s') to end with "
                     "a slash")
@@ -451,8 +452,144 @@ class SVNCommitEmailMaildirSource(Maildi
                 files.append(f)
 
         if not files:
             log.msg("no matching files found, ignoring commit")
             return None
 
         return changes.Change(who, files, comments, when=when, revision=rev)
 
+# bzr Launchpad branch subscription mails. Sample mail:
+#
+#   From: noreply@launchpad.net
+#   Subject: [Branch ~knielsen/maria/tmp-buildbot-test] Rev 2701: test add file
+#   To: Joe <joe@acme.com>
+#   ...
+#   
+#   ------------------------------------------------------------
+#   revno: 2701
+#   committer: Joe <joe@acme.com>
+#   branch nick: tmpbb
+#   timestamp: Fri 2009-05-15 10:35:43 +0200
+#   message:
+#     test add file
+#   added:
+#     test-add-file
+#   
+#   
+#   --
+#   
+#   https://code.launchpad.net/~knielsen/maria/tmp-buildbot-test
+#   
+#   You are subscribed to branch lp:~knielsen/maria/tmp-buildbot-test.
+#   To unsubscribe from this branch go to https://code.launchpad.net/~knielsen/maria/tmp-buildbot-test/+edit-subscription.
+# 
+# [end of mail]
+
+class BzrLaunchpadEmailMaildirSource(MaildirSource):
+    name = "Launchpad"
+
+    compare_attrs = MaildirSource.compare_attrs + ["branchMap", "defaultBranch"]
+
+    def __init__(self, maildir, prefix=None, branchMap=None, defaultBranch=None, **kwargs):
+        self.branchMap = branchMap
+        self.defaultBranch = defaultBranch
+        MaildirSource.__init__(self, maildir, prefix, **kwargs)
+
+    def parse(self, m, prefix=None):
+        """Parse branch notification messages sent by Launchpad.
+        """
+
+        subject = m["subject"]
+        match = re.search(r"^\s*\[Branch\s+([^]]+)\]", subject)
+        if match:
+            repository = match.group(1)
+        else:
+            repository = None
+
+        # Put these into a dictionary, otherwise we cannot assign them
+        # from nested function definitions.
+        d = { 'files': [], 'comments': "" }
+        gobbler = None
+        rev = None
+        who = None
+        when = util.now()
+        def gobble_comment(s):
+            d['comments'] += s + "\n"
+        def gobble_removed(s):
+            d['files'].append('%s REMOVED' % s)
+        def gobble_added(s):
+            d['files'].append('%s ADDED' % s)
+        def gobble_modified(s):
+            d['files'].append('%s MODIFIED' % s)
+        def gobble_renamed(s):
+            match = re.search(r"^(.+) => (.+)$", s)
+            if match:
+                d['files'].append('%s RENAMED %s' % (match.group(1), match.group(2)))
+            else:
+                d['files'].append('%s RENAMED' % s)
+
+        lines = list(body_line_iterator(m, True))
+        rev = None
+        while lines:
+            line = lines.pop(0)
+
+            # revno: 101
+            match = re.search(r"^revno: ([0-9.]+)", line)
+            if match:
+                rev = match.group(1)
+
+            # committer: Joe <joe@acme.com>
+            match = re.search(r"^committer: (.*)$", line)
+            if match:
+                who = match.group(1)
+
+            # timestamp: Fri 2009-05-15 10:35:43 +0200
+            # datetime.strptime() is supposed to support %z for time zone, but
+            # it does not seem to work. So handle the time zone manually.
+            match = re.search(r"^timestamp: [a-zA-Z]{3} (\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) ([-+])(\d{2})(\d{2})$", line)
+            if match:
+                datestr = match.group(1)
+                tz_sign = match.group(2)
+                tz_hours = match.group(3)
+                tz_minutes = match.group(4)
+                when = parseLaunchpadDate(datestr, tz_sign, tz_hours, tz_minutes)
+
+            if re.search(r"^message:\s*$", line):
+                gobbler = gobble_comment
+            elif re.search(r"^removed:\s*$", line):
+                gobbler = gobble_removed
+            elif re.search(r"^added:\s*$", line):
+                gobbler = gobble_added
+            elif re.search(r"^renamed:\s*$", line):
+                gobbler = gobble_renamed
+            elif re.search(r"^modified:\s*$", line):
+                gobbler = gobble_modified
+            elif re.search(r"^  ", line) and gobbler:
+                gobbler(line[2:-1]) # Use :-1 to gobble trailing newline
+
+        # Determine the name of the branch.
+        branch = None
+        if self.branchMap and repository:
+            if self.branchMap.has_key(repository):
+                branch = self.branchMap[repository]
+            elif self.branchMap.has_key('lp:' + repository):
+                branch = self.branchMap['lp:' + repository]
+        if not branch:
+            if self.defaultBranch:
+                branch = self.defaultBranch
+            else:
+                if repository:
+                    branch = 'lp:' + repository
+                else:
+                    branch = None
+
+        #log.msg("parse(): rev=%s who=%s files=%s comments='%s' when=%s branch=%s" % (rev, who, d['files'], d['comments'], time.asctime(time.localtime(when)), branch))
+        if rev and who:
+            return changes.Change(who, d['files'], d['comments'],
+                                  when=when, revision=rev, branch=branch)
+        else:
+            return None
+
+def parseLaunchpadDate(datestr, tz_sign, tz_hours, tz_minutes):
+    time_no_tz = calendar.timegm(time.strptime(datestr, "%Y-%m-%d %H:%M:%S"))
+    tz_delta = 60 * 60 * int(tz_sign + tz_hours) + 60 * int(tz_minutes)
+    return time_no_tz - tz_delta
--- a/buildbot/changes/p4poller.py
+++ b/buildbot/changes/p4poller.py
@@ -26,17 +26,17 @@ def get_simple_split(branchfile):
 class P4Source(base.ChangeSource, util.ComparableMixin):
     """This source will poll a perforce repository for changes and submit
     them to the change master."""
 
     compare_attrs = ["p4port", "p4user", "p4passwd", "p4base",
                      "p4bin", "pollinterval"]
 
     changes_line_re = re.compile(
-            r"Change (?P<num>\d+) on \S+ by \S+@\S+ '.+'$")
+            r"Change (?P<num>\d+) on \S+ by \S+@\S+ '.*'$")
     describe_header_re = re.compile(
             r"Change \d+ by (?P<who>\S+)@\S+ on (?P<when>.+)$")
     file_re = re.compile(r"^\.\.\. (?P<path>[^#]+)#\d+ \w+$")
     datefmt = '%Y/%m/%d %H:%M:%S'
 
     parent = None # filled in when we're added
     last_change = None
     loop = None
--- a/buildbot/changes/pb.py
+++ b/buildbot/changes/pb.py
@@ -29,17 +29,20 @@ class ChangePerspective(NewCredPerspecti
             pathnames.append(path)
 
         if pathnames:
             change = changes.Change(changedict['who'],
                                     pathnames,
                                     changedict['comments'],
                                     branch=changedict.get('branch'),
                                     revision=changedict.get('revision'),
+                                    revlink=changedict.get('revlink', ''),
                                     category=changedict.get('category'),
+                                    when=changedict.get('when'),
+                                    properties=changedict.get('properties', {})
                                     )
             self.changemaster.addChange(change)
 
 class PBChangeSource(base.ChangeSource):
     compare_attrs = ["user", "passwd", "port", "prefix"]
 
     def __init__(self, user="change", passwd="changepw", port=None,
                  prefix=None, sep=None):
--- a/buildbot/changes/svnpoller.py
+++ b/buildbot/changes/svnpoller.py
@@ -8,16 +8,17 @@ from twisted.python import log
 from twisted.internet import defer, reactor, utils
 from twisted.internet.task import LoopingCall
 
 from buildbot import util
 from buildbot.changes import base
 from buildbot.changes.changes import Change
 
 import xml.dom.minidom
+import urllib
 
 def _assert(condition, msg):
     if condition:
         return True
     raise AssertionError(msg)
 
 def dbgMsg(myString):
     log.msg(myString)
@@ -42,27 +43,27 @@ def split_file_branches(path):
 
 class SVNPoller(base.ChangeSource, util.ComparableMixin):
     """This source will poll a Subversion repository for changes and submit
     them to the change master."""
 
     compare_attrs = ["svnurl", "split_file_function",
                      "svnuser", "svnpasswd",
                      "pollinterval", "histmax",
-                     "svnbin"]
+                     "svnbin", "category"]
 
     parent = None # filled in when we're added
     last_change = None
     loop = None
     working = False
 
     def __init__(self, svnurl, split_file=None,
                  svnuser=None, svnpasswd=None,
                  pollinterval=10*60, histmax=100,
-                 svnbin='svn'):
+                 svnbin='svn', revlinktmpl='', category=None):
         """
         @type  svnurl: string
         @param svnurl: the SVN URL that describes the repository and
                        subdirectory to watch. If this ChangeSource should
                        only pay attention to a single branch, this should
                        point at the repository for that branch, like
                        svn://svn.twistedmatrix.com/svn/Twisted/trunk . If it
                        should follow multiple branches, point it at the
@@ -158,31 +159,46 @@ class SVNPoller(base.ChangeSource, util.
                              system load, but if more than histmax changes
                              are recorded between polls, the extra ones will
                              be silently lost.
 
         @type  svnbin:       string
         @param svnbin:       path to svn binary, defaults to just 'svn'. Use
                              this if your subversion command lives in an
                              unusual location.
+        
+        @type  revlinktmpl:  string
+        @param revlinktmpl:  A format string to use for hyperlinks to revision
+                             information. For example, setting this to
+                             "http://reposerver/websvn/revision.php?rev=%s"
+                             would create suitable links on the build pages
+                             to information in websvn on each revision.
+
+        @type  category:     string
+        @param category:     A single category associated with the changes that
+                             could be used by schedulers watch for branches of a
+                             certain name AND category.
         """
 
         if svnurl.endswith("/"):
             svnurl = svnurl[:-1] # strip the trailing slash
         self.svnurl = svnurl
         self.split_file_function = split_file or split_file_alwaystrunk
         self.svnuser = svnuser
         self.svnpasswd = svnpasswd
 
+        self.revlinktmpl = revlinktmpl
+
         self.svnbin = svnbin
         self.pollinterval = pollinterval
         self.histmax = histmax
         self._prefix = None
         self.overrun_counter = 0
         self.loop = LoopingCall(self.checksvn)
+        self.category = category
 
     def split_file(self, path):
         # use getattr() to avoid turning this function into a bound method,
         # which would require it to have an extra 'self' argument
         f = getattr(self, "split_file_function")
         return f(path)
 
     def startService(self):
@@ -384,16 +400,23 @@ class SVNPoller(base.ChangeSource, util.
         return where
 
     def create_changes(self, new_logentries):
         changes = []
 
         for el in new_logentries:
             branch_files = [] # get oldest change first
             revision = str(el.getAttribute("revision"))
+
+            revlink=''
+
+            if self.revlinktmpl:
+                if revision:
+                    revlink = self.revlinktmpl % urllib.quote_plus(revision)
+
             dbgMsg("Adding change revision %s" % (revision,))
             # TODO: the rest of buildbot may not be ready for unicode 'who'
             # values
             author   = self._get_text(el, "author")
             comments = self._get_text(el, "msg")
             # there is a "date" field, but it provides localtime in the
             # repository's timezone, whereas we care about buildmaster's
             # localtime (since this will get used to position the boxes on
@@ -434,17 +457,19 @@ class SVNPoller(base.ChangeSource, util.
 
                 if action == u'D' and number_of_files_changed == 1 and files[0] == '':
                     log.msg("Ignoring deletion of branch '%s'" % branch)
                 else:
                     c = Change(who=author,
                                files=files,
                                comments=comments,
                                revision=revision,
-                               branch=branch)
+                               branch=branch,
+                               revlink=revlink,
+                               category=self.category)
                     changes.append(c)
 
         return changes
 
     def submit_changes(self, changes):
         for c in changes:
             self.parent.addChange(c)
 
--- a/buildbot/clients/sendchange.py
+++ b/buildbot/clients/sendchange.py
@@ -5,21 +5,23 @@ from twisted.internet import reactor
 
 class Sender:
     def __init__(self, master, user=None):
         self.user = user
         self.host, self.port = master.split(":")
         self.port = int(self.port)
         self.num_changes = 0
 
-    def send(self, branch, revision, comments, files, user=None, category=None):
+    def send(self, branch, revision, comments, files, user=None, category=None,
+             when=None, properties={}):
         if user is None:
             user = self.user
         change = {'who': user, 'files': files, 'comments': comments,
-                  'branch': branch, 'revision': revision, 'category': category}
+                  'branch': branch, 'revision': revision, 'category': category,
+                  'when': when, 'properties': properties}
         self.num_changes += 1
 
         f = pb.PBClientFactory()
         d = f.login(credentials.UsernamePassword("change", "changepw"))
         reactor.connectTCP(self.host, self.port, f)
         d.addCallback(self.addChange, change)
         return d
 
new file mode 100644
--- /dev/null
+++ b/buildbot/config.py
@@ -0,0 +1,91 @@
+from buildbot.util import now, safeTranslate
+
+
+class BuilderConfig:
+    """
+
+    Used in config files to specify a builder - this can be subclassed by users
+    to add extra config args, set defaults, or whatever.  It is converted to a
+    dictionary for consumption by the buildmaster at config time.
+
+    """
+
+    def __init__(self,
+                name=None,
+                slavename=None,
+                slavenames=None,
+                builddir=None,
+                slavebuilddir=None,
+                factory=None,
+                category=None,
+                nextSlave=None,
+                nextBuild=None,
+                locks=None,
+                env=None):
+
+        # name is required, and can't start with '_'
+        if not name or type(name) is not str:
+            raise ValueError("builder's name is required")
+        if name[0] == '_':
+            raise ValueError("builder names must not start with an "
+                             "underscore: " + name)
+        self.name = name
+
+        # factory is required
+        if factory is None:
+            raise ValueError("builder's factory is required")
+        self.factory = factory
+
+        # slavenames can be a single slave name or a list, and should also
+        # include slavename, if given
+        if type(slavenames) is str:
+            slavenames = [ slavenames ]
+        if slavenames:
+            if type(slavenames) is not list:
+                raise TypeError("slavenames must be a list or a string")
+        else:
+            slavenames = []
+        if slavename:
+            if type(slavename) != str:
+                raise TypeError("slavename must be a string")
+            slavenames = slavenames + [ slavename ]
+        if not slavenames:
+            raise ValueError("at least one slavename is required")
+        self.slavenames = slavenames
+
+        # builddir defaults to name
+        if builddir is None:
+            builddir = safeTranslate(name)
+        self.builddir = builddir
+
+        # slavebuilddir defaults to builddir
+        if slavebuilddir is None:
+            slavebuilddir = builddir
+        self.slavebuilddir = slavebuilddir
+
+        # remainder are optional
+        self.category = category
+        self.nextSlave = nextSlave
+        self.nextBuild = nextBuild
+        self.locks = locks
+        self.env = env
+
+    def getConfigDict(self):
+        rv = {
+            'name': self.name,
+            'slavenames': self.slavenames,
+            'factory': self.factory,
+            'builddir': self.builddir,
+            'slavebuilddir': self.slavebuilddir,
+        }
+        if self.category:
+            rv['category'] = self.category
+        if self.nextSlave:
+            rv['nextSlave'] = self.nextSlave
+        if self.nextBuild:
+            rv['nextBuild'] = self.nextBuild
+        if self.locks:
+            rv['locks'] = self.locks
+        if self.env:
+            rv['env'] = self.env
+        return rv
--- a/buildbot/ec2buildslave.py
+++ b/buildbot/ec2buildslave.py
@@ -27,17 +27,17 @@ TERMINATED = 'terminated'
 class EC2LatentBuildSlave(AbstractLatentBuildSlave):
 
     instance = image = None
     _poll_resolution = 5 # hook point for tests
 
     def __init__(self, name, password, instance_type, ami=None,
                  valid_ami_owners=None, valid_ami_location_regex=None,
                  elastic_ip=None, identifier=None, secret_identifier=None,
-                 aws_id_file_path=None,
+                 aws_id_file_path=None, user_data=None,
                  keypair_name='latent_buildbot_slave',
                  security_name='latent_buildbot_slave',
                  max_builds=None, notify_on_missing=[], missing_timeout=60*20,
                  build_wait_timeout=60*10, properties={}):
         AbstractLatentBuildSlave.__init__(
             self, name, password, max_builds, notify_on_missing,
             missing_timeout, build_wait_timeout, properties)
         if not ((ami is not None) ^
@@ -63,16 +63,17 @@ class EC2LatentBuildSlave(AbstractLatent
             else:
                 # verify that regex will compile
                 re.compile(valid_ami_location_regex)
         self.valid_ami_owners = valid_ami_owners
         self.valid_ami_location_regex = valid_ami_location_regex
         self.instance_type = instance_type
         self.keypair_name = keypair_name
         self.security_name = security_name
+        self.user_data = user_data
         if identifier is None:
             assert secret_identifier is None, (
                 'supply both or neither of identifier, secret_identifier')
             if aws_id_file_path is None:
                 home = os.environ['HOME']
                 aws_id_file_path = os.path.join(home, '.ec2', 'aws_id')
             if not os.path.exists(aws_id_file_path):
                 raise ValueError(
@@ -82,21 +83,21 @@ class EC2LatentBuildSlave(AbstractLatent
                     (self.__class__.__name__, aws_id_file_path))
             aws_file = open(aws_id_file_path, 'r')
             try:
                 identifier = aws_file.readline().strip()
                 secret_identifier = aws_file.readline().strip()
             finally:
                 aws_file.close()
         else:
-            assert (aws_id_file_path is None,
-                    'if you supply the identifier and secret_identifier, '
-                    'do not specify the aws_id_file_path')
-            assert (secret_identifier is not None,
-                    'supply both or neither of identifier, secret_identifier')
+            assert aws_id_file_path is None, \
+                    'if you supply the identifier and secret_identifier, ' \
+                    'do not specify the aws_id_file_path'
+            assert secret_identifier is not None, \
+                    'supply both or neither of identifier, secret_identifier'
         # Make the EC2 connection.
         self.conn = boto.connect_ec2(identifier, secret_identifier)
 
         # Make a keypair
         #
         # We currently discard the keypair data because we don't need it.
         # If we do need it in the future, we will always recreate the keypairs
         # because there is no way to
@@ -181,38 +182,38 @@ class EC2LatentBuildSlave(AbstractLatent
                 options = [candidate[level:] for candidate in options]
         else:
             options = [(image.location, image.id, image) for image
                        in self.conn.get_all_images(
                         owners=self.valid_ami_owners)]
         options.sort()
         log.msg('sorted images (last is chosen): %s' %
                 (', '.join(
-                    '%s (%s)' % (candidate[-1].id, candidate[-1].location)
-                    for candidate in options)))
+                    ['%s (%s)' % (candidate[-1].id, candidate[-1].location)
+                    for candidate in options])))
         if not options:
             raise ValueError('no available images match constraints')
         return options[-1][-1]
 
-    @property
     def dns(self):
         if self.instance is None:
             return None
         return self.instance.public_dns_name
+    dns = property(dns)
 
     def start_instance(self):
         if self.instance is not None:
             raise ValueError('instance active')
         return threads.deferToThread(self._start_instance)
 
     def _start_instance(self):
         image = self.get_image()
         reservation = image.run(
             key_name=self.keypair_name, security_groups=[self.security_name],
-            instance_type=self.instance_type)
+            instance_type=self.instance_type, user_data=self.user_data)
         self.instance = reservation.instances[0]
         log.msg('%s %s starting instance %s' %
                 (self.__class__.__name__, self.slavename, self.instance.id))
         duration = 0
         interval = self._poll_resolution
         while self.instance.state == PENDING:
             time.sleep(interval)
             duration += interval
--- a/buildbot/interfaces.py
+++ b/buildbot/interfaces.py
@@ -337,16 +337,19 @@ class ISchedulerStatus(Interface):
         BuildSets are waiting for their tree-stable-timers to expire."""
         # TODO: this is not implemented anywhere
 
 
 class IBuilderStatus(Interface):
     def getName():
         """Return the name of this Builder (a string)."""
 
+    def getCategory():
+        """Return the category of this builder (a string)."""
+
     def getState():
         # TODO: this isn't nearly as meaningful as it used to be
         """Return a tuple (state, builds) for this Builder. 'state' is the
         so-called 'big-status', indicating overall status (as opposed to
         which step is currently running). It is a string, one of 'offline',
         'idle', or 'building'. 'builds' is a list of IBuildStatus objects
         (possibly empty) representing the currently active builds."""
 
@@ -435,27 +438,32 @@ class IBuilderStatus(Interface):
         receiver will be given builderChangedState, buildStarted, and
         buildFinished messages."""
 
     def unsubscribe(receiver):
         """Unregister an IStatusReceiver. No further status messgaes will be
         delivered."""
 
 class IEventSource(Interface):
-    def eventGenerator(branches=[]):
+    def eventGenerator(branches=[], categories=[]):
         """This function creates a generator which will yield all of this
         object's status events, starting with the most recent and progressing
         backwards in time. These events provide the IStatusEvent interface.
         At the moment they are all instances of buildbot.status.builder.Event
         or buildbot.status.builder.BuildStepStatus .
 
         @param branches: a list of branch names. The generator should only
         return events that are associated with these branches. If the list is
         empty, events for all branches should be returned (i.e. an empty list
         means 'accept all' rather than 'accept none').
+
+        @param categories: a list of category names.  The generator
+        should only return events that are categorized within the
+        given category.  If the list is empty, events for all
+        categories should be returned.
         """
 
 class IBuildStatus(Interface):
     """I represent the status of a single Build/BuildRequest. It could be
     in-progress or finished."""
 
     def getBuilder():
         """
@@ -551,18 +559,18 @@ class IBuildStatus(Interface):
     def getText():
         """Returns a list of strings to describe the build. These are
         intended to be displayed in a narrow column. If more space is
         available, the caller should join them together with spaces before
         presenting them to the user."""
 
     def getResults():
         """Return a constant describing the results of the build: one of the
-        constants in buildbot.status.builder: SUCCESS, WARNINGS, or
-        FAILURE."""
+        constants in buildbot.status.builder: SUCCESS, WARNINGS,
+        FAILURE, SKIPPED or EXCEPTION."""
 
     def getLogs():
         """Return a list of logs that describe the build as a whole. Some
         steps will contribute their logs, while others are are less important
         and will only be accessible through the IBuildStepStatus objects.
         Each log is an object which implements the IStatusLog interface."""
 
     def getTestResults():
@@ -877,16 +885,23 @@ class IStatusReceiver(Interface):
         """
 
     def requestSubmitted(request):
         """A new BuildRequest has been submitted to the buildmaster.
 
         @type request: implementor of L{IBuildRequestStatus}
         """
 
+    def requestCancelled(builder, request):
+        """A BuildRequest has been cancelled on the given Builder.
+
+        @type builder: L{buildbot.status.builder.BuilderStatus}
+        @type request: implementor of L{IBuildRequestStatus}
+        """
+
     def builderAdded(builderName, builder):
         """
         A new Builder has just been added. This method may return an
         IStatusReceiver (probably 'self') which will be subscribed to receive
         builderChangedState and buildStarted/Finished events.
 
         @type  builderName: string
         @type  builder:     L{buildbot.status.builder.BuilderStatus}
@@ -1023,22 +1038,23 @@ class IBuilderControl(Interface):
         through the control object."""
 
     def getBuild(number):
         """Attempt to return an IBuildControl object for the given build.
         Returns None if no such object is available. This will only work for
         the build that is currently in progress: once the build finishes,
         there is nothing to control anymore."""
 
-    def ping(timeout=30):
+    def ping():
         """Attempt to contact the slave and see if it is still alive. This
         returns a Deferred which fires with either True (the slave is still
-        alive) or False (the slave did not respond). As a side effect, adds
-        an event to this builder's column in the waterfall display
-        containing the results of the ping."""
+        alive) or False (the slave did not respond). As a side effect, adds an
+        event to this builder's column in the waterfall display containing the
+        results of the ping. Note that this may not fail for a long time, it is
+        implemented in terms of the timeout on the underlying TCP connection."""
         # TODO: this ought to live in ISlaveControl, maybe with disconnect()
         # or something. However the event that is emitted is most useful in
         # the Builder column, so it kinda fits here too.
 
 class IBuildRequestControl(Interface):
     def subscribe(observer):
         """Register a callable that will be invoked (with a single
         IBuildControl object) for each Build that is created to satisfy this
--- a/buildbot/locks.py
+++ b/buildbot/locks.py
@@ -145,25 +145,27 @@ class RealSlaveLock:
             lock = self.locks[slavename] = BaseLock(self.name, maxCount)
             desc = "<SlaveLock(%s, %s)[%s] %d>" % (self.name, maxCount,
                                                    slavename, id(lock))
             lock.description = desc
             self.locks[slavename] = lock
         return self.locks[slavename]
 
 
-class LockAccess:
+class LockAccess(util.ComparableMixin):
     """ I am an object representing a way to access a lock.
 
     @param lockid: LockId instance that should be accessed.
     @type  lockid: A MasterLock or SlaveLock instance.
 
     @param mode: Mode of accessing the lock.
     @type  mode: A string, either 'counting' or 'exclusive'.
     """
+
+    compare_attrs = ['lockid', 'mode']
     def __init__(self, lockid, mode):
         self.lockid = lockid
         self.mode = mode
 
         assert isinstance(lockid, (MasterLock, SlaveLock))
         assert mode in ['counting', 'exclusive']
 
 
--- a/buildbot/master.py
+++ b/buildbot/master.py
@@ -6,34 +6,36 @@ try:
     import signal
 except ImportError:
     pass
 from cPickle import load
 import warnings
 
 from zope.interface import implements
 from twisted.python import log, components
+from twisted.python.failure import Failure
 from twisted.internet import defer, reactor
 from twisted.spread import pb
 from twisted.cred import portal, checkers
 from twisted.application import service, strports
 from twisted.persisted import styles
 
 import buildbot
 # sibling imports
-from buildbot.util import now
+from buildbot.util import now, safeTranslate
 from buildbot.pbutil import NewCredPerspective
 from buildbot.process.builder import Builder, IDLE
 from buildbot.process.base import BuildRequest
 from buildbot.status.builder import Status
 from buildbot.changes.changes import Change, ChangeMaster, TestChangeMaster
 from buildbot.sourcestamp import SourceStamp
 from buildbot.buildslave import BuildSlave
 from buildbot import interfaces, locks
 from buildbot.process.properties import Properties
+from buildbot.config import BuilderConfig
 
 ########################################
 
 class BotMaster(service.MultiService):
 
     """This is the master-side service which manages remote buildbot slaves.
     It provides them with BuildSlaves, and distributes file change
     notification messages to them.
@@ -61,16 +63,20 @@ class BotMaster(service.MultiService):
 
         # self.locks holds the real Lock instances
         self.locks = {}
 
         # self.mergeRequests is the callable override for merging build
         # requests
         self.mergeRequests = None
 
+        # self.prioritizeBuilders is the callable override for builder order
+        # traversal
+        self.prioritizeBuilders = None
+
     # these four are convenience functions for testing
 
     def waitUntilBuilderAttached(self, name):
         b = self.builders[name]
         #if b.slaves:
         #    return defer.succeed(None)
         d = defer.Deferred()
         b.watchers['attach'].append(d)
@@ -189,29 +195,41 @@ class BotMaster(service.MultiService):
 
     def _updateAllSlaves(self):
         """Notify all buildslaves about changes in their Builders."""
         dl = [s.updateSlave() for s in self.slaves.values()]
         return defer.DeferredList(dl)
 
     def maybeStartAllBuilds(self):
         builders = self.builders.values()
-        def _sortfunc(b1, b2):
-            t1 = b1.getOldestRequestTime()
-            t2 = b2.getOldestRequestTime()
-            # If t1 or t2 is None, then there are no build requests,
-            # so sort it at the end
-            if t1 is None:
-                return 1
-            if t2 is None:
-                return -1
-            return cmp(t1, t2)
-        builders.sort(cmp=_sortfunc)
-        for b in builders:
-            b.maybeStartBuild()
+        if self.prioritizeBuilders is not None:
+            try:
+                builders = self.prioritizeBuilders(self.parent, builders)
+            except:
+                log.msg("Exception prioritizing builders")
+                log.err(Failure())
+                return
+        else:
+            def _sortfunc(b1, b2):
+                t1 = b1.getOldestRequestTime()
+                t2 = b2.getOldestRequestTime()
+                # If t1 or t2 is None, then there are no build requests,
+                # so sort it at the end
+                if t1 is None:
+                    return 1
+                if t2 is None:
+                    return -1
+                return cmp(t1, t2)
+            builders.sort(_sortfunc)
+        try:
+            for b in builders:
+                b.maybeStartBuild()
+        except:
+            log.msg("Exception starting builds")
+            log.err(Failure())
 
     def shouldMergeRequests(self, builder, req1, req2):
         """Determine whether two BuildRequests should be merged for
         the given builder.
 
         """
         if self.mergeRequests is not None:
             return self.mergeRequests(builder, req1, req2)
@@ -298,28 +316,22 @@ class DebugPerspective(NewCredPerspectiv
                 bot = s.f
                 for channel in bot.channels:
                     print " channel", channel
                     bot.p.msg(channel, "Ow, quit it")
 
     def perspective_print(self, msg):
         print "debug", msg
 
-class Dispatcher(styles.Versioned):
+class Dispatcher:
     implements(portal.IRealm)
-    persistenceVersion = 2
 
     def __init__(self):
         self.names = {}
 
-    def upgradeToVersion1(self):
-        self.master = self.botmaster.parent
-    def upgradeToVersion2(self):
-        self.names = {}
-
     def register(self, name, afactory):
         self.names[name] = afactory
     def unregister(self, name):
         del self.names[name]
 
     def requestAvatar(self, avatarID, mind, interface):
         assert interface == pb.IPerspective
         afactory = self.names.get(avatarID)
@@ -355,19 +367,18 @@ class Dispatcher(styles.Versioned):
 #    all IChangeSource objects
 #   StatusClientService
 #   TCPClient(self.ircFactory)
 #   TCPServer(self.slaveFactory) -> dispatcher.requestAvatar
 #   TCPServer(self.site)
 #   UNIXServer(ResourcePublisher(self.site))
 
 
-class BuildMaster(service.MultiService, styles.Versioned):
+class BuildMaster(service.MultiService):
     debug = 0
-    persistenceVersion = 3
     manhole = None
     debugPassword = None
     projectName = "(unspecified)"
     projectURL = None
     buildbotURL = None
     change_svc = None
     properties = Properties()
 
@@ -404,33 +415,16 @@ class BuildMaster(service.MultiService, 
 
         # this ChangeMaster is a dummy, only used by tests. In the real
         # buildmaster, where the BuildMaster instance is activated
         # (startService is called) by twistd, this attribute is overwritten.
         self.useChanges(TestChangeMaster())
 
         self.readConfig = False
 
-    def upgradeToVersion1(self):
-        self.dispatcher = self.slaveFactory.root.portal.realm
-
-    def upgradeToVersion2(self): # post-0.4.3
-        self.webServer = self.webTCPPort
-        del self.webTCPPort
-        self.webDistribServer = self.webUNIXPort
-        del self.webUNIXPort
-        self.configFileName = "master.cfg"
-
-    def upgradeToVersion3(self):
-        # post 0.6.3, solely to deal with the 0.6.3 breakage. Starting with
-        # 0.6.5 I intend to do away with .tap files altogether
-        self.services = []
-        self.namedServices = {}
-        del self.change_svc
-
     def startService(self):
         service.MultiService.startService(self)
         self.loadChanges() # must be done before loading the config file
         if not self.readConfig:
             # TODO: consider catching exceptions during this call to
             # loadTheConfigFile and bailing (reactor.stop) if it fails,
             # since without a config file we can't do anything except reload
             # the config file, and it would be nice for the user to discover
@@ -518,55 +512,72 @@ class BuildMaster(service.MultiService, 
             config = localDict['BuildmasterConfig']
         except KeyError:
             log.err("missing config dictionary")
             log.err("config file must define BuildmasterConfig")
             raise
 
         known_keys = ("bots", "slaves",
                       "sources", "change_source",
-                      "schedulers", "builders", "mergeRequests", 
+                      "schedulers", "builders", "mergeRequests",
                       "slavePortnum", "debugPassword", "logCompressionLimit",
                       "manhole", "status", "projectName", "projectURL",
-                      "buildbotURL", "properties"
+                      "buildbotURL", "properties", "prioritizeBuilders",
+                      "eventHorizon", "buildCacheSize", "logHorizon", "buildHorizon",
+                      "changeHorizon", "logMaxSize", "logMaxTailSize",
+                      "logCompressionMethod",
                       )
         for k in config.keys():
             if k not in known_keys:
                 log.msg("unknown key '%s' defined in config dictionary" % k)
 
         try:
             # required
             schedulers = config['schedulers']
             builders = config['builders']
-            for k in builders:
-                if k['name'].startswith("_"):
-                    errmsg = ("builder names must not start with an "
-                              "underscore: " + k['name'])
-                    log.err(errmsg)
-                    raise ValueError(errmsg)
-
             slavePortnum = config['slavePortnum']
             #slaves = config['slaves']
             #change_source = config['change_source']
 
             # optional
             debugPassword = config.get('debugPassword')
             manhole = config.get('manhole')
             status = config.get('status', [])
             projectName = config.get('projectName')
             projectURL = config.get('projectURL')
             buildbotURL = config.get('buildbotURL')
             properties = config.get('properties', {})
-            logCompressionLimit = config.get('logCompressionLimit')
+            buildCacheSize = config.get('buildCacheSize', None)
+            eventHorizon = config.get('eventHorizon', None)
+            logHorizon = config.get('logHorizon', None)
+            buildHorizon = config.get('buildHorizon', None)
+            logCompressionLimit = config.get('logCompressionLimit', 4*1024)
             if logCompressionLimit is not None and not \
                     isinstance(logCompressionLimit, int):
                 raise ValueError("logCompressionLimit needs to be bool or int")
+            logCompressionMethod = config.get('logCompressionMethod', "bz2")
+            if logCompressionMethod not in ('bz2', 'gz'):
+                raise ValueError("logCompressionMethod needs to be 'bz2', or 'gz'")
+            logMaxSize = config.get('logMaxSize')
+            if logMaxSize is not None and not \
+                    isinstance(logMaxSize, int):
+                raise ValueError("logMaxSize needs to be None or int")
+            logMaxTailSize = config.get('logMaxTailSize')
+            if logMaxTailSize is not None and not \
+                    isinstance(logMaxTailSize, int):
+                raise ValueError("logMaxTailSize needs to be None or int")
             mergeRequests = config.get('mergeRequests')
             if mergeRequests is not None and not callable(mergeRequests):
                 raise ValueError("mergeRequests must be a callable")
+            prioritizeBuilders = config.get('prioritizeBuilders')
+            if prioritizeBuilders is not None and not callable(prioritizeBuilders):
+                raise ValueError("prioritizeBuilders must be callable")
+            changeHorizon = config.get("changeHorizon")
+            if changeHorizon is not None and not isinstance(changeHorizon, int):
+                raise ValueError("changeHorizon needs to be an int")
 
         except KeyError, e:
             log.msg("config dictionary is missing a required parameter")
             log.msg("leaving old configuration in place")
             raise
 
         #if "bots" in config:
         #    raise KeyError("c['bots'] is no longer accepted")
@@ -583,16 +594,19 @@ class BuildMaster(service.MultiService, 
         if "bots" not in config and "slaves" not in config:
             log.msg("config dictionary must have either 'bots' or 'slaves'")
             log.msg("leaving old configuration in place")
             raise KeyError("must have either 'bots' or 'slaves'")
 
         #if "sources" in config:
         #    raise KeyError("c['sources'] is no longer accepted")
 
+        if changeHorizon is not None:
+            self.change_svc.changeHorizon = changeHorizon
+
         change_source = config.get('change_source', [])
         if isinstance(change_source, (list, tuple)):
             change_sources = change_source
         else:
             change_sources = [change_source]
         if "sources" in config:
             m = ("c['sources'] is deprecated as of 0.7.6 and will be "
                  "removed by 0.8.0 . Please use c['change_source'] instead.")
@@ -621,31 +635,53 @@ class BuildMaster(service.MultiService, 
             assert interfaces.IScheduler(s, None), errmsg
         assert isinstance(status, (list, tuple))
         for s in status:
             assert interfaces.IStatusReceiver(s, None)
 
         slavenames = [s.slavename for s in slaves]
         buildernames = []
         dirnames = []
+
+        # convert builders from objects to config dictionaries
+        builders_dicts = []
         for b in builders:
-            if type(b) is tuple:
-                raise ValueError("builder %s must be defined with a dict, "
-                                 "not a tuple" % b[0])
+            if isinstance(b, BuilderConfig):
+                builders_dicts.append(b.getConfigDict())
+            elif type(b) is dict:
+                builders_dicts.append(b)
+            else:
+                raise ValueError("builder %s is not a BuilderConfig object (or a dict)" % b)
+        builders = builders_dicts
+
+        for b in builders:
             if b.has_key('slavename') and b['slavename'] not in slavenames:
                 raise ValueError("builder %s uses undefined slave %s" \
                                  % (b['name'], b['slavename']))
             for n in b.get('slavenames', []):
                 if n not in slavenames:
                     raise ValueError("builder %s uses undefined slave %s" \
                                      % (b['name'], n))
             if b['name'] in buildernames:
                 raise ValueError("duplicate builder name %s"
                                  % b['name'])
             buildernames.append(b['name'])
+
+            # sanity check name (BuilderConfig does this too)
+            if b['name'].startswith("_"):
+                errmsg = ("builder names must not start with an "
+                          "underscore: " + b['name'])
+                log.err(errmsg)
+                raise ValueError(errmsg)
+
+            # Fix the dictionnary with default values, in case this wasn't
+            # specified with a BuilderConfig object (which sets the same defaults)
+            b.setdefault('builddir', safeTranslate(b['name']))
+            b.setdefault('slavebuilddir', b['builddir'])
+
             if b['builddir'] in dirnames:
                 raise ValueError("builder %s reuses builddir %s"
                                  % (b['name'], b['builddir']))
             dirnames.append(b['builddir'])
 
         unscheduled_buildernames = buildernames[:]
         schedulernames = []
         for s in schedulers:
@@ -713,20 +749,39 @@ class BuildMaster(service.MultiService, 
         d = defer.succeed(None)
 
         self.projectName = projectName
         self.projectURL = projectURL
         self.buildbotURL = buildbotURL
 
         self.properties = Properties()
         self.properties.update(properties, self.configFileName)
-        if logCompressionLimit is not None:
-            self.status.logCompressionLimit = logCompressionLimit
+
+        self.status.logCompressionLimit = logCompressionLimit
+        self.status.logCompressionMethod = logCompressionMethod
+        self.status.logMaxSize = logMaxSize
+        self.status.logMaxTailSize = logMaxTailSize
+        # Update any of our existing builders with the current log parameters.
+        # This is required so that the new value is picked up after a
+        # reconfig.
+        for builder in self.botmaster.builders.values():
+            builder.builder_status.setLogCompressionLimit(logCompressionLimit)
+            builder.builder_status.setLogCompressionMethod(logCompressionMethod)
+            builder.builder_status.setLogMaxSize(logMaxSize)
+            builder.builder_status.setLogMaxTailSize(logMaxTailSize)
+
         if mergeRequests is not None:
             self.botmaster.mergeRequests = mergeRequests
+        if prioritizeBuilders is not None:
+            self.botmaster.prioritizeBuilders = prioritizeBuilders
+
+        self.buildCacheSize = buildCacheSize
+        self.eventHorizon = eventHorizon
+        self.logHorizon = logHorizon
+        self.buildHorizon = buildHorizon
 
         # self.slaves: Disconnect any that were attached and removed from the
         # list. Update self.checker with the new list of passwords, including
         # debug/change/status.
         d.addCallback(lambda res: self.loadConfig_Slaves(slaves))
 
         # self.debugPassword
         if debugPassword:
@@ -795,16 +850,18 @@ class BuildMaster(service.MultiService, 
         return self.botmaster.loadConfig_Slaves(new_slaves)
 
     def loadConfig_Sources(self, sources):
         if not sources:
             log.msg("warning: no ChangeSources specified in c['change_source']")
         # shut down any that were removed, start any that were added
         deleted_sources = [s for s in self.change_svc if s not in sources]
         added_sources = [s for s in sources if s not in self.change_svc]
+        log.msg("adding %d new changesources, removing %d" %
+                (len(added_sources), len(deleted_sources)))
         dl = [self.change_svc.removeSource(s) for s in deleted_sources]
         def addNewOnes(res):
             [self.change_svc.addSource(s) for s in added_sources]
         d = defer.DeferredList(dl, fireOnOneErrback=1, consumeErrors=0)
         d.addCallback(addNewOnes)
         return d
 
     def allSchedulers(self):
@@ -852,17 +909,17 @@ class BuildMaster(service.MultiService, 
                 del allBuilders[oldname]
                 somethingChanged = True
                 # announce the change
                 self.status.builderRemoved(oldname)
 
         # everything in newList is either unchanged, changed, or new
         for name, data in newList.items():
             old = self.botmaster.builders.get(name)
-            basedir = data['builddir'] # used on both master and slave
+            basedir = data['builddir']
             #name, slave, builddir, factory = data
             if not old: # new
                 # category added after 0.6.2
                 category = data.get('category', None)
                 log.msg("adding new builder %s for category %s" %
                         (name, category))
                 statusbag = self.status.builderAdded(name, basedir, category)
                 builder = Builder(data, statusbag)
@@ -888,16 +945,22 @@ class BuildMaster(service.MultiService, 
 
                 allBuilders[name] = new_builder
                 somethingChanged = True
             else:
                 # unchanged: leave it alone
                 log.msg("builder %s is unchanged" % name)
                 pass
 
+        # regardless of whether anything changed, get each builder status
+        # to update its config
+        for builder in allBuilders.values():
+            builder.builder_status.reconfigFromBuildmaster(self)
+
+        # and then tell the botmaster if anything's changed
         if somethingChanged:
             sortedAllBuilders = [allBuilders[name] for name in newBuilderNames]
             d = self.botmaster.setBuilders(sortedAllBuilders)
             return d
         return None
 
     def loadConfig_status(self, status):
         dl = []
--- a/buildbot/pbutil.py
+++ b/buildbot/pbutil.py
@@ -67,23 +67,16 @@ class ReconnectingPBClientFactory(PBClie
         self.resetDelay()
         PBClientFactory.clientConnectionMade(self, broker)
         if self._doingLogin:
             self.doLogin(self._root)
         if self._doingGetPerspective:
             self.doGetPerspective(self._root)
         self.gotRootObject(self._root)
 
-    def __getstate__(self):
-        # this should get folded into ReconnectingClientFactory
-        d = self.__dict__.copy()
-        d['connector'] = None
-        d['_callID'] = None
-        return d
-
     # oldcred methods
 
     def getPerspective(self, *args):
         raise RuntimeError, "getPerspective is one-shot: use startGettingPerspective instead"
 
     def startGettingPerspective(self, username, password, serviceName,
                                 perspectiveName=None, client=None):
         self._doingGetPerspective = True
--- a/buildbot/process/base.py
+++ b/buildbot/process/base.py
@@ -235,22 +235,16 @@ class Build:
                 files.append(f)
             if c.isdir:
                 havedirs = 1
         return files
 
     def __repr__(self):
         return "<Build %s>" % (self.builder.name,)
 
-    def __getstate__(self):
-        d = self.__dict__.copy()
-        if d.has_key('remote'):
-            del d['remote']
-        return d
-
     def blamelist(self):
         blamelist = []
         for c in self.allChanges():
             if c.who not in blamelist:
                 blamelist.append(c.who)
         blamelist.sort()
         return blamelist
 
@@ -286,16 +280,20 @@ class Build:
         buildmaster = self.builder.botmaster.parent
         props.updateFromProperties(buildmaster.properties)
 
         # get any properties from requests (this is the path through
         # which schedulers will send us properties)
         for rq in self.requests:
             props.updateFromProperties(rq.properties)
 
+        # and finally, from the SourceStamp, which has properties via Change
+        for change in self.source.changes:
+            props.updateFromProperties(change.properties)
+
         # now set some properties of our own, corresponding to the
         # build itself
         props.setProperty("buildername", self.builder.name, "Build")
         props.setProperty("buildnumber", self.build_status.number, "Build")
         props.setProperty("branch", self.source.branch, "Build")
         props.setProperty("revision", self.source.revision, "Build")
 
     def setupSlaveBuilder(self, slavebuilder):
@@ -387,42 +385,39 @@ class Build:
         self.build_status.buildStarted(self)
         self.startNextStep()
 
     def setupBuild(self, expectations):
         # create the actual BuildSteps. If there are any name collisions, we
         # add a count to the loser until it is unique.
         self.steps = []
         self.stepStatuses = {}
-        stepnames = []
+        stepnames = {}
         sps = []
 
         for factory, args in self.stepFactories:
             args = args.copy()
             try:
                 step = factory(**args)
             except:
                 log.msg("error while creating step, factory=%s, args=%s"
                         % (factory, args))
                 raise
             step.setBuild(self)
             step.setBuildSlave(self.slavebuilder.slave)
             step.setDefaultWorkdir(self.workdir)
             name = step.name
-            count = 1
-            while name in stepnames and count < 1000:
+            if stepnames.has_key(name):
+                count = stepnames[name]
                 count += 1
+                stepnames[name] = count
                 name = step.name + "_%d" % count
-            if count == 1000:
-                raise RuntimeError("reached 1000 steps with base name" + \
-                                   "%s, bailing" % step.name)
-            elif name in stepnames:
-                raise RuntimeError("duplicate step '%s'" % step.name)
+            else:
+                stepnames[name] = 0
             step.name = name
-            stepnames.append(name)
             self.steps.append(step)
 
             # tell the BuildStatus about the step. This will create a
             # BuildStepStatus and bind it to the Step.
             step_status = self.build_status.addStepWithName(name)
             step.setStepStatus(step_status)
 
             sp = None
--- a/buildbot/process/builder.py
+++ b/buildbot/process/builder.py
@@ -1,26 +1,29 @@
 
 import random, weakref
 from zope.interface import implements
 from twisted.python import log, components
+from twisted.python.failure import Failure
 from twisted.spread import pb
 from twisted.internet import reactor, defer
 
 from buildbot import interfaces
 from buildbot.status.progress import Expectations
 from buildbot.util import now
 from buildbot.process import base
+from buildbot.process.properties import Properties
 
 (ATTACHING, # slave attached, still checking hostinfo/etc
  IDLE, # idle, available for use
  PINGING, # build about to start, making sure it is still alive
  BUILDING, # build is running
  LATENT, # latent slave is not substantiated; similar to idle
- ) = range(5)
+ SUBSTANTIATING,
+ ) = range(6)
 
 
 class AbstractSlaveBuilder(pb.Referenceable):
     """I am the master-side representative for one of the
     L{buildbot.slave.bot.SlaveBuilder} objects that lives in a remote
     buildbot. When a remote builder connects, I query it for command versions
     and then make it available to any Builds that are ready to run. """
 
@@ -109,17 +112,20 @@ class AbstractSlaveBuilder(pb.Referencea
         return self
 
     def _attachFailure(self, why, where):
         assert isinstance(where, str)
         log.msg(where)
         log.err(why)
         return why
 
-    def ping(self, timeout, status=None):
+    def prepare(self, builder_status):
+        return defer.succeed(None)
+
+    def ping(self, status=None):
         """Ping the slave to make sure it is still there. Returns a Deferred
         that fires with True if it is.
 
         @param status: if you point this at a BuilderStatus, a 'pinging'
                        event will be pushed.
         """
         oldstate = self.state
         self.state = PINGING
@@ -129,17 +135,17 @@ class AbstractSlaveBuilder(pb.Referencea
         if newping:
             if status:
                 event = status.addEvent(["pinging"])
                 d2 = defer.Deferred()
                 d2.addCallback(self._pong_status, event)
                 self.ping_watchers.insert(0, d2)
                 # I think it will make the tests run smoother if the status
                 # is updated before the ping completes
-            Ping().ping(self.remote, timeout).addCallback(self._pong)
+            Ping().ping(self.remote).addCallback(self._pong)
 
         def reset_state(res):
             if self.state == PINGING:
                 self.state = oldstate
             return res
         d.addCallback(reset_state)
         return d
 
@@ -162,62 +168,35 @@ class AbstractSlaveBuilder(pb.Referencea
             self.slave.removeSlaveBuilder(self)
         self.slave = None
         self.remote = None
         self.remoteCommands = None
 
 
 class Ping:
     running = False
-    timer = None
 
-    def ping(self, remote, timeout):
+    def ping(self, remote):
         assert not self.running
         self.running = True
         log.msg("sending ping")
         self.d = defer.Deferred()
         # TODO: add a distinct 'ping' command on the slave.. using 'print'
         # for this purpose is kind of silly.
         remote.callRemote("print", "ping").addCallbacks(self._pong,
                                                         self._ping_failed,
                                                         errbackArgs=(remote,))
-
-        # We use either our own timeout or the (long) TCP timeout to detect
-        # silently-missing slaves. This might happen because of a NAT
-        # timeout or a routing loop. If the slave just shuts down (and we
-        # somehow missed the FIN), we should get a "connection refused"
-        # message.
-        self.timer = reactor.callLater(timeout, self._ping_timeout, remote)
         return self.d
 
-    def _ping_timeout(self, remote):
-        log.msg("ping timeout")
-        # force the BuildSlave to disconnect, since this indicates that
-        # the bot is unreachable.
-        del self.timer
-        remote.broker.transport.loseConnection()
-        # the forcibly-lost connection will now cause the ping to fail
-
-    def _stopTimer(self):
-        if not self.running:
-            return
-        self.running = False
-
-        if self.timer:
-            self.timer.cancel()
-            del self.timer
-
     def _pong(self, res):
         log.msg("ping finished: success")
-        self._stopTimer()
         self.d.callback(True)
 
     def _ping_failed(self, res, remote):
         log.msg("ping finished: failure")
-        self._stopTimer()
         # the slave has some sort of internal error, disconnect them. If we
         # don't, we'll requeue a build and ping them again right away,
         # creating a nasty loop.
         remote.broker.transport.loseConnection()
         # TODO: except, if they actually did manage to get this far, they'll
         # probably reconnect right away, and we'll do this game again. Maybe
         # it would be better to leave them in the PINGING state.
         self.d.callback(False)
@@ -253,17 +232,30 @@ class LatentSlaveBuilder(AbstractSlaveBu
         AbstractSlaveBuilder.__init__(self)
         self.slave = slave
         self.state = LATENT
         self.setBuilder(builder)
         self.slave.addSlaveBuilder(self)
         log.msg("Latent buildslave %s attached to %s" % (slave.slavename,
                                                          self.builder_name))
 
-    def substantiate(self, build):
+    def prepare(self, builder_status):
+        log.msg("substantiating slave %s" % (self,))
+        d = self.substantiate()
+        def substantiation_failed(f):
+            builder_status.addPointEvent(['removing', 'latent',
+                                          self.slave.slavename])
+            self.slave.disconnect()
+            # TODO: should failover to a new Build
+            return f
+        d.addErrback(substantiation_failed)
+        return d
+
+    def substantiate(self):
+        self.state = SUBSTANTIATING
         d = self.slave.substantiate(self)
         if not self.slave.substantiated:
             event = self.builder.builder_status.addEvent(
                 ["substantiating"])
             def substantiated(res):
                 msg = ["substantiate", "success"]
                 if isinstance(res, basestring):
                     msg.append(res)
@@ -291,22 +283,22 @@ class LatentSlaveBuilder(AbstractSlaveBu
     def buildFinished(self):
         AbstractSlaveBuilder.buildFinished(self)
         self.slave.buildFinished(self)
 
     def _attachFailure(self, why, where):
         self.state = LATENT
         return AbstractSlaveBuilder._attachFailure(self, why, where)
 
-    def ping(self, timeout, status=None):
+    def ping(self, status=None):
         if not self.slave.substantiated:
             if status:
                 status.addEvent(["ping", "latent"]).finish()
             return defer.succeed(True)
-        return AbstractSlaveBuilder.ping(self, timeout, status)
+        return AbstractSlaveBuilder.ping(self, status)
 
 
 class Builder(pb.Referenceable):
     """I manage all Builds of a given type.
 
     Each Builder is created by an entry in the config file (the c['builders']
     list), with a number of parameters.
 
@@ -327,59 +319,60 @@ class Builder(pb.Referenceable):
     I maintain a list of available SlaveBuilders, one for each connected
     slave that the C{slavenames} parameter says we can use. Some of these
     will be idle, some of them will be busy running builds for me. If there
     are multiple slaves, I can run multiple builds at once.
 
     I also manage forced builds, progress expectation (ETA) management, and
     some status delivery chores.
 
-    I am persisted in C{BASEDIR/BUILDERNAME/builder}, so I can remember how
-    long a build usually takes to run (in my C{expectations} attribute). This
-    pickle also includes the L{buildbot.status.builder.BuilderStatus} object,
-    which remembers the set of historic builds.
-
     @type buildable: list of L{buildbot.process.base.BuildRequest}
     @ivar buildable: BuildRequests that are ready to build, but which are
                      waiting for a buildslave to be available.
 
     @type building: list of L{buildbot.process.base.Build}
     @ivar building: Builds that are actively running
 
     @type slaves: list of L{buildbot.buildslave.BuildSlave} objects
     @ivar slaves: the slaves currently available for building
     """
 
     expectations = None # this is created the first time we get a good build
-    START_BUILD_TIMEOUT = 10
     CHOOSE_SLAVES_RANDOMLY = True # disabled for determinism during tests
 
     def __init__(self, setup, builder_status):
         """
         @type  setup: dict
         @param setup: builder setup data, as stored in
                       BuildmasterConfig['builders'].  Contains name,
-                      slavename(s), builddir, factory, locks.
+                      slavename(s), builddir, slavebuilddir, factory, locks.
         @type  builder_status: L{buildbot.status.builder.BuilderStatus}
         """
         self.name = setup['name']
         self.slavenames = []
         if setup.has_key('slavename'):
             self.slavenames.append(setup['slavename'])
         if setup.has_key('slavenames'):
             self.slavenames.extend(setup['slavenames'])
         self.builddir = setup['builddir']
+        self.slavebuilddir = setup['slavebuilddir']
         self.buildFactory = setup['factory']
+        self.nextSlave = setup.get('nextSlave')
+        if self.nextSlave is not None and not callable(self.nextSlave):
+            raise ValueError("nextSlave must be callable")
         self.locks = setup.get("locks", [])
         self.env = setup.get('env', {})
         assert isinstance(self.env, dict)
         if setup.has_key('periodicBuildTime'):
             raise ValueError("periodicBuildTime can no longer be defined as"
                              " part of the Builder: use scheduler.Periodic"
                              " instead")
+        self.nextBuild = setup.get('nextBuild')
+        if self.nextBuild is not None and not callable(self.nextBuild):
+            raise ValueError("nextBuild must be callable")
 
         # build/wannabuild slots: Build objects move along this sequence
         self.buildable = []
         self.building = []
         # old_building holds active builds that were stolen from a predecessor
         self.old_building = weakref.WeakKeyDictionary()
 
         # buildslaves which have connected but which are not yet available.
@@ -408,24 +401,27 @@ class Builder(pb.Referenceable):
             setup_slavenames.append(setup['slavename'])
         setup_slavenames.extend(setup.get('slavenames', []))
         if setup_slavenames != self.slavenames:
             diffs.append('slavenames changed from %s to %s' \
                          % (self.slavenames, setup_slavenames))
         if setup['builddir'] != self.builddir:
             diffs.append('builddir changed from %s to %s' \
                          % (self.builddir, setup['builddir']))
+        if setup['slavebuilddir'] != self.slavebuilddir:
+            diffs.append('slavebuilddir changed from %s to %s' \
+                         % (self.slavebuilddir, setup['slavebuilddir']))
         if setup['factory'] != self.buildFactory: # compare objects
             diffs.append('factory changed')
-        oldlocks = [(lock.__class__, lock.name)
-                    for lock in self.locks]
-        newlocks = [(lock.__class__, lock.name)
-                    for lock in setup.get('locks',[])]
-        if oldlocks != newlocks:
-            diffs.append('locks changed from %s to %s' % (oldlocks, newlocks))
+        if setup.get('locks', []) != self.locks:
+            diffs.append('locks changed from %s to %s' % (self.locks, setup.get('locks')))
+        if setup.get('nextSlave') != self.nextSlave:
+            diffs.append('nextSlave changed from %s to %s' % (self.nextSlave, setup['nextSlave']))
+        if setup.get('nextBuild') != self.nextBuild:
+            diffs.append('nextBuild changed from %s to %s' % (self.nextBuild, setup['nextBuild']))
         return diffs
 
     def __repr__(self):
         return "<Builder '%s' at %d>" % (self.name, id(self))
 
     def getOldestRequestTime(self):
         """Returns the timestamp of the oldest build request for this builder.
 
@@ -435,37 +431,25 @@ class Builder(pb.Referenceable):
         else:
             return None
 
     def submitBuildRequest(self, req):
         req.setSubmitTime(now())
         self.buildable.append(req)
         req.requestSubmitted(self)
         self.builder_status.addBuildRequest(req.status)
-        self.maybeStartBuild()
+        self.botmaster.maybeStartAllBuilds()
 
     def cancelBuildRequest(self, req):
         if req in self.buildable:
             self.buildable.remove(req)
-            self.builder_status.removeBuildRequest(req.status)
+            self.builder_status.removeBuildRequest(req.status, cancelled=True)
             return True
         return False
 
-    def __getstate__(self):
-        d = self.__dict__.copy()
-        # TODO: note that d['buildable'] can contain Deferreds
-        del d['building'] # TODO: move these back to .buildable?
-        del d['slaves']
-        return d
-
-    def __setstate__(self, d):
-        self.__dict__ = d
-        self.building = []
-        self.slaves = []
-
     def consumeTheSoulOfYourPredecessor(self, old):
         """Suck the brain out of an old Builder.
 
         This takes all the runtime state from an existing Builder and moves
         it into ourselves. This is used when a Builder is changed in the
         master.cfg file: the new Builder has a different factory, but we want
         all the builds that were queued for the old one to get processed by
         the new one. Any builds which are already running will keep running.
@@ -549,17 +533,17 @@ class Builder(pb.Referenceable):
         for s in self.slaves:
             if s == slave:
                 break
         else:
             sb = LatentSlaveBuilder(slave, self)
             self.builder_status.addPointEvent(
                 ['added', 'latent', slave.slavename])
             self.slaves.append(sb)
-            reactor.callLater(0, self.maybeStartBuild)
+            reactor.callLater(0, self.botmaster.maybeStartAllBuilds)
 
     def attached(self, slave, remote, commands):
         """This is invoked by the BuildSlave when the self.slavename bot
         registers their builder.
 
         @type  slave: L{buildbot.buildslave.BuildSlave}
         @param slave: the BuildSlave that represents the buildslave as a whole
         @type  remote: L{twisted.spread.pb.RemoteReference}
@@ -599,34 +583,32 @@ class Builder(pb.Referenceable):
         d.addErrback(self._not_attached, slave)
         return d
 
     def _attached(self, sb):
         # TODO: make this .addSlaveEvent(slave.slavename, ['connect']) ?
         self.builder_status.addPointEvent(['connect', sb.slave.slavename])
         self.attaching_slaves.remove(sb)
         self.slaves.append(sb)
-        reactor.callLater(0, self.maybeStartBuild)
 
         self.fireTestEvent('attach')
         return self
 
     def _not_attached(self, why, slave):
         # already log.err'ed by SlaveBuilder._attachFailure
         # TODO: make this .addSlaveEvent?
         # TODO: remove from self.slaves (except that detached() should get
         #       run first, right?)
         self.builder_status.addPointEvent(['failed', 'connect',
                                            slave.slave.slavename])
         # TODO: add an HTMLLogFile of the exception
         self.fireTestEvent('attach', why)
 
     def detached(self, slave):
         """This is called when the connection to the bot is lost."""
-        log.msg("%s.detached" % self, slave.slavename)
         for sb in self.attaching_slaves + self.slaves:
             if sb.slave == slave:
                 break
         else:
             log.msg("WEIRD: Builder.detached(%s) (%s)"
                     " not in attaching_slaves(%s)"
                     " or slaves(%s)" % (slave, slave.slavename,
                                         self.attaching_slaves,
@@ -659,39 +641,61 @@ class Builder(pb.Referenceable):
             self.builder_status.setBigState("offline")
         elif self.building:
             self.builder_status.setBigState("building")
         else:
             self.builder_status.setBigState("idle")
             self.fireTestEvent('idle')
 
     def maybeStartBuild(self):
-        log.msg("maybeStartBuild %s: %s %s" %
-                (self, self.buildable, self.slaves))
+        log.msg("maybeStartBuild %s: %i request(s), %i slave(s)" %
+                (self, len(self.buildable), len(self.slaves)))
         if not self.buildable:
             self.updateBigStatus()
             return # nothing to do
 
         # pick an idle slave
         available_slaves = [sb for sb in self.slaves if sb.isAvailable()]
         if not available_slaves:
-            log.msg("%s: want to start build, but we don't have a remote"
-                    % self)
             self.updateBigStatus()
             return
-        if self.CHOOSE_SLAVES_RANDOMLY:
-            # TODO prefer idle over latent? maybe other sorting preferences?
+        if self.nextSlave:
+            sb = None
+            try:
+                sb = self.nextSlave(self, available_slaves)
+            except:
+                log.msg("Exception choosing next slave")
+                log.err(Failure())
+
+            if not sb:
+                self.updateBigStatus()
+                return
+        elif self.CHOOSE_SLAVES_RANDOMLY:
             sb = random.choice(available_slaves)
         else:
             sb = available_slaves[0]
 
         # there is something to build, and there is a slave on which to build
         # it. Grab the oldest request, see if we can merge it with anything
         # else.
-        req = self.buildable.pop(0)
+        if not self.nextBuild:
+            req = self.buildable.pop(0)
+        else:
+            try:
+                req = self.nextBuild(self, self.buildable)
+                if not req:
+                    # Nothing to do
+                    self.updateBigStatus()
+                    return
+                self.buildable.remove(req)
+            except:
+                log.msg("Exception choosing next build")
+                log.err(Failure())
+                self.updateBigStatus()
+                return
         self.builder_status.removeBuildRequest(req.status)
         mergers = []
         botmaster = self.botmaster
         for br in self.buildable[:]:
             if botmaster.shouldMergeRequests(self, req, br):
                 self.buildable.remove(br)
                 self.builder_status.removeBuildRequest(br.status)
                 mergers.append(br)
@@ -715,37 +719,30 @@ class Builder(pb.Referenceable):
 
         @return: a Deferred which fires with a
         L{buildbot.interfaces.IBuildControl} that can be used to stop the
         Build, or to access a L{buildbot.interfaces.IBuildStatus} which will
         watch the Build as it runs. """
 
         self.building.append(build)
         self.updateBigStatus()
-        if isinstance(sb, LatentSlaveBuilder):
-            log.msg("starting build %s.. substantiating the slave %s" %
-                    (build, sb))
-            d = sb.substantiate(build)
-            def substantiated(res):
-                return sb.ping(self.START_BUILD_TIMEOUT)
-            def substantiation_failed(res):
-                self.builder_status.addPointEvent(
-                    ['removing', 'latent', sb.slave.slavename])
-                sb.slave.disconnect()
-                # TODO: should failover to a new Build
-                #self.retryBuild(sb.build)
-            d.addCallbacks(substantiated, substantiation_failed)
-        else:
+        log.msg("starting build %s using slave %s" % (build, sb))
+        d = sb.prepare(self.builder_status)
+        def _ping(ign):
+            # ping the slave to make sure they're still there. If they've
+            # fallen off the map (due to a NAT timeout or something), this
+            # will fail in a couple of minutes, depending upon the TCP
+            # timeout.
+            #
+            # TODO: This can unnecessarily suspend the starting of a build, in
+            # situations where the slave is live but is pushing lots of data to
+            # us in a build.
             log.msg("starting build %s.. pinging the slave %s" % (build, sb))
-            d = sb.ping(self.START_BUILD_TIMEOUT)
-        # ping the slave to make sure they're still there. If they're fallen
-        # off the map (due to a NAT timeout or something), this will fail in
-        # a couple of minutes, depending upon the TCP timeout. TODO: consider
-        # making this time out faster, or at least characterize the likely
-        # duration.
+            return sb.ping()
+        d.addCallback(_ping)
         d.addCallback(self._startBuild_1, build, sb)
         return d
 
     def _startBuild_1(self, res, build, sb):
         if not res:
             return self._startBuildFailed("slave ping failed", build, sb)
         # The buildslave is ready to go. sb.buildStarted() sets its state to
         # BUILDING (so we won't try to use it for any other builds). This
@@ -834,41 +831,69 @@ class BuilderControl(components.Adapter)
         L{buildbot.interfaces.NoSlaveError} if no slaves are currently
         available, so it cannot be used to queue a BuildRequest in the hopes
         that a slave will eventually connect. This method is appropriate for
         use by things like the web-page 'Force Build' button."""
         if not self.original.slaves:
             raise interfaces.NoSlaveError
         self.requestBuild(req)
 
-    def resubmitBuild(self, bs, reason="<rebuild, no reason given>"):
+    def resubmitBuild(self, bs, reason="<rebuild, no reason given>", extraProperties=None):
         if not bs.isFinished():
             return
 
         ss = bs.getSourceStamp(absolute=True)
-        req = base.BuildRequest(reason, ss, self.original.name)
+        if extraProperties is None:
+            properties = bs.getProperties()
+        else:
+            # Make a copy so as not to modify the original build.
+            properties = Properties()
+            properties.updateFromProperties(bs.getProperties())
+            properties.updateFromProperties(extraProperties)
+        req = base.BuildRequest(reason, ss, self.original.name,
+                                properties=properties)
         self.requestBuild(req)
 
     def getPendingBuilds(self):
         # return IBuildRequestControl objects
-        raise NotImplementedError
+        retval = []
+        for r in self.original.buildable:
+            retval.append(BuildRequestControl(self.original, r))
+
+        return retval
 
     def getBuild(self, number):
         return self.original.getBuild(number)
 
-    def ping(self, timeout=30):
+    def ping(self):
         if not self.original.slaves:
             self.original.builder_status.addPointEvent(["ping", "no slave"])
             return defer.succeed(False) # interfaces.NoSlaveError
         dl = []
         for s in self.original.slaves:
-            dl.append(s.ping(timeout, self.original.builder_status))
+            dl.append(s.ping(self.original.builder_status))
         d = defer.DeferredList(dl)
         d.addCallback(self._gatherPingResults)
         return d
 
     def _gatherPingResults(self, res):
         for ignored,success in res:
             if not success:
                 return False
         return True
 
 components.registerAdapter(BuilderControl, Builder, interfaces.IBuilderControl)
+
+class BuildRequestControl:
+    implements(interfaces.IBuildRequestControl)
+
+    def __init__(self, builder, request):
+        self.original_builder = builder
+        self.original_request = request
+
+    def subscribe(self, observer):
+        raise NotImplementedError
+
+    def unsubscribe(self, observer):
+        raise NotImplementedError
+
+    def cancel(self):
+        self.original_builder.cancelBuildRequest(self.original_request)
--- a/buildbot/process/buildstep.py
+++ b/buildbot/process/buildstep.py
@@ -57,24 +57,16 @@ class RemoteCommand(pb.Referenceable):
                                L{buildbot.slave.registry.registerSlaveCommand}
         @type  args:           dict
         @param args:           arguments to send to the remote command
         """
 
         self.remote_command = remote_command
         self.args = args
 
-    def __getstate__(self):
-        dict = self.__dict__.copy()
-        # Remove the remote ref: if necessary (only for resumed builds), it
-        # will be reattached at resume time
-        if dict.has_key("remote"):
-            del dict["remote"]
-        return dict
-
     def run(self, step, remote):
         self.active = True
         self.step = step
         self.remote = remote
         c = self.commandCounter[0]
         self.commandCounter[0] += 1
         #self.commandID = "%d %d" % (c, random.randint(0, 1000000))
         self.commandID = "%d" % c
@@ -98,22 +90,30 @@ class RemoteCommand(pb.Referenceable):
     def start(self):
         """
         Tell the slave to start executing the remote command.
 
         @rtype:   L{twisted.internet.defer.Deferred}
         @returns: a deferred that will fire when the remote command is
                   done (with None as the result)
         """
+
+        # Allow use of WithProperties in logfile path names.
+        cmd_args = self.args
+        if cmd_args.has_key("logfiles") and cmd_args["logfiles"]:
+            cmd_args = cmd_args.copy()
+            properties = self.step.build.getProperties()
+            cmd_args["logfiles"] = properties.render(cmd_args["logfiles"])
+
         # This method only initiates the remote command.
         # We will receive remote_update messages as the command runs.
         # We will get a single remote_complete when it finishes.
         # We should fire self.deferred when the command is done.
         d = self.remote.callRemote("startCommand", self, self.commandID,
-                                   self.remote_command, self.args)
+                                   self.remote_command, cmd_args)
         return d
 
     def interrupt(self, why):
         # TODO: consider separating this into interrupt() and stop(), where
         # stop() unconditionally calls _finished, but interrupt() merely
         # asks politely for the command to stop soon.
 
         log.msg("RemoteCommand.interrupt", self, why)
@@ -251,16 +251,17 @@ class LoggedRemoteCommand(RemoteCommand)
 
     """
 
     rc = None
     debug = False
 
     def __init__(self, *args, **kwargs):
         self.logs = {}
+        self.delayedLogs = {}
         self._closeWhenFinished = {}
         RemoteCommand.__init__(self, *args, **kwargs)
 
     def __repr__(self):
         return "<RemoteCommand '%s' at %d>" % (self.remote_command, id(self))
 
     def useLog(self, loog, closeWhenFinished=False, logfileName=None):
         """Start routing messages from a remote logfile to a local LogFile
@@ -285,19 +286,25 @@ class LoggedRemoteCommand(RemoteCommand)
                             to ShellCommand.
 
         """
 
         assert interfaces.ILogFile.providedBy(loog)
         if not logfileName:
             logfileName = loog.getName()
         assert logfileName not in self.logs
+        assert logfileName not in self.delayedLogs
         self.logs[logfileName] = loog
         self._closeWhenFinished[logfileName] = closeWhenFinished
 
+    def useLogDelayed(self, logfileName, activateCallBack, closeWhenFinished=False):
+        assert logfileName not in self.logs
+        assert logfileName not in self.delayedLogs
+        self.delayedLogs[logfileName] = (activateCallBack, closeWhenFinished)
+
     def start(self):
         log.msg("LoggedRemoteCommand.start")
         if 'stdio' not in self.logs:
             log.msg("LoggedRemoteCommand (%s) is running a command, but "
                     "it isn't being logged to anything. This seems unusual."
                     % self)
         self.updates = {}
         return RemoteCommand.start(self)
@@ -308,16 +315,24 @@ class LoggedRemoteCommand(RemoteCommand)
     def addStderr(self, data):
         if 'stdio' in self.logs:
             self.logs['stdio'].addStderr(data)
     def addHeader(self, data):
         if 'stdio' in self.logs:
             self.logs['stdio'].addHeader(data)
 
     def addToLog(self, logname, data):
+        # Activate delayed logs on first data.
+        if logname in self.delayedLogs:
+            (activateCallBack, closeWhenFinished) = self.delayedLogs[logname]
+            del self.delayedLogs[logname]
+            loog = activateCallBack(self)
+            self.logs[logname] = loog
+            self._closeWhenFinished[logname] = closeWhenFinished
+
         if logname in self.logs:
             self.logs[logname].addStdout(data)
         else:
             log.msg("%s.addToLog: no such log %s" % (self, logname))
 
     def remoteUpdate(self, update):
         if self.debug:
             for k,v in update.items():
@@ -426,19 +441,20 @@ class LogLineObserver(LogObserver):
 
 
 class RemoteShellCommand(LoggedRemoteCommand):
     """This class helps you run a shell command on the build slave. It will
     accumulate all the command's output into a Log named 'stdio'. When the
     command is finished, it will fire a Deferred. You can then check the
     results of the command and parse the output however you like."""
 
-    def __init__(self, workdir, command, env=None, 
+    def __init__(self, workdir, command, env=None,
                  want_stdout=1, want_stderr=1,
-                 timeout=20*60, logfiles={}, usePTY="slave-config"):
+                 timeout=20*60, maxTime=None, logfiles={},
+                 usePTY="slave-config", logEnviron=True):
         """
         @type  workdir: string
         @param workdir: directory where the command ought to run,
                         relative to the Builder's home directory. Defaults to
                         '.': the same as the Builder's homedir. This should
                         probably be '.' for the initial 'cvs checkout'
                         command (which creates a workdir), and the Build-wide
                         workdir for all subsequent commands (including
@@ -467,31 +483,40 @@ class RemoteShellCommand(LoggedRemoteCom
         @type  want_stderr: bool
         @param want_stderr: False if stderr should be thrown away
 
         @type  timeout: int
         @param timeout: tell the remote that if the command fails to
                         produce any output for this number of seconds,
                         the command is hung and should be killed. Use
                         None to disable the timeout.
+
+        @param logEnviron: whether to log env vars on the slave side
+
+        @type  maxTime: int
+        @param maxTime: tell the remote that if the command fails to complete
+                        in this number of seconds, the command should be
+                        killed.  Use None to disable maxTime.
         """
 
         self.command = command # stash .command, set it later
         if env is not None:
             # avoid mutating the original master.cfg dictionary. Each
             # ShellCommand gets its own copy, any start() methods won't be
             # able to modify the original.
             env = env.copy()
         args = {'workdir': workdir,
                 'env': env,
                 'want_stdout': want_stdout,
                 'want_stderr': want_stderr,
                 'logfiles': logfiles,
                 'timeout': timeout,
+                'maxTime': maxTime,
                 'usePTY': usePTY,
+                'logEnviron': logEnviron,
                 }
         LoggedRemoteCommand.__init__(self, "shell", args)
 
     def start(self):
         self.args['command'] = self.command
         if self.remote_command == "shell":
             # non-ShellCommand slavecommands are responsible for doing this
             # fixup themselves
@@ -564,25 +589,28 @@ class BuildStep:
     parms = ['name', 'locks',
              'haltOnFailure',
              'flunkOnWarnings',
              'flunkOnFailure',
              'warnOnWarnings',
              'warnOnFailure',
              'alwaysRun',
              'progressMetrics',
+             'doStepIf',
              ]
 
     name = "generic"
     locks = []
     progressMetrics = () # 'time' is implicit
     useProgress = True # set to False if step is really unpredictable
     build = None
     step_status = None
     progress = None
+    # doStepIf can be False, True, or a function that returns False or True
+    doStepIf = True
 
     def __init__(self, **kwargs):
         self.factory = (self.__class__, dict(kwargs))
         for p in self.__class__.parms:
             if kwargs.has_key(p):
                 setattr(self, p, kwargs[p])
                 del kwargs[p]
         if kwargs:
@@ -702,17 +730,26 @@ class BuildStep:
             lock.claim(self, access)
         return defer.succeed(None)
 
     def _startStep_2(self, res):
         if self.progress:
             self.progress.start()
         self.step_status.stepStarted()
         try:
-            skip = self.start()
+            skip = None
+            if isinstance(self.doStepIf, bool):
+                if not self.doStepIf:
+                    skip = SKIPPED
+            elif not self.doStepIf(self):
+                skip = SKIPPED
+
+            if skip is None:
+                skip = self.start()
+
             if skip == SKIPPED:
                 # this return value from self.start is a shortcut
                 # to finishing the step immediately
                 reactor.callLater(0, self.finished, SKIPPED)
         except:
             log.msg("BuildStep.startStep exception in .start")
             self.failed(Failure())
 
@@ -760,17 +797,25 @@ class BuildStep:
         If the step encounters an exception, it should call self.failed(why).
         'why' should be a Failure object. This automatically fails the whole
         build with an exception. It is a good idea to add self.failed as an
         errback to any Deferreds you might obtain.
 
         If the step decides it does not need to be run, start() can return
         the constant SKIPPED. This fires the callback immediately: it is not
         necessary to call .finished yourself. This can also indicate to the
-        status-reporting mechanism that this step should not be displayed."""
+        status-reporting mechanism that this step should not be displayed.
+
+        A step can be configured to only run under certain conditions.  To
+        do this, set the step's doStepIf to a boolean value, or to a function
+        that returns a boolean value.  If the value or function result is
+        False, then the step will return SKIPPED without doing anything,
+        otherwise the step will be executed normally.  If you set doStepIf
+        to a function, that function should accept one parameter, which will
+        be the Step object itself."""
         
         raise NotImplementedError("your subclass must implement this method")
 
     def interrupt(self, reason):
         """Halt the command, either because the user has decided to cancel
         the build ('reason' is a string), or because the slave has
         disconnected ('reason' is a ConnectionLost Failure). Any further
         local processing should be skipped, and the Step completed with an
@@ -929,30 +974,39 @@ class OutputProgressObserver(LogObserver
 class LoggingBuildStep(BuildStep):
     """This is an abstract base class, suitable for inheritance by all
     BuildSteps that invoke RemoteCommands which emit stdout/stderr messages.
     """
 
     progressMetrics = ('output',)
     logfiles = {}
 
-    parms = BuildStep.parms + ['logfiles']
+    parms = BuildStep.parms + ['logfiles', 'lazylogfiles']
 
-    def __init__(self, logfiles={}, *args, **kwargs):
+    def __init__(self, logfiles={}, lazylogfiles=False, *args, **kwargs):
         BuildStep.__init__(self, *args, **kwargs)
-        self.addFactoryArguments(logfiles=logfiles)
+        self.addFactoryArguments(logfiles=logfiles,
+                                 lazylogfiles=lazylogfiles)
         # merge a class-level 'logfiles' attribute with one passed in as an
         # argument
         self.logfiles = self.logfiles.copy()
         self.logfiles.update(logfiles)
+        self.lazylogfiles = lazylogfiles
         self.addLogObserver('stdio', OutputProgressObserver("output"))
 
     def describe(self, done=False):
         raise NotImplementedError("implement this in a subclass")
 
+    def addLogFile(self, logname, filename):
+        """
+        This allows to add logfiles after construction, but before calling
+        startCommand().
+        """
+        self.logfiles[logname] = filename
+
     def startCommand(self, cmd, errorMessages=[]):
         """
         @param cmd: a suitable RemoteCommand which will be launched, with
                     all output being put into our self.stdio_log LogFile
         """
         log.msg("ShellCommand.startCommand(cmd=%s)" % (cmd,))
         log.msg("  cmd.args = %r" % (cmd.args))
         self.cmd = cmd # so we can interrupt it
@@ -980,20 +1034,30 @@ class LoggingBuildStep(BuildStep):
         d.addCallback(_gotResults) # returns results
         d.addCallbacks(self.finished, self.checkDisconnect)
         d.addErrback(self.failed)
 
     def setupLogfiles(self, cmd, logfiles):
         """Set up any additional logfiles= logs.
         """
         for logname,remotefilename in logfiles.items():
-            # tell the BuildStepStatus to add a LogFile
-            newlog = self.addLog(logname)
-            # and tell the LoggedRemoteCommand to feed it
-            cmd.useLog(newlog, True)
+            if self.lazylogfiles:
+                # Ask LoggedRemoteCommand to watch a logfile, but only add
+                # it when/if we see any data.
+                #
+                # The dummy default argument local_logname is a work-around for
+                # Python name binding; default values are bound by value, but
+                # captured variables in the body are bound by name.
+                callback = lambda cmd_arg, local_logname=logname: self.addLog(local_logname)
+                cmd.useLogDelayed(logname, callback, True)
+            else:
+                # tell the BuildStepStatus to add a LogFile
+                newlog = self.addLog(logname)
+                # and tell the LoggedRemoteCommand to feed it
+                cmd.useLog(newlog, True)
 
     def interrupt(self, reason):
         # TODO: consider adding an INTERRUPTED or STOPPED status to use
         # instead of FAILURE, might make the text a bit more clear.
         # 'reason' can be a Failure, or text
         self.addCompleteLog('interrupt', str(reason))
         d = self.cmd.interrupt(reason)
         return d
@@ -1085,13 +1149,13 @@ class LoggingBuildStep(BuildStep):
         return []
 
     def setStatus(self, cmd, results):
         # this is good enough for most steps, but it can be overridden to
         # get more control over the displayed text
         self.step_status.setText(self.getText(cmd, results))
         self.step_status.setText2(self.maybeGetText2(cmd, results))
 
-# (WithProeprties used to be available in this module)
+# (WithProperties used to be available in this module)
 from buildbot.process.properties import WithProperties
 _hush_pyflakes = [WithProperties]
 del _hush_pyflakes
 
--- a/buildbot/process/factory.py
+++ b/buildbot/process/factory.py
@@ -7,16 +7,29 @@ from buildbot.steps.source import CVS, S
 from buildbot.steps.shell import Configure, Compile, Test, PerlModuleTest
 
 # deprecated, use BuildFactory.addStep
 def s(steptype, **kwargs):
     # convenience function for master.cfg files, to create step
     # specification tuples
     return (steptype, kwargs)
 
+class ArgumentsInTheWrongPlace(Exception):
+    """When calling BuildFactory.addStep(stepinstance), addStep() only takes
+    one argument. You passed extra arguments to addStep(), which you probably
+    intended to pass to your BuildStep constructor instead. For example, you
+    should do::
+
+     f.addStep(ShellCommand(command=['echo','stuff'], haltOnFailure=True))
+
+    instead of::
+
+     f.addStep(ShellCommand(command=['echo','stuff']), haltOnFailure=True)
+    """
+
 class BuildFactory(util.ComparableMixin):
     """
     @cvar  buildClass: class to use when creating builds
     @type  buildClass: L{buildbot.process.base.Build}
     """
     buildClass = Build
     useProgress = 1
     compare_attrs = ['buildClass', 'steps', 'useProgress']
@@ -37,16 +50,18 @@ class BuildFactory(util.ComparableMixin)
         """
         b = self.buildClass(request)
         b.useProgress = self.useProgress
         b.setStepFactories(self.steps)
         return b
 
     def addStep(self, step_or_factory, **kwargs):
         if isinstance(step_or_factory, BuildStep):
+            if kwargs:
+                raise ArgumentsInTheWrongPlace()
             s = step_or_factory.getStepFactory()
         else:
             s = (step_or_factory, dict(kwargs))
         self.steps.append(s)
 
     def addSteps(self, steps):
         self.steps.extend([ s.getStepFactory() for s in steps ])
 
new file mode 100644
--- /dev/null
+++ b/buildbot/process/mtrlogobserver.py
@@ -0,0 +1,472 @@
+import sys
+import re
+import exceptions
+from twisted.python import log
+from twisted.internet import defer
+from twisted.enterprise import adbapi
+from buildbot.process.buildstep import LogLineObserver
+from buildbot.steps.shell import Test
+
+class EqConnectionPool(adbapi.ConnectionPool):
+    """This class works the same way as
+twisted.enterprise.adbapi.ConnectionPool. But it adds the ability to
+compare connection pools for equality (by comparing the arguments
+passed to the constructor).
+
+This is useful when passing the ConnectionPool to a BuildStep, as
+otherwise Buildbot will consider the buildstep (and hence the
+containing buildfactory) to have changed every time the configuration
+is reloaded.
+
+It also sets some defaults differently from adbapi.ConnectionPool that
+are more suitable for use in MTR.
+"""
+    def __init__(self, *args, **kwargs):
+        self._eqKey = (args, kwargs)
+        return adbapi.ConnectionPool.__init__(self,
+                                              cp_reconnect=True, cp_min=1, cp_max=3,
+                                              *args, **kwargs)
+
+    def __eq__(self, other):
+        if isinstance(other, EqConnectionPool):
+            return self._eqKey == other._eqKey
+        else:
+            return False
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+
+class MtrTestFailData:
+    def __init__(self, testname, variant, result, info, text, callback):
+        self.testname = testname
+        self.variant = variant
+        self.result = result
+        self.info = info
+        self.text = text
+        self.callback = callback
+
+    def add(self, line):
+        self.text+= line
+
+    def fireCallback(self):
+        return self.callback(self.testname, self.variant, self.result, self.info, self.text)
+
+
+class MtrLogObserver(LogLineObserver):
+    """
+    Class implementing a log observer (can be passed to
+    BuildStep.addLogObserver().
+
+    It parses the output of mysql-test-run.pl as used in MySQL,
+    MariaDB, Drizzle, etc.
+
+    It counts number of tests run and uses it to provide more accurate
+    completion estimates.
+
+    It parses out test failures from the output and summarises the results on
+    the Waterfall page. It also passes the information to methods that can be
+    overridden in a subclass to do further processing on the information."""
+
+    _line_re = re.compile(r"^([-._0-9a-zA-z]+)( '[-_ a-zA-Z]+')?\s+(w[0-9]+\s+)?\[ (fail|pass) \]\s*(.*)$")
+    _line_re2 = re.compile(r"^[-._0-9a-zA-z]+( '[-_ a-zA-Z]+')?\s+(w[0-9]+\s+)?\[ [-a-z]+ \]")
+    _line_re3 = re.compile(r"^\*\*\*Warnings generated in error logs during shutdown after running tests: (.*)")
+    _line_re4 = re.compile(r"^The servers were restarted [0-9]+ times$")
+    _line_re5 = re.compile(r"^Only\s+[0-9]+\s+of\s+[0-9]+\s+completed.$")
+
+    def __init__(self, textLimit=5, testNameLimit=16, testType=None):
+        self.textLimit = textLimit
+        self.testNameLimit = testNameLimit
+        self.testType = testType
+        self.numTests = 0
+        self.testFail = None
+        self.failList = []
+        self.warnList = []
+        LogLineObserver.__init__(self)
+
+    def setLog(self, loog):
+        LogLineObserver.setLog(self, loog)
+        d= loog.waitUntilFinished()
+        d.addCallback(lambda l: self.closeTestFail())
+
+    def outLineReceived(self, line):
+        stripLine = line.strip("\r\n")
+        m = self._line_re.search(stripLine)
+        if m:
+            testname, variant, worker, result, info = m.groups()
+            self.closeTestFail()
+            self.numTests += 1
+            self.step.setProgress('tests', self.numTests)