add max_builds= to BuildSlave, thanks to Dustin Mitchell. Closes #48.
[buildbot.git] / ChangeLog
blob2378d1c7855929a359de78ca35c3016035c59394
1 2007-08-07  Brian Warner  <warner@lothar.com>
3         * buildbot/buildslave.py (BuildSlave.__init__): add max_builds=,
4         which imposes a per-slave limit on how many builds are allowed to
5         run simultaneously. This has a the same scope than the SlaveLock,
6         but is different because max_builds= gives the buildmaster the
7         freedom to assign the build to a different slave, whereas the
8         SlaveLock doesn't get tested until after the build is irrevocably
9         assigned to a slave. Therefore using max_builds= will improve
10         utilization in the presence of multiple buildslaves that are
11         attached to the same Builder. This completes the incorporation of
12         Dustin Mitchell's patches, and closes ticket #48. Thanks Dustin!
13         * buildbot/process/builder.py (SlaveBuilder.buildFinished): when
14         any Builder finishes, potentially trigger *all* Builders, since
15         max_builds= may have stalled someone else while waiting for the
16         slave.
17         * buildbot/scripts/sample.cfg: mention max_builds=
18         * buildbot/test/test_run.py (ConcurrencyLimit): test it
19         * docs/buildbot.texinfo (Buildslave Specifiers): document it
21         * buildbot/test/test_run.py (CanStartBuild._do_test2): tests which
22         inherit from RunMixin do not need to call master.stopService()
23         themselves, since RunMixin.tearDown does that. The double call
24         fails on Twisted-2.0.x, which didn't happen to protect against it.
25         * buildbot/test/test_slaves.py (BuildSlave.test_track_builders): same
27         * buildbot/buildslave.py (BuildSlave.addSlaveBuilder): third patch
28         from #48, this one to have the BuildSlave objects track
29         SlaveBuilders, so they'll be able to use that knowledge to
30         influence their canStartBuild() response.
31         * buildbot/process/builder.py (SlaveBuilder.attached): call it
32         (SlaveBuilder.detached): same
33         * buildbot/test/test_slaves.py (BuildSlave): test it
35         * buildbot/buildslave.py (BuildSlave.canStartBuild): incorporate
36         the second of Dustin's #48 patches, this one adding a method to
37         the BuildSlave that allows it to decide whether it is willing to
38         participate in a build or not.
39         (SlaveBuilder.isAvailable): use canStartBuild() to decide
41         * buildbot/test/test_run.py (CanStartBuild): test for it
43         * all: incorporate the first of four patches by Dustin Mitchell
44         from ticket #48, working towards improving control over slave
45         concurrency. The first patch is to use a long-lived BuildSlave
46         object per slave, on which other behavior can be added later. I've
47         modified his patch considerably.
48         * buildbot/buildslave.py (BuildSlave): move class out of
49         slave/__init__.py (where it would get loaded by the slave as well
50         as the master, making dependencies trickier), and merge it with
51         BotPerspective. Now these BuildSlave instances are created once in
52         the master.cfg file, and not destroyed until they are either
53         removed from the config file or changed so
54         much (name/password/class changes) that we cannot continue to use
55         the old one. This affects config files: they must use
56         'from buildbot.buildslave import BuildSlave' instead of using
57         'from buildbot.slave import BuildSlave'.
58         * buildbot/master.py: move BotPerspective out
59         (BuildMaster.loadConfig_Slaves): examine old and new slaves,
60         add or remove as necessary, update the rest using data from
61         the new config file.
62         * buildbot/slave/__init__.py: move BuildSlave out
63         * buildbot/test/test*.py: import BuildSlave from the new place
64         * buildbot/scripts/sample.cfg: update to match
65         * docs/buildbot.texinfo: update to match
66         * buildbot/process/builder.py: update comments to match
68 2007-08-02  Brian Warner  <warner@lothar.com>
70         * buildbot/status/web/baseweb.py (OneLinePerBuild): improve
71         one-line-per-build pages a bit, add a header, refactor slightly
73         * buildbot/test/test_maildir.py (MaildirTest.testMaildir): cleanup
74         the TimeOutError timer, patch by Dustin Mitchell.
76 2007-08-01  Brian Warner  <warner@lothar.com>
78         * buildbot/status/web/baseweb.py (OneLinePerBuild): make this
79         mostly work (branch= is still ignored, we need a useful header)
80         (OneLinePerBuildOneBuilder.body): this too
82         * buildbot/status/web/builder.py (StatusResourceBuilder.force):
83         bring this up-to-date w.r.t. recent refactorings, and fix
84         redirections to bounce the browser to the top page after hitting
85         the 'force' button. This needs to be improved, but at least it now
86         redirects to a valid page.
87         (StatusResourceBuilder.ping): same
88         (StatusResourceBuilder.getChild): same, although I think this code
89         might be dead anyways
91         * buildbot/status/web/waterfall.py (WaterfallStatusResource): add
92         a branch= query argument, to filter the display down to builds and
93         changes that involve the given branch. You can add multiple
94         branch= arguments to see multiple branches (using a logical OR).
95         Note that there is no way to include the default branch (i.e.
96         None, i.e. trunk) yet, there is still work to be done to allow for
97         simple+uniform names of branches (i.e. removing the VC-specific
98         details of how branches are implemented, so calling the branch
99         'beta4' even though the SVN checkout step requires
100         'branches/beta4').
101         * buildbot/status/builder.py (BuilderStatus.eventGenerator): same
102         * buildbot/changes/changes.py (ChangeMaster.eventGenerator): same
103         * buildbot/interfaces.py (IEventSource.eventGenerator): same
104         * docs/buildbot.texinfo (Buildbot Web Resources): document it
106         * all: bring import statements up-to-date: don't import
107         __future__, assume cPickle and cStringIO are always available.
108         Also remove #!/usr/bin/python lines from non-scripts, my editor
109         has been a bit over-enthusiastic about stuffing them into new .py
110         files.
112         * buildbot/status/web/index.html: put a link to the waterfall page
113         on the index, otherwise first-time users of WebStatus aren't going
114         to see anything very interesting.
116         * buildbot/interfaces.py (IEventSource): document this interface.
117         Thanks to Dustin Mitchell for the patch. Closes #60.
118         * buildbot/status/builder.py (BuilderStatus): same
119         * buildbot/changes/changes.py (ChangeMaster): same
121         * buildbot/status/web/waterfall.py (WaterfallStatusResource.buildGrid):
122         add a query arg of 'show_events=true' to display non-build events,
123         like slaves attaching/detaching and reconfig events, or
124         'show_events=false' to hide them. The default is 'true'.
125         * docs/buildbot.texinfo (Buildbot Web Resources): document it
127         * web-parts: merge in web-parts branch. Lots of changes. The new
128         functionality is to add buildbot.status.html.WebStatus, which is a
129         superset of the Waterfall that adds new status pages and serves
130         regular files from BASEDIR/public_html/ , which is now the preferred
131         place to put robots.txt, buildbot.css, and index.html .
132         * buildbot/scripts/runner.py: the 'create-master' command now
133         creates public_html/ too, and populates it with a couple of
134         static files.
135         * buildbot/status/web: split waterfall code into smaller pieces
137 2007-07-31  Brian Warner  <warner@lothar.com>
139         * buildbot/scripts/startup.py (launch): import twistd.run in a
140         different way to hush pyflakes
141         * buildbot/process/builder.py: remove unused import
143 2007-07-30  Brian Warner  <warner@lothar.com>
145         * buildbot/interfaces.py (ISourceStamp): cleanup patch by Dustin
146         Mitchell: pass SourceStamps around rather than branch/version/etc
147         tuples. Thanks Dustin! Closes #70.
148         * buildbot/sourcestamp.py (SourceStamp): insist that .changes is a
149         tuple rather than a list, to avoid surprising mutations
150         * buildbot/process/builder.py (BuilderControl.resubmitBuild): same
151         * buildbot/status/mail.py (MailNotifier.buildMessage): same
152         * buildbot/status/builder.py (BuildStatus.getSourceStamp): same
153         * buildbot/test/test_status.py (Subscription): same
154         * buildbot/test/test_control.py (Force): same
155         * buildbot/test/test_buildreq.py (Request.testMerge): same
157 2007-07-29  Brian Warner  <warner@lothar.com>
159         * buildbot/scripts/sample.cfg: remove the spurious 'builders'
160         variable, since it wasn't used and is confusing in the presence of
161         c['builders'] (which *is* used). Thanks to Thomas Vander Stichele
162         for the suggestion.
164         * buildbot/status/web/waterfall.py (WaterfallStatusResource): update
165         the Buildbot home-page link to point at buildbot.net instead of 
166         sourceforge, and add a current-version query parameter so we can
167         get some statistics on which versions are in use out there.
169 2007-07-28  Brian Warner  <warner@lothar.com>
171         * buildbot/master.py (BuildMaster.loadConfig): replace c['sources']
172         with c['change_source'], leaving c['sources'] for backwards
173         compatibility (but deprecated), scheduled for removal in 0.8.0
174         * docs/buildbot.texinfo: same
175         * buildbot/test/test_config.py: verify that c['sources'] still works
176         * buildbot/test/test_*.py: replace c['sources'] with c['change_source']
177         * buildbot/scripts/sample.cfg: update to match
179         * buildbot/changes/mail.py (MaildirSource): parse with python's
180         stdlib 'email' module, which has been available since python2.2,
181         and drop use of the 'rfc822' module, which has been depreceated
182         since python2.3 .
183         * buildbot/test/test_maildir.py: same: use parse_file() not parse
185         * buildbot/test/test_maildir.py (MaildirTest.testMaildir): oops,
186         this needs to match the renaming in test/mail/msg*
188         * README (SETTING UP A BUILD MASTER): fix capitalization-typo.
189         Closes SF#1752648.
191         * buildbot/test/test_mailparse.py: rename sample emails a bit
192         * buildbot/test/mail/msg*: same
194         * buildbot/changes/mail.py (SVNCommitEmailMaildirSource): add a
195         parser for the "commit-email.pl" script that is shipped with SVN,
196         written by Justin Mason. Thanks! Closes SF#1072845.
197         * buildbot/test/mail/svn-commit.*: sample messages
198         * buildbot/test/test_mailparse.py (TestSVNCommitEmail): test it
199         * docs/buildbot.texinfo (SVNCommitEmailMaildirSource): docs
201 2007-07-27  Brian Warner  <warner@lothar.com>
203         * buildbot/changes/mail.py: refactor: move parsing into a method
204         named 'parse', each parser type gets a separate subclass. Remove
205         the old 'sep' argument (hardcode it to '/'), fix usage of prefix=
206         to be a simple leading-substring match. Add a warning to the logs
207         if prefix= does not end in a slash, since that's probably a
208         mistake. Fix both places where a prefix= mismatch would skip all
209         subsequent files in the same email, instead of just skipping the
210         one that didn't match.
211         * buildbot/test/test_mailparse.py: match changes
213         * docs/buildbot.texinfo (Getting Source Code Changes): refactor
214         docs on email-based ChangeSources
216         * docs/buildbot.texinfo (Getting Source Code Changes): move all
217         the changesource types up a level, removing the one-entry menu in
218         the process
220         * buildbot/master.py (BuildMaster.loadConfig_Slaves): rename
221         c['bots'] to c['slaves'], and use buildbot.slave.BuildSlave
222         instances instead of tuples. Closes #63.
223         * buildbot/slave/__init__.py (BuildSlave): define marker class
224         * buildbot/scripts/sample.cfg: use c['slaves'] in sample config
225         * docs/buildbot.texinfo (Buildslave Specifiers): document c['slaves']
226         * buildbot/test/test_*.py: update tests to match
227         * buildbot/test/test_config.py (ConfigTest.testBots): verify that
228         the c['bots'] backwards-compatibility handler works
230 2007-07-26  Brian Warner  <warner@lothar.com>
232         * buildbot/changes/hgbuildbot.py (hook): add an in-process
233         Mercurial change-sending hook, contributed by Frederic Leroy.
234         Thanks! Addresses #50.
235         * docs/buildbot.texinfo (MercurialHook): document it
237         * buildbot/changes/hgbuildbot.py: change the way imports are done,
238         to make it compatible with at least hg-0.9.1 and the current 0.9.4
240 2007-07-17  Brian Warner  <warner@lothar.com>
242         * buildbot/process/buildstep.py (BuildStep.getLog): add a
243         convenience method to retrieve a log added with
244         addLog()/addCompleteLog()/etc or logfiles= . I should have added
245         this two years ago..
247 2007-07-03  Brian Warner  <warner@lothar.com>
249         * buildbot/slave/commands.py (ShellCommand._startCommand): when
250         logging the environment variables, put one variable on each line,
251         rather than having one really long line with all of them. This
252         should make them a bit more readable and not trigger the
253         horizontal scrollbar (when viewing it in a web browser) quite so
254         much. Thanks to Albert Hofkamp for the patch.
256         * buildbot/steps/shell.py (ShellCommand): allow workdir= to be a
257         WithProperties instance. Thanks to Axel Hecht for the patch.
258         Closes #43.
259         * buildbot/test/test_properties.py (Interpolate.testWorkdir): test it
260         * docs/buildbot.texinfo (Build Properties): document it
261         * buildbot/slave/commands.py (ShellCommand._startCommand): create the
262         workdir if it didn't already exist.
264         * docs/buildbot.texinfo (Scheduler Types): correct the description
265         of Dependent schedulers. Thanks to Greg Ward for the patch.
267         * buildbot/steps/source.py (SVN.startVC): when applying a patch,
268         add "[patch]" to the step's display. Thanks to Dustin Mitchell for
269         the patch. Closes #49.
271         * buildbot/slave/commands.py (rmdirRecursive): chmod everything to
272         0700 before removing it, to deal with situations where a build will
273         leave files around without write permissions and the 'copy' or
274         'clobber' VC checkout modes need to blow away the tree first.
275         Thanks to Steve Milner for the suggestion and the patch (which I
276         mangled horribly). Closes #29.
277         * buildbot/test/test_slavecommand.py (Utilities.test_rmdirRecursive):
278         test for it
280         * buildbot/test/runutils.py (RunMixin.disappearSlave): oops, add
281         an allowReconnect= argument to let callers control whether they
282         want this don't-let-it-reconnect behavior, since some tests care.
283         Factor out the .continueTrying=False lines from those callers.
284         * buildbot/test/test_slaves.py: same
285         * buildbot/test/test_run.py: same
287 2007-07-02  Brian Warner  <warner@lothar.com>
289         * buildbot/test/runutils.py (RunMixin.disappearSlave): once a
290         slave has been disappeared, don't let it reconnect. This was
291         causing an intermittent failure in test_slaves.py, when the slave
292         that was supposed to be gone managed to come back by the end of
293         the test and affect the count.
294         * buildbot/test/test_slaves.py (Slave.testFallback2): minor
295         refactorings
296         * buildbot/process/builder.py (SlaveBuilder.__repr__): added some
297         diagnostic messages to track down this problem
298         (Builder.startBuild): same
300         * buildbot/process/builder.py (Builder.maybeStartBuild): choose
301         the slave randomly rather than always taking the first one. Thanks
302         to Pike for the patch. Closes #36.
303         * buildbot/test/test_slaves.py: match the change. to avoid huge
304         changes to the tests, I added a CHOOSE_SLAVES_RANDOMLY flag which
305         enables/disables the round-robin-ness (enabled by default), and
306         some unit tests disable it.
307         * docs/buildbot.texinfo (Buildmaster Architecture): document it
309         * buildbot/slave/bot.py (BuildSlave.__init__): rename the 'host'
310         argument to 'buildmaster_host', to make it more obvious that this
311         points to the buildmaster. Thanks to Bob Proulx for the
312         suggestion.
313         * buildbot/scripts/runner.py (slaveTAC): same
314         * buildbot/test/test_runner.py (Create.testSlave): match the change
316         * contrib/hg_buildbot.py: patch from Frederic Leroy to make this
317         work better.
319 2007-06-17  Brian Warner  <warner@lothar.com>
321         * buildbot/test/test_config.py (Factories.testAllSteps): make sure
322         we can round-trip all of our current step classes by calling
323         getStepFactory() and using the results to make a clone of the
324         original step.
326         * buildbot/steps/maxq.py: fix import errors. Guess this hasn't been
327         used in a while..
329         * buildbot/process/factory.py (BuildFactory.addStep): To simplify
330         the config file, we're moving to using actual instances instead of
331         the (class, kwargs) 'step specification' tuples. BuildFactory
332         still keeps a list of tuples internally, but when real instances
333         are passed in to addStep(), they are asked for their class and
334         kwargs using the new BuildStep.getStepFactory method. BuildFactory
335         accepts both instances and the tuple form, and converts instances
336         to the tuple form, but the instance form is preferred because it
337         gives the Steps a chance to do argument validation. Closes: #11.
339         * buildbot/process/buildstep.py (BuildStep.__init__): record the
340         factory information necessary to implement getStepFactory. The
341         addFactoryArguments() method can be used to include arguments that
342         aren't passed to the BuildStep base class constructor.
343         (BuildStep.setBuild):
344         (BuildStep.setDefaultWorkdir): new methods to take parameters that
345         are needed for live BuildSteps but not to construct the specification
346         tuples that are stashed in the factory.
348         * buildbot/process/base.py (Build.setupBuild): pass 'build' and
349         'workdir' into new BuildSteps by using methods instead of
350         arguments. This makes the constructor for BuildSteps a lot
351         simpler.
353         * buildbot/steps/*.py: update to match this change. Basically this
354         means adding calls to addFactoryArguments() in the __init__
355         methods to capture the arguments that aren't passed through to the
356         base class.
357         * buildbot/steps/shell.py (ShellCommand.setDefaultWorkdir): copy
358         the new workdir (if any) into the RemoteShellCommands arguments.
359         * buildbot/steps/source.py: allow workdir= to be optional,
360         implement setDefaultWorkdir() since we don't inherit from
361         (CVS): finally remove old clobber=/export=/copydir= arguments,
362         in favor of the mode= argument that's been around forever now.
363         * buildbot/steps/transfer.py: remove build= argument
365         * buildbot/test/*.py: update to match, generally by turning all
366         build= arguments into subsequent calls to s.setBuild()
367         * buildbot/test/test_config.py (Factories): verify that we can
368         use either BuildStep instances or class/kwarg tuples in both
369         BuildFactory.addStep and BuildFactory.__init__
371         * docs/buildbot.texinfo (Build Steps): document the new approach,
372         mention compatibility with the old approach, update all examples
373         to use the new style.
375 2007-06-16  Brian Warner  <warner@lothar.com>
377         * buildbot/changes/svnpoller.py: when the poll fails, don't kill
378         the LoopingCall, just eat the failure so that we'll poll again
379         next time. This should allow us to tolerate (e.g.) sf.net SVN
380         failures more gracefully. Many thanks to Dustin Mitchell for the
381         patch. Closes #34.
383 2007-05-17  Brian Warner  <warner@lothar.com>
385         * buildbot/status/words.py: refactor the IRC status bot into
386         separate 'Contact' and 'Channel' classes. The base Contact class
387         contains the interaction code: commands and responses. The
388         IRCContact subclass (and IrcStatusBot 'Channel') handle the
389         IRC-specific aspects. The plan is to write other subclasses for
390         other IM protocols like AIM and Jabber.
392 2007-04-16  Brian Warner  <warner@lothar.com>
394         * CREDITS: update list of contributors. Thank you all!
396 2007-04-13  Brian Warner  <warner@lothar.com>
398         * buildbot/status/mail.py (MailNotifier): add the project name to
399         the subject line and message body, to make it easier to
400         distinguish email coming from different buildmasters. Thanks to
401         Benoit Sigoure for the patch.
402         * buildbot/test/test_status.py (Mail): update to match
404 2007-03-24  Brian Warner  <warner@lothar.com>
406         * buildbot/steps/transfer.py: open all files in 'b' binary mode to
407         avoid text-conversion problems between DOS/windows and unix.
408         Thanks to Phil Thompson for the patch. Fixes SF#1674927.
410 2007-03-03  Brian Warner  <warner@lothar.com>
412         * buildbot/status/html.py (_hush_pyflakes): hush a pyflakes
413         warning about the use of Waterfall here
415 2007-03-01  Brian Warner  <warner@lothar.com>
417         * buildbot/interfaces.py (IStatus.getBuilder): mention exceptions
419 2007-02-28  Brian Warner  <warner@lothar.com>
421         * buildbot/changes/p4poller.py (P4Source): apply change from Scott
422         Lamb to use a more optimal form of 'p4 changes', to reduce server
423         load. He reports that this optimization was added to p4d release
424         2005.2, but it should work in all versions. Closes #27.
425         * buildbot/test/test_p4poller.py: match it
427 2007-02-27  Brian Warner  <warner@lothar.com>
429         * buildbot/status/web/*.py: move all web status stuff into a
430         separate directory, in anticipation of splitting it into smaller
431         pieces and adding more files. html.py was getting way too big.
432         * buildbot/status/classic.css: move it too
433         * setup.py: add the new sub-package
434         * buildbot/test/test_web.py: match the changes
435         * MANIFEST.in: handle the move of classic.css
437 2007-02-07  Brian Warner  <warner@lothar.com>
439         * contrib/OS-X/*: add some launchd .plist files for automatically
440         starting a buildmaster or buildslave under OS-X (10.4 or later).
441         Thanks to Mark Pauley for these.
443 2007-02-06  Brian Warner  <warner@lothar.com>
445         * docs/buildbot.texinfo (Requirements): update requirements to
446         stop claiming compatibility with python-2.2 or twisted-1.3.x .
447         Closes #13.
448         * README: mention python-2.5 and twisted-2.5 compatibility
450         * buildbot/clients/debug.py: hush pyflakes warnings by removing a
451         redundant import
452         * buildbot/scripts/startup.py: same, by removing twisted-1.3.0
453         compatibility
454         * buildbot/status/builder.py: same, by requiring cStringIO
455         * buildbot/status/words.py: same, remove twisted-1.3.0 compat
456         * buildbot/test/test_vc.py: same
457         * buildbot/test/test_web.py:
458         * buildbot/test/test_steps.py: same, remove unused import
460         * buildbot/status/html.py (StatusResourceBuild.body): oops, close
461         the FORM tag
463         * buildbot/master.py (BuildMaster.loadConfig): warn the user if we
464         see any Builders that don't have Schedulers to drive them
466         * buildbot/master.py (BotPerspective.__repr__): fit bitrot, the
467         attributes this uses went away
469         * contrib/bb_applet.py (MyApplet.filled): add a small prefs
470         dialog, to allow you to reset the buildmaster and force
471         connect/disconnect. Correctly handle losing the buildmaster
472         connection (by switching the display to the hexnut, at which point
473         you can use the 'Connect' menu item to reconnect).
475         * buildbot/steps/source.py (Source.start): if we're using a patch,
476         add it as a LogFile to the checkout/update step. This will turn
477         into a link on the waterfall page.
479         * buildbot/scripts/tryclient.py (Try.createJob): implement --diff
480         option, to take the patch from a pre-made file rather than
481         generating it from the local tree. Thanks to Robert Helmer for the
482         idea. Closes #15 (the Trac ticket on the new http://buildbot.net/).
483         * buildbot/scripts/runner.py (TryOptions): add --diff,
484         --patchlevel, and --baserev options
485         * buildbot/scheduler.py (Try_Jobdir.parseJob): treat a baserev of ""
486         as None, meaning HEAD.
487         * buildbot/sourcestamp.py (SourceStamp): update docstring to
488         indicate that baserev=None means HEAD
489         * docs/buildbot.texinfo (try --diff): document it
491         * buildbot/test/test_steps.py (BuildStep): remove use of
492         reactor.iterate(), although the technique I replaced it with is a
493         gross polling hack that must be cleaned up properly some day. This
494         was the last use of reactor.iterate in the entire tree, yay.
496 2007-02-05  Brian Warner  <warner@lothar.com>
498         * buildbot/status/mail.py (MailNotifier.__init__): assert that 'mode'
499         is one of the three known values, otherwise we emit some confusing
500         messages later on. Thanks to Grig Gheorghiu for the catch.
502 2007-01-30  Brian Warner  <warner@lothar.com>
504         * buildbot/changes/bonsaipoller.py (BonsaiParser.__init__): Ben
505         Hearsum contributed a patch to let BonsaiPoller work with results
506         that contain non-ascii characters. Closes SF#1632641.
508 2007-01-27  Brian Warner  <warner@lothar.com>
510         * Makefile (release): produce both .tar.gz and .zip source bundles.
511         Closes SF#1222216.
513 2007-01-23  Brian Warner  <warner@lothar.com>
515         * buildbot/changes/freshcvsmail.py: hush a pyflakes warning
516         * buildbot/changes/monotone.py: same
518         * buildbot/changes/maildir.py: combine several files into one,
519         clean up maildir.py to use Services properly.
520         * buildbot/changes/maildirtwisted.py: remove
521         * buildbot/changes/maildirgtk.py: remove, it wasn't used by
522         buildbot anyways.
523         * buildbot/changes/mail.py: match the change
524         * buildbot/scheduler.py: same, since Try_Jobdir uses a maildir
525         * buildbot/test/test_maildir.py: remove use of reactor.iterate()
527         * buildbot/slave/commands.py (command_version): bump to "2.3" to
528         indicate that the buildslave knows about the 'bzr' command
530 2007-01-22  Brian Warner  <warner@lothar.com>
532         * buildbot/process/builder.py (Builder.fireTestEvent): don't use
533         'with', it will become a reserved work in python2.6 .
535         * contrib/bb_applet.py: add a simple gnome-panel applet, to
536         display a terse summary of buildbot status.
537         * docs/hexnut32.png, docs/hexnut48.png, docs/hexnut64.png: add
538         some icons, small versions of the Blender object that lives in
539         docs/images/icon.blend
541         * buildbot/steps/source.py (Bzr): add Bazaar-ng support
542         * buildbot/slave/commands.py (Bzr): same
543         * buildbot/scripts/tryclient.py (BzrExtractor): same
544         (SourceStampExtractor.dovc): modify this to allow non-zero exit
545         status, since 'bzr diff' does that
546         * buildbot/test/test_vc.py (Bzr): same
547         * docs/buildbot.texinfo (How Different VC Systems Specify Sources):
548         add notes on bzr
549         (Bzr): document it
551 2007-01-20  Brian Warner  <warner@lothar.com>
553         * contrib/darcs_buildbot.py: tidy up the progress messages
555 2007-01-17  Brian Warner  <warner@lothar.com>
557         * contrib/darcs_buildbot.py: enhance to handle multiple patches
558         being pushed at a time. This keeps state in the repository in a
559         small file named .darcs_buildbot-lastchange, but that shouldn't
560         interfere with normal repository operations. Fixes SF#1534049.
561         * buildbot/clients/sendchange.py (Sender): make a single Sender
562         capable of sending Changes with different usernames.
564 2006-12-11  Brian Warner  <warner@lothar.com>
566         * buildbot/changes/freshcvsmail.py: mark this file as deprecated,
567         scheduled for removal in 0.7.7 . The FCMaildirSource was moved to
568         buildbot.changes.mail a long time ago, but I forgot to add the
569         DeprecationWarning until now.
571         * buildbot/process/maxq.py: remove this, the functionality now
572         lives in buildbot.steps.maxq
574         * buildbot/clients/debug.py: remove an unnecessary gnome.ui import
575         * buildbot/clients/gtkPanes.py: remove unused import
577         * buildbot/slave/trial.py: remove an unused/incomplete/buggy file,
578         that was meant to provide a special Reporter to run inside trial
579         and give the buildslave lots of machine-readable status. We never
580         finished this project.
582         * buildbot/changes/bonsaipoller.py: remove unused imports
583         * buildbot/changes/svnpoller.py: same
584         * buildbot/process/builder.py: same
585         * buildbot/process/buildstep.py: same
586         * buildbot/slave/bot.py: hush pyflakes warning
587         * buildbot/status/tests.py: remove unused imports
588         * buildbot/status/tinderbox.py: same
589         * buildbot/steps/python_twisted.py: same
591         * buildbot/process/step.py: remove this file, these names were
592         deprecated in 0.7.5 and are now being removed.
593         * buildbot/process/step_twisted.py: same
594         * buildbot/test/test_steps.py (ReorgCompatibility): remove test
596         * buildbot/twcompat.py: remove the empty file, yay it is gone
598         * buildbot/twcompat.py (waitForDeferred): remove the monkeypatch,
599         tw-2.0.0 and newer have the method we need.
600         (getProcessOutputAndValue): same
601         (which): remove this method, tw-2.0.0 t.p.procutils has it
603         * buildbot/twcompat.py (implements): remove this method
604         * buildbot/*: import implements() from zope.interface directly
606         * buildbot/status/mail.py: stop falling back to importing
607         twisted.protocols.smtp.sendmail, now that we don't need tw-1.3.0
608         support
610         * buildbot/twcompat.py (Interface): remove this import
611         * buildbot/*: import Interface from zope.interface directly
613         * buildbot/twcompat.py (providedBy): remove this method
614         * buildbot/*: turn all uses of providedBy(obj, iface) into
615         iface.providedBy(obj)
617         * buildbot/twcompat.py (maybeWait): remove this method, now that
618         we no longer maintain compatibility with Twisted<=1.3.0 .
619         Twisted-2.0.0 and later allow trial methods to return Deferreds
620         directly.
621         * buildbot/test/*: remove all uses of maybeWait
623         * buildbot/__init__.py (version): bump to 0.7.5+ while between
624         releases
625         * docs/buildbot.texinfo: same
627 2006-12-10  Brian Warner  <warner@lothar.com>
629         * buildbot/__init__.py (version): Releasing buildbot-0.7.5
630         * docs/buildbot.texinfo: set version to match
632 2006-12-10  Brian Warner  <warner@lothar.com>
634         * README (REQUIREMENTS): update for release
635         * NEWS: update for release
636         * buildbot/slave/commands.py (command_version): mention that this
637         version (2.2) was released with buildbot-0.7.5
639         * buildbot/test/test_config.py (StartService.testStartService):
640         inhibit the usual read-config-on-startup behavior, since otherwise
641         the log.err that gets recorded causes the test to fail
643         * buildbot/status/builder.py (LogFile.finish): forget about all
644         subscribers once the log has finished, since after that point
645         we're never going to use them again. This might help free up some
646         memory somewhere.
648         * buildbot/clients/debug.py: update to use gtk.main_quit() rather
649         than the old/deprecated gtk.mainquit()
651 2006-12-09  Brian Warner  <warner@lothar.com>
653         * buildbot/steps/transfer.py (_FileWriter.__del__): handle errors
654         better when we can't open the masterdst file
656         * buildbot/scripts/startup.py (Follower._failure): add missing
657         import statement for BuildSlaveDetectedError
659         * buildbot/steps/transfer.py (FileUpload): cleanup
660         (FileDownload): same. Add tests for slave version, add mode=.
661         * buildbot/slave/commands.py (SlaveFileUploadCommand): same
662         (SlaveFileDownloadCommand): same
663         * buildbot/test/test_transfer.py: enhance tests
664         * buildbot/test/runutils.py (makeBuildStep): create a fake form of
665         step.slaveVersion
667 2006-12-08  Brian Warner  <warner@lothar.com>
669         * buildbot/scripts/runner.py (sendchange): halt the reactor on
670         both success *and* failure. Without this, the 'buildbot
671         sendchange' command would hang if it could not contact the
672         buildmaster or deliver the Change, which would generally cause the
673         user's commit/record/checkin command to hang too. Thanks to
674         Christian Unger for the catch.
676 2006-12-06  Brian Warner  <warner@lothar.com>
678         * NEWS: update with items for the next release
680         * docs/buildbot.texinfo (Adding LogObservers): add a somewhat
681         whimsical example pulled from a punch-drunk email I sent out late
682         one night.
683         (Transferring Files): document some of the other parameters
684         (Adding LogObservers): update to 0.7.5 buildbot.steps.*
685         (SVNPoller): rename svnpoller.SvnSource to SVNPoller
686         * buildbot/test/test_svnpoller.py: same
687         * buildbot/changes/svnpoller.py (SVNPoller): same
689 2006-11-26  Brian Warner  <warner@lothar.com>
691         * docs/buildbot.texinfo (Build Properties): remind users that
692         WithProperties must appear in a command= list, not as a top-level
693         instance.
694         * buildbot/steps/shell.py (ShellCommand.start): and assert that
695         we're sending a list or a single string to the RemoteShellCommand
697         * buildbot/scheduler.py (Nightly): Improve docs slightly.
699         * buildbot/scripts/startup.py (start): skip the whole
700         watch-the-logfile thing under windows, since it needs os.fork()
702         * buildbot/scripts/runner.py (restart): remove the old message
703         that got printed after the buildbot was restarted.. it most cases
704         it didn't get printed at the right time anyways
706 2006-11-25  Brian Warner  <warner@lothar.com>
708         * buildbot/scripts/runner.py: enhance 'start' and 'restart' to
709         follow twistd.log and print lines until the process has started
710         started properly. For the buildmaster, this means until the config
711         file has been parsed and accepted. For the buildslave, this means
712         until we've connected to the master. We give up after 5 seconds in
713         any case. Helpful error messages and troubleshooting suggestions
714         are printed when we don't see a successful startup. This closes the
715         remainder of SF#1517975.
716         * buildbot/scripts/startup.py: moved app startup code to here
717         * buildbot/scripts/logwatcher.py: utility class to follow log
718         * buildbot/scripts/reconfig.py: rewrite to use LogWatcher
719         * buildbot/slave/bot.py: announce our BuildSlaveness to the log
720         so the LogWatcher can tell the difference between a buildmaster
721         and a buildslave
723 2006-11-24  Brian Warner  <warner@lothar.com>
725         * docs/examples/twisted_master.cfg: update to match the version
726         in use on twistedmatrix.com
727         (IRC): re-enable IRC bot. The 'irc.us.freenode.net' hostname I
728         was using before stopped working, but 'irc.freenode.net' works
729         just fine.
731         * buildbot/scripts/runner.py (run): oops, forgot to enable the new
732         'reconfig' command
734         * buildbot/clients/base.py (TextClient.not_connected): upon
735         UnauthorizedLogin failures, remind the user to connect to the
736         PBListener port instead of the slaveport.
737         (TextClient.disconnected): shut down more quietly
738         * docs/buildbot.texinfo (statuslog): add another reminder
740         * buildbot/scripts/runner.py (Options.subCommands): rename
741         'buildbot sighup DIR' to 'buildbot reconfig DIR', but keep
742         'sighup' as an alias.
743         * buildbot/scripts/reconfig.py (Reconfigurator): enhance the
744         reconfig command to follow twistd.log and print all of the lines
745         from the start of the config-file reload to its completion. This
746         should make it a lot easier to discover bugs in the config file.
747         Use --quiet to disable this behavior. This addresses half of
748         SF#1517975, the other half will be to add this same utility to
749         'buildbot start' and 'buildbot restart'.
750         * docs/buildbot.texinfo (Loading the Config File): same
751         (Shutdown): same
753         * buildbot/interfaces.py (IBuilderControl.forceBuild): remove this
754         method, it has been deprecated for a long time. Use
755         IBuilderControl.requestBuild instead.
756         * buildbot/process/builder.py (BuilderControl.forceBuild): remove
757         * buildbot/master.py (BotPerspective.perspective_forceBuild): same
758         * buildbot/slave/bot.py (Bot.debug_forceBuild): same
759         * buildbot/test/test_control.py (Force.testForce): same
760         * buildbot/test/test_run.py: use requestBuild instead
762         * buildbot/clients/debug.py: replace 'Force Build' button with
763         'Request Build' (which just adds one to the queue), add Ping
764         Builder, add branch/revision fields to Request Build.
765         * buildbot/clients/debug.glade: same
766         * buildbot/master.py: update interface to match. This creates an
767         incompatibility between new debugclients and old buildmasters.
769         * buildbot/process/builder.py (Builder._attached): delay the call
770         to maybeStartBuild for a reactor turn, to avoid starting a build
771         in the middle of a reconfig (say, if the new Builder uses a new
772         slave which is already connected).
774 2006-11-23  Brian Warner  <warner@lothar.com>
776         * buildbot/test/test_transfer.py: appease pyflakes
777         * buildbot/test/test_steps.py: same
779         * buildbot/test/test_bonsaipoller.py: remove the 'import *' that
780         keeps pyflakes from finding undefined names
782         * buildbot/master.py (BuildMaster.loadConfig_Builders): changing a
783         Builder no longer induces a disconnect/reconnect cycle. This means
784         that any builds currently in progress will not be interrupted, and
785         any builds which are queued in the Builder will not be lost. This
786         is implemented by having the new Builder extract the state (i.e.
787         all pending Builds and any desired SlaveBuilders) from the old
788         Builder.
789         (BotPerspective): refactor. The BotPerspective no longer keeps
790         track of all the Builders that want to use this slave; instead, it
791         asks the BotMaster each time it needs this list. This removes
792         addBuilder and removeBuilder. Clean up attached() to acquire all
793         the slave's information in a more atomic fashion. updateSlave() is
794         now the way to make sure the slave is using the right set of
795         Builders: just call it after everything else has been
796         reconfigured.
797         (BotMaster): refactor, removing addBuilder/removeBuilder and
798         replacing them with an all-at-once setBuilders() call.
800         * buildbot/test/test_slaves.py (Reconfig): new test case to
801         exercise this functionality
802         * buildbot/steps/dummy.py (Wait): new dummy BuildStep for the test
803         * buildbot/slave/commands.py (WaitCommand): same
805         * docs/buildbot.texinfo (Loading the Config File): document the
806         changes
808         * buildbot/process/builder.py (SlaveBuilder): refactor. Allow the
809         SlaveBuilder to have its parent Builder changed.
810         (SlaveBuilder.isAvailable): new method to give access to state,
811         which is now a private attribute
812         (SlaveBuilder.buildStarted,buildFinished): new methods to inform
813         the SlaveBuilder about how it is being used. These methods update
814         its internal state. buildFinished() is now the place that invokes
815         maybeStartBuild() on its parent Builder.
816         (Builder.consumeTheSoulOfYourPredecessor): new method to allow a
817         new Builder to take over for an old one, transferring state from
818         the old one.
819         (Buider): refactor the way that SlaveBuilders are used to match,
820         giving them a bit more autonomy.
821         (Builder.buildFinished): this no longer calls maybeStartBuild():
822         instead the SlaveBuilder calls it on whoever its parent Builder is
823         at the time. This way, when an old Builder is replaced by a new
824         one, and there was a build in progress during the transition, when
825         that build finishes, it will be the new Builder that is told about
826         the newly available slave so it can start a new build.
828         * buildbot/process/base.py (Build.startBuild._release_slave): when
829         the Build finishes, tell the SlaveBuilder that they've been
830         released.
832         * buildbot/status/builder.py (SlaveStatus): add some new setter
833         methods for use by BotPerspective, to keep some attributes more
834         private
836         * buildbot/slave/bot.py (Bot.remote_getDirs): this is no longer
837         called by the buildmaster.
838         (Bot.setBuilderList): instead, we locally announce any leftover
839         directories based upon which Builders we were told about. The
840         master doesn't really care; it's the local admin who may or may not
841         wish to delete them.
844         * contrib/svn_buildbot.py: use /usr/bin/python, not /usr/bin/env,
845         to allow use of python2.4 or whatever. This tool still requires
846         python2.3 or newer.
848 2006-11-19  Brian Warner  <warner@lothar.com>
850         * NEWS (IStatusLog.readlines): more news items
852 2006-11-18  Brian Warner  <warner@lothar.com>
854         * NEWS: start collecting items for the next release.
856 2006-11-04  Brian Warner  <warner@lothar.com>
858         * buildbot/changes/bonsaipoller.py: apply updates from Ben
859         Hearsum. Closes SF#1590310.
860         * buildbot/test/test_bonsaipoller.py: and tests
862         * buildbot/status/tinderbox.py
863         (TinderboxMailNotifier.buildMessage): send out a "testfailed"
864         status when the build results in WARNINGS. Patch from Dave
865         Liebreich. Closes SF#1587352.
867         * buildbot/slave/commands.py (LogFileWatcher.poll): overcome a
868         linux-vs-osx behavior difference w.r.t. reading from files that
869         have reached EOF. This should fix LogFileWatcher on OS-X. Thanks
870         to Mark Rowe for the patch.
872 2006-10-15  Brian Warner  <warner@lothar.com>
874         * buildbot/interfaces.py (IStatus.getURLForThing): oops, the
875         method name was misspelled in the interface definition. Thanks to
876         Roy Rapoport for the catch.
878 2006-10-13  Brian Warner  <warner@lothar.com>
880         * docs/buildbot.texinfo (Adding LogObservers): update sample code
881         to match the great Steps renaming
883         * buildbot/steps/transfer.py (FileUpload.start): Fix stupid error.
884         Maybe I should run my own unit tests before recording a big
885         change. Good thing I've got a buildbot to remind me.
887 2006-10-12  Brian Warner  <warner@lothar.com>
889         * buildbot/steps/transfer.py: rework __init__ and args setup
890         * buildbot/slave/commands.py (SlaveFileDownloadCommand): minor
891         docs improvements
892         * buildbot/slave/commands.py (SlaveFileDownloadCommand.setup):
893         when opening the target file, only catch IOError (to report via
894         stderr/rc!=0), let the others be reported as normal exceptions
896 2006-10-08  Brian Warner  <warner@lothar.com>
898         * contrib/svn_watcher.py: fix security holes by using proper argv
899         arrays and subprocess.Popen() rather than commands.getoutput().
900         Thanks to Nick Mathewson for the patch. Note that svn_watcher.py
901         is deprecated in favor of buildbot/changes/svnpoller.py, and will
902         probably be removed by the next release.
903         * CREDITS: add Nick
905 2006-10-04  Brian Warner  <warner@lothar.com>
907         * buildbot/steps/python.py (PyFlakes.createSummary): skip any
908         initial lines that weren't emitted by pyflakes. When the pyflakes
909         command is run under a Makefile, 'make' will echo the command it
910         runs to stdio, and that was getting logged as a "misc" warning.
911         * buildbot/test/test_steps.py (Python.testPyFlakes2): test it
912         * buildbot/test/test_steps.py (testPyFlakes3): another test
914 2006-10-01  Brian Warner  <warner@lothar.com>
916         * buildbot/status/html.py (HtmlResource.render): if we get a
917         unicode object from our content() method, encode it into utf-8
918         like we've been claiming to all along. This allows the comments
919         and author names from svnpoller.py to be delivered properly.
921         * buildbot/changes/svnpoller.py (SvnSource.create_changes):
922         de-unicodify filenames before creating the Change, because the
923         rest of buildbot is unlikely to handle them well. Leave the 'who'
924         field as a unicode object.. I don't think there's anything that
925         will break very soon, and it will probably nudge us towards
926         accepting unicode everywhere sooner or later. Stop using the
927         "date" field that comes out of SVN, since it is using the
928         repository's clock (and timezone) and what we care about is the
929         buildmaster's (otherwise Changes from the future show up later
930         than the builds they triggered).
931         * buildbot/test/test_svnpoller.py (Everything.test1): match the
932         change to .when
934         * buildbot/changes/svnpoller.py (SvnSource): added Niklaus Giger's
935         Suvbersion repository polling ChangeSource. I've hacked it up
936         considerably: any bugs are entirely my own fault. Thank you
937         Niklaus!
938         * buildbot/test/test_svnpoller.py: tests for it
939         * docs/buildbot.texinfo (SvnSource): document it
941 2006-09-30  Brian Warner  <warner@lothar.com>
943         * buildbot/scheduler.py (Periodic): submit a reason= to the
944         BuildSet to indicate which Scheduler triggered the build. Thanks
945         to Mateusz Loskot for the suggestion.
946         (Nightly): same
947         * buildbot/test/test_scheduler.py (Scheduling.testPeriodic1): test it
949         * buildbot/changes/p4poller.py (P4Source): some minor stylistic
950         changes: set self.loop in __init__, remove unused volatile=
952         * docs/buildbot.texinfo (.buildbot config directory): add more
953         docs on the .buildbot/options keys used by "buildbot try"
954         * buildbot/scripts/tryclient.py (Try.createJob): remove dead code
955         (Try.deliverJob): same
957         * buildbot/changes/bonsaipoller.py (BonsaiParser): more updates
958         from Robert Helmer
959         (BonsaiPoller): same
961         * buildbot/slave/commands.py (LogFileWatcher.stop): explicitly
962         close the filehandle when we stop watching the file. Before, the
963         filehandle was only closed when the LogFileWatcher was
964         garbage-collected, which could be quite a while in the future. If
965         it was still open by the time the next build started, windows will
966         refuse to let the new build delete the old build/ directory. Fixes
967         SF#1568415, thanks to <scmikes>, <FireMoth>, and <radix> on
968         #twisted for the catch.
970 2006-09-29  Brian Warner  <warner@lothar.com>
972         * buildbot/status/tinderbox.py (TinderboxMailNotifier): updates
973         from Robert Helmer
975 2006-09-25  Brian Warner  <warner@lothar.com>
977         * setup.py: the new buildbot.steps module wasn't being installed.
978         Thanks to Jose Dapena Paz for the catch, fixes SF#1560631.
979         (testmsgs): add the extra stuff from buildbot/test/* so you can
980         run unit tests on an installed copy of buildbot, not just from
981         the source tree.
983         * contrib/svn_buildbot.py (ChangeSender.getChanges): the first *4*
984         columns of 'svnlook changed' output contain status information, so
985         strip [:4] instead of [:6]. Depending upon what the status flags
986         were, this would sometimes lead to mangled filenames. Thanks to
987         Riccardo Magliocchetti for the patch. Closes SF#1545146.
989         * buildbot/steps/source.py (Monotone): initial Monotone support,
990         contributed by Nathaniel Smith. Still needs docs and tests, but
991         this code has been in use on the Monotone buildbot for a long
992         time now.
993         * buildbot/slave/commands.py (Monotone): slave-side support
994         * buildbot/changes/monotone.py (MonotoneSource): polling change
995         source
997         * buildbot/changes/bonsaipoller.py (BonsaiPoller): Ben also
998         contributed a Change Source that polls a Bonsai server (a
999         kind of web-based viewcvs CGI script).
1001         * buildbot/status/tinderbox.py (TinderboxMailNotifier): Ben
1002         Hearsum contributed a status plugin which sends email in the same
1003         format that Tinderbox does: this allows a number of tinderbox
1004         tools to be driven by Buildbot instead. Thanks Ben!
1006 2006-09-24  Brian Warner  <warner@lothar.com>
1008         * buildbot/changes/mail.py (parseBonsaiMail): fix the parser.
1009         Thanks to Robert Helmer for the patch.
1011         * buildbot/process/base.py (Build.setupSlaveBuilder): tell our
1012         BuildStatus about the buildslave name at the *beginning* of the
1013         build, rather than at the end. Thanks to Alexander Lorenz for the
1014         patch.
1015         * buildbot/status/html.py (StatusResourceBuild.body): always
1016         include the slavename in the build page, not just when the build
1017         has finished.
1018         * buildbot/status/mail.py (MailNotifier.buildMessage): include the
1019         slavename in the email message
1021 2006-09-21  Brian Warner  <warner@lothar.com>
1023         * buildbot/scripts/sample.cfg: update to use new BuildStep classes
1024         from buildbot.steps
1025         * docs/examples/glib_master.cfg: same
1026         * docs/examples/hello.cfg: same
1027         * docs/examples/twisted_master.cfg: same, update to current usage
1029 2006-09-19  Brian Warner  <warner@lothar.com>
1031         * buildbot/steps/python.py (PyFlakes): refactor, add summary logs
1032         (PyFlakes.createSummary): make it compatible with python-2.2
1034         * buildbot/test/test_steps.py (Python.testPyFlakes): add a test
1035         for at least the output-parsing parts of PyFlakes
1037 2006-09-18  Brian Warner  <warner@lothar.com>
1039         * buildbot/steps/python.py: oops, fix import of StringIO
1041 2006-09-17  Brian Warner  <warner@lothar.com>
1043         * buildbot/test/test_vc.py (VCBase._do_vctest_update_retry_1): it
1044         turns out that SVN-1.4.0 doesn't fail to update once you've
1045         replaced a file with a directory, unlike older versions of SVN and
1046         pretty much every other VC tool we support. Since what we really
1047         care about is that the update succeeds anyway, stop checking that
1048         the tree got clobbered and just assert that the build succeeded.
1049         (VCBase.printLogs): add a utility function for debugging
1051         * buildbot/process/step.py: oops, added extra imports by mistake
1053         * buildbot/changes/p4poller.py (P4Source._process_describe): do an
1054         rstrip() on the first line coming out of the 'p4 describe'
1055         process, to remove the stray ^M that Wade Brainerd reports seeing
1056         in the 'when' field. Fixes SF#1555985.
1058         * buildbot/master.py (BuildMaster.loadConfig): improve the error
1059         message logged when c['schedulers'] is not right
1060         * buildbot/scheduler.py (Scheduler.__init__): improve error
1061         message when a Scheduler() is created with the wrong arguments
1062         * buildbot/test/test_config.py (ConfigTest.testSchedulerErrors):
1063         verify that these error messages are emitted
1065         * buildbot/process/buildstep.py: rename step.py to buildstep.py .
1066         The idea is that all the base classes (like BuildStep and
1067         RemoteCommand and LogObserver) live in b.p.buildstep, and b.p.step
1068         will be a leftover backwards-compatibility file that only contains
1069         aliases for the steps that were moved out to buildbot.steps.*
1070         * lots: change imports to match
1071         * buildbot/process/step.py: add a DeprecationWarning if it ever
1072         gets imported
1074 2006-09-12  Brian Warner  <warner@lothar.com>
1076         * buildbot/scheduler.py (Scheduler.__init__): make sure that
1077         builderNames= is actually a sequence, since if you happen to give
1078         it a single builder-specification dictionary instead, it won't get
1079         caught by the existing assert. Thanks to Brett Neely for the
1080         catch.
1082         * buildbot/steps/python.py (BuildEPYDoc, PyFlakes): add new steps. No
1083         tests yet, alas.
1084         * docs/buildbot.texinfo (Python BuildSteps): document them
1085         (sendchange): include a link to PBChangeSource, since you need one
1087         * buildbot/steps/shell.py: clean up test-case-name line, remove some
1088         unnecessary imports
1089         * buildbot/steps/dummy.py: same
1091 2006-09-08  Brian Warner  <warner@lothar.com>
1093         * buildbot/steps/transfer.py (FileUpload,FileDownload): new
1094         BuildStep which lets you transfer files from the master to the
1095         slave or vice versa. Thanks to Albert Hofkamp for the original
1096         patch. Fixes SF#1504631.
1097         * buildbot/slave/commands.py (SlaveFileUploadCommand): slave-side
1098         support for it
1099         (SlaveFileDownloadCommand): same
1100         * docs/buildbot.texinfo (Transferring Files): document it
1101         * buildbot/test/test_transfer.py: test it
1102         * buildbot/test/runutils.py (StepTester): new utility class for
1103         testing BuildSteps and RemoteCommands without Builds or Bots or PB
1104         * buildbot/test/test_steps.py (CheckStepTester): validate that the
1105         utility class works
1107         * buildbot/interfaces.py (IStatusLog.readlines): make it easier to
1108         walk through StatusLogs one line at a time, mostly for the benefit
1109         of ShellCommand.createSummary methods. You can either walk through
1110         STDOUT or STDERR, but the default is STDOUT.
1112         * buildbot/status/builder.py (LogFile.readlines): implement it.
1113         Note that this is not yet memory-efficient, it just pulls the
1114         whole file into RAM and then splits it up with a StringIO.
1115         Eventually this should be a generator that only pulls chunks from
1116         disk as necessary.
1117         * buildbot/test/test_status.py (Log.testReadlines): test it
1119         * docs/buildbot.texinfo: update to match changes
1120         * buildbot/process/factory.py: stop using old definitions
1121         * buildbot/process/process_twisted.py: same
1122         * buildbot/test/test_*.py: same
1124         * buildbot/process/step_twisted.py: move definition to..
1125         * buildbot/steps/python_twisted.py: .. here, unfortunately python's
1126         relative-import mechanisms prevent this from being named 'twisted'
1127         or 'python/twisted' as I would have preferred.
1129         * buildbot/process/maxq.py: move definition to..
1130         * buildbot/steps/maxq.py: .. here, leave a compatibility import
1132         * buildbot/process/step.py: split the user-visible BuildSteps into
1133         separate files, all under buildbot/steps/
1134         * buildbot/steps/source.py: this holds VC-checkout steps like SVN
1135         * buildbot/steps/shell.py: this holds ShellCommand and friends
1136         * buildbot/steps/dummy.py: this holds the testing steps like Dummy
1138 2006-09-05  Brian Warner  <warner@lothar.com>
1140         * lots: run pyflakes, removed a lot of unused imports, changed the
1141         form of some conditional imports to remove false pyflakes
1142         warnings. There are still a number of warnings left, mostly from
1143         imports that are done for their side-effects.
1144         * buildbot/test/test_vc.py: import twisted.python.failure, since it
1145         was missing
1147 2006-08-26  Brian Warner  <warner@lothar.com>
1149         * buildbot/test/test_locks.py (Unit.testLater): make the tests
1150         compatible with twisted-1.3.0, for some reason I just can't seem
1151         to let go of the past.
1153 2006-08-25  Brian Warner  <warner@lothar.com>
1155         * buildbot/status/mail.py (MailNotifier.__init__): fix typo in docs
1157         * buildbot/process/step.py (LoggingBuildStep.startCommand): set up
1158         all logfiles= in startCommand(), rather than in start() . This
1159         makes it easier to have the 'stdio' log come before any secondary
1160         logfiles, which I feel makes the waterfall display more
1161         understandable.
1162         (LoggingBuildStep.setupLogfiles): move the addLog/cmd.useLog code
1163         from ShellCommand up into LoggingBuildStep
1164         (LoggingBuildStep.__init__): move the handling of logfiles= from
1165         ShellCommand up to LoggingBuildStep, because startCommand is
1166         provided by LoggingBuildStep, whereas start() was specific to
1167         subclasses like ShellCommand and Source. This removes code
1168         duplication in those subclasses.
1169         (ShellCommand.__init__): same
1170         (ShellCommand.checkForOldSlaveAndLogfiles): split out the check
1171         for a slave that's too old to understand logfiles= into a separate
1172         method, so it can live in ShellCommand. The rest of
1173         setupLogfiles() can live in LoggingBuildStep.
1175 2006-08-24  Brian Warner  <warner@lothar.com>
1177         * buildbot/locks.py (BaseLock): you can now configure Locks to
1178         allow multiple simultaneous owners. They still default to
1179         maxCount=1. Fixes SF#1434997. Thanks to James Knight (foom) for
1180         the patch.
1181         * docs/buildbot.texinfo (Interlocks): document the new options
1182         * buildbot/test/test_locks.py: add a bunch of new unit tests
1183         * buildbot/process/base.py (Build.acquireLocks): locks now offer
1184         waitUntilMaybeAvailable, not waitUntilAvailable
1185         * buildbot/process/step.py (BuildStep.acquireLocks): same
1186         * buildbot/master.py (BotMaster.getLockByID): real locks now use
1187         the whole lockid in their constructor, not just the name. Also,
1188         keep track of which real locks we've handed out by the full
1189         lockid, not just class+name, otherwise changing just the maxCount=
1190         in the master.cfg file would not actually cause a behavioral
1191         change
1193 2006-08-23  Brian Warner  <warner@lothar.com>
1195         * buildbot/__init__.py (version): bump to 0.7.4+ while between
1196         releases
1197         * docs/buildbot.texinfo: same
1199 2006-08-23  Brian Warner  <warner@lothar.com>
1201         * buildbot/__init__.py (version): Releasing buildbot-0.7.4
1202         * docs/buildbot.texinfo: set version to match
1203         * NEWS: update for 0.7.4
1204         * buildbot/slave/commands.py (command_version): mention that this
1205         version (2.1) was released with buildbot-0.7.4
1207 2006-08-22  Brian Warner  <warner@lothar.com>
1209         * README: update
1211         * CREDITS: new file, list of people who have helped. Thanks!
1212         * MANIFEST.in: ship it
1214         * MANIFEST.in: stop shipping the old PyCon-2003 paper.. with the
1215         new diagrams, the user's manual is more informative than it was.
1216         Start shipping the .html user's manual (and generated .png
1217         images).
1218         * Makefile: update 'release' target to match
1220         * buildbot/test/test_web.py (GetURL.testBrokenStuff): delete this
1221         test.. I think the web-parts effort will render it pointless well
1222         before it ever actually starts to work.
1224 2006-08-20  Brian Warner  <warner@lothar.com>
1226         * buildbot/changes/pb.py (PBChangeSource): fix and simplify
1227         meaning of the prefix= argument. It is now just a string which is
1228         stripped from the beginning of the filename. If prefix= is set but
1229         not found on any given filename, that filename is ignored. If all
1230         filenames in a Change are ignored, the Change is dropped. This is
1231         much simpler than the previous sep= nonsense, and I should have
1232         implemented it this way from the beginning. Effectively resolves
1233         SF#1217699 and SF#1381867. Thanks to Gary Granger and Marius
1234         Gedminas for the catch and suggested fixes.
1235         (ChangePerspective.perspective_addChange): implement the actual
1236         prefix comparison
1237         * buildbot/test/test_changes.py (TestChangePerspective): test it
1238         * docs/buildbot.texinfo (PBChangeSource): document it, explain
1239         how to properly use prefix=
1240         * docs/examples/twisted_master.cfg (source): update prefix= by
1241         adding the trailing slash
1244         * docs/examples/twisted_master.cfg: update to actual practice
1246         * buildbot/test/test_web.py (WaterfallSteps.test_urls): oops,
1247         update test case to match new link text.. the HREF has both a
1248         class= setting and an enclosing [] pair that I didn't match in the
1249         test.
1251         * docs/buildbot.texinfo (ShellCommand.command=): explain why a
1252         list of strings is preferred over a single string with embedded
1253         spaces
1254         (ShellCommand.description=): explain that either single strings or
1255         a list of strings is acceptable, and why you might prefer one over
1256         the other. Add an example. Fixes SF#1524659, thanks to Paul
1257         Winkler for the catch.
1258         (Build Steps): update to use f.addStep() rather than using s()
1259         and the constructor list
1261         * buildbot/process/step.py (ShellCommand): accept either a single
1262         string or a list of strings in both description= and
1263         descriptionDone=
1264         * buildbot/test/test_steps.py (Steps.test_description): test it
1265         * buildbot/test/runutils.py (makeBuildStep): support for that test
1267         * contrib/CSS/*.css: add some contributed CSS stylesheets, to make
1268         the Waterfall display a bit less ugly. Thanks to John O'Duinn for
1269         collecting the files and creating the patch.
1271         * docs/buildbot.texinfo (BuildStep URLs): document new feature:
1272         per-step URLs that will be displayed on the waterfall display,
1273         for things like the HTML output of code-coverage tools, when
1274         the results are hosted elsewhere.
1275         * buildbot/interfaces.py (IBuildStepStatus.getURLs): document the
1276         way to retrieve these URLs
1277         * buildbot/status/builder.py (BuildStepStatus.getURLs): implement
1278         the method to retrieve these URLs. Also provide backwards
1279         compatibility for saved BuildStepStatus instances that didn't have
1280         the .urls attribute
1281         * buildbot/process/step.py (BuildStep.addURL): method to set these
1282         URLs from within a BuildStep
1283         * buildbot/status/html.py (StepBox.getBox): emit links to the URLs
1284         (StepBox.getBox): give these external links a distinct CSS class
1285         named "BuildStep external" so a .css file can display them
1286         differently
1288         * buildbot/test/test_web.py (WaterfallSteps): test that we really
1289         do emit those links
1290         * buildbot/test/test_steps.py (Steps): test that we can all the
1291         URLs. Also add a bunch of other tests on methods that can be
1292         called from within BuildSteps
1293         * buildbot/test/runutils.py (makeBuildStep): add utility function
1295 2006-08-13  Brian Warner  <warner@lothar.com>
1297         * docs/buildbot.texinfo (BuildStep LogFiles): document them
1299 2006-08-10  Brian Warner  <warner@lothar.com>
1301         * docs/buildbot.texinfo (Index of master.cfg keys): add another
1302         index, this one of things like c['sources'] and c['schedulers']
1303         (indices): it looks like my clever idea of putting the @fooindex
1304         commands in between the @node and the @subsection (to make the
1305         HREF anchor jump to slightly above the section title, which works
1306         much better in html) confused texinfo horribly, so I'm moving the
1307         index tags back to be just after the @subsection marker. I also
1308         added extra lines between the @node/@section paragraph and the
1309         index tags, since I think maybe texinfo wants to see these be
1310         separate paragraphs.
1312         * docs/Makefile (images): make sure images get built when
1313         rendering the manual
1314         * docs/images/Makefile: same
1316         * buildbot/scripts/runner.py: rename 'buildbot master' to
1317         'buildbot create-master', and 'buildbot slave' to 'buildbot
1318         create-slave'
1319         * docs/buildbot.texinfo: same
1320         * README: same
1322         * docs/buildbot.texinfo: reimplement the "useful classes" index
1323         with actual texinfo indices. The .info rendering is a bit
1324         weird-looking but it works well, and the HTML rendering is quite
1325         nice. This also puts the index targets in the regular flow of the
1326         text, which is easier to maintain.
1328 2006-08-06  Brian Warner  <warner@lothar.com>
1330         * buildbot/slave/commands.py (ShellCommand.__init__): patch from
1331         Kevin Turner to prefer the environ= argument be a list rather than
1332         a string. If it is a list, it will be joined with a platform-local
1333         os.pathsep delimiter, and then prepended to any existing
1334         $PYTHONPATH value. This works better in cross-platform (i.e.
1335         windows buildslaves) environments when you need to push multiple
1336         directories onto the front of the path.
1337         (SlaveShellCommand): documented the new magic
1338         * docs/buildbot.texinfo (ShellCommand): documented the new magic
1339         in a user-visible form
1341         * buildbot/test/test_vc.py (BaseHelper.dovc): patch from Kevin
1342         Turner to prefer lists over strings when creating/running VC
1343         commands during unit tests. This is clearly necessary to survive
1344         vcexe containing spaces, like "C:\Program Files\darcs.exe". I
1345         renamed the wq() function to qw() though, since that's how it's
1346         spelled in perl. Eventually I'd prefer all commands to be
1347         specified with lists.
1349         * buildbot/slave/commands.py (LogFileWatcher): handle logfiles
1350         which are deleted (or not yet created) correctly. Also add
1351         failsafe code to not explode if the file-watching poller doesn't
1352         get started. Thanks to JP Calderone for the catch and the poller
1353         patch.
1354         * buildbot/test/test_shell.py (SlaveSide._testLogFiles): add test
1355         for that case
1356         * buildbot/test/emitlogs.py: same
1358         * NEWS: summarize recent changes
1360         * docs/buildbot.texinfo (Debug options): suggest an .ssh/options
1361         clause to avoid the "host key mismatch" warning
1363         * buildbot/process/step_twisted.py (Trial.start): if the
1364         buildslave is too old to understand logfiles=, fall back to
1365         running 'cat _trial_temp/test.log' like before.
1366         (Trial.commandComplete): same. this takes advantage of the
1367         LoggingBuildStep refactoring to stall commandComplete long enough
1368         to run a second RemoteShellCommand.
1370         * buildbot/process/step.py (LoggingBuildStep.startCommand):
1371         refactor command-completion handling, to allow methods like
1372         commandComplete/createSummary/evaluateCommand to return Deferreds.
1373         (LoggingBuildStep._commandComplete): delete the refactored method
1374         (ShellCommand.setupLogfiles): if the buildslave is too old to
1375         understand logfiles=, put a warning message both into twistd.log
1376         and into the otherwise empty user-visible LogFiles.
1378         * buildbot/process/step.py (LoggedRemoteCommand.useLog): allow
1379         callers to provide the slave-side logfile name, rather than
1380         forcing it to come from the local name of the LogFile.
1381         (BuildStep.getSlaveName): new method
1383         * buildbot/process/base.py (Build.getSlaveName): new method, so
1384         steps can find out which buildslave they're running on
1386         * buildbot/test/test_steps.py (Version.checkCompare): oops, update
1387         to match the s/cvs_ver/command_version/ change
1389 2006-08-05  Brian Warner  <warner@lothar.com>
1391         * buildbot/slave/commands.py (command_version): replace the CVS
1392         auto-updated cvs_ver keyword with a manually-updated variable,
1393         since CVS is no longer the master repository. Add a description of
1394         the remote API change starting in this version (2.1), specifically
1395         the fact that SlaveShellCommand now accepts 'initial_stdin',
1396         'keep_stdin_open', and 'logfiles'.
1398 2006-07-31  Brian Warner  <warner@lothar.com>
1400         * docs/buildbot.texinfo (System Architecture): Finally add lots of
1401         diagrams to describe how the whole system fits together. The
1402         images themselves are kept in SVG files, with ascii-art versions
1403         in corresponding .txt files. Texinfo knows how to interpolate the
1404         text version into .info files, reference the .png versions from
1405         .html files, and include .eps versions in the .ps format.
1406         * docs/images/Makefile: tools to create .png and .eps
1407         * docs/images/*.svg: created pictures with Inkscape.
1408         * .darcs-boring: ignore the generated .eps and .png files
1410 2006-07-24  Brian Warner  <warner@lothar.com>
1412         * buildbot/master.py (BuildMaster.loadConfig): check for duplicate
1413         Scheduler names, since they cause setServiceParent to explode
1414         later.
1415         * buildbot/test/test_config.py (ConfigTest._testSchedulers_7): test it
1417 2006-07-20  Brian Warner  <warner@lothar.com>
1419         * buildbot/scripts/sample.cfg: simplify the sample BuildFactory,
1420         which runs the buildbot unit tests
1422         * docs/buildbot.texinfo (Index of Useful Classes): add a table of
1423         classes that are useful in master.cfg
1425 2006-07-15  Brian Warner  <warner@lothar.com>
1427         * Makefile (some-apidocs): new target to build only some epydocs
1429         * setup.py: minor comment.. does the classifiers= argument prevent
1430         the setup.py script from working on python2.2/2.3?
1432         * buildbot/scripts/sample.cfg: update manhole example, arrange into
1433         major sections
1435         * buildbot/twcompat.py: fix minor typo in comments
1437         * buildbot/manhole.py: move all Manhole-related code out to this
1438         module. Implement SSH-based manholes (with TwistedConch), and move
1439         to conch's nifty line-editing syntax-coloring REPL shell instead
1440         of the boring non-editing monochromatic (and deprecated) old
1441         'telnet' protocol.
1442         * buildbot/master.py: remove all Manhole-related code
1443         (BuildMaster.loadConfig._add): make sure the old manhole is
1444         removed before we add the new one
1445         * docs/buildbot.texinfo (Debug options): document new Manhole options
1447         * buildbot/twcompat.py (_which): fix some epydoc issues
1448         * buildbot/status/html.py (Waterfall.__init__): same
1450 2006-06-29  Brian Warner  <warner@lothar.com>
1452         * buildbot/interfaces.py: get Interface from b.twcompat to hush
1453         deprecation warnings under newer Twisteds (by using
1454         zope.interface.Interface instead of old twisted.python.components
1455         stuff)
1456         * buildbot/slave/interfaces.py: same
1458 2006-06-28  Brian Warner  <warner@lothar.com>
1460         * buildbot/slave/commands.py (SVN): add --non-interactive to all
1461         svn commands, so it will fail immediately instead of hanging while
1462         it waits for a username/password to be typed in.
1464         * buildbot/slave/bot.py (SlaveBuilder.commandComplete): add minor
1465         log message if the step was shut down
1467         * buildbot/scripts/runner.py (SlaveOptions.longdesc): remove
1468         obsolete reference to mktap.
1470 2006-06-20  Brian Warner  <warner@lothar.com>
1472         * buildbot/test/test_steps.py (BuildStep.testShellCommand1): update
1473         test to include new 'logfiles' argument sent from master to slave
1475 2006-06-19  Brian Warner  <warner@lothar.com>
1477         * buildbot/process/step_twisted.py (Trial): track Progress from
1478         _trial_temp/test.log too
1480         * buildbot/process/step.py (OutputProgressObserver): generalize
1481         the earlier StdioProgressObserver into an OutputProgressObserver
1482         that can track LogFiles other than stdio.
1483         (LoggingBuildStep.__init__): same
1485         * buildbot/process/step_twisted.py (Trial): use logfiles= to track
1486         _trial_temp/test.log, not a separate 'cat' command. TODO: this
1487         will fail under windows because of os.sep issues. It might have
1488         worked before if 'cat' was doing cygwin path conversion.
1490         * buildbot/slave/commands.py (LogFileWatcher.__init__): note the
1491         creation of LogFileWatchers
1492         (ShellCommand._startCommand): and record the files that were
1493         watched in the 'headers' section of the ShellCommand output
1495         * buildbot/process/step.py (RemoteShellCommand.__init__): duh, you
1496         need to actually pass it to the slave if you want it to work.
1497         (ShellCommand): document it a bit
1499         * buildbot/test/test_shell.py: new test to validate LogFiles
1500         * buildbot/test/runutils.py (SlaveCommandTestBase): updates to
1501         test LogFiles
1502         * buildbot/test/emitlogs.py: enhance to wait for a line on stdin
1503         before printing the last batch of lines, to test that the polling
1504         logic is working properly
1506         * buildbot/process/step.py (LoggedRemoteCommand): improve LogFile
1507         handling, making it possible to track multiple logs for a single
1508         RemoteCommand. The previous single logfile is now known as the
1509         'stdio' log.
1510         (LoggedRemoteCommand.remoteUpdate): accept key='log' updates
1511         (RemoteShellCommand.__init__): accept logfiles=
1512         (LoggingBuildStep.startCommand): stdio_log is now one of many
1513         (ShellCommand): added logfiles= argument, as well as a class-level
1514         .logfiles attribute, which will be merged together to figure out
1515         which logfiles should be tracked. The latter maybe be useful for
1516         subclasses of ShellCommand which know they will aways produce
1517         secondary logfiles in the same location.
1519         * buildbot/slave/commands.py (ShellCommandPP): add writeStdin()
1520         and closeStdin() methods, preparing to make it possible to write
1521         to a ShellCommand's stdin at any time, not just at startup. These
1522         writes are buffered if the child process hasn't started yet.
1523         (LogFileWatcher): new helper class to watch arbitrary logfiles
1524         while a ShellCommand runs. This class polls the file every two
1525         seconds, and sends back 10k chunks to the buildmaster.
1526         (ShellCommand): rename stdin= to initialStdin=, and add
1527         keepStdinOpen= and logfiles= to arguments. Set up LogFileWatchers
1528         at startup.
1529         (ShellCommand.addLogfile): LogFile text is sent in updates with a
1530         key of "log" and a value of (logname, data).
1531         (SlaveShellCommand): add 'initial_stdin', 'keep_stdin_open', and
1532         'logfiles' to the master-visible args dictionary.
1533         (SourceBase.doPatch): match s/stdin/initialStdin/ change
1534         (CVS.start): same
1535         (P4.doVCFull): same
1536         * buildbot/test/test_vc.py (Patch.testPatch): same
1539         * buildbot/test/emit.py: write to a logfile in the current
1540         directory. We use this to figure out what was used as a basedir
1541         rather than looking to see which copy of emit.py gets run, so that
1542         we can run the commands from inside _trial_temp rather than inside
1543         buildbot/test
1544         * buildbot/test/subdir/emit.py: same
1545         * buildbot/test/runutils.py (FakeSlaveBuilder): take a 'basedir'
1546         argument rather than running from buildbot/test/
1547         (SlaveCommandTestBase.setUpBuilder): explicitly set up the Builder
1548         rather than using an implicit setUp()
1549         * buildbot/test/test_slavecommand.py (ShellBase.setUp): same
1550         (ShellBase.testShell1, etc): use explicit path to emit.py instead
1551         of assuming that we're running in buildbot/test/ (and that '.' is
1552         on our $PATH)
1554         * buildbot/slave/commands.py (Command.doStart): refactor Command
1555         startup/completion a bit: now the SlaveBuilder calls doStart(),
1556         which is not meant for overridding by subclasses, and doStart()
1557         calls start(), which is. Likewise the SlaveBuilder calls
1558         doInterrupt(), and subclasses override interrupt(). This also puts
1559         responsibility for maintaining .running in Command rather than in
1560         SlaveBuilder.
1561         (Command.doInterrupt): same
1562         (Command.commandComplete): same, this is called when the deferred
1563         returned by start() completes.
1564         * buildbot/slave/bot.py (SlaveBuilder.remote_startCommand): same
1565         (SlaveBuilder.remote_interruptCommand): same
1566         (SlaveBuilder.stopCommand): same
1568 2006-06-16  Brian Warner  <warner@lothar.com>
1570         * buildbot/test/test_shell.py: new test file to contain everything
1571         relating to ShellCommand
1572         (SlaveSide.testLogFiles): (todo) test for the upcoming "watch
1573         multiple logfiles in realtime" feature, not yet implemented
1574         * buildbot/test/emitlogs.py: support file for testLogFiles
1575         * docs/buildbot.texinfo (ShellCommand): document the feature
1577         * buildbot/test/test_steps.py (BuildStep.setUp): rmtree refactoring
1579         * buildbot/test/runutils.py (SlaveCommandTestBase): utility class
1580         for tests which exercise SlaveCommands in isolation.
1582         * buildbot/test/test_slavecommand.py: Move some utilities like
1583         SignalMixin and FakeSlaveBuilder from here ..
1584         * buildbot/test/runutils.py: .. to here, so they can be used by
1585         other test classes too
1586         * buildbot/test/test_vc.py: more SignalMixin refactoring
1587         * buildbot/test/test_control.py: same
1588         * buildbot/test/test_run.py: and some rmtree refactoring
1590 2006-06-15  Brian Warner  <warner@lothar.com>
1592         * buildbot/test/test_vc.py (P4.testCheckoutBranch): rename from
1593         'testBranch' to match other VC tests and have the tests run in
1594         roughly increasing order of dependency
1596         * buildbot/test/test_steps.py (LogObserver): new test to verify
1597         LogObservers can be created at various times and still get
1598         connected up properly
1600         * buildbot/test/runutils.py (setupBuildStepStatus): utility method
1601         to create BuildStepStatus instances that actually work.
1603         * buildbot/process/step.py (LogObserver): add outReceived and
1604         errReceived base methods, to be overridden
1606         * buildbot/status/builder.py (BuildStatus.addStepWithName): change
1607         API to take a name instead of a step, reducing the coupling
1608         somewhat. This returns the BuildStepStatus object so it can be
1609         passed to the new Step, instead of jamming it directly into the
1610         Step.
1611         * buildbot/process/step.py (BuildStep.setStepStatus): add a setter
1612         method
1613         * buildbot/process/base.py (Build.setupBuild): use both methods
1614         * buildbot/test/test_web.py (Logfile.setUp): rearrange the setup
1615         process a bit to match
1617 2006-06-14  Brian Warner  <warner@lothar.com>
1619         * docs/buildbot.texinfo (Adding LogObservers): add some limited
1620         docs on writing new LogObserver classes
1621         (Writing New Status Plugins): brief docs on how Status Plugins fit
1622         together
1624         * buildbot/process/step_twisted.py (TrialTestCaseCounter):
1625         implement a LogObserver that counts how many unit tests have been
1626         run so far
1627         (Trial.__init__): wire it in
1628         * buildbot/test/test_twisted.py (Counter): unit test for it
1630         * buildbot/process/step_twisted.py (HLint.commandComplete): update
1631         to new cmd.logs['stdio'] scheme
1632         (Trial.commandComplete): same
1633         (BuildDebs.commandComplete): same
1635         * buildbot/process/step.py (LoggedRemoteCommand): use a dict of
1636         LogFiles, instead of just a single one. The old single logfile is
1637         now called "stdio". LoggedRemoteCommand no longer creates a
1638         LogFile for you (the code to do that was broken anyway). If you
1639         don't create a "stdio" LogFile, then stdout/stderr will be
1640         discarded.
1641         (LogObserver): implement "LogObservers", which a BuildStep can add
1642         to parse the output of a command in real-time. The primary use is
1643         to provide more useful information to the Progress code, allowing
1644         better ETA estimates.
1645         (LogLineObserver): utility subclass which feeds complete lines to
1646         the parser instead of bytes.
1647         (BuildStep.progressMetrics): this is safer as a tuple
1648         (BuildStep.setProgress): utility method, meant to be called by
1649         LogObservers
1650         (BuildStep.addLogObserver): new method, to be called at any time
1651         during the BuildStep (even before any LogFiles have been created),
1652         to attach (or schedule for eventual attachment) a LogObserver to a
1653         LogFile.
1654         (StdioProgressObserver): new LogObserver which replaces the old
1655         "output" progress gatherer
1656         (LoggingBuildStep.__init__): same
1657         (LoggingBuildStep.startCommand): set up the "stdio" LogFile
1658         (LoggingBuildStep._commandComplete): must use logs['stdio']
1659         instead of the old single ".log" attribute.
1660         * buildbot/status/builder.py (LogFile): remove old logProgressTo
1661         functionality, now subsumed into StdioProgressObserver
1662         * buildbot/test/test_status.py (Subscription._testSlave_2): the
1663         log name changed from "output" to "stdio".
1666         * buildbot/interfaces.py (ILogFile): add the Interface used from
1667         the BuildStep towards the LogFile
1668         (ILogObserver): and the one provided by a LogObserver
1669         * buildbot/status/builder.py (LogFile): implement it
1671         * buildbot/interfaces.py (LOG_CHANNEL_*): move STDOUT / STDERR /
1672         HEADER constants here ..
1673         * buildbot/status/builder.py (STDOUT): .. from here
1675 2006-06-13  Brian Warner  <warner@lothar.com>
1677         * buildbot/test/test_p4poller.py (TestP4Poller.failUnlessIn): fix
1678         compatibility with python2.2, which doesn't have the 'substr in
1679         str' feature.
1680         (TestP4Poller.makeTime): utility function to construct the
1681         timestamp using the same strptime() approach as p4poller does. It
1682         turns out that time.mktime() behaves slightly differently under
1683         python2.2, probably something to do with the DST flag, and that
1684         causes the test to fail under python2.2. (changing the mktime()
1685         arguments to have dst=0 instead of -1 caused it to fail under
1686         python2.3. Go figure.)
1687         (TestP4Poller._testCheck3): use our makeTime() instead of mktime()
1689 2006-06-12  Brian Warner  <warner@lothar.com>
1691         * buildbot/process/step.py (P4): merge in patch SF#1473939, adding
1692         proper Perforce (P4) support. Many many thanks to Scott Lamb for
1693         contributing such an excellent patch, including docs and unit
1694         tests! This makes it *so* much easier to apply. I had to update
1695         test_vc.py to handle some recent refactorings, but everything else
1696         applied smoothly. The only remaining thing I'd like to fix would
1697         be to remove the hard-wired port 1666 used by p4d, and allow it to
1698         claim any unused port. This would allow two copies of the test
1699         suite to run on the same host at the same time, as well as
1700         allowing the test suite to run while a real (production) p4d was
1701         running on the same host. Oh, and maybe we should add a warning to
1702         step.P4 that gets emitted if the slave is too old to provide the
1703         'p4' SlaveCommand. Otherwise it looks great. (closes: SF#1473939).
1704         * buildbot/slave/commands.py (P4): same
1705         (P4Sync): same, some minor updates
1706         * buildbot/changes/p4poller.py: same
1707         * docs/buildbot.texinfo: same
1708         * buildbot/test/test_p4poller.py: same
1709         * buildbot/test/test_vc.py (P4): same
1711         * setup.py: add Trove classifiers for PyPI
1713 2006-06-08  Brian Warner  <warner@allmydata.com>
1715         * buildbot/status/client.py
1716         (RemoteBuilder.remote_getCurrentBuilds): oops, I screwed up when
1717         changing this from getCurrentBuild() to getCurrentBuilds(). Each
1718         build needs to be IRemote'd separately, rather than IRemote'ing
1719         the whole list at once. I can't wait until newpb's serialization
1720         adapters make this unnecessary.
1722 2006-06-06  Brian Warner  <warner@lothar.com>
1724         * buildbot/process/step.py (WithProperties): make this inherit
1725         from ComparableMixin, so that reloading an unchanged config file
1726         doesn't cause us to spuriously reload any Builders which use them.
1727         * buildbot/test/test_config.py (ConfigTest.testWithProperties):
1728         add a test for it
1730 2006-06-03  Brian Warner  <warner@lothar.com>
1732         * contrib/windows/{setup.py, buildbot_service.py}: add support for
1733         running py2exe on windows, contributed by Mark Hammond. Addresses
1734         SF#1401121, but I think we still need to include
1735         buildbot/scripts/sample.cfg
1736         * setup.py: include buildbot_service.py as a script under windows
1737         * buildbot/status/html.py: when sys.frozen (i.e. we're running in
1738         a py2exe application), get the icon/css datafiles from a different
1739         place than usual.
1741         * buildbot/status/mail.py (MailNotifier.buildMessage): don't
1742         double-escape the build URL. Thanks to Olivier Bonnet for the
1743         patch. Fixes SF#1452801.
1745 2006-06-02  Brian Warner  <warner@lothar.com>
1747         * contrib/svn_buildbot.py (ChangeSender.getChanges): ignore the
1748         first six columns of 'svnlook' output, not just the first column,
1749         since property changes appear in the other five. Thanks to Olivier
1750         Bonnet for the patch. Fixes SF#1398174.
1752 2006-06-01  Brian Warner  <warner@lothar.com>
1754         * buildbot/test/test_web.py (Logfile.setUp): set the .reason on
1755         the fake build, so that title= has something to be set to
1757         * buildbot/status/html.py (BuildBox.getBox): set the 'title='
1758         attribute of the "Build #NN" link in the yellow start-the-build
1759         box to the build's reason. This means that you get a little
1760         tooltip explaining why the build was done when you hover over the
1761         yellow box. Thanks to Zandr Milewski for the suggestion.
1763         * buildbot/clients/gtkPanes.py (Box.setColor): ignore color=None
1764         (Box.setETA): handle ETA=None (by stopping the timer)
1765         (Box.update): make the [soon] text less different than the usual
1766         text, so the rest of the text doesn't flop around so much. It
1767         would be awfully nice to figure out how to center this stuff.
1768         (ThreeRowBuilder.stepETAUpdate): more debugging printouts
1770         * buildbot/process/step.py (ShellCommand): set flunkOnFailure=True
1771         by default, so that any ShellCommand which fails marks the overall
1772         build as a failure. I should have done this from the beginning.
1773         Add flunkOnFailure=False to the arguments if you want to turn off
1774         this behavior.
1776 2006-05-30  Brian Warner  <warner@lothar.com>
1778         * buildbot/clients/gtkPanes.py: add a third row: now it shows
1779         last-build/current-build/current-step. Show what step is currently
1780         running. Show ETA for both the overall build and the current step.
1781         Update GTK calls to modern non-deprecated forms. There's still a
1782         lot of dead code and debug noise to remove.
1784         * buildbot/process/step_twisted.py (Trial): set the step name, so it
1785         shows up properly in status displays
1787 2006-05-28  Brian Warner  <warner@lothar.com>
1789         * buildbot/test/test_properties.py (Run.testInterpolate): on the
1790         build we use to verify that WithProperties works:
1792         ** set flunkOnFailure=True so that build failures get noticed
1793         ** set workdir='.' so that the build succeeds, otherwise it is trying
1794             to touch 'build/something', and 'build/' doesn't exist because
1795             usually that's created by a Source step
1796         ** set timeout=10, because Twisted-1.3.0 has a race condition that
1797             this test somehow triggers, in which the 'touch' process becomes
1798             a zombie and we wait for th etimeout before giving up on it.
1800         * buildbot/test/runutils.py (RunMixin.logBuildResults): utility method
1801         to log the Build results and step logs to the twisted log.
1802         (RunMixin.failUnlessBuildSucceeded): use logBuildResults to record
1803         what went wrong if a build was expected to succeed but didn't.
1805         * buildbot/process/step_twisted.py (Trial): set the default
1806         trialMode to '--reporter=bwverbose', which specifies verbose
1807         black-and-white text. Back in twisted-1.3/2.0 days we had to use
1808         '-to', but those are completely missing in modern Twisteds.
1810         * buildbot/scripts/sample.cfg: make the sample Manhole config use
1811         a localhost-only port, to encourage better security
1813         * docs/buildbot.texinfo (Change Sources): mention
1814         darcs_buildbot.py
1816         * .darcs-boring: add a Darcs boringfile
1818         * README (REQUIREMENTS): stop claiming compatibility with
1819         Twisted-1.3.0
1821         * contrib/darcs_buildbot.py: write a darcs-commit-hook change
1822         sender
1824 2006-05-27  Brian Warner  <warner@lothar.com>
1826         * buildbot/__init__.py: bump to 0.7.3+ while between releases
1827         * docs/buildbot.texinfo: same
1829 2006-05-23  Brian Warner  <warner@lothar.com>
1831         * buildbot/__init__.py (version): Releasing buildbot-0.7.3
1832         * docs/buildbot.texinfo: set version to match
1833         * NEWS: update for 0.7.3
1835         * docs/buildbot.texinfo (Change Sources): mention hg_buildbot.py,
1836         give a quick mapping from VC system to possible ChangeSources
1837         (Build Properties): add 'buildername'
1839         * buildbot/process/base.py (Build.setupStatus): oops, set
1840         'buildername' and 'buildnumber' properties
1841         * buildbot/test/test_properties.py (Interpolate.testBuildNumber):
1842         test them
1844 2006-05-22  Brian Warner  <warner@lothar.com>
1846         * docs/buildbot.texinfo (Build Properties): explain the syntax of
1847         property interpolation better
1849         * README (INSTALLATION): remove old '-v' argument from recommended
1850         trial command line
1852         * docs/buildbot.texinfo (ShellCommand): add docs for description=
1853         and descriptionDone= arguments. Thanks to Niklaus Giger for the
1854         patch. SF#1475494.
1856         * buildbot/slave/commands.py (SVN.parseGotRevision._parse): use
1857         'svnversion' instead of grepping the output of 'svn info', much
1858         simpler and avoids CR/LF problems on windows. Thanks to Olivier
1859         Bonnet for the suggestion.
1860         (SVN.parseGotRevision): oops, older verisons of 'svnversion'
1861         require the WC_PATH argument, so run 'svnversion .' instead.
1863         * buildbot/interfaces.py (IChangeSource): methods in Interfaces
1864         aren't supposed to have 'self' in their argument list
1866 2006-05-21  Brian Warner  <warner@lothar.com>
1868         * buildbot/process/step.py (ShellCommand.start): make
1869         testInterpolate pass. I was passing the uninterpolated command to
1870         the RemoteShellCommand constructor
1871         (ShellCommand._interpolateProperties): oops, handle non-list
1872         commands (i.e. strings with multiple words separated by spaces in
1873         them) properly, instead of forgetting about them.
1875         * buildbot/test/test_properties.py (Run.testInterpolate): new test
1876         to actually try to use build properties in a real build. This test
1877         fails.
1878         * buildbot/test/runutils.py (RunMixin.requestBuild): utility methods
1879         to start and evaluate builds
1881         * buildbot/test/test__versions.py: add a pseudo-test to record
1882         what version of Twisted/Python/Buildbot are running. This should
1883         show up at the beginning of _trial_tmp/test.log, and exists to help
1884         debug other problems.
1886         * buildbot/status/html.py (Waterfall): add 'robots_txt=' argument,
1887         a filename to be served as 'robots.txt' to discourage web spiders.
1888         Adapted from a patch by Tobi Vollebregt, thanks!
1889         * buildbot/test/test_web.py (Waterfall._test_waterfall_5): test it
1890         (Waterfall.test_waterfall): tweak the way that filenames are put
1891         into the config file, to accomodate windows pathnames better.
1893         * docs/buildbot.texinfo (HTML Waterfall): document it
1895         * buildbot/process/process_twisted.py
1896         (QuickTwistedBuildFactory.__init__): recent versions of Twisted
1897         changed the build process. The new setup.py no longer takes the
1898         'all' argument.
1899         (FullTwistedBuildFactory.__init__): same
1900         (TwistedReactorsBuildFactory.__init__): same
1902         * contrib/hg_buildbot.py: wrote a commit script for mercurial, to
1903         be placed in the [hooks] section of the central repository (the
1904         one that everybody pushes changes to).
1906 2006-05-20  Brian Warner  <warner@lothar.com>
1908         * buildbot/slave/commands.py (Darcs.doVCFull): when writing the
1909         .darcs-context file, use binary mode. I think this was causing a
1910         Darcs failure under windows.
1912 2006-05-19  Brian Warner  <warner@lothar.com>
1914         * buildbot/scripts/tryclient.py (CVSExtractor.getBaseRevision):
1915         use a timezone string of +0000 and gmtime, since this timestamp is
1916         sent to a buildmaster and %z is broken.
1918         * buildbot/test/test_vc.py (CVSHelper.getdate): use no timezone
1919         string and localtime, since this timestamp will only be consumed
1920         locally, and %z is broken.
1922         * buildbot/slave/commands.py (CVS.parseGotRevision): use +0000 and
1923         gmtime, since this timestamp is returned to the buildmaster, and
1924         %z is broken.
1926 2006-05-18  Brian Warner  <warner@lothar.com>
1928         * NEWS: update in preparation for next release
1930         * buildbot/test/test_vc.py (VCS_Helper): factor out all the
1931         setup-repository and do-we-have-the-vc-tools code into a separate
1932         "helper" class, which sticks around in a single module-level
1933         object. This seems more likely to continue to work in the future
1934         than having it hide in the TestCase and hope that TestCases stick
1935         around for a long time.
1937         * buildbot/test/test_vc.py (MercurialSupport.vc_create): 'hg
1938         addremove' has been deprecated in recent versions of mercurial, so
1939         use 'hg add' instead
1941 2006-05-07  Brian Warner  <warner@lothar.com>
1943         * buildbot/scheduler.py (Try_Jobdir.messageReceived): when
1944         operating under windows, move the file before opening it, since
1945         you can't rename a file that somebody has open.
1947         * buildbot/process/base.py (Build.setupBuild): if something goes
1948         wrong while creating a Step, log the name and arguments, since the
1949         error message when you get the number of arguments wrong is really
1950         opaque.
1952 2006-05-06  Brian Warner  <warner@lothar.com>
1954         * buildbot/process/step_twisted.py (Trial.setupEnvironment): more
1955         bugs in twisted-specific code not covered by my unit tests, this
1956         time use 'cmd' argument instead of self.cmd
1958         * buildbot/process/process_twisted.py (TwistedBuild.isFileImportant):
1959         fix stupid braino: either use startwith or find()==0, not both.
1960         (TwistedReactorsBuildFactory.__init__): another dumb typo
1962         * buildbot/test/test_slavecommand.py (ShellBase.testInterrupt1): 
1963         mark this test as TODO under windows, since process-killing seems
1964         dodgy there. We'll come back to this later and try to fix it
1965         properly.
1967         * buildbot/test/test_vc.py (CVSSupport.getdate): use localtime,
1968         and don't include a timezone
1969         (CVSSupport.vc_try_checkout): stop trying to strip the timezone.
1970         This should avoid the windows-with-verbose-timezone-name problem
1971         altogether.
1972         (Patch.testPatch): add a test which runs 'patch' with less
1973         overhead than the full VCBase.do_patch sequence, to try to isolate
1974         a windows test failure. This one uses slave.commands.ShellCommand
1975         and 'patch', but none of the VC code.
1977         * buildbot/slave/commands.py (getCommand): use which() to find the
1978         executables for 'cvs', 'svn', etc. This ought to help under
1979         windows.
1981         * buildbot/test/test_vc.py (VCBase.do_getpatch): Delete the
1982         working directory before starting. If an earlier test failed, the
1983         leftover directory would mistakenly flunk a later test.
1984         (ArchCommon.registerRepository): fix some tla-vs-baz problems.
1985         Make sure that we use the right commandlines if which("tla") picks
1986         up "tla.exe" (as it does under windows).
1987         (TlaSupport.do_get): factor out this tla-vs-baz difference
1988         (TlaSupport.vc_create): more tla-vs-baz differences
1990         * buildbot/test/test_slavecommand.py
1991         (ShellBase.testShellMissingCommand): stop trying to assert
1992         anything about the error message: different shells on different
1993         OSes with different languages makes it hard, and it really isn't
1994         that interesting of a thing to test anyway.
1996         * buildbot/test/test_vc.py (CVSSupport.capable): skip CVS tests if
1997         we detect cvs-1.10 (which is the version shipped with OS-X 10.3
1998         "Panther"), because it has a bug which flunks a couple tests in
1999         weird ways. I've checked that cvs-1.12.9 (as shipped with debian)
2000         is ok. OS-X 10.4 "Tiger" ships with cvs-1.11, but I haven't been
2001         able to test that yet.
2003 2006-04-30  Brian Warner  <warner@lothar.com>
2005         * buildbot/test/test_vc.py (VCBase.runCommand): set $LC_ALL="C" to
2006         make sure child commands emit messages in english, so our regexps
2007         will match. Thanks to Nikaus Giger for identifying the problems.
2008         (VCBase._do_vctest_export_1): mode="export" is not responsible
2009         for setting the "got_revision" property, since in many cases it is
2010         not convenient to determine.
2011         (SVNSupport.capable): when running 'svn --version' to check for
2012         ra_local, we want error messages in english
2013         * buildbot/test/test_slavecommand.py 
2014         (ShellBase.testShellMissingCommand): set $LC_ALL="C" to get bash
2015         to emit the error message in english
2017         * buildbot/slave/commands.py (SourceBase.setup): stash a copy of
2018         the environment with $LC_ALL="C" so that Commands which need to
2019         parse the output of their child processes can obtain it in
2020         english.
2021         (SVN.parseGotRevision): call "svn info" afterwards instead of
2022         watching the output of the "svn update" or "svn checkout".
2023         (Darcs.parseGotRevision): use $LC_ALL="C" when running the command
2024         (Arch.parseGotRevision): same
2025         (Bazaar.parseGotRevision): same
2026         (Mercurial.parseGotRevision): same
2028         * buildbot/scripts/tryclient.py (SourceStampExtractor.dovc): set
2029         $LC_ALL="C" when running commands under 'buildbot try', too
2031         * buildbot/test/__init__.py: remove the global os.environ()
2032         setting, instead we do it just for the tests that run commands and
2033         need to parse their output.
2035         * buildbot/test/test_scheduler.py (Scheduling.testTryJobdir):
2036         remove the overly-short .timeout on this test, because non-DNotify
2037         platforms must fall back to polling which happens at 10 second
2038         intervals, so a 5 second timeout would never succeed.
2040 2006-04-24  Brian Warner  <warner@lothar.com>
2042         * docs/buildbot.texinfo (Installing the code): update trial
2043         invocation, SF#1469116 by Niklaus Giger.
2044         (Attributes of Changes): updated branch-name examples to be
2045         a bit more realistic, SF#1475240 by Stephen Davis.
2047         * contrib/windows/buildbot2.bat: utility wrapper for windows
2048         developers, contributed by Nick Trout (after a year of neglect..
2049         sorry!). SF#1194231.
2051         * buildbot/test/test_vc.py (*.capable): store the actual VC
2052         binary's pathname in VCS[vcname], so it can be retrieved later
2053         (CVSSupport.vc_try_checkout): incorporate Niklaus Giger's patch to
2054         strip out non-numeric timezone information, specifically the funky
2055         German string that his system produced that confuses CVS.
2056         (DarcsSupport.vc_create): use dovc() instead of vc(), this should
2057         allow Darcs tests to work on windows
2058         * buildbot/scripts/tryclient.py (SourceStampExtractor): use
2059         procutils.which() everywhere, to allow tryclient to work under
2060         windows. Also from Niklaus Giger, SF#1463394.
2062         * buildbot/twcompat.py (which): move the replacement for a missing
2063         twisted.python.procutils.which from test_vc.py to here, so it can
2064         be used in other places too (specifically tryclient.py)
2066 2006-04-23  Brian Warner  <warner@lothar.com>
2068         * buildbot/status/html.py (StatusResourceBuild.body): replace the
2069         bare buildbotURL/projectName line with a proper DIV, along with a
2070         CSS class of "title", from Stefan Seefeld (SF#1461675).
2071         (WaterfallStatusResource.body0): remove the redundant 'table'
2072         class from the table
2073         (WaterfallStatusResource.body): same. Also add class="LastBuild"
2074         to the top-row TR, and class="Activity" to the second-row TR,
2075         rather than putting them in the individual TD nodes.
2077         * buildbot/test/test_vc.py (VCBase.checkGotRevision): test
2078         'got_revision' build property for all VC systems that implement
2079         accurate ones: SVN, Darcs, Arch, Bazaar, Mercurial.
2081         * buildbot/slave/commands.py (SourceBase._handleGotRevision): try
2082         to determine which revision we actually obtained
2083         (CVS.parseGotRevision): implement this for CVS, which just means
2084         to grab a timestamp. Not ideal, and it depends upon the buildslave
2085         having a clock that is reasonably well syncronized with the server,
2086         but it's better than nothing.
2087         (SVN.parseGotRevision): implement it for SVN, which is accurate
2088         (Darcs.parseGotRevision): same
2089         (Arch.parseGotRevision): same
2090         (Bazaar.parseGotRevision): same
2091         (Mercurial.parseGotRevision): same
2093         * buildbot/process/step.py (LoggedRemoteCommand.remoteUpdate):
2094         keep a record of all non-stdout/stderr/header/rc status updates,
2095         for the benefit of RemoteCommands that send other useful things,
2096         like got_revision
2097         (Source.commandComplete): put any 'got_revision' status values
2098         into a build property of the same name
2101         * buildbot/process/step_twisted.py (Trial): update to deal with
2102         new ShellCommand refactoring
2104         * docs/buildbot.texinfo (Build Properties): document new feature
2105         that allows BuildSteps to get/set Build-wide properties like which
2106         revision was requested and/or checked out.
2108         * buildbot/interfaces.py (IBuildStatus.getProperty): new method
2109         * buildbot/status/builder.py (BuildStatus.getProperty): implement
2110         it. Note that this bumps the persistenceVersion of the saved Build
2111         object, so add the necessary upgrade-old-version logic to include
2112         an empty properties dict.
2114         * buildbot/process/base.py (Build.setProperty): implement it
2115         (Build.getProperty): same
2116         (Build.startBuild): change build startup to set 'branch',
2117         'revision', and 'slavename' properties at the right time
2119         * buildbot/process/step.py (BuildStep.__init__): change setup to
2120         require 'build' argument in a better way
2121         (LoggingBuildStep): split ShellCommand into two pieces, for better
2122         subclassing elsewhere. LoggingBuildStep is a BuildStep which runs
2123         a single RemoteCommand that sends stdout/stderr status text. It
2124         also provides the usual commandComplete / createSummary /
2125         evaluateCommand / getText methods to be overridden...
2126         (ShellCommand): .. whereas ShellCommand is specifically for
2127         running RemoteShellCommands. Other shell-like BuildSteps (like
2128         Source) can inherit from LoggingBuildStep instead of ShellCommand
2129         (WithProperties): marker class to do build-property interpolation
2130         (Source): inherit from LoggingBuildStep instead of ShellCommand
2131         (RemoteDummy): same
2133         * buildbot/test/test_properties.py: test new functionality
2135 2006-04-21  Brian Warner  <warner@lothar.com>
2137         * buildbot/test/test_vc.py: rename testBranch to
2138         testCheckoutBranch to keep the tests in about the right
2139         alphabetical order
2141 2006-04-18  Brian Warner  <warner@lothar.com>
2143         * docs/buildbot.texinfo (PBListener): improve cross-references
2144         between PBListener and 'buildbot statusgui', thanks to John Pye
2145         for the suggestion.
2147 2006-04-17  Brian Warner  <warner@lothar.com>
2149         * buildbot/twcompat.py (maybeWait): handle SkipTest properly when
2150         running under Twisted-1.3.0, otherwise skipped tests are reported
2151         as errors.
2153         * all: use isinstance() instead of 'type(x) is foo', suggested by
2154         Neal Norwitz
2156         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
2157         oops, fix a brain-fade from the other week, when making the
2158         addStep changes. I changed all the __init__ upcalls to use the
2159         wrong superclass name.
2160         (FullTwistedBuildFactory.__init__): same
2161         (TwistedDebsBuildFactory.__init__): same
2162         (TwistedReactorsBuildFactory.__init__): same
2163         (TwistedBuild.isFileImportant): use .startswith for clarity,
2164         thanks to Neal Norwitz for the suggestions.
2166         * contrib/viewcvspoll.py: script to poll a viewcvs database for
2167         changes, then deliver them over PB to a remote buildmaster.
2169         * contrib/svnpoller.py: added script by John Pye to poll a remote
2170         SVN repository (by running 'svn log') from a cronjob, and run
2171         'buildbot sendchange' to deliver the changes to a remote
2172         buildmaster.
2173         * contrib/svn_watcher.py: added script by Niklaus Giger (a
2174         modification of svnpoller.py), same purpose, but this one loops
2175         internally (rather than expecting to run from a cronjob) and works
2176         under windows.
2177         * contrib/README.txt: same
2179 2006-04-11  Brian Warner  <warner@lothar.com>
2181         * all: fix a number of incorrect names and missing imports, thanks
2182         to Anthony Baxter for the patch.
2183         * buildbot/status/html.py (WaterfallStatusResource.statusToHTML): 
2184         remove unused buggy method.
2185         * buildbot/status/builder.py (BuildStatus.saveYourself): rmtree
2186         comes from shutil, not "shutils"
2187         * buildbot/process/step.py (TreeSize.evaluateCommand): fix bad name
2188         (Arch.checkSlaveVersion): same
2189         * buildbot/process/step_twisted.py (Trial.commandComplete): same, in
2190         some disabled code
2191         * buildbot/process/step_twisted2.py: add some missing imports
2192         * buildbot/twcompat.py (_deferGenerator): fix cut-and-paste error,
2193         this code used to live in twisted.internet.defer
2195 2006-04-10  Brian Warner  <warner@lothar.com>
2197         * buildbot/process/step.py (Mercurial): add Mercurial support
2198         * buildbot/slave/commands.py (Mercurial): same
2199         * buildbot/scripts/tryclient.py (MercurialExtractor): same
2200         * buildbot/test/test_vc.py (Mercurial): same, checkout over HTTP is
2201         not yet tested, but 'try' support *is* covered
2202         * docs/buildbot.texinfo (Mercurial): document it
2204         * buildbot/process/step.py (LoggedRemoteCommand.remoteUpdate): add
2205         some debugging messages (turned off)
2206         * buildbot/test/test_vc.py: improve debug messages
2208 2006-04-07  Brian Warner  <warner@lothar.com>
2210         * buildbot/test/test_vc.py (which): define our own which() in case
2211         we can't import twisted.python.procutils, because procutils doesn't
2212         exist in Twisted-1.3
2214         * docs/buildbot.texinfo (Interlocks): fix some typos, mention use
2215         of SlaveLocks for performance tests
2217         * docs/examples/twisted_master.cfg: update to match current usage
2219         * buildbot/changes/p4poller.py (P4Source): add new arguments:
2220         password, p4 binary, pollinterval, maximum history to check.
2221         Patch from an anonymous sf.net contributor, SF#1219384.
2222         * buildbot/process/step.py (P4Sync.__init__): add username,
2223         password, and client arguments.
2224         * buildbot/slave/commands.py (P4Sync): same
2226 2006-04-05  Brian Warner  <warner@lothar.com>
2228         * buildbot/process/factory.py (BuildFactory.addStep): new method
2229         to add steps to a BuildFactory. Use it instead of f.steps.append,
2230         and you can probably avoid using the s() convenience function.
2231         Patch from Neal Norwitz, sf.net #1412605.
2232         (other): update all factories to use addStep
2233         * buildbot/process/process_twisted.py: update all factories to use
2234         addStep.
2236 2006-04-03  Brian Warner  <warner@lothar.com>
2238         * buildbot/test/test_vc.py: modified find-the-VC-command logic to
2239         work under windows too. Adapted from a patch by Niklaus Giger,
2240         addresses SF#1463399.
2242         * buildbot/test/__init__.py: set $LANG to 'C', to insure that
2243         spawned commands emit parseable results in english and not some
2244         other language. Patch from Niklaus Giger, SF#1463395.
2246         * README (INSTALLATION): discourage users from running unit tests on
2247         a "network drive", patch from Niklaus Giger, SF#1463394.
2249 2006-03-22  Brian Warner  <warner@lothar.com>
2251         * contrib/svn_buildbot.py: rearrange, add an easy-to-change
2252         function to turn a repository-relative pathname into a (branch,
2253         branch-relative-filename) tuple. Change this function to handle
2254         the branch naming policy used by your Subversion repository.
2255         Thanks to AllMyData.com for sponsoring this work.
2257 2006-03-16  Brian Warner  <warner@lothar.com>
2259         * buildbot/scripts/sample.cfg: add python-mode declaration for
2260         vim. Thanks to John Pye for the patch.
2262         * docs/buildbot.texinfo (Launching the daemons): fix @reboot job
2263         command line, mention the importance of running 'crontab' as the
2264         buildmaster/buildslave user. Thanks to John Pye for the catch.
2266 2006-03-13  Brian Warner  <warner@lothar.com>
2268         * buildbot/status/words.py (IRC): add an optional password=
2269         argument, which will be sent to Nickserv in an IDENTIFY message at
2270         login, to claim the nickname. freenode requires this before the
2271         bot can sent (or reply to) private messages. Thanks to Clement
2272         Stenac for the patch.
2273         * docs/buildbot.texinfo (IRC Bot): document it
2275         * buildbot/status/builder.py (LogFile.merge): don't write chunks
2276         larger than chunkSize. Fixes SF#1349253.
2277         * buildbot/test/test_status.py (Log.testLargeSummary): test it
2278         (Log.testConsumer): update to match new internal chunking behavior
2280 2006-03-12  Brian Warner  <warner@lothar.com>
2282         * buildbot/test/test_vc.py: remove the last use of waitForDeferred
2284         * buildbot/test/test_maildir.py (MaildirTest): rename the
2285         'timeout' method, as it collides with trial's internals
2287         * buildbot/scripts/runner.py: add 'buildbot restart' command
2288         (stop): don't sys.exit() out of here, otherwise restart can't work
2289         * docs/buildbot.texinfo (Shutdown): document it
2291         * buildbot/buildset.py (BuildSet.__init__): clean up docstring
2292         * buildbot/status/html.py (Waterfall.__init__): same
2293         * buildbot/process/builder.py (Builder.startBuild): same
2294         * buildbot/process/base.py (BuildRequest): same
2295         * buildbot/sourcestamp.py (SourceStamp): same
2296         * buildbot/scheduler.py (Nightly): same
2298         * buildbot/__init__.py (version): bump to 0.7.2+ while between
2299         releases
2300         * docs/buildbot.texinfo: same
2302 2006-02-17  Brian Warner  <warner@lothar.com>
2304         * buildbot/__init__.py (version): Releasing buildbot-0.7.2
2305         * docs/buildbot.texinfo: set version number to match
2306         * NEWS: update for 0.7.2
2308 2006-02-16  Brian Warner  <warner@lothar.com>
2310         * docs/buildbot.texinfo (Build Dependencies): add cindex tag
2312 2006-02-09  Brian Warner  <warner@lothar.com>
2314         * docs/buildbot.texinfo (How Different VC Systems Specify Sources):
2315         add text to explain per-build branch parameters
2316         * NEWS: mention --umask
2318 2006-02-08  Brian Warner  <warner@lothar.com>
2320         * buildbot/scripts/runner.py (Maker.makeSlaveTAC): remove unused
2321         method
2322         (SlaveOptions.optParameters): add --umask, to make it possible to
2323         make buildslave-generated files (including build products) be
2324         world-readable
2325         (slaveTAC): same
2326         * buildbot/slave/bot.py (BuildSlave.startService): same
2328 2006-01-23  Brian Warner  <warner@lothar.com>
2330         * buildbot/status/builder.py: urllib.quote() all URLs that include
2331         Builder names, so that builders can include characters like '/'
2332         and ' ' without completely breaking the resulting HTML. Thanks to
2333         Kevin Turner for the patch.
2334         * buildbot/status/html.py: same
2335         * buildbot/test/test_web.py (GetURL.testBuild): match changes
2337         * NEWS: update in preparation for upcoming release
2339 2006-01-18  Brian Warner  <warner@lothar.com>
2341         * docs/examples/twisted_master.cfg: update to match the Twisted
2342         buildbot: remove python2.2, switch to exarkun's buildslaves,
2343         disable the .deb builder until we figure out how to build twisted
2344         .debs from SVN, add some ktrace debugging to the OS-X build
2345         process and remove the qt build, remove threadless builders,
2346         change freebsd builder to use landonf's buildslave.
2348 2006-01-12  Brian Warner  <warner@lothar.com>
2350         * buildbot/master.py (Manhole.__init__): let port= be a strports
2351         specification string, but handle a regular int for backwards
2352         compatibility. This allows "tcp:12345:interface=127.0.0.1" to be
2353         used in master.cfg to limit connections to just the local host.
2354         (BuildMaster.loadConfig): same for c['slavePortnum']
2355         * buildbot/scheduler.py (Try_Userpass.__init__): same
2356         * buildbot/status/client.py (PBListener.__init__): same
2357         * buildbot/status/html.py (Waterfall.__init__): same, for both
2358         http_port and distrib_port. Include backwards-compatibility checks
2359         so distrib_port can be a filename string and still mean unix:/foo
2360         * docs/buildbot.texinfo (Setting the slaveport): document it
2361         (Debug options): same
2362         (HTML Waterfall): same
2363         (PBListener): same
2364         (try): same
2365         * buildbot/test/test_config.py (ConfigTest): test it
2367         * buildbot/master.py (BuildMaster.loadConfig): wait for the
2368         slaveport's disownServiceParent deferred to fire before opening
2369         the new one. Fixes an annoying bug in the unit tests.
2371 2006-01-03  Brian Warner  <warner@lothar.com>
2373         * buildbot/master.py (BuildMaster): remove the .schedulers
2374         attribute, replacing it with an allSchedulers() method that looks
2375         for all IService children that implement IScheduler. Having only
2376         one parent/child relationship means fewer opportunities for bugs.
2377         (BuildMaster.allSchedulers): new method
2378         (BuildMaster.loadConfig_Schedulers): update to use allSchedulers,
2379         also fix ugly bug that caused any config-file reload to
2380         half-forget about the earlier Schedulers, causing an exception
2381         when a Change arrived and was handed to a half-connected
2382         Scheduler. The exception was in scheduler.py line 54ish:
2383           self.parent.submitBuildSet(bs)
2384           exceptions.AttributeError: 'NoneType' object has no attribute
2385           'submitBuildSet'
2386         (BuildMaster.addChange): update to use allSchedulers()
2388         * buildbot/scheduler.py (BaseScheduler.__implements__): fix this
2389         to work properly with twisted-1.3.0, where you must explicitly
2390         include the __implements__ from parent classes
2391         (BaseScheduler.__repr__): make it easier to distinguish distinct
2392         instances
2393         (BaseUpstreamScheduler.__implements__): same
2395         * buildbot/status/builder.py (Status.getSchedulers): update to
2396         use allSchedulers()
2397         * buildbot/test/test_run.py (Run.testMaster): same
2398         * buildbot/test/test_dependencies.py (Dependencies.findScheduler): same
2399         * buildbot/test/test_config.py (ConfigTest.testSchedulers): same,
2400         make sure Scheduler instances are left alone when an identical
2401         config file is reloaded
2402         (ConfigElements.testSchedulers): make sure Schedulers are properly
2403         comparable
2405         * Makefile (TRIALARGS): my local default Twisted version is now
2406         2.1.0, update the trial arguments accordingly
2408 2005-12-22  Brian Warner  <warner@lothar.com>
2410         * docs/examples/twisted_master.cfg: merge changes from pyr: add
2411         new win32 builders
2413         * buildbot/scheduler.py (BaseScheduler.addChange): include a dummy
2414         addChange in the parent class, although I suspect this should be
2415         fixed better in the future.
2417 2005-11-26  Brian Warner  <warner@lothar.com>
2419         * buildbot/scheduler.py (AnyBranchScheduler.addChange): don't
2420         explode when branch==None, thanks to Kevin Turner for the catch
2421         * buildbot/test/test_scheduler.py (Scheduling.testAnyBranch): test
2422         it
2424         * buildbot/__init__.py (version): bump to 0.7.1+ while between
2425         releases
2426         * docs/buildbot.texinfo: same
2428 2005-11-26  Brian Warner  <warner@lothar.com>
2430         * buildbot/__init__.py (version): Releasing buildbot-0.7.1
2431         * docs/buildbot.texinfo: set version number to match
2433 2005-11-26  Brian Warner  <warner@lothar.com>
2435         * NEWS: update for 0.7.1
2437         * buildbot/status/builder.py (BuildStepStatus.unsubscribe): make
2438         sure that unsubscribe works even if we never sent an ETA update.
2439         Also, don't explode on duplicate unsubscribe.
2440         (BuildStepStatus.addLog): make the convenience "return self"-added
2441         watcher automatically unsubscribe when the Step finishes.
2442         (BuildStatus.unsubscribe): same handle-duplicate-unsubscribe
2443         (BuildStatus.stepStarted): same auto-unsubscribe
2444         (BuilderStatus.buildStarted): same auto-unsubscribe
2446         * buildbot/interfaces.py (IStatusReceiver.buildStarted): document
2447         auto-unsubscribe
2448         (IStatusReceiver.stepStarted): same
2449         (IStatusReceiver.logStarted): same
2451         * buildbot/test/test_run.py (Status): move the Status test..
2452         * buildbot/test/test_status.py (Subscription): .. to here
2454 2005-11-25  Brian Warner  <warner@lothar.com>
2456         * NEWS: more updates
2458         * buildbot/locks.py: fix the problem in which loading a master.cfg
2459         file that changes some Builders (but not all of them) can result
2460         in having multiple copies of the same Lock. Now, the real Locks
2461         are kept in a table inside the BotMaster, and the Builders/Steps
2462         use "LockIDs", which are still instances of MasterLock and
2463         SlaveLock. The real Locks are instances of the new RealMasterLock
2464         and RealSlaveLock classes.
2465         * buildbot/master.py (BotMaster.getLockByID): new method to
2466         convert LockIDs into real Locks.
2467         * buildbot/process/base.py (Build.startBuild): convert LockIDs
2468         into real Locks before building
2469         * buildbot/process/step.py (BuildStep.startStep): same
2470         * buildbot/test/test_locks.py (Locks.testLock1a): add a test which
2471         exercises the problem
2474         * docs/buildbot.texinfo (Scheduler Types): give a few hints about
2475         what Schedulers are available
2477         * buildbot/scheduler.py (Nightly): add new Scheduler based upon
2478         work by Dobes Vandermeer and hacked mercilessly by me. This offers
2479         'cron'-style build scheduling at certain times of day, week,
2480         month, or year.
2481         * buildbot/test/test_scheduler.py (Scheduling.testNightly): test it
2483         * buildbot/scheduler.py (Scheduler): change fileIsImportant
2484         handling: treat self.fileIsImportant more as an attribute that
2485         contains a callable than as a method. If the attribute is None,
2486         don't call it and assume all filenames are important. It is still
2487         possible to provide a fileIsImportant method in a subclass,
2488         however.
2489         (AnyBranchScheduler): handle fileIsImportant=None, previously it
2490         was broken
2491         * buildbot/test/test_scheduler.py (Scheduling.testAnyBranch2):
2492         test using AnyBranchScheduler with fileIsImportant=None
2494 2005-11-24  Brian Warner  <warner@lothar.com>
2496         * buildbot/test/test_config.py (StartService): don't claim a fixed
2497         port number, instead set slavePort=0 on the first pass, figure out
2498         what port was allocated, then switch to a config file that uses
2499         the allocated port.
2501         * buildbot/master.py (BuildMaster.loadConfig): close the old
2502         slaveport before opening the new one, because unit tests might
2503         replace slavePort=0 with the same allocated portnumber, and if we
2504         don't wait for the old port to close first, we get a "port already
2505         in use" error. There is a tiny race condition here, but the only
2506         threat is from other programs that bind (statically) to the same
2507         port number we happened to be allocated, and only if those
2508         programs use SO_REUSEADDR, and only if they get control in between
2509         reactor turns.
2511         * Makefile (TRIALARGS): update to handle Twisted > 2.1.0
2513         * buildbot/master.py (BuildMaster.loadConfig_Sources): remove all
2514         deleted ChangeSources before adding any new ones
2515         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): fix
2516         compare_attrs, to make sure that a config-file reload does not
2517         unnecessarily replace an unmodified ChangeSource instance
2518         * buildbot/test/test_config.py (ConfigTest.testSources): update
2520         * buildbot/scheduler.py (AnyBranchScheduler): fix branches=[] to
2521         mean "don't build anything", and add a warning if it gets used
2522         because it isn't actually useful.
2524         * contrib/svn_buildbot.py: update example usage to match the port
2525         number that gets used by the PBChangeSource
2526         * buildbot/scripts/sample.cfg: add example of PBChangeSource
2528 2005-11-22  Brian Warner  <warner@lothar.com>
2530         * NEWS: start collecting items for next release
2532         * buildbot/process/step.py (SVN.computeSourceRevision): assume
2533         revisions are strings
2534         (P4Sync.computeSourceRevision): same
2536         * buildbot/status/html.py (StatusResourceBuild.body): add a link
2537         to the Buildbot's overall status page
2538         (StatusResourceBuilder.body): same
2540 2005-11-15  Brian Warner  <warner@lothar.com>
2542         * buildbot/master.py (BuildMaster.loadConfig): serialize the
2543         config-file loading, specifically to make sure old StatusTargets
2544         are finished shutting down before new ones start up (thus
2545         resolving a bug in which changing the Waterfall object would fail
2546         because both new and old instances were claiming the same
2547         listening port). Also load new Schedulers after all the new
2548         Builders are set up, in case they fire off a new build right away.
2549         * buildbot/test/test_config.py (StartService): test it
2551         * buildbot/status/mail.py (MailNotifier.buildMessage): oops, add
2552         the branch name to the mail body
2554         * buildbot/changes/pb.py (PBChangeSource.compare_attrs): add this.
2555         Without it, a config-file reload fails to update an existing
2556         PBChangeSource.
2557         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): add
2558         username/passwd to compare_attrs, for the same reason
2559         * buildbot/status/html.py (Waterfall): add favicon to
2560         compare_attrs, same reason
2562 2005-11-05  Brian Warner  <warner@lothar.com>
2564         * buildbot/scripts/tryclient.py (createJobfile): stringify the
2565         baserev before stuffing it in the jobfile. This resolves problems
2566         under SVN (and probably Arch) where revisions are expressed as
2567         numbers. I'm inclined to use string-based revisions everywhere in
2568         the future, but this fix should be safe for now. Thanks to Steven
2569         Walter for the patch.
2571         * buildbot/changes/changes.py (ChangeMaster.saveYourself): use
2572         binary mode when opening pickle files, to make windows work
2573         better. Thanks to Dobes Vandermeer for the catch.
2574         * buildbot/status/builder.py (BuildStatus.saveYourself): same
2575         (BuilderStatus.getBuildByNumber): same
2576         (Status.builderAdded): same
2577         * buildbot/master.py (BuildMaster.loadChanges): same
2579         * buildbot/util.py (Swappable): delete unused leftover code
2581         * buildbot/process/step.py (SVN): when building on a non-default
2582         branch, add the word "[branch]" to the VC step's description, so
2583         it is obvious that we're not building the usual stuff. Likewise,
2584         when we are building a specific revision, add the text "rNNN" to
2585         indicate what that revision number is. Thanks to Brad Hards and
2586         Nathaniel Smith for the suggestion.
2587         (Darcs.startVC): same
2588         (Arch.startVC): same
2589         (Bazaar.startVC): same
2591         * buildbot/process/factory.py (GNUAutoconf.__init__): fix a silly
2592         typo, caught by Mark Dillavou, closes SF#1216636.
2594         * buildbot/test/test_status.py (Log.TODO_testDuplicate): add notes
2595         about a test to add some day
2597         * docs/examples/twisted_master.cfg: update: bot1 can now handle
2598         the 'full-2.3' build, and the 'reactors' build is now run under
2599         python-2.4 because the buildslave no longer has gtk/etc bindings
2600         for earlier versions.
2602 2005-11-03  Brian Warner  <warner@lothar.com>
2604         * buildbot/interfaces.py (IBuilderControl.resubmitBuild): new
2605         method, takes an IBuildStatus and rebuilds it. It might make more
2606         sense to add this to IBuildControl instead, but that instance goes
2607         away completely once the build has finished, and resubmitting
2608         builds can take place weeks later.
2609         * buildbot/process/builder.py (BuilderControl.resubmitBuild): same
2610         * buildbot/status/html.py (StatusResourceBuild): also stash an
2611         IBuilderControl so we can use resubmitBuild.
2612         (StatusResourceBuild.body): render "resubmit" button if we can.
2613         Also add hrefs for each BuildStep
2614         (StatusResourceBuild.rebuild): add action for "resubmit" button
2615         (StatusResourceBuilder.getChild): give it an IBuilderControl
2617         * buildbot/status/builder.py (Status.getURLForThing): change the
2618         URL for BuildSteps to have a "step-" prefix, so the magic URLs
2619         that live as targets of buttons like "stop" and "rebuild" can't
2620         collide with them.
2621         * buildbot/status/builder.py (Status.getURLForThing): same
2622         * buildbot/status/html.py (StatusResourceBuild.getChild): same
2623         (StepBox.getBox): same
2624         * buildbot/test/test_web.py (GetURL): same
2625         (Logfile): same
2627         * buildbot/process/step.py (SVN.__init__): put svnurl/baseURL
2628         exclusivity checks after Source.__init__ upcall, so misspelled
2629         arguments will be reported more usefully
2630         (Darcs.__init__): same
2632 2005-10-29  Brian Warner  <warner@lothar.com>
2634         * docs/examples/twisted_master.cfg: don't double-fire the 'quick'
2635         builder. Move the Try scheduler off to a separate port.
2637 2005-10-27  Brian Warner  <warner@lothar.com>
2639         * buildbot/clients/gtkPanes.py
2640         (TwoRowClient.remote_builderRemoved): disappearing Builders used
2641         to cause the app to crash, now they don't.
2643         * buildbot/clients/debug.py: display the buildmaster's location
2644         in the window's title bar
2646 2005-10-26  Brian Warner  <warner@lothar.com>
2648         * buildbot/status/mail.py (MailNotifier): urllib.escape the URLs
2649         in case they have spaces or whatnot. Patch from Dobes Vandermeer.
2650         * buildbot/test/test_status.py (MyStatus.getURLForThing): fix it
2652         * buildbot/status/html.py (td): put a single non-breaking space
2653         inside otherwise empty <td> elements, as a workaround for buggy
2654         browsers which would optimize them away (along with any associated
2655         styles, like the kind that create the waterfall grid borders).
2656         Patch from Frerich Raabe.
2658         * buildbot/process/step_twisted.py (Trial): expose the trialMode=
2659         argv-list as an argument, defaulting to ["-to"], which is
2660         appropriate for the Trial that comes with Twisted-2.1.0 and
2661         earlier. The Trial in current Twisted SVN wants
2662         ["--reporter=bwverbose"] instead. Also expose trialArgs=, which
2663         defaults to an empty list.
2664         * buildbot/process/process_twisted.py (TwistedTrial.trialMode):
2665         match it, now that trialMode= is a list instead of a single string
2667         * buildbot/__init__.py (version): bump to 0.7.0+ while between
2668         releases
2669         * docs/buildbot.texinfo: same
2671 2005-10-24  Brian Warner  <warner@lothar.com>
2673         * buildbot/__init__.py (version): Releasing buildbot-0.7.0
2674         * docs/buildbot.texinfo: set version number to match
2676 2005-10-24  Brian Warner  <warner@lothar.com>
2678         * README: update for 0.7.0
2679         * NEWS: same
2680         * docs/buildbot.texinfo: move the freshcvs stuff out of the README
2682         * buildbot/clients/debug.glade: add 'branch' box to fake-commit
2683         * buildbot/clients/debug.py (DebugWidget.do_commit): same. Don't
2684         send the branch= argument unless the user really provided one, to
2685         retain compatibility with older buildmasters that don't accept
2686         that argument.
2687         * buildbot/master.py (DebugPerspective.perspective_fakeChange):
2688         same
2690         * docs/buildbot.texinfo: update lots of stuff
2692         * buildbot/scripts/runner.py (sendchange): add a --branch argument
2693         to the 'buildbot sendchange' command
2694         * buildbot/clients/sendchange.py (Sender.send): same
2695         * buildbot/changes/pb.py (ChangePerspective): same
2696         * buildbot/test/test_changes.py (Sender.testSender): test it
2698         * buildbot/process/step.py (SVN.__init__): change 'base_url' and
2699         'default_branch' argument names to 'baseURL' and 'defaultBranch',
2700         for consistency with other BuildStep arguments that use camelCase.
2701         Well, at least more of them use camelCase (like flunkOnWarnings)
2702         than don't.. I wish I'd picked one style and stuck with it
2703         earlier. Annoying, but it's best done before the release, since
2704         these arguments didn't exist at all in 0.6.6 .
2705         (Darcs): same
2706         * buildbot/test/test_vc.py (SVN.testCheckout): same
2707         (Darcs.testPatch): same
2708         * docs/buildbot.texinfo (SVN): document the change
2709         (Darcs): same, add some build-on-branch docs
2710         * docs/examples/twisted_master.cfg: match change
2712         * buildbot/process/step.py (BuildStep): rename
2713         slaveVersionNewEnough to slaveVersionIsOlderThan, because that's
2714         how it is normally used.
2715         * buildbot/test/test_steps.py (Version.checkCompare): same
2717         * buildbot/process/step.py (CVS.startVC): refuse to build
2718         update/copy -style builds on a non-default branch with an old
2719         buildslave (<=0.6.6) that doesn't know how to do it properly. The
2720         concern is that it will do a VC 'update' in an existing tree when
2721         it is supposed to be switching branches (and therefore clobbering
2722         the tree to do a full checkout), thus building the wrong source.
2723         This used to be a warning, but I think the confusion it is likely
2724         to cause warrants making it an error.
2725         (SVN.startVC): same, also make mode=export on old slaves an error
2726         (Darcs.startVC): same
2727         (Git.startVC): improve error message for non-Git-enabled slaves
2728         (Arch.checkSlaveVersion): same. continue to emit a warning when a
2729         specific revision is built on a slave that doesn't pay attention
2730         to args['revision'], because for slowly-changing trees it will
2731         probably do the right thing, and because we have no way to tell
2732         whether we're asking it to build the most recent version or not.
2733         * buildbot/interfaces.py (BuildSlaveTooOldError): new exception
2735         * buildbot/scripts/runner.py (SlaveOptions.postOptions): assert
2736         that 'master' is in host:portnum format, to catch errors sooner
2738 2005-10-23  Brian Warner  <warner@lothar.com>
2740         * buildbot/process/step_twisted.py (ProcessDocs.createSummary):
2741         when creating the list of warning messages, include the line
2742         immediately after each WARNING: line, since that's usually where
2743         the file and line number wind up.
2745         * docs/examples/twisted_master.cfg: OS-X slave now does QT, add a
2746         TryScheduler
2748         * NEWS: update
2750 2005-10-22  Brian Warner  <warner@lothar.com>
2752         * buildbot/status/html.py (HtmlResource): incorporate valid-HTML
2753         patch from Brad Hards
2754         * buildbot/status/classic.css: same
2755         * buildbot/test/test_web.py (Waterfall): match changes
2757         * buildbot/test/test_steps.py (BuildStep.setUp): set
2758         nextBuildNumber so the test passes
2759         * buildbot/test/test_status.py (MyBuilder): same
2761         * buildbot/status/html.py (StatusResourceBuild.body): revision
2762         might be numeric, so stringify it before html-escapifying it
2763         (CurrentBox.getBox): add a "waiting" state, and show a countdown
2764         timer for the upcoming build
2765         * buildbot/status/classic.css: add background-color attributes for
2766         offline/waiting/building classes
2768         * buildbot/status/builder.py (BuildStatus): derive from
2769         styles.Versioned, fix upgrade of .sourceStamp attribute. Also set
2770         the default (i.e. unknown) .slavename to "???" instead of None,
2771         since even unknown slavenames need to be printed eventually.
2772         (BuilderStatus): also derive from styles.Versioned . More
2773         importantly, determine .nextBuildNumber at creation/unpickling
2774         time by scanning the directory of saved BuildStatus instances and
2775         choosing one larger than the highest-numbered one found. This
2776         should fix the problem where random errors during upgrades cause
2777         the buildbot to forget about earlier builds. .nextBuildNumber is
2778         no longer stored in the pickle.
2779         (Status.builderAdded): if we can't unpickle the BuilderStatus,
2780         at least log the error. Also call Builder.determineNextBuildNumber
2781         once the basedir is set.
2783         * buildbot/master.py (BuildMaster.loadChanges): do
2784         styles.doUpgrade afterwards, in case I decide to make Changes
2785         derived from styles.Versioned some day and forget to make this
2786         change later.
2789         * buildbot/test/test_runner.py (Options.testForceOptions): skip
2790         when running under older pythons (<2.3) in which the shlex module
2791         doesn't have a 'split' function.
2793         * buildbot/process/step.py (ShellCommand.start): make
2794         errorMessages= be a list of strings to stuff in the log before the
2795         command actually starts. This makes it easier to flag multiple
2796         warning messages, e.g. when the Source steps have to deal with an
2797         old buildslave.
2798         (CVS.startVC): handle slaves that don't handle multiple branches
2799         by switching into 'clobber' mode
2800         (SVN.startVC): same. Also reject branches without base_url
2801         (Darcs.startVC): same. Also reject revision= in older slaves
2802         (Arch.checkSlaveVersion): same (just the multiple-branches stuff)
2803         (Bazaar.startVC): same, and test for baz separately than for arch
2805         * buildbot/slave/commands.py (cvs_ver): document new features
2807         * buildbot/process/step.py (BuildStep.slaveVersion): document it
2808         (BuildStep.slaveVersionNewEnough): more useful utility method
2809         * buildbot/test/test_steps.py (Version): start testing it
2811         * buildbot/status/words.py (IrcStatusBot.command_FORCE): note that
2812         the 'force' command requires python2.3, for the shlex.split method
2814         * docs/examples/twisted_master.cfg: remove old freshcvs stuff,
2815         since we don't use it anymore. The Twisted buildbot uses a
2816         PBChangeSource now.
2818 2005-10-21  Brian Warner  <warner@lothar.com>
2820         * buildbot/process/process_twisted.py: rework all BuildFactory
2821         classes to take a 'source' step as an argument, instead of
2822         building up the SVN instance in the factory.
2823         * docs/examples/twisted_master.cfg: enable build-on-branch by
2824         providing a base_url and default_branch
2826         * buildbot/status/words.py (IrcStatusBot.command_FORCE): add
2827         control over --branch and --revision, not that they are always
2828         legal to provide
2829         * buildbot/status/html.py (StatusResourceBuilder.force): same
2830         (StatusResourceBuild.body): display SourceStamp components
2832         * buildbot/scripts/runner.py (ForceOptions): option parser for the
2833         IRC 'force' command, so it can be shared with an eventual
2834         command-line-tool 'buildbot force' mode.
2835         * buildbot/test/test_runner.py (Options.testForceOptions): test it
2837 2005-10-20  Brian Warner  <warner@lothar.com>
2839         * buildbot/status/mail.py (MailNotifier.buildMessage): reformat
2841         * docs/examples/twisted_master.cfg: update to use Schedulers
2843         * buildbot/scripts/sample.cfg: update with Schedulers
2845         * buildbot/interfaces.py (IBuilderControl.requestBuildSoon): new
2846         method specifically for use by HTML "force build" button and the
2847         IRC "force" command. Raises an immediate error if there are no
2848         slaves available.
2849         (IBuilderControl.requestBuild): make this just submit a build, not
2850         try to check for existing slaves or set up any when-finished
2851         Deferreds or anything.
2852         * buildbot/process/builder.py (BuilderControl): same
2853         * buildbot/status/html.py (StatusResourceBuilder.force): same
2854         * buildbot/status/words.py (IrcStatusBot.command_FORCE): same
2855         * buildbot/test/test_slaves.py: same
2856         * buildbot/test/test_web.py: same
2858 2005-10-19  Brian Warner  <warner@lothar.com>
2860         * docs/examples/twisted_master.cfg: re-sync with reality: bring
2861         back python2.2 tests, turn off OS-X threadedselect-reactor tests
2863 2005-10-18  Brian Warner  <warner@lothar.com>
2865         * buildbot/status/html.py: provide 'status' argument to most
2866         StatusResourceFOO objects
2867         (StatusResourceBuild.body): href-ify the Builder name, add "Steps
2868         and Logfiles" section to make the Build page into a more-or-less
2869         comprehensive source of status information about the build
2871         * buildbot/status/mail.py (MailNotifier): include the Build's URL
2872         * buildbot/status/words.py (IrcStatusBot.buildFinished): same
2874 2005-10-17  Brian Warner  <warner@lothar.com>
2876         * buildbot/process/process_twisted.py (TwistedTrial): update Trial
2877         arguments to accomodate Twisted >=2.1.0 . I will have to figure
2878         out what to do about other projects: the correct options for
2879         recent Twisteds will not work for older ones.
2881 2005-10-15  Brian Warner  <warner@lothar.com>
2883         * buildbot/status/builder.py (Status.getURLForThing): add method
2884         to provide a URL for arbitrary IStatusFoo objects. The idea is to
2885         use this in email/IRC status clients to make them more useful, by
2886         providing the end user with hints on where to learn more about the
2887         object being reported on.
2888         * buildbot/test/test_web.py (GetURL): tests for it
2890 2005-10-14  Brian Warner  <warner@lothar.com>
2892         * buildbot/test/test_config.py (ConfigTest._testSources_1): oops,
2893         fix bug resulting from deferredResult changes
2895 2005-10-13  Brian Warner  <warner@lothar.com>
2897         * buildbot/test/test_changes.py: remove use of deferredResult
2898         * buildbot/test/test_config.py: same
2899         * buildbot/test/test_control.py: same
2900         * buildbot/test/test_status.py: same
2901         * buildbot/test/test_vc.py: this is the only remaining use, since
2902         it gets used at module level. This needs to be replaced by some
2903         sort of class-level run-once routine.
2905         * buildbot/status/words.py (IrcStatusBot.command_WATCH): fix typo
2907         * lots: implement multiple slaves per Builder, which means multiple
2908         current builds per Builder. Some highlights:
2909         * buildbot/interfaces.py (IBuilderStatus.getState): return a tuple
2910         of (state,currentBuilds) instead of (state,currentBuild)
2911         (IBuilderStatus.getCurrentBuilds): replace getCurrentBuild()
2912         (IBuildStatus.getSlavename): new method, so you can tell which
2913         slave got used. This only gets set when the build completes.
2914         (IBuildRequestStatus.getBuilds): new method
2916         * buildbot/process/builder.py (SlaveBuilder): add a .state
2917         attribute to track things like ATTACHING and IDLE and BUILDING,
2918         instead of..
2919         (Builder): .. the .slaves attribute here, which has been turned
2920         into a simple list of available slaves. Added a separate
2921         attaching_slaves list to track ones that are not yet ready for
2922         builds.
2923         (Builder.fireTestEvent): put off the test-event callback for a
2924         reactor turn, to make tests a bit more consistent.
2925         (Ping): cleaned up the slaveping a bit, now it disconnects if the
2926         ping fails due to an exception. This needs work, I'm worried that
2927         a code error could lead to a constantly re-connecting slave.
2928         Especially since I'm trying to move to a distinct remote_ping
2929         method, separate from the remote_print that we currently use.
2930         (BuilderControl.requestBuild): return a convenience Deferred that
2931         provides an IBuildStatus when the build finishes.
2932         (BuilderControl.ping): ping all connected slaves, only return True
2933         if they all respond.
2935         * buildbot/slave/bot.py (BuildSlave.stopService): stop trying to
2936         reconnect when we shut down.
2938         * buildbot/status/builder.py: implement new methods, convert
2939         one-build-at-a-time methods to handle multiple builds
2940         * buildbot/status/*.py: do the same in all default status targets
2941         * buildbot/status/html.py: report the build's slavename in the
2942         per-Build page, report all buildslaves on the per-Builder page
2944         * buildbot/test/test_run.py: update/create tests
2945         * buildbot/test/test_slaves.py: same
2946         * buildbot/test/test_scheduler.py: remove stale test
2948         * docs/buildbot.texinfo: document the new builder-specification
2949         'slavenames' parameter
2951 2005-10-12  Brian Warner  <warner@lothar.com>
2953         * buildbot/buildset.py (BuildSet): fix bug where BuildSet did not
2954         report failure correctly, causing Dependent builds to run when
2955         they shouldn't have.
2956         * buildbot/status/builder.py (BuildSetStatus): same
2957         * buildbot/test/test_buildreq.py (Set.testBuildSet): verify it
2958         (Set.testSuccess): test the both-pass case too
2959         * buildbot/test/test_dependencies.py (Dependencies.testRun_Fail):
2960         fix this test: it was ending too early, masking the failure before
2961         (Logger): specialized StatusReceiver to make sure the dependent
2962         builds aren't even started, much less completed.
2964 2005-10-07  Brian Warner  <warner@lothar.com>
2966         * buildbot/slave/bot.py (SlaveBuilder.activity): survive
2967         bot.SlaveBuilder being disowned in the middle of a build
2969         * buildbot/status/base.py (StatusReceiverMultiService): oops, make
2970         this inherit from StatusReceiver. Also upcall in __init__. This
2971         fixes the embarrasing crash when the new buildSetSubmitted method
2972         is invoked and Waterfall/etc don't implement their own.
2973         * buildbot/test/test_run.py: add a TODO note about a test to catch
2974         just this sort of thing.
2976         * buildbot/process/builder.py (Builder.attached): remove the
2977         already-attached warning, this situation is normal. Add some
2978         comments explaining it.
2980 2005-10-02  Brian Warner  <warner@lothar.com>
2982         * buildbot/changes/maildir.py (Maildir.start): Tolerate
2983         OverflowError when setting up dnotify, because some 64-bit systems
2984         have problems with signed-vs-unsigned constants and trip up on the
2985         DN_MULTISHOT flag. Patch from Brad Hards.
2987 2005-09-06  Fred Drake  <fdrake@users.sourceforge.net>
2989         * buildbot/process/step.py (BuildStep, ShellCommand): Add
2990         progressMetrics, description, descriptionDone to the 'parms' list,
2991         and make use the 'parms' list from the implementation class
2992         instead of only BuildStep to initialize the parameters.  This
2993         allows buildbot.process.factory.s() to initialize all the parms,
2994         not just those defined in directly by BuildStep.
2996 2005-09-03  Brian Warner  <warner@lothar.com>
2998         * NEWS: start adding items for the next release
3000         * docs/examples/twisted_master.cfg: (sync with reality) turn off
3001         python2.2 tests, change 'Quick' builder to only use python2.3
3003 2005-09-02  Fred Drake  <fdrake@users.sourceforge.net>
3005         * buildbot/status/html.py (StatusResourceBuilder.body): only show
3006         the "Ping Builder" button if the build control is available; the
3007         user sees an exception otherwise
3009         * docs/buildbot.texinfo (PBChangeSource): fix a typo
3011 2005-09-01  Brian Warner  <warner@lothar.com>
3013         * buildbot/interfaces.py (IBuilderStatus.getState): update
3014         signature, point out that 'build' can be None
3015         (IBuildStatus.getETA): point out ETA can be none
3017         * buildbot/status/html.py (CurrentBox.getBox): tolerate build/ETA
3018         being None
3019         * buildbot/status/words.py (IrcStatusBot.emit_status): same
3021 2005-08-31  Brian Warner  <warner@lothar.com>
3023         * buildbot/status/base.py (StatusReceiver.builderChangedState):
3024         update to match correct signature: removed 'eta' argument
3025         * buildbot/status/mail.py (MailNotifier.builderChangedState): same
3027 2005-08-30  Brian Warner  <warner@lothar.com>
3029         * buildbot/status/builder.py (LogFile): remove the assertion that
3030         blows up when you try to overwrite an existing logfile, instead
3031         just emit a warning. This case gets hit when the buildmaster is
3032         killed and doesn't get a chance to write out the serialized
3033         BuilderStatus object, so the .nextBuildNumber attribute gets out
3034         of date.
3036         * buildbot/scripts/runner.py (sendchange): add --revision_file to
3037         the 'buildbot sendchange' arguments, for the Darcs context file
3038         * docs/buildbot.texinfo (sendchange): document it
3040         * buildbot/status/html.py: add pending/upcoming builds to CurrentBox
3041         * buildbot/interfaces.py (IScheduler.getPendingBuildTimes): new method
3042         (IStatus.getSchedulers): new method
3043         * buildbot/status/builder.py (BuilderStatus): track pendingBuilds
3044         (Status.getSchedulers): implement
3045         * buildbot/process/builder.py (Builder): maintain
3046         BuilderStatus.pendingBuilds
3047         * buildbot/scheduler.py (Scheduler.getPendingBuildTimes): new method
3048         (TryBase.addChange): Try schedulers should ignore Changes
3050         * buildbot/scripts/tryclient.py (getTopdir): implement getTopdir
3051         for 'try' on CVS/SVN
3052         * buildbot/test/test_runner.py (Try.testGetTopdir): test case
3054         * buildbot/scripts/tryclient.py (Try): make jobdir-style 'try'
3055         report status properly.
3056         (Try.createJob): implement unique buildset IDs
3058         * buildbot/status/client.py (StatusClientPerspective): add a
3059         perspective_getBuildSets method for the benefit of jobdir-style
3060         'try'.
3061         * docs/buildbot.texinfo (try): more docs
3062         * buildbot/test/test_scheduler.py (Scheduling.testGetBuildSets):
3063         new test case
3065 2005-08-18  Brian Warner  <warner@lothar.com>
3067         * buildbot/scripts/tryclient.py (Try): make 'try' status reporting
3068         actually work. It's functional but still kind of clunky. Also, it
3069         only works with the pb-style.. needs to be made to work with the
3070         jobdir-style too.
3072         * buildbot/status/client.py (RemoteBuildSet): new class
3073         (RemoteBuildRequest): same
3074         (RemoteBuild.remote_waitUntilFinished): return the RemoteBuild
3075         object, not the internal BuildStatus object.
3076         (RemoteBuild.remote_subscribe): new method to subscribe to builds
3077         outside of the usual buildStarted() return value.
3078         (BuildSubscriber): support class for RemoteBuild.remote_subscribe
3080         * buildbot/scheduler.py (Try_Jobdir): convey buildsetID properly
3081         (Try_Userpass_Perspective.perspective_try): return a remotely
3082         usable BuildSetStatus object
3084         * buildbot/interfaces.py (IBuildStatus): remove obsolete
3085         isStarted()/waitUntilStarted()
3087 2005-08-16  Brian Warner  <warner@lothar.com>
3089         * buildbot/status/builder.py: implement IBuildSetStatus and
3090         IBuildRequestStatus, wire them into place.
3091         * buildbot/buildset.py: same. Add ID, move wait-until-finished
3092         methods into the BuildSetStatus object.
3093         * buildbot/interfaces.py: same
3094         (IStatus.getBuildSets): new method to get pending BuildSets
3095         (IStatusReceiver.buildsetSubmitted): new method which hears about
3096         new BuildSets
3097         * buildbot/master.py (BuildMaster.submitBuildSet): same
3098         * buildbot/process/base.py (BuildRequest): same, replace
3099         waitUntilStarted with subscribe/unsubscribe
3100         * buildbot/process/builder.py (BuilderControl.forceBuild): use
3101         subscribe instead of waitUntilStarted
3102         * buildbot/status/base.py (StatusReceiver.buildsetSubmitted): stub
3103         for new method
3104         * buildbot/status/client.py (StatusClientPerspective.builderRemoved): 
3105         same
3106         * buildbot/test/test_buildreq.py: update for new code
3107         * buildbot/test/test_control.py (Force.testRequest): same
3110         * buildbot/slave/commands.py (Darcs.doVCFull): fix get-revision
3111         for Darcs to not use the tempfile module, so it works under
3112         python-2.2 too. We really didn't need the full cleverness of that
3113         module, since the slave has exclusive control of its own builddir.
3115 2005-08-15  Brian Warner  <warner@lothar.com>
3117         * buildbot/scripts/tryclient.py (CVSExtractor): implement 'try'
3118         for CVS trees. It doesn't work for non-trunk branches,
3119         unfortunately.
3120         * buildbot/test/test_vc.py (CVS.testTry): test it, but skip the
3121         branch test
3123         * Makefile: make it easier to test against python2.2
3125         * buildbot/test/test_vc.py (VCBase.tearDown): provide for
3126         tearDown2, so things like Arch can unregister archives as they're
3127         shutting down. The previous subclass-override-tearDown technique
3128         resulted in a nested maybeWait() and test failures under
3129         Twisted-1.3.0
3131         * buildbot/scripts/tryclient.py (getSourceStamp): extract branches
3132         where we can (Arch), add a branch= argument to set the branch used
3133         when we can't
3134         (BazExtractor): extract the branch too
3135         (TlaExtractor): same
3136         * buildbot/scripts/runner.py (TryOptions): add --branch
3137         * docs/buildbot.texinfo (try): document --branch/try_branch
3139         * buildbot/slave/commands.py (Darcs): implement get-revision for
3140         Darcs, so that 'try' will work. This requires the tempfile module
3141         from python-2.3 .
3143         * buildbot/test/test_vc.py: rewrite tests, getting better coverage
3144         of revisions, branches, and 'try' in the process.
3146 2005-08-11  Brian Warner  <warner@lothar.com>
3148         * buildbot/master.py (DebugPerspective.perspective_pokeIRC): fix
3149         this, it got broken at some point in the last few releases
3150         * buildbot/status/words.py (IrcBuildRequest): reply was broken
3151         (IrcStatusBot.emit_status): handle new IBuilderStatus.getState,
3152         specifically the removal of ETA information from the tuple
3154         * buildbot/locks.py: use %d for id() instead of %x, avoid a silly
3155         warning message
3157         * docs/buildbot.texinfo (try): document both --builder and
3158         'try_builders' in .buildbot/options
3159         * buildbot/scripts/runner.py (TryOptions): add --builder,
3160         accumulate the values into opts['builders']
3161         * buildbot/scripts/tryclient.py (Try.__init__): set builders
3162         * buildbot/test/test_runner.py (Try): add some quick tests to make
3163         sure 'buildbot try --options' and .buildbot/options get parsed
3164         * buildbot/test/test_scheduler.py (Scheduling.testTryUserpass):
3165         use --builder control
3167         * docs/buildbot.texinfo (try): add --port argument to PB style
3169         * buildbot/scripts/tryclient.py (SourceStampExtractor): return an
3170         actual SourceStamp. Still need to extract a branch name, somehow.
3171         (Try): finish implementing the try client side, still need a UI
3172         for specifying which builders to use
3173         (Try.getopt): factor our options/config-file reading
3174         * buildbot/test/test_scheduler.py (Scheduling.testTryUserpass):
3175         test it
3176         * buildbot/test/test_vc.py: match SourceStampExtractor change
3178         * buildbot/scripts/runner.py (Options.opt_verbose): --verbose
3179         causes the twisted log to be sent to stderr
3181         * buildbot/scheduler.py (Try_Userpass): implement the PB style
3183 2005-08-10  Brian Warner  <warner@lothar.com>
3185         * buildbot/scripts/runner.py: Add 'buildbot try' command, jobdir
3186         style is 90% done, still missing status reporting or waiting for
3187         the buildsets to finish, and it is completely untested.
3189         * buildbot/trybuild.py: delete file, move contents to ..
3190         * buildbot/scripts/tryclient.py (getSourceStamp): .. here
3191         * buildbot/test/test_vc.py: match the move
3193         * buildbot/scheduler.py (Try_Jobdir): implement the jobdir style
3194         of the TryScheduler, no buildsetID or status-tracking support yet
3195         * buildbot/test/test_scheduler.py (Scheduling.testTryJobdir): test it
3197         * buildbot/changes/maildir.py (Maildir.setBasedir): make it
3198         possible to set the basedir after __init__ time, so it is easier
3199         to use as a Service-child of the BuildMaster instance
3201         * buildbot/changes/maildirtwisted.py (MaildirService): make a form
3202         that delivers messages to its Service parent instead of requiring
3203         a subclass to be useful. This turns out to be much easier to build
3204         unit tests around.
3206         * buildbot/scripts/tryclient.py (createJob): utility code to
3207         create jobfiles, will eventually be used by 'buildbot try'
3209 2005-08-08  Brian Warner  <warner@lothar.com>
3211         * docs/buildbot.texinfo (try): add docs on the
3212         as-yet-unimplemented Try scheduler
3214         * buildbot/test/test_buildreq.py: move Scheduling tests out to ..
3215         * buildbot/test/test_scheduler.py: .. here
3216         (Scheduling.testTryJobdir): add placeholder test for 'try'
3218         * buildbot/test/test_status.py (Log.testMerge3): update to match new
3219         addEntry merging (>=chunkSize) behavior
3220         (Log.testConsumer): update to handle new callLater(0) behavior
3222         * buildbot/test/test_web.py: rearrange tests a bit, add test for
3223         both the MAX_LENGTH bugfix and the resumeProducing hang.
3225         * buildbot/status/builder.py (LogFileProducer.resumeProducing):
3226         put off the actual resumeProducing for a moment with
3227         reactor.callLater(0). This works around a twisted-1.3.0 bug which
3228         causes large logfiles to hang midway through.
3230         * buildbot/process/step.py (BuildStep.addCompleteLog): break the
3231         logfile up into chunks, both to avoid NetstringReceiver.MAX_LENGTH
3232         and to improve memory usage when streaming the file out to a web
3233         browser.
3234         * buildbot/status/builder.py (LogFile.addEntry): change > to >= to
3235         make this work cleanly
3237 2005-08-03  Brian Warner  <warner@lothar.com>
3239         * buildbot/trybuild.py: new file for 'try' utilities
3240         (getSourceStamp): run in a tree, find out the baserev+patch
3241         * buildbot/test/test_vc.py (VCBase.do_getpatch): test it,
3242         implemented for SVN and Darcs, still working on Arch. I don't know
3243         how to make CVS work yet.
3245         * docs/buildbot.texinfo: document the 'buildbot' command-line
3246         tool, including the not-yet-implemented 'try' feature, and the
3247         in-flux .buildbot/ options directory.
3249 2005-07-20  Brian Warner  <warner@lothar.com>
3251         * buildbot/locks.py: added temporary id() numbers to Lock
3252         descriptions, to track down a not-really-sharing-the-Lock bug
3254         * buildbot/test/runutils.py: must import errno, cut-and-paste bug
3256         * buildbot/test/test_slavecommand.py (ShellBase.failUnlessIn):
3257         needed for python2.2 compatibility
3258         * buildbot/test/test_vc.py: python2.2 compatibility: generators
3259         are from the __future__
3261 2005-07-19  Brian Warner  <warner@lothar.com>
3263         * buildbot/master.py (BuildMaster.loadConfig): give a better error
3264         message when schedulers use unknown builders
3266         * buildbot/process/builder.py (Builder.compareToSetup): make sure
3267         SlaveLock('name') and MasterLock('name') are distinct
3269         * buildbot/master.py (BuildMaster.loadConfig): oops, sanity-check
3270         c['schedulers'] in such a way that we can actually accept
3271         Dependent instances
3272         * buildbot/test/test_config.py: check it
3274         * buildbot/scheduler.py (Dependent.listBuilderNames): oops, add
3275         utility method to *all* the Schedulers
3276         (Periodic.listBuilderNames): same
3278         * docs/buildbot.texinfo (Interlocks): update chapter to match
3279         reality
3281         * buildbot/master.py (BuildMaster.loadConfig): Add sanity checks
3282         to make sure that c['sources'], c['schedulers'], and c['status']
3283         are all lists of the appropriate objects, and that the Schedulers
3284         all point to real Builders
3285         * buildbot/interfaces.py (IScheduler, IUpstreamScheduler): add
3286         'listBuilderNames' utility method to support this
3287         * buildbot/scheduler.py: implement the utility method
3288         * buildbot/test/test_config.py (ConfigTest.testSchedulers): test it
3290         * docs/buildbot.texinfo: add some @cindex entries
3292         * buildbot/test/test_vc.py (Arch.createRepository): set the tla ID
3293         if it wasn't already set: most tla commands will fail unless one
3294         has been set.
3295         (Arch.createRepository): and disable bazaar's revision cache, since
3296         they cause test failures (the multiple repositories we create all
3297         interfere with each other through the cache)
3299         * buildbot/test/test_web.py (WebTest): remove use of deferredResult,
3300         bring it properly up to date with twisted-2.0 test guidelines
3302         * buildbot/master.py (BuildMaster): remove references to old
3303         'interlock' module, this caused a bunch of post-merge test
3304         failures
3305         * buildbot/test/test_config.py: same
3306         * buildbot/process/base.py (Build): same
3308         * buildbot/test/test_slaves.py: stubs for new test case
3310         * buildbot/scheduler.py: add test-case-name tag
3311         * buildbot/test/test_buildreq.py: same
3313         * buildbot/slave/bot.py (SlaveBuilder.__init__): remove some
3314         unnecessary init code
3315         (Bot.remote_setBuilderList): match it
3317         * docs/buildbot.texinfo (@settitle): don't claim version 1.0
3319         * buildbot/changes/mail.py (parseSyncmail): update comment
3321         * buildbot/test/test_slavecommand.py: disable Shell tests on
3322         platforms that don't suport IReactorProcess
3324         * buildbot/status/builder.py (LogFile): remove the 't' mode from
3325         all places where we open logfiles. It causes OS-X to open the file
3326         in some weird mode that that prevents us from mixing reads and
3327         writes to the same filehandle, which we depend upon to implement
3328         _generateChunks properly. This change doesn't appear to break
3329         win32, on which "b" and "t" are treated differently but a missing
3330         flag seems to be interpreted as "t".
3332 2005-07-18  Brian Warner  <warner@lothar.com>
3334         * buildbot/slave/commands.py (ShellCommand): overhaul
3335         error-handling code, to try and make timeout/interrupt work
3336         properly, and make win32 happier
3337         * buildbot/test/test_slavecommand.py: clean up, stop using
3338         reactor.iterate, add tests for timeout and interrupt
3339         * buildbot/test/sleep.py: utility for a new timeout test
3341         * buildbot/twcompat.py: copy over twisted 1.3/2.0 compatibility
3342         code from the local-usebranches branch
3344 2005-07-17  Brian Warner  <warner@lothar.com>
3346         * buildbot/process/process_twisted.py
3347         (TwistedReactorsBuildFactory): change the treeStableTimer to 5
3348         minutes, to match the other twisted BuildFactories, and don't
3349         excuse failures in c/qt/win32 reactors any more.
3351         * docs/examples/twisted_master.cfg: turn off the 'threadless' and
3352         'freebsd' builders, since the buildslaves have been unavailable
3353         for quite a while
3355 2005-07-13  Brian Warner  <warner@lothar.com>
3357         * buildbot/test/test_vc.py (VCBase.do_branch): test the new
3358         build-on-branch feature
3360         * buildbot/process/step.py (Darcs.__init__): add base_url and
3361         default_branch arguments, just like SVN
3362         (Arch.__init__): note that the version= argument is really the
3363         default branch name
3365         * buildbot/slave/commands.py (SourceBase): keep track of the
3366         repository+branch that was used for the last checkout in
3367         SRCDIR/.buildbot-sourcedata . If the contents of this file do not
3368         match, we clobber the directory and perform a fresh checkout
3369         rather than trying to do an in-place update. This should protect
3370         us against trying to get to branch B by doing an update in a tree
3371         obtained from branch A.
3372         (CVS.setup): add CVS-specific sourcedata: root, module, and branch
3373         (SVN.setup): same, just the svnurl
3374         (Darcs.setup): same, just the repourl
3375         (Arch.setup): same, arch coordinates (url), version, and
3376         buildconfig. Also pull the buildconfig from the args dictionary,
3377         which we weren't doing before, so the build-config was effectively
3378         disabled.
3379         (Arch.sourcedirIsUpdateable): don't try to update when we're
3380         moving to a specific revision: arch can't go backwards, so it is
3381         safer to just clobber the tree and checkout a new one at the
3382         desired revision.
3383         (Bazaar.setup): same sourcedata as Arch
3385         * buildbot/test/test_dependencies.py (Dependencies.testRun_Fail):
3386         use maybeWait, to work with twisted-1.3.0 and twcompat
3387         (Dependencies.testRun_Pass): same
3389         * buildbot/test/test_vc.py: rearrange, cleanup
3391         * buildbot/twcompat.py: add defer.waitForDeferred and
3392         utils.getProcessOutputAndValue, so test_vc.py (which uses them)
3393         can work under twisted-1.3.0 .
3395         * buildbot/test/test_vc.py: rewrite. The sample repositories are
3396         now created at setUp time. This increases the runtime of the test
3397         suite considerably (from 91 seconds to 151), but it removes the
3398         need for an offline tarball, which should solve a problem I've
3399         seen where the test host has a different version of svn than the
3400         tarball build host. The new code also validates that mode=update
3401         really picks up recent commits. This approach will also make it
3402         easier to test out branches, because the code which creates the VC
3403         branches is next to the code which uses them. It will also make it
3404         possible to test some change-notification hooks, by actually
3405         performing a VC commit and watching to see the ChangeSource get
3406         notified.
3408 2005-07-12  Brian Warner  <warner@lothar.com>
3410         * docs/buildbot.texinfo (SVN): add branches example
3411         * docs/Makefile (buildbot.ps): add target for postscript manual
3413         * buildbot/test/test_dependencies.py: s/test_interlocks/test_locks/ 
3414         * buildbot/test/test_locks.py: same
3416         * buildbot/process/step.py (Darcs): comment about default branches
3418         * buildbot/master.py (BuildMaster.loadConfig): don't look for
3419         c['interlocks'] in the config file, complain if it is present.
3420         Scan all locks in c['builders'] to make sure the Locks they use
3421         are uniquely named.
3422         * buildbot/test/test_config.py: remove old c['interlocks'] test,
3423         add some tests to check for non-uniquely-named Locks
3424         * buildbot/test/test_vc.py (Patch.doPatch): fix factory.steps,
3425         since the unique-Lock validation code requires it now
3427         * buildbot/locks.py: fix test-case-name
3429         * buildbot/interlock.py: remove old file
3431 2005-07-11  Brian Warner  <warner@lothar.com>
3433         * buildbot/test/test_interlock.py: rename to..
3434         * buildbot/test/test_locks.py: .. something shorter
3436         * buildbot/slave/bot.py (BuildSlave.stopService): newer Twisted
3437         versions (after 2.0.1) changed internet.TCPClient to shut down the
3438         connection in stopService. Change the code to handle this
3439         gracefully.
3441         * buildbot/process/base.py (Build): handle whole-Build locks
3442         * buildbot/process/builder.py (Builder.compareToSetup): same
3443         * buildbot/test/test_interlock.py: make tests work
3445         * buildbot/process/step.py (BuildStep.startStep): complain if a
3446         Step tries to claim a lock that's owned by its own Build
3447         (BuildStep.releaseLocks): typo
3449         * buildbot/locks.py (MasterLock): use ComparableMixin so config
3450         file reloads don't replace unchanged Builders
3451         (SlaveLock): same
3452         * buildbot/test/test_config.py (ConfigTest.testInterlocks):
3453         rewrite to cover new Locks instead of old c['interlocks']
3454         * buildbot/test/runutils.py (RunMixin.connectSlaves): remember
3455         slave2 too
3458         * buildbot/test/test_dependencies.py (Dependencies.setUp): always
3459         start the master and connect the buildslave
3461         * buildbot/process/step.py (FailingDummy.done): finish with a
3462         FAILURE status rather than raising an exception
3464         * buildbot/process/base.py (BuildRequest.mergeReasons): don't try to
3465         stringify a BuildRequest.reason that is None
3467         * buildbot/scheduler.py (BaseUpstreamScheduler.buildSetFinished):
3468         minor fix
3469         * buildbot/status/builder.py (BuildSetStatus): implement enough to
3470         allow scheduler.Dependent to work
3471         * buildbot/buildset.py (BuildSet): set .reason and .results
3473         * buildbot/test/test_interlock.py (Locks.setUp): connect both
3474         slaves, to make the test stop hanging. It still fails, of course,
3475         because I haven't even started to implement Locks.
3477         * buildbot/test/runutils.py (RunMixin.connectSlaves): new utility
3479         * docs/buildbot.texinfo (Build-Dependencies): redesign the feature
3480         * buildbot/interfaces.py (IUpstreamScheduler): new Interface
3481         * buildbot/scheduler.py (BaseScheduler): factor out common stuff
3482         (Dependent): new class for downstream build dependencies
3483         * buildbot/test/test_dependencies.py: tests (still failing)
3485         * buildbot/buildset.py (BuildSet.waitUntilSuccess): minor notes
3487 2005-07-07  Brian Warner  <warner@lothar.com>
3489         * buildbot/test/runutils.py (RunMixin): factored this class out..
3490         * buildbot/test/test_run.py: .. from here
3491         * buildbot/test/test_interlock.py: removed old c['interlock'] tests,
3492         added new buildbot.locks tests (which all hang right now)
3493         * buildbot/locks.py (SlaveLock, MasterLock): implement Locks
3494         * buildbot/process/step.py: claim/release per-BuildStep locks
3496         * docs/Makefile: add 'buildbot.html' target
3498         * buildbot/process/step.py (CVS.__init__): allow branch=None to be
3499         interpreted as "HEAD", so that all VC steps can accept branch=None
3500         and have it mean the "default branch".
3502         * docs/buildbot.texinfo: add Schedulers, Dependencies, and Locks
3504 2005-07-07  Brian Warner  <warner@lothar.com>
3506         * docs/examples/twisted_master.cfg: update to match current usage
3508         * docs/buildbot.texinfo (System Architecture): comment out the
3509         image, it doesn't exist yet and just screws up the HTML manual.
3511 2005-07-05  Brian Warner  <warner@lothar.com>
3513         * debian/.cvsignore: oops, missed one. Removing leftover file.
3515 2005-06-17  Brian Warner  <warner@lothar.com>
3517         * buildbot/test/test_vc.py (VCSupport.__init__): svn --version
3518         changed its output in 1.2.0, don't mistakenly think that the
3519         subversion we find isn't capable of supporting our tests.
3521         * debian/*: remove the debian/ directory and its contents, to make
3522         life easier for the proper Debian maintainer
3523         * MANIFEST.in: same
3524         * Makefile (release): same
3526 2005-06-07  Brian Warner  <warner@lothar.com>
3528         * everything: create a distinct SourceStamp class to replace the
3529         ungainly 4-tuple, let it handle merging instead of BuildRequest.
3530         Changed the signature of Source.startVC to include the revision
3531         information (instead of passing it through self.args). Implement
3532         branches for SVN (now only Darcs/Git is missing support). Add more
3533         Scheduler tests.
3535 2005-06-06  Brian Warner  <warner@lothar.com>
3537         * everything: rearrange build scheduling. Create a new Scheduler
3538         object (configured in c['schedulers'], which submit BuildSets to a
3539         set of Builders. Builders can now use multiple slaves. Builds can
3540         be run on alternate branches, either requested manually or driven
3541         by changes. This changed some of the Status classes. Interlocks
3542         are out of service until they've been properly split into Locks
3543         and Dependencies. treeStableTimer, isFileImportant, and
3544         periodicBuild have all been moved from the Builder to the
3545         Scheduler.
3546         (BuilderStatus.currentBigState): removed the 'waiting' and
3547         'interlocked' states, removed the 'ETA' argument.
3549 2005-05-24  Brian Warner  <warner@lothar.com>
3551         * buildbot/pbutil.py (ReconnectingPBClientFactory): Twisted-1.3
3552         erroneously abandons the connection (in clientConnectionFailed)
3553         for non-UserErrors, which means that if we lose the connection due
3554         to a network problem or a timeout, we'll never try to reconnect.
3555         Fix this by not upcalling to the buggy parent method. Note:
3556         twisted-2.0 fixes this, but the function only has 3 lines so it
3557         makes more sense to copy it than to try and detect the buggyness
3558         of the parent class. Fixes SF#1207588.
3560         * buildbot/changes/changes.py (Change.branch): doh! Add a
3561         class-level attribute to accomodate old Change instances that were
3562         pickled before 0.6.5 (where .branch was added for new Changes).
3563         This fixes the exception that occurs when you try to look at an
3564         old Change (through asHTML).
3566         * buildbot/__init__.py (version): bump to 0.6.6+ while between
3567         releases
3569 2005-05-23  Brian Warner  <warner@lothar.com>
3571         * buildbot/__init__.py (version): release 0.6.6
3573 2005-05-23  Brian Warner  <warner@lothar.com>
3575         * NEWS: update for 0.6.6 release
3576         * debian/changelog: same
3578         * buildbot/scripts/runner.py (start): put the basedir in sys.path
3579         before starting: this was done by twistd back when we spawned it,
3580         now that we're importing the pieces and running them in the
3581         current process, we have to do it ourselves. This allows
3582         master.cfg to import files from the same directory without
3583         explicitly manipulating PYTHONPATH. Thanks to Thomas Vander
3584         Stichele for the catch.
3585         (Options.opt_version): Add a --version command (actually, just make
3586         the existing --version command emit Buildbot's version too)
3588         * buildbot/status/builder.py (HTMLLogFile.upgrade): oops! second
3589         fix to make this behave like other LogFiles, this time to handle
3590         existing LogFiles on disk. (add the missing .upgrade method)
3591         * buildbot/test/test_status.py (Log.testHTMLUpgrade): test it
3593 2005-05-21  Brian Warner  <warner@lothar.com>
3595         * buildbot/test/test_runner.py (Create.testMaster): match the
3596         rawstring change in runner.py:masterTAC
3598         * buildbot/test/test_config.py (ConfigTest.testIRC): skip unless
3599         TwistedWords is installed
3600         * buildbot/test/test_status.py: same, with TwistedMail
3602         * buildbot/master.py: remove old IRC/Waterfall imports (used by
3603         some old, deprecated, and removed config keys). This should enable
3604         you to use the base buildbot functionality with Twisted-2.0.0 when
3605         you don't also have TwistedWeb and TwistedWords installed
3607 2005-05-20  Brian Warner  <warner@lothar.com>
3609         * buildbot/scripts/runner.py (run): call sendchange(), not
3610         do_sendchange(): thus 'buildbot sendchange' was broken in 0.6.5
3611         (run): call stop("HUP"), not "-HUP", 'buildbot stop' was broken.
3612         (stop): don't wait for process to die when sending SIGHUP
3613         (masterTAC): use a rawstring for basedir=, otherwise '\' in the
3614         directory name gets interpreted, which you don't want
3615         (slaveTAC): same
3617         * buildbot/__init__.py (version): bump to 0.6.5+ while between
3618         releases
3620 2005-05-18  Brian Warner  <warner@lothar.com>
3622         * buildbot/__init__.py (version): Releasing buildbot-0.6.5
3624 2005-05-18  Brian Warner  <warner@lothar.com>
3626         * README: update for 0.6.5
3627         * debian/changelog: same
3629         * buildbot/changes/changes.py: rename tag= to branch=, since
3630         that's how we're using it, and my design for the upcoming "build a
3631         specific branch" feature wants it. also, tag= was too CVS-centric
3632         * buildbot/changes/mail.py (parseSyncmail): same
3633         * buildbot/process/base.py (Build.isBranchImportant): same
3634         * buildbot/test/test_mailparse.py (Test3.testMsgS4): same
3635         * docs/buildbot.texinfo (Attributes of Changes): same
3637         * NEWS: update tag=, update for upcoming release
3639 2005-05-17  Brian Warner  <warner@lothar.com>
3641         * buildbot/scripts/runner.py (stop): actually poll once per
3642         second, instead of re-killing the poor daemon once per second.
3643         Sleep briefly (0.1s) before the first poll, since there's a good
3644         chance we can avoid waiting the full second if the daemon shuts
3645         down quickly. Also remove the sys.exit() at the end.
3646         (start): remove the unneighborly sys.exit()
3648         * Makefile: improve permission-setting to not kick Arch so badly
3650         * buildbot/scripts/runner.py (SlaveOptions.optParameters): set a
3651         default --keepalive=600, since it doesn't hurt very much, and it's
3652         a hassle to discover that you need it.
3653         * buildbot/test/test_runner.py (Create.testSlave): test it
3655         * buildbot/status/words.py (IrcStatusBot.buildFinished): Teach the
3656         IRC bot about EXCEPTION
3658         * buildbot/status/client.py (PBListener): upcall more correctly
3660         * buildbot/process/base.py (Build.allStepsDone): if a step caused
3661         an exception mark the overall build with EXCEPTION, not SUCCESS
3663         * buildbot/scripts/runner.py (makefile_sample): remove the leading
3664         newline
3665         * buildbot/status/mail.py (MailNotifier): oops, forgot to upcall
3666         * Makefile: update some release-related stuff
3668         * buildbot/slave/commands.py (ShellCommand.kill): if somehow this
3669         gets called when there isn't actually an active process, just end
3670         the Command instead of blowing up. I don't know how it gets into
3671         this state, but the twisted win32 buildslave will sometimes hang,
3672         and when it shakes its head and comes back, it thinks it's still
3673         running a Command. The next build causes this command to be
3674         interrupted, but the lack of self.process.pid breaks the interrupt
3675         attempt.
3677         * NEWS: document changes since the last release
3679         * buildbot/scripts/runner.py (start): change 'buildbot start' to
3680         look for Makefile.buildbot instead of a bare Makefile . The
3681         'buildbot start' does not install this file, so you have to
3682         manually copy it if you want to customize startup behavior.
3683         (createMaster): change 'buildbot master' command to create
3684         Makefile.sample instead of Makefile, to create master.cfg.sample
3685         instead of master.cfg (requiring you to copy it before the
3686         buildmaster can be started). Both sample files are kept up to
3687         date, i.e. they are overwritten if they have been changed. The
3688         'buildbot.tac' file is *not* overwritten, but if the new contents
3689         don't match the old, a 'buildbot.tac.new' file is created and the
3690         user is warned. This seems to be a much more sane way to handle
3691         startup files. Also, don't sys.exit(0) when done, so we can run
3692         unit tests against it.
3693         (createSlave): same. Don't overwrite the sample info/ files.
3694         * buildbot/scripts/sample.mk: remove. the contents were pulled
3695         into runner.py, since they need to match the behavior of start()
3696         * setup.py: same
3697         * MANIFEST.in: same
3699         * docs/buildbot.texinfo (Launching the daemons): document it
3700         * buildbot/test/test_runner.py (Create): test it
3702         * buildbot/test/test_vc.py (SetupMixin.failUnlessIn): Add a
3703         version that can handle string-in-string tests, because otherwise
3704         python-2.2 fails the tests. It'd be tremendous if Trial's test
3705         took two strings under 2.2 too.
3707         * everything: fixed all deprecation warnings when running against
3708         Twisted-2.0 . (at least all the ones in buildbot code, there are a
3709         few that come from Twisted itself). This involved putting most of
3710         the Twisted-version specific code in the new buildbot.twcompat
3711         module, and creating some abstract base classes in
3712         buildbot.changes.base and buildbot.status.base (which might be
3713         useful anyway). __implements__ is a nuisance and requires an ugly
3714         'if' clause everywhere.
3716         * buildbot/test/test_status.py (Mail.testMail): add a 0.1 second
3717         delay before finishing the test: it seems that smtp.sendmail
3718         doesn't hang up on the server, so we must wait a moment so it can
3719         hang up on us. This removes the trial warning about an unclean
3720         reactor.
3722 2005-05-16  Brian Warner  <warner@lothar.com>
3724         * buildbot/process/step.py (Source): add 'retry' argument. It is a
3725         tuple of (delay, repeats).
3726         * buildbot/test/test_vc.py (Retry): test it
3727         * docs/buildbot.texinfo (Source Checkout): document it
3728         * buildbot/slave/commands.py (SourceBase): add 'retry' parameter.
3729         (SourceBase.maybeDoVCRetry): If 'retry' is set, failures in
3730         doVCFull() are handled by re-trying the checkout (after a delay)
3731         some number of times.
3732         (ShellCommand._startCommand): make header lines easier to read
3734         * buildbot/test/test_web.py (WebTest.tearDown): factor out master
3735         shutdown
3736         (WebTest.test_logfile): make sure master gets shut down, silences
3737         some "unclean reactor" test errors
3739         * buildbot/test/test_changes.py (Sender.tearDown): spin the
3740         reactor once after shutdown, something in certain versions of
3741         Twisted trigger a test failure. 1.3.0 is ok, 2.0.0 fails, 2.0.1pre
3742         fails, svn-trunk is ok.
3744         * buildbot/test/test_slavecommand.py (Shell.testShellZ): add a
3745         second win32 error message
3747         * buildbot/test/test_run.py (Status.testSlave): be smarter about
3748         validating the ETA, so the tests don't fail on slow systems
3750 2005-05-15  Brian Warner  <warner@lothar.com>
3752         * buildbot/status/builder.py (HTMLLogFile): make this behave like
3753         the new LogFile class, so upgrading works properly
3754         (LogFileProducer.resumeProducing): survive resumeProducing after
3755         we've exhausted the chunkGenerator
3757         * buildbot/test/test_web.py (WebTest.test_logfile): validate HTML
3758         logs too
3759         * buildbot/test/test_status.py (Log.testAdd): validate hasContents
3760         (Log.testUpgrade): same
3762         * docs/buildbot.texinfo (Maintenance): describe how to delete old
3763         Builds and logs with a cron job.
3765         * buildbot/status/builder.py (LogFile): revamp LogFiles. Got rid
3766         of the old non-offline LogFile, added code to upgrade these to
3767         new-style contents-live-on-disk instances at load time (in a way
3768         that doesn't invalidate the old Build pickles, so upgrading to
3769         0.6.5 is not a one-way operation). Got rid of everything related
3770         to 'stub' builds.
3771         (LogFile.__init__): create LogFiles with the parent step status,
3772         the log's name, and a builder-relative filename where it can keep
3773         the contents on disk.
3774         (LogFile.hasContents): new method, clients are advised to call it
3775         before getText or getChunks and friends. If it returns False, the
3776         log's contents have been deleted and getText() will raise an
3777         error.
3778         (LogFile.getChunks): made it a generator
3779         (LogFile.subscribeConsumer): new method, takes a Twisted-style
3780         Consumer (except one that takes chunks instead of strings). This
3781         enables streaming of very large logfiles without storing the whole
3782         thing in memory.
3783         (BuildStatus.generateLogfileName): create names like
3784         12-log-compile-output, with a _0 suffix if required to be unique
3785         (BuildStatus.upgradeLogfiles): transform any old-style (from 0.6.4
3786         or earlier) logfiles into new-style ones
3787         (BuilderStatus): remove everything related to 'stub' builds. There
3788         is now only one build cache, and we don't strip logs from old
3789         builds anymore.
3790         (BuilderStatus.getBuildByNumber): check self.currentBuild too,
3791         since we no longer fight to keep it in the cache
3793         * buildbot/status/html.py (TextLog.render_GET): use a
3794         ChunkConsumer to stream the log entries efficiently.
3795         (ChunkConsumer): wrapper which consumes chunks and writes
3796         formatted HTML.
3798         * buildbot/test/test_twisted.py (Parse.testParse): use a
3799         LogFile-like object instead of a real one
3801         * buildbot/test/test_status.py (MyLog): handle new LogFile code
3802         (Log.testMerge3): validate more merge behavior
3803         (Log.testChunks): validate LogFile.getChunks
3804         (Log.testUpgrade): validate old-style LogFile upgrading
3805         (Log.testSubscribe): validate LogFile.subscribe
3806         (Log.testConsumer): validate LogFile.subscribeConsumer
3808         * buildbot/interfaces.py (IStatusLogStub): remove
3809         (IStatusLog.subscribeConsumer): new method
3810         (IStatusLog.hasContents): new method
3811         (IStatusLogConsumer): describes things passed to subscribeConsumer
3813         * buildbot/status/html.py (StepBox.getBox): Don't offer an href to
3814         the log contents if it does not have any contents.
3815         (StatusResourceBuildStep.body): same
3816         (StatusResourceBuildStep.getChild): give a 404 for empty logs
3818 2005-05-14  Brian Warner  <warner@lothar.com>
3820         * buildbot/test/test_web.py (WebTest.test_logfile): add 5-second
3821         timeouts to try and make the windows metabuildslave not hang
3823 2005-05-13  Mike Taylor  <bear@code-bear.com>
3825         * buildbot/slave/commands.py (rmdirRecursive): added a check
3826         to ensure the path passed into rmdirRecursive actually exists.
3827         On win32 a non-existant path would generate an exception.
3829 2005-05-13  Brian Warner  <warner@lothar.com>
3831         * buildbot/slave/commands.py (rmdirRecursive): replacement for
3832         shutil.rmtree which behaves correctly on windows in the face of
3833         files that you have to chmod before deleting. Thanks to Bear at
3834         the OSAF for the routine.
3835         (SourceBase.doClobber): use rmdirRecursive
3837 2005-05-12  Brian Warner  <warner@lothar.com>
3839         * buildbot/status/builder.py (OfflineLogFile.getChunks): have this
3840         method generate chunks instead of returning a big list. This
3841         allows the same method to be used for both old LogFile and new
3842         OfflineLogFile.
3843         (OfflineLogFile.getText): use the generator
3844         (OfflineLogFile.subscribe): same
3845         * buildbot/status/html.py (TextLog.resumeProducing): same
3846         * buildbot/interfaces.py (IStatusLog.getChunks): document it
3848         * buildbot/test/test_web.py (WebTest.test_logfile): Add a test to
3849         point out that OfflineLogFile does not currently work with
3850         html.Waterfall . Fixing this is high-priority.
3852         * buildbot/scripts/runner.py (start): add --logfile=twistd.log, since
3853         apparently windows defaults to using stdout
3855         * buildbot/test/test_slavecommand.py (Shell.testShellZ): log a
3856         better message on failure so I can figure out the win32 problem
3858         * buildbot/slave/commands.py (ShellCommand._startCommand): update
3859         log messages to include more useful copies of the command being
3860         run, the argv array, and the child command's environment.
3861         (Git.doVCFull): update cg-close usage, patch from Brandon Philips.
3863 2005-05-11  Brian Warner  <warner@lothar.com>
3865         * setup.py: oops, install debug.glade so 'buildbot debugclient'
3866         will actually work
3867         * Makefile: update the deb-snapshot version
3869         * docs/buildbot.texinfo: move all .xhtml docs into a new
3870         .texinfo-format document, adding a lot of material in the process.
3871         This is starting to look like a real user's manual. Removed all
3872         the Lore-related files: *.xhtml, *.css, template.tpl .
3873         * docs/Makefile: simple makefile to run 'makeinfo'
3874         * buildbot/scripts/sample.cfg: rearrange slightly
3875         * MANIFEST.in: include .info and .textinfo, don't include *.xhtml
3877 2005-05-10  Brian Warner  <warner@lothar.com>
3879         * buildbot/scripts/runner.py (start): Twisted-1.3.0 used a
3880         different name for the internal twistw module, handle it.
3882         * MANIFEST.in: we deleted plugins.tml, so stop shipping it
3883         * setup.py: .. and stop trying to install it
3885         * buildbot/process/step.py (Git): added support for 'cogito' (aka
3886         'git'), the new linux kernel VC system (http://kernel.org/git/).
3887         Thanks to Brandon Philips for the patch.
3888         * buildbot/slave/commands.py (Git): same
3890 2005-05-06  Brian Warner  <warner@lothar.com>
3892         * buildbot/status/builder.py (OfflineLogFile): replace the default
3893         LogFile with a form that appends its new contents to a disk file
3894         as they arrive. The complete log data is never kept in RAM. This
3895         is the first step towards handling very large (100MB+) logfiles
3896         without choking quite so badly. (The other half is
3897         producer/consumer on the HTML pages).
3898         (BuildStepStatus.addLog): use OfflineLogFile by default
3899         (BuildStatus.getLogfileName): helper code to give the
3900         OfflineLogFile a filename to work with
3902         * buildbot/test/test_status.py (Results.testAddResults): update
3903         tests to handle new asserts
3904         * buildbot/test/test_vc.py (Patch.doPatch): same
3905         * buildbot/test/test_steps.py (BuildStep.setUp): same
3907 2005-05-05  Brian Warner  <warner@lothar.com>
3909         * buildbot/scripts/runner.py (start): if there is no Makefile,
3910         launch the app by importing twistd's internals and calling run(),
3911         rather than spawning a new twistd process. This stands a much
3912         better chance of working under windows.
3913         (stop): kill the process with os.kill instead of spawning
3914         /bin/kill, again to reduce the number of external programs which
3915         windows might not have in the PATH. Also wait up to 5 seconds for
3916         the process to go away, allowing things like 'buildbot stop;
3917         buildbot start' to be reliable in the face of slow shutdowns.
3919         * buildbot/master.py (Dispatcher.__getstate__): remove old
3920         .tap-related methods
3921         (BuildMaster.__getstate__): same
3922         (makeService): same
3923         * buildbot/slave/bot.py (makeService): same
3924         (Options.longdesc): same
3925         * buildbot/scripts/runner.py: copy over some old mktap option text
3927         * buildbot/scripts/runner.py (masterTAC): stop using mktap.
3928         'buildbot master' now creates a buildbot.tac file, so there is no
3929         longer a create-instance/save/reload sequence. mktap is dead, long
3930         live twistd -y.
3931         * buildbot/scripts/sample.mk: use twistd -y, not -f
3932         * buildbot/test/test_config.py: remove mktap-based test
3933         * buildbot/bb_tap.py, buildbot/plugins.tml: delete old files
3934         * README: don't reference mktap
3936         * docs/source.xhtml: document some of the attributes that Changes
3937         might have
3939         * docs/steps.xhtml (Bazaar): document the Bazaar checkout step
3941         * general: merge in Change(tag=) patch from Thomas Vander Stichele.
3942         [org.apestaart@thomas--buildbot/buildbot--cvstag--0-dev--patch-2]
3943         * buildbot/changes/changes.py (Change)
3944         * buildbot/changes/mail.py (parseSyncmail)
3945         * buildbot/test/test_mailparse.py (Test3.getNoPrefix)
3946         (Test3.testMsgS5)
3947         * buildbot/process/base.py (Build.isTagImportant)
3948         (Build.addChange)
3951 2005-05-04  Brian Warner  <warner@lothar.com>
3953         * buildbot/clients/sendchange.py (Sender.send): tear down the PB
3954         connection after sending the change, so that unit tests don't
3955         complain about sockets being left around
3957         * buildbot/status/html.py (WaterfallStatusResource.body): fix
3958         exception in phase=0 rendering
3959         * buildbot/test/test_web.py (WebTest.test_waterfall): test it
3961         * buildbot/changes/dnotify.py (DNotify.__init__): remove debug msg
3963         * buildbot/master.py (BuildMaster.loadConfig): finally remove
3964         deprecated config keys: webPortnum, webPathname, irc, manholePort,
3965         and configuring builders with tuples.
3966         * buildbot/test/test_config.py: stop testing compatibility with
3967         deprecated config keys
3968         * buildbot/test/test_run.py: same
3970 2005-05-03  Brian Warner  <warner@lothar.com>
3972         * contrib/arch_buildbot.py: survive if there are no logfiles
3973         (username): just use a string, os.getlogin isn't reliable
3975         * buildbot/scripts/runner.py (sendchange): oops, fix the command
3976         so 'buildbot sendchange' actually works. The earlier test only
3977         covered the internal (non-reactor-running) form.
3979         * contrib/arch_buildbot.py: utility that can run as an Arch hook
3980         script to notify the buildmaster about changes
3982         * buildbot/scripts/runner.py (sendchange): new command to send a
3983         change to a buildbot.changes.pb.PBChangeSource receiver.
3984         * buildbot/test/test_changes.py (Sender): test it
3986         * buildbot/master.py (BuildMaster.startService): mark .readConfig
3987         after any reading of the config file, not just when we do it in
3988         startService. This makes some tests a bit cleaner.
3990         * buildbot/changes/pb.py: add some log messages
3992         * buildbot/process/base.py (Build.startBuild): fix a bug that
3993         caused an exception when the build terminated in the very first
3994         step.
3995         (Build.stepDone): let steps return a status of EXCEPTION. This
3996         terminates the build right away, and sets the build's overall
3997         status to EXCEPTION too.
3998         * buildbot/process/step.py (BuildStep.failed): return a status of
3999         EXCEPTION when that is what has happened.
4001         * buildbot/process/step.py (Arch.computeSourceRevision): finally
4002         implement this, allowing Arch-based projects to get precise
4003         checkouts instead of always using the latest code
4004         (Bazaar): create variant of Arch to let folks use baz instead of
4005         tla. Requires a new buildslave too.
4006         * buildbot/slave/commands.py (Arch): add 'revision' argument
4007         (Bazaar): create variant of Arch that uses baz instead of tla.
4008         Remove the code that extracts the archive name from the
4009         register-archive output, since baz doesn't provide it, and require
4010         the user provide both the archive name and its location.
4011         * buildbot/test/test_vc.py (VC.testBazaar): added tests
4013 2005-05-02  Brian Warner  <warner@lothar.com>
4015         * buildbot/scripts/sample.cfg: improve docs for c['buildbotURL'],
4016         thanks to Nick Trout.
4018         * buildbot/scripts/runner.py (Maker.makefile): chmod before edit,
4019         deals better with source Makefile coming from a read-only CVS
4020         checkout. Thanks to Nick Trout for the catch.
4022         * buildbot/__init__.py (version): bump to 0.6.4+ while between
4023         releases
4025 2005-04-28  Brian Warner  <warner@lothar.com>
4027         * buildbot/__init__.py (version): Releasing buildbot-0.6.4
4029         * debian/changelog: update for 0.6.4
4031 2005-04-28  Brian Warner  <warner@lothar.com>
4033         * README.w32: add a checklist of steps for getting buildbot
4034         running on windows.
4035         * MANIFEST.in: include it in the tarball
4037         * NEWS: update
4039         * buildbot/master.py (BuildMaster.upgradeToVersion3): deal with
4040         broken .tap files from 0.6.3 by getting rid of .services,
4041         .namedServices, and .change_svc at load time.
4043 2005-04-27  Brian Warner  <warner@lothar.com>
4045         * NEWS: update in preparation for new release
4047         * buildbot/test/test_config.py (Save.testSave): don't pull in
4048         twisted.scripts.twistd, we don't need it and it isn't for windows
4049         anyway.
4051         * buildbot/changes/changes.py (ChangeMaster.saveYourself):
4052         accomodate win32 which can't do atomic-rename
4054 2005-04-27  Brian Warner  <warner@lothar.com>
4056         * buildbot/test/test_run.py (Disconnect.testBuild2): crank up some
4057         timeouts to help the slow metabuildbot not flunk them so much
4058         (Disconnect.testBuild3): same
4059         (Disconnect.testBuild4): same
4060         (Disconnect.testInterrupt): same
4062         * buildbot/master.py (BuildMaster.loadChanges): fix change_svc
4063         setup, it was completely broken for new buildmasters (those which
4064         did not have a 'change.pck' already saved. Thanks to Paul Warren
4065         for catching this (embarrassing!) bug.
4066         (Dispatcher.__getstate__): don't save our registered avatar
4067         factories, since they'll be re-populated when the config file is
4068         re-read.
4069         (BuildMaster.__init__): add a dummy ChangeMaster, used only by
4070         tests (since the real mktap-generated BuildMaster doesn't save
4071         this attribute).
4072         (BuildMaster.__getstate__): don't save any service children,
4073         they'll all be re-populated when the config file is re-read.
4074         * buildbot/test/test_config.py (Save.testSave): test for this
4076 2005-04-26  Brian Warner  <warner@lothar.com>
4078         * buildbot/buildbot.png: use a new, smaller (16x16) icon image,
4079         rendered with Blender.. looks a bit nicer.
4080         * buildbot/docs/images/icon.blend: add the Blender file for it
4082         * buildbot/slave/commands.py (ShellCommand._startCommand): prepend
4083         'cmd.exe' (or rather os.environ['COMSPEC']) to the argv list when
4084         running under windows. This appears to be the best way to allow
4085         BuildSteps to do something normal like 'trial -v buildbot.test' or
4086         'make foo' and still expect it to work. The idea is to make the
4087         BuildSteps look as much like what a developer would type when
4088         compiling or testing the tree by hand. This approach probably has
4089         problems when there are spaces in the arguments, so if you've got
4090         windows buildslaves, you'll need to pay close attention to your
4091         commands.
4093         * buildbot/status/html.py (WaterfallStatusResource.body): add the
4094         timezone to the timestamp column.
4095         * buildbot/test/test_web.py (WebTest.test_waterfall): test it
4097         * buildbot/scripts/runner.py (loadOptions): do something sane for
4098         windows, I think. We use %APPDATA%/buildbot instead of
4099         ~/.buildbot, but we still search everywhere from the current
4100         directory up to the root for a .buildbot/ subdir. The "is it under
4101         $HOME" security test was replaced with "is it owned by the current
4102         user", which is only performed under posix.
4103         * buildbot/test/test_runner.py (Options.testFindOptions): update
4104         tests to match. The "is it owned by the current user" check is
4105         untested. The test has been re-enabled for windows.
4107         * buildbot/test/test_slavecommand.py (Shell.checkOutput): replace
4108         any "\n" in the expected output with the platform-specific line
4109         separator. Make this separator "\r\n" on PTYs under unix, they
4110         seem to do that and I don't know why
4112         * buildbot/test/test_runner.py (Options.optionsFile): disable on
4113         windows for now, I don't know what ~/.buildbot/ should mean there.
4115         * buildbot/test/test_run.py (BuilderNames.testGetBuilderNames):
4116         win32 compatibility, don't use "/tmp"
4117         (Basedir.testChangeBuilddir): remove more unixisms
4119 2005-04-26  Brian Warner  <warner@lothar.com>
4121         * buildbot/test/test_control.py (Force.rmtree): python2.2
4122         compatibility, apparently its shutil.rmtree ignore_errors=
4123         argument is ignored.
4124         * buildbot/test/test_run.py (Run.rmtree): same
4125         (RunMixin.setUp): same
4127         * buildbot/test/test_runner.py (make): python2.2 has os.sep but
4128         not os.path.sep
4130         * buildbot/test/test_twisted.py (Parse.failUnlessIn): 2.2 has no
4131         'substring in string' operator, must use string.find(substr)!=-1
4132         * buildbot/test/test_vc.py (Patch.failUnlessIn): same
4133         * buildbot/test/test_web.py (WebTest.failUnlessIn): same
4135         * buildbot/scripts/runner.py (loadOptions): add code to search for
4136         ~/.buildbot/, a directory with things like 'options', containing
4137         defaults for various 'buildbot' subcommands. .buildbot/ can be in
4138         the current directory, your $HOME directory, or anywhere
4139         inbetween, as long as you're somewhere inside your home directory.
4140         (debugclient): look in ~/.buildbot/options for master and passwd
4141         (statuslog): look in ~/.buildbot/options for 'masterstatus'
4142         * buildbot/test/test_runner.py (Options.testFindOptions): test it
4144         * buildbot/status/client.py (makeRemote): new approach to making
4145         IRemote(None) be None, which works under Twisted-2.0
4146         * buildbot/test/test_status.py (Client.testAdaptation): test it
4148         * buildbot/status/builder.py (Status.builderAdded): when loading a
4149         pickled BuilderStatus in from disk, set its name after loading.
4150         The config file might have changed its name (but not its
4151         directory) while it wasn't looking.
4152         
4153         * buildbot/process/builder.py (Builder.attached): always return a
4154         Deferred, even if the builder was already attached
4155         * buildbot/test/test_run.py (Basedir.testChangeBuilddir): test it
4157 2005-04-25  Brian Warner  <warner@lothar.com>
4159         * buildbot/status/words.py (IrcStatusBot.buildFinished): fix a
4160         category-related exception when announcing a build has finished
4162         * buildbot/status/html.py (StatusResourceChanges.body): oops, don't
4163         reference no-longer-existent changemaster.sources
4164         * buildbot/test/test_web.py (WebTest.test_waterfall): test for it
4166         * buildbot/__init__.py (version): bump to 0.6.3+ while between
4167         releases
4169 2005-04-25  Brian Warner  <warner@lothar.com>
4171         * buildbot/__init__.py (version): Releasing buildbot-0.6.3
4173         * debian/changelog: update for 0.6.3
4175 2005-04-25  Brian Warner  <warner@lothar.com>
4177         * MANIFEST.in: make sure debug.glade is in the tarball
4179         * README (REQUIREMENTS): list necessary Twisted-2.0 packages
4181         * NEWS: update for the imminent 0.6.3 release
4183         * buildbot/status/html.py (HtmlResource.content): make the
4184         stylesheet <link> always point at "buildbot.css".
4185         (StatusResource.getChild): map "buildbot.css" to a static.File
4186         containing whatever css= argument was provided to Waterfall()
4187         (Waterfall): provide the "classic" css as the default.
4188         * docs/waterfall.classic.css: move default CSS from here ..
4189         * buildbot/status/classic.css: .. to here
4191         * MANIFEST.in: make sure classic.css is included in the tarball
4192         * setup.py: and that it is installed too, under buildbot/status/
4194         * buildbot/master.py (BuildMaster): oops, set .change_svc=None at
4195         the module level, because buildbot.tap files from 0.6.2 don't have
4196         it in their attribute dictionary.
4198         * buildbot/slave/bot.py (Bot.startService): make sure the basedir
4199         really exists at startup, might save some confusion somewhere.
4201 2005-04-24  Thomas Vander Stichele  <thomas at apestaart dot org>
4203         * docs/waterfall.classic.css:
4204           add a stylesheet that's almost the same as the "classic"
4205           buildbot style
4207         * buildbot/status/builder.py:
4208           add EXCEPTION as a result - this is a problem for the bot
4209           maintainer, not a build problem for the changers
4210         * buildbot/process/step.py:
4211           use EXCEPTION instead of FAILURE for exceptions
4212         * buildbot/status/html.py:
4213           add build_get_class to get a class out of a build/buildstep
4214           finish naming the classes
4215           split out sourceNames to changeNames and builderNames so we
4216           can style them separately
4217         * docs/config.xhtml:
4218           finish documenting classes as they are right now
4220         * buildbot/status/html.py:
4221           name the classes as we agreed on IRC
4222         * docs/config.xhtml:
4223           and document them
4225         * buildbot/status/html.py:
4226           same for cssclass->class_
4228         * buildbot/status/html.py:
4229           as decided on IRC, use class_ for the "class" attribute to not
4230           conflict with the class keyword, and clean up the messy **{} stuff.
4232         * buildbot/status/mail.py:
4233           put back "builders" argument, and fix docstring, because the
4234           code *ignores* builders listed in this argument
4236         * buildbot/process/builder.py:
4237           remove FIXME notes - category is now indeed a cvar of BuilderStatus
4239         * docs/config.xhtml:
4240           describe the category argument for builders
4242         * buildbot/status/builder.py:
4243           Fix a silly bug due to merging
4245         * buildbot/process/builder.py:
4246           remove category from the process Builder ...
4247         * buildbot/status/builder.py:
4248           ... and add it to BuilderStatus instead.
4249           Set category on unpickled builder statuses, they might not have it.
4250         * buildbot/master.py:
4251           include category when doing builderAdded
4252         * buildbot/status/mail.py:
4253           return None instead of self for builders we are not interested in.
4254         * buildbot/test/test_run.py:
4255           fix a bug due to only doing deferredResult on "dummy" waiting
4256         * buildbot/test/test_status.py:
4257           add checks for the Mail IStatusReceiver returning None or self
4259         * buildbot/status/html.py:
4260           fix testsuite by prefixing page title with BuildBot
4262         * buildbot/status/builder.py:
4263           have .category in builder status ...
4264         * buildbot/process/builder.py:
4265           ... and set it from Builder
4266         * buildbot/status/html.py:
4267           make .css a class variable 
4268         * buildbot/test/test_status.py:
4269           write more tests to cover our categories stuff ...
4270         * buildbot/status/mail.py:
4271           ... and fix the bug that this uncovered
4273         * buildbot/changes/mail.py:
4274         * buildbot/changes/pb.py:
4275         * buildbot/master.py:
4276         * buildbot/process/base.py:
4277         * buildbot/process/factory.py:
4278         * buildbot/process/interlock.py:
4279         * buildbot/process/step.py:
4280         * buildbot/process/step_twisted.py:
4281         * buildbot/slave/commands.py:
4282         * buildbot/status/builder.py:
4283         * buildbot/status/client.py:
4284         * buildbot/status/html.py:
4285         * buildbot/status/mail.py:
4286         * buildbot/status/progress.py:
4287         * buildbot/test/test_changes.py:
4288         * buildbot/test/test_config.py:
4289         * buildbot/test/test_control.py:
4290         * buildbot/test/test_interlock.py:
4291         * buildbot/test/test_maildir.py:
4292         * buildbot/test/test_mailparse.py:
4293         * buildbot/test/test_run.py:
4294         * buildbot/test/test_slavecommand.py:
4295         * buildbot/test/test_status.py:
4296         * buildbot/test/test_steps.py:
4297         * buildbot/test/test_twisted.py:
4298         * buildbot/test/test_util.py:
4299         * buildbot/test/test_vc.py:
4300         * buildbot/test/test_web.py:
4301         * buildbot/util.py:
4302           add test-case-name at the top of a whole set of files
4304         * buildbot/status/builder.py:
4305           keep order of addition when getting builder names
4306         * buildbot/status/words.py:
4307         * buildbot/test/test_run.py:
4308           add test for getBuilderNames
4310         * buildbot/process/base.py:
4311         * buildbot/process/step.py:
4312         * buildbot/status/builder.py:
4313         * buildbot/status/html.py:
4314           make buildbot css-able
4315           replace the color code for purple with purple, don't understand
4316           why it wasn't purple to start with
4318         * buildbot/status/words.py:
4319           ok, so it doesn't look like BuilderStatus.remote is still valid.
4320           Use what waterfall uses instead.
4322         * buildbot/interfaces.py:
4323         * buildbot/status/builder.py:
4324         * buildbot/status/html.py:
4325         * buildbot/status/mail.py:
4326         * buildbot/status/words.py:
4327         * buildbot/test/test_run.py:
4328           use categories everywhere and make it be a list.  More sensible
4329           for the future.  Also make words actually respect this in
4330           buildFinished.
4332         * buildbot/interfaces.py:
4333           add category argument to getBuilderNames
4334         * buildbot/process/builder.py:
4335         * buildbot/status/builder.py:
4336         * buildbot/status/html.py:
4337         * buildbot/status/mail.py:
4338         * buildbot/status/words.py:
4339         * buildbot/test/test_run.py:
4340           move from specifying builders by name to specifying the category
4342         * buildbot/status/html.py:
4343         * buildbot/status/words.py:
4344           add "builders=" to __init__ of status clients so they can
4345           limit themselves to the given list of builders to report on
4347         * buildbot/status/html.py: set the title to the product name
4349 2005-04-23  Thomas Vander Stichele  <thomas at apestaart dot org>
4351         * buildbot/interfaces.py:
4352         * buildbot/status/builder.py:
4353           more documentation.  Hm, not sure if ChangeLog entries make sense
4354           here...
4356 2005-04-23  Brian Warner  <warner@lothar.com>
4358         * buildbot/test/test_vc.py (SetupMixin.do_vc): increase timeouts
4360         * buildbot/test/test_slavecommand.py (Shell): increase timeouts
4362         * buildbot/scripts/runner.py: make 'statuslog' and 'statusgui' be
4363         the sub-commands that log buildmaster status to stdout and to a
4364         GUI window, respectively.
4366         * buildbot/clients/gtkPanes.py: overhaul. basic two-row
4367         functionality is working again, but all the step-status and ETA
4368         stuff is missing. Commented out a lot of code pending more
4369         overhaul work.
4371         * buildbot/status/client.py: make sure that IRemote(None) is None
4373         * buildbot/changes/changes.py: import defer, oops
4374         (ChangeMaster): remove the .sources list, rely upon the fact that
4375         MultiServices can be treated as sequences of their children. This
4376         cleans up the add/remove ChangeSource routines a lot, as we keep
4377         exactly one list of the current sources instead of three.
4379         * buildbot/master.py (BuildMaster.__init__): remove .sources, set
4380         up an empty ChangeMaster at init time.
4381         (BuildMaster.loadChanges): if there are changes to be had from
4382         disk, replace self.change_svc with the new ones. If not, keep
4383         using the empty ChangeMaster set up in __init__.
4384         (BuildMaster.loadConfig_Sources): use list(self.change_svc)
4385         instead of a separate list, makes the code a bit cleaner.
4386         * buildbot/test/test_config.py (ConfigTest.testSimple): match it
4387         (ConfigTest.testSources): same, also wait for loadConfig to finish.
4388         Extend the test to make sure we can get rid of the sources when
4389         we're done.
4391 2005-04-22  Brian Warner  <warner@lothar.com>
4393         * buildbot/scripts/runner.py (Maker.mkinfo): create the info/admin
4394         and info/host files when making the slave directory
4396         * buildbot/test/test_run.py (RunMixin.shutdownSlave): remove the
4397         whendone= argument, just return the Deferred and let the caller do
4398         what they want with it.
4399         (Disconnect.testBuild1): wait for shutdownSlave
4400         (Basedir.testChangeBuilddir): new test to make sure changes to the
4401         builddir actually get propagated to the slave
4403         * buildbot/slave/bot.py (SlaveBuilder.setBuilddir): use an
4404         explicit method, rather than passing the builddir in __init__ .
4405         Make sure to update self.basedir too, this was broken before.
4406         (Bot.remote_setBuilderList): use b.setBuilddir for both new
4407         builders and for ones that have just had their builddir changed.
4408         (BotFactory): add a class-level .perspective attribute, so
4409         BuildSlave.waitUntilDisconnected won't get upset when the
4410         connection hasn't yet been established
4411         (BuildSlave.__init__): keep track of the bot.Bot instance, so
4412         tests can reach through it to inspect the SlaveBuilders
4414         * buildbot/process/base.py (Build.buildException): explain the
4415         log.err with a log.msg
4416         * buildbot/process/builder.py (Builder.startBuild): same
4417         (Builder._startBuildFailed): improve error message
4419         * buildbot/pbutil.py (RBCP.failedToGetPerspective): if the failure
4420         occurred because we lost the brand-new connection, retry instead
4421         of giving up. If not, it's probably an authorization failure, and
4422         it makes sense to stop trying. Make sure we log.msg the reason
4423         that we're log.err'ing the failure, otherwise test failures are
4424         really hard to figure out.
4426         * buildbot/master.py: change loadConfig() to return a Deferred
4427         that doesn't fire until the change has been fully implemented.
4428         This means any connected slaves have been updated with the new
4429         builddir. This change makes it easier to test the code which
4430         actually implements this builddir-updating.
4431         (BotPerspective.addBuilder): return Deferred
4432         (BotPerspective.removeBuilder): same
4433         (BotPerspective.attached): same
4434         (BotPerspective._attached): same. finish with remote_print before
4435         starting the getSlaveInfo, instead of doing them in parallel
4436         (BotPerspective.list_done): same
4437         (BotMaster.removeSlave): same. Fix the typo that meant we weren't
4438         actually calling slave.disconnect()
4439         (BotMaster.addBuilder): same
4440         (BotMaster.removeBuilder): same
4441         (BuildMaster.loadConfig): same
4442         (BuildMaster.loadConfig_Slaves): same
4443         (BuildMaster.loadConfig_Sources): same
4444         (BuildMaster.loadConfig_Builders): same
4445         (BuildMaster.loadConfig_status): same
4447         * buildbot/changes/changes.py (ChangeMaster.removeSource): return
4448         a Deferred that fires when the source is finally removed
4450         * buildbot/slave/commands.py (SourceBase.doClobber): when removing
4451         the previous tree on win32, where we have to do it synchronously,
4452         make sure we return a Deferred anyway.
4453         (SourceBase.doCopy): same
4455         * buildbot/scripts/runner.py (statusgui): use the text client for
4456         now, while I rewrite the Gtk one
4457         * buildbot/clients/base.py: strip out old code, leaving just the
4458         basic print-message-on-event functionality. I also remove the
4459         ReconnectingPBClientFactory, but it does at least quit when it
4460         loses the connection instead of going silent
4462 2005-04-21  Brian Warner  <warner@lothar.com>
4464         * Makefile: minor tweaks
4466         * NEWS: point out deprecation warnings, new features for
4467         /usr/bin/buildbot
4469         * buildbot/master.py (BuildMaster.loadConfig): emit
4470         DeprecationWarnings for Builders defined with tuples. Rearrange
4471         code to facility removal of deprecated configuration keys in the
4472         next release.
4474         * buildbot/scripts/runner.py (createMaster,createSlave): rewrite
4475         'buildbot' command to put a little Makefile in the target that
4476         helps you re-create the buildbot.tap file, start or stop the
4477         master/slave, and reconfigure (i.e. SIGHUP) the master. Also chmod
4478         all the files 0600, since they contain passwords.
4479         (start): if there is a Makefile, and /usr/bin/make exists, use
4480         'make start' in preference to a raw twistd command. This lets
4481         slave admins put things like PYTHONPATH variables in their
4482         Makefiles and have them still work when the slave is started with
4483         'buildbot start ~/slave/foo'. The test is a bit clunky, it would
4484         be nice to first try the 'make' command and only fall back to
4485         twistd if it fails. TODO: the Makefile's "start" command does not
4486         add the --reactor=win32 argument when running under windows.
4487         (Options.debugclient, Options.statusgui): add sub-commands to launch
4488         the debug client (formerly in contrib/debugclient.py) and the
4489         Gtk status application (currently broken)
4490         * buildbot/clients/debug.py: move from contrib/debugclient.py
4491         * buildbot/clients/debug.glade: same
4493         * buildbot/test/test_trial.py: remove it. This requires some
4494         functionality out of Twisted that isn't there yet, and until then
4495         having it around just confuses things.
4497         * buildbot/test/test_slavecommand.py (Shell): test both with and
4498         without PTYs, and make sure that command output is properly
4499         interleaved in the with-PTY case. I think the without-PTY test
4500         should pass on windows, where we never use PTYs anyway.
4502 2005-04-20  Brian Warner  <warner@lothar.com>
4504         * README (REQUIREMENTS): mention Twisted-2.0.0 compatibility
4506         * MANIFEST.in: add epyrun, gen-reference, buildbot.png
4508         * NEWS: start creating entries for the next release
4510         * buildbot/slave/commands.py (ShellCommand.__init__): use os.pathsep
4512         * buildbot/test/test_web.py (WebTest.test_webPortnum): add timeout
4513         (WebTest.test_webPathname): same
4514         (WebTest.test_webPathname_port): same
4515         (WebTest.test_waterfall): use the default favicon rather than
4516         rooting around the filesystem for it. Open the expected-icon file
4517         in binary mode, to make win32 tests happier (thanks to Nick Trout
4518         for the catch)
4519         * buildbot/status/html.py (buildbot_icon): win32 portability
4521         * buildbot/test/test_slavecommand.py (SlaveCommandTestCase.testShellZ):
4522         win32-compatibility fixes from Nick Trout, the "file not found" message
4523         is different under windows
4524         (FakeSlaveBuilder.__init__): clean up setup a bit
4525         * buildbot/test/test_vc.py (VCSupport.__init__): win32: use os.pathsep
4527 2005-04-19  Brian Warner  <warner@lothar.com>
4529         * buildbot/test/test_vc.py (SetupMixin.setUpClass): fix the
4530         skip-if-repositories-are-unavailable test to not kill the trial
4531         that comes with Twisted-1.3.0
4533         * setup.py: install buildbot.png icon file when installing code
4535         * buildbot/slave/commands.py (ShellCommand._startCommand): log the
4536         environment used by the command, at least on the child side.
4538         * buildbot/status/html.py (TextLog.pauseProducing): add a note,
4539         this method needs to be added and implemented because it gets
4540         called under heavy load. I don't quite understand the
4541         producer/consumer API enough to write it.
4542         (StatusResource.getChild): add a resource for /favicon.ico
4543         (Waterfall.__init__): add favicon= argument
4544         * buildbot/test/test_web.py (WebTest.test_waterfall): test it
4545         (WebTest.test_webPortnum): stop using deprecated 'webPortnum'
4546         (WebTest.test_webPathname): same
4547         (WebTest.test_webPathname_port): same
4548         * docs/config.xhtml: mention favicon=
4549         * buildbot/buildbot.png: add a default icon, dorky as it is
4551 2005-04-18  Thomas Vander Stichele  <thomas at apestaart dot org>
4553         * buildbot/master.py:
4554         * buildbot/process/base.py:
4555         * buildbot/process/builder.py:
4556         * buildbot/process/interlock.py:
4557         * buildbot/status/builder.py:
4558         * buildbot/status/html.py:
4559         * buildbot/status/mail.py:
4560         * buildbot/status/words.py:
4561           new documentation while digging through the code
4563 2005-04-17  Brian Warner  <warner@lothar.com>
4565         * general: try to fix file modes on all .py files: a+r, a-x,
4566         but let buildbot/clients/*.py be +x since they're tools
4568         * docs/epyrun (addMod): when an import fails, say why
4570         * Makefile: Add a 'docs' target, hack on the PYTHONPATH stuff
4572 2005-04-17  Thomas Vander Stichele  <thomas at apestaart dot org>
4574         * buildbot/process/base.py:
4575         * buildbot/process/builder.py:
4576         * buildbot/status/builder.py:
4577           new documentation while digging through the code
4579 2005-04-17  Thomas Vander Stichele  <thomas at apestaart dot org>
4581         * buildbot/changes/changes.py:
4582         * buildbot/changes/p4poller.py:
4583         * buildbot/interfaces.py:
4584         * buildbot/process/base.py:
4585         * buildbot/process/builder.py:
4586         * buildbot/process/step.py:
4587         * buildbot/process/step_twisted.py:
4588         * buildbot/slave/bot.py:
4589         * buildbot/slave/commands.py:
4590         * buildbot/status/builder.py:
4591           fix all docstrings to make epydoc happy.  In the process of fixing
4592           some, I also moved pieces of docs, and removed some deprecated
4593           documentation
4595 2005-04-17  Thomas Vander Stichele  <thomas at apestaart dot org>
4597         * buildbot/process/builder.py:
4598         * buildbot/process/interlock.py:
4599         * buildbot/process/process_twisted.py:
4600         * buildbot/process/step.py:
4601           BuildProcess -> Build, as it looks like that's what happened
4602         * buildbot/process/base.py:
4603         * buildbot/process/factory.py:
4604           update epydoc stuff
4606 2005-04-17  Brian Warner  <warner@lothar.com>
4608         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
4609         update compile command to accomodate the Twisted split.. now
4610         instead of './setup.py build_ext -i', you do './setup.py all
4611         build_ext -i', to run build_ext over all sub-projects.
4612         (FullTwistedBuildFactory): same
4613         (TwistedReactorsBuildFactory): same
4615         * buildbot/status/html.py (TextLog.finished): null out self.req
4616         when we're done, otherwise the reference cycle of TextLog to .req
4617         to .notifications to a Deferred to TextLog.stop keeps them from
4618         being collected, and consumes a huge (610MB on pyramid at last
4619         check) amount of memory.
4621 2005-04-11  Brian Warner  <warner@lothar.com>
4623         * buildbot/test/test_vc.py (VCSupport.__init__): use abspath() to
4624         normalize the VC-repository location.. makes SVN happier with
4625         certain test environments.
4627         * buildbot/process/step.py (RemoteShellCommand.__init__): let each
4628         RemoteShellCommand gets its own .env dictionary, so that code in
4629         start() doesn't mutate the original. I think this should fix the
4630         step_twisted.Trial problem where multiple identical components
4631         kept getting added to PYTHONPATH= over and over again.
4633         * general: merge org.apestaart@thomas/buildbot--doc--0--patch-3,
4634         adding epydoc-format docstrings to many classes. Thanks to Thomas
4635         Vander Stichele for the patches.
4636         * docs/epyrun, docs/gen-reference: add epydoc-generating tools
4637         * buildbot/status/mail.py, buildbot/process/step_twisted.py: same
4638         * buildbot/slave/bot.py, commands.py, registry.py: same
4640 2005-04-05  Brian Warner  <warner@lothar.com>
4642         * buildbot/slave/commands.py (SourceBase.doCopy): use cp -p to
4643         preserve timestamps, helps incremental builds of large trees.
4644         Patch from Rene Rivera.
4646         * buildbot/slave/bot.py (SlaveBuilder.commandComplete): oops, log
4647         'failure' and not the non-existent 'why'. Thanks to Rene Rivera
4648         for the catch.
4650 2005-04-03  Brian Warner  <warner@lothar.com>
4652         * buildbot/master.py (BuildMaster.loadConfig): only call exec()
4653         with one dict, apparently exec has some scoping bugs when used
4654         with both global/local dicts. Thanks to Nathaniel Smith for the
4655         catch.
4657 2005-04-02  Brian Warner  <warner@lothar.com>
4659         * buildbot/process/step_twisted.py (countFailedTests): the new
4660         trial in Twisted-2.0 emits a slightly different status line than
4661         old trial ("PASSED.." instead of "OK.."). Handle it so we don't
4662         mistakenly think the test count is unparseable.
4663         (Trial.start): note that for some reason each build causes another
4664         copy of self.testpath to be prepended to PYTHONPATH. This needs to
4665         be fixed but I'm not sure quite where the problem is.
4667 2005-04-01  Brian Warner  <warner@lothar.com>
4669         * buildbot/test/test_run.py (Run.testMaster): change some uses of
4670         deferredResult to avoid hangs/warnings under twisted-2.0
4671         (RunMixin.tearDown): same
4672         (RunMixin.shutdownSlave): same
4673         (Disconnect.testIdle1): same
4674         (Disconnect.testBuild2): same: wait one second after the build
4675         finishes for test to really be done.. this should be cleaned up to
4676         avoid wasting that second. Builder.detach uses a callLater(0),
4677         either that should be done in-line (something else needed that
4678         behavior), or it should return a Deferred that fires when the
4679         builder is really offline.
4680         (Disconnect.testBuild3): same
4681         (Disconnect.testDisappear): same
4683         * buildbot/test/test_web.py: rearrange server-setup and teardown
4684         code to remove unclean-reactor warnings from twisted-2.0
4686         * buildbot/test/test_vc.py: rearrange probe-for-VC-program routine
4687         so the tests don't hang under twisted-2.0
4689 2005-03-31  Brian Warner  <warner@lothar.com>
4691         * buildbot/slave/bot.py (Bot.remote_setBuilderList): fix typo that
4692         caused a warning each time the master changed our set of builders
4694         * buildbot/status/builder.py (BuildStatus.saveYourself): under
4695         w32, don't unlink the file unless it already exists. Thanks to
4696         Baptiste Lepilleur for the catch.
4697         (BuilderStatus.saveYourself): same
4699 2005-02-01  Brian Warner  <warner@lothar.com>
4701         * buildbot/status/html.py (TextLog.getChild): use a /text child
4702         URL, such as http://foo.com/svn-hello/builds/1/test/0/text instead
4703         of http://foo.com/svn-hello/builds/1/test/0 , to retrieve the
4704         logfile as text/plain (no markup, no headers). This replaces the
4705         previous scheme (which used an ?text=1 argument), and gets us back
4706         to a relative link (which works better when the buildbot lives
4707         behind another web server, such as Apache configured as a reverse
4708         proxy). Thanks to Gerald Combs for spotting the problem.
4710         * buildbot/__init__.py (version): bump to 0.6.2+ while between
4711         releases
4713 2004-12-13  Brian Warner  <warner@lothar.com>
4715         * buildbot/__init__.py (version): Releasing buildbot-0.6.2
4717         * debian/changelog: update for 0.6.2
4718         * NEWS: finalize for 0.6.2
4720 2004-12-11  Brian Warner  <warner@lothar.com>
4722         * NEWS: bring it up to date
4724         * buildbot/slave/bot.py (BotFactory): revamp keepalive/lost-master
4725         detection code. Require some sign of life from the buildmaster
4726         every BotFactory.keepaliveInterval seconds. Provoke this
4727         indication at BotFactory.keepaliveTimeout seconds before the
4728         deadline by sending a keepalive request. We don't actually care if
4729         that request is answered in a timely fashion, what we care about
4730         is that .activity() is called before the deadline. .activity() is
4731         triggered by any PB message from the master (including an ack to
4732         one of the slave's status-update messages). With this new scheme,
4733         large status messages over slow pipes are OK, as long as any given
4734         message can be sent (and thus acked) within .keepaliveTimeout
4735         seconds (which defaults to 30).
4736         (SlaveBuilder.remote_startCommand): record activity
4737         (SlaveBuilder.ackUpdate): same
4738         (SlaveBuilder.ackComplete): same
4739         (BotFactory.gotPerspective): same
4740         * buildbot/test/test_run.py (Disconnect.testSlaveTimeout): test it
4742 2004-12-09  Brian Warner  <warner@lothar.com>
4744         * buildbot/status/html.py (StatusResourceBuilder.getChild): remove
4745         debug message
4747         * buildbot/process/step_twisted.py (Trial._commandComplete):
4748         update self.cmd when we start the 'cat test.log' transfer. Without
4749         this, we cannot interrupt the correct RemoteCommand when we lose
4750         the connection.
4752         * buildbot/process/step.py (RemoteCommand.interrupt): don't bother
4753         trying to tell the slave to stop the command if we're already
4754         inactive, or if we no longer have a .remote
4756         * buildbot/process/builder.py (Builder._detached): don't let an
4757         exception in currentBuild.stopBuild() prevent the builder from
4758         being marked offline
4760 2004-12-07  Brian Warner  <warner@lothar.com>
4762         * buildbot/status/words.py (IrcStatusBot.getBuilder): catch the
4763         KeyError that happens when you ask for a non-existent Builder, and
4764         translate it into a UsageError.
4766         * buildbot/test/test_run.py (Disconnect.testBuild4): validate that
4767         losing the slave in the middle of a remote step is handled too
4769         * buildbot/process/step.py (ShellCommand.interrupt): 'reason' can
4770         be a Failure, so be sure to stringify it before using it as the
4771         contents of the 'interrupt' logfile
4772         (RemoteCommand.interrupt): use stringified 'why' in
4773         remote_interruptCommand too, just in case
4775 2004-12-06  Brian Warner  <warner@lothar.com>
4777         * buildbot/slave/commands.py (Arch.doVCUpdate): use 'tla replay'
4778         instead of 'tla update', which is more efficient in case we've
4779         missed a couple of patches since the last update.
4781         * debian/changelog: update for previous (0.6.1) release. Obviously
4782         this needs to be handled better.
4784 2004-12-05  Brian Warner  <warner@lothar.com>
4786         * NEWS: update for stuff since last release
4788         * buildbot/master.py (DebugPerspective.attached): return 'self', to
4789         match the maybeDeferred change in Dispatcher.requestAvatar
4790         * buildbot/changes/pb.py (ChangePerspective.attached): same
4791         * buildbot/status/client.py (StatusClientPerspective.attached): same
4792         * buildbot/process/builder.py (Builder._attached3): same
4793         * buildbot/pbutil.py (NewCredPerspective.attached): same
4795         * buildbot/status/html.py (WaterfallStatusResource.phase2): Add
4796         the date to the top-most box, if it is not the same as today's
4797         date.
4799         * docs/slave.xhtml: provide a buildslave setup checklist
4801         * docs/source.xhtml (Arch): correct terminology
4803 2004-12-04  Brian Warner  <warner@lothar.com>
4805         * buildbot/test/test_slavecommand.py: use sys.executable instead
4806         of hard-coding 'python' for child commands, might help portability
4808         * docs/examples/twisted_master.cfg: update to current usage
4810         * buildbot/status/words.py (IrcStatusBot.command_STOP): add a
4811         'stop build' command to the IRC bot
4813         * buildbot/master.py (Dispatcher.requestAvatar): remove debug
4814         message that broke PBChangeSource
4816         * buildbot/slave/bot.py: clean up shutdown/lose-master code
4817         (SlaveBuilder): make some attributes class-level, remove the old
4818         "update queue" which existed to support resuming a build after the
4819         master connection was lost. Try to reimplement that feature later.
4820         (SlaveBuilder.stopCommand): clear self.command when the
4821         SlaveCommand finishes, so that we don't try to kill a leftover one
4822         at shutdown time.
4823         (SlaveBuilder.commandComplete): same, merge with commandFailed and
4824         .finishCommand
4826         * buildbot/slave/commands.py (SourceBase): set self.command for
4827         all VC commands, so they can be interrupted.
4829 2004-12-03  Brian Warner  <warner@lothar.com>
4831         * buildbot/master.py: clean up slave-handling code, to handle
4832         slave-disconnect and multiple-connect better
4833         (BotPerspective): make these long-lasting, exactly one per bot
4834         listed in the config file.
4835         (BotPerspective.attached): if a slave connects while an existing
4836         one appears to still be connected, disconnect the old one first.
4837         (BotPerspective.disconnect): new method to forcibly disconnect a
4838         buildslave. Use some hacks to empty the transmit buffer quickly to
4839         avoid the long (20-min?) TCP timeout that could occur if the old
4840         slave has dropped off the net.
4841         (BotMaster): Keep persistent BotPerspectives in .slaves, let them
4842         own their own SlaveStatus objects. Remove .attached/.detached, add
4843         .addSlave/.removeSlave, treat slaves like Builders (config file
4844         parsing sends deltas to the BotMaster). Inform the slave
4845         instances, i.e. the BotPerspective, about addBuilder and
4846         removeBuilder.
4847         (BotMaster.getPerspective): turns into a single dict lookup
4848         (Dispatcher.requestAvatar): allow .attached to return a Deferred,
4849         which gives BotPerspective.attached a chance to disconnect the old
4850         slave first.
4851         (BuildMaster.loadConfig): add code (disabled) to validate that all
4852         builders use known slaves (listed in c['bots']). The check won't
4853         work with tuple-specified builders, which are deprecated but not
4854         yet invalid, so the check is disabled for now.
4855         (BuildMaster.loadConfig_Slaves): move slave-config into a separate
4856         routine, do the add/changed/removed dance with them like we do
4857         with builders.
4858         (BuildMaster.loadConfig_Sources): move source-config into a
4859         separate routine too
4861         * buildbot/status/builder.py (Status.getSlave): get the
4862         SlaveStatus object from the BotPerspective, not the BotMaster.
4864         * buildbot/test/test_run.py: bunch of new tests for losing the
4865         buildslave at various points in the build, handling a slave that
4866         connects multiple times, and making sure we can interrupt a
4867         running build
4869         * buildbot/slave/bot.py (BuildSlave): make it possible to use
4870         something other than 'Bot' for the Bot object, to make certain
4871         test cases easier to write.
4872         (BuildSlave.waitUntilDisconnected): utility method for testing
4874 2004-11-30  Brian Warner  <warner@lothar.com>
4876         * buildbot/test/test_run.py (RunMixin): refactor, remove debug msg
4878         * buildbot/interfaces.py (IBuilderControl.ping): add timeout=
4879         argument, return a Deferred that always fires with True or False.
4880         I don't use an errback to indicate 'ping failed' so that callers
4881         are free to ignore the deferred without causing spurious errors in
4882         the logs.
4883         * buildbot/process/builder.py (BuilderControl.ping): implement it
4885         * buildbot/test/test_run.py (Status.testDisappear): test ping
4886         (Status.disappearSlave): fix it
4888 2004-11-30  Brian Warner  <warner@lothar.com>
4890         * buildbot/interfaces.py (IBuildControl): add .stopBuild
4891         (IBuilderControl): add .getBuild(num), only works for the current
4892         build, of course, although it might be interesting to offer
4893         something for builds in the .waiting or .interlocked state.
4895         * buildbot/process/base.py (Build): have .stopBuild just do the
4896         interrupt, then let the build die by itself.
4897         (BuildControl): add .stopBuild, and add a point-event named
4898         'interrupt' just after the build so status viewers can tell that
4899         someone killed it.
4900         (BuilderControl): add .getBuild
4902         * buildbot/process/step.py (Dummy): use haltOnFailure so it really
4903         stops when you kill it, good for testing
4904         (ShellCommand.interrupt): add a logfile named 'interrupt' which
4905         contains the 'reason' text.
4907         * buildbot/status/html.py: Add Stop Build button, if the build can
4908         still be stopped. Send a Redirect (to the top page) one second
4909         later, hopefully long enough for the interrupt to have an effect.
4910         Move make_row() up to top-level to share it between Stop Build and
4911         Force Build.
4913         * buildbot/slave/commands.py: only kill the child process once
4915         * buildbot/test/test_run.py: add testInterrupt
4917 2004-11-29  Brian Warner  <warner@lothar.com>
4919         * buildbot/process/base.py: Refactor command interruption. The
4920         Build is now responsible for noticing that the slave has gone
4921         away: Build.lostRemote() interrupts the current step and makes
4922         sure that no further ones will be started.
4923         
4924         * buildbot/process/builder.py: When the initial remote_startBuild
4925         message fails, log it: this usually indicates that the slave has
4926         gone away, but we don't really start paying attention until they
4927         fail to respond to the first step's command.
4929         * buildbot/process/step.py (RemoteCommand): Does *not* watch for
4930         slave disconnect. Now sports a new interrupt() method. Error
4931         handling was simplified a lot by chaining deferreds, so
4932         remoteFailed/remoteComplete were merged into a single
4933         remoteComplete method (which can now get a Failure object).
4934         Likewise failed/finished were merged into just _finished.
4935         (BuildStep): Add interrupt(why) method, and if why is a
4936         ConnectionLost Failure then the step is failed with some useful
4937         error text.
4939         * buildbot/slave/bot.py: stop the current command when the remote
4940         Step reference is lost, and when the slave is shut down.
4941         (Bot): make it a MultiService, so it can have children. Use
4942         stopService to tell when the slave is shutting down.
4943         (SlaveBuilder): make it a Service, and a child of the Bot. Add
4944         remote_interruptCommand (which asks the current SlaveCommand to
4945         stop but allows it to keep emitting status messages), and
4946         stopCommand (which tells it to shut up and die).
4948         * buildbot/slave/commands.py: make commands interruptible
4949         (ShellCommand.kill): factor out os.kill logic
4950         (Command): factor out setup()
4951         (Command.sendStatus): don't send status if .running is false, this
4952         happens when the command has been halted.
4953         (Command.interrupt): new method, used to tell the command to die
4954         (SlaveShellCommand): implement .interrupt
4955         (DummyCommand): implement .interrupt
4956         (SourceBase, etc): factor out setup(), don't continue substeps if
4957         .interrupted is set
4959         * buildbot/status/builder.py: fix all waitUntilFinished() methods
4960         so they can be called after finishing
4962         * buildbot/test/test_run.py: new tests for disconnect behavior,
4963         refactor slave-shutdown routines, add different kinds of
4964         slave-shutdown
4966 2004-11-27  Brian Warner  <warner@lothar.com>
4968         * buildbot/status/words.py (IrcStatusBot.convertTime): utility
4969         method to express ETA time like "2m45s" instead of "165 seconds"
4971 2004-11-24  Brian Warner  <warner@lothar.com>
4973         * buildbot/test/test_vc.py (VC.testArch): unregister the test
4974         archive after the test completes, to avoid cluttering the user's
4975         'tla archives' listing with a bogus entry. Arch doesn't happen to
4976         provide any way to override the use of ~/.arch-params/, so there
4977         isn't a convenient way to avoid touching the setup of the user who
4978         runs the test.
4979         (VC_HTTP.testArchHTTP): same
4981 2004-11-23  Brian Warner  <warner@lothar.com>
4983         * buildbot/status/html.py (TextLog): split render() up into
4984         render_HEAD and render_GET. Use a Producer when sending log
4985         chunks, to reduce memory requirements and avoid sending huge
4986         non-Banana-able strings over web.distrib connections. Requires
4987         peeking under the covers of IStatusLog.
4988         (TextLog.resumeProducing): fix the "as text" link, handle client
4989         disconnects that occur while we're still sending old chunks.
4991         * buildbot/status/builder.py (HTMLLogFile.waitUntilFinished): oops,
4992         use defer.succeed, not the non-existent defer.success
4993         (LogFile.waitUntilFinished): same
4994         (LogFile.subscribe): don't add watchers to a finished logfile
4996         * buildbot/__init__.py (version): bump to 0.6.1+ while between
4997         releases
4999 2004-11-23  Brian Warner  <warner@lothar.com>
5001         * buildbot/__init__.py (version): Releasing buildbot-0.6.1
5003 2004-11-23  Brian Warner  <warner@lothar.com>
5005         * NEWS: update for the 0.6.1 release
5006         * MANIFEST.in: add new files
5008         * README (INSTALLATION): explain how to enable the extra VC tests
5010         * buildbot/status/builder.py (LogFile): add .runEntries at the class
5011         level to, so old pickled builds can be displayed ok
5013 2004-11-22  Brian Warner  <warner@lothar.com>
5015         * NEWS: summarize updates since last release
5017         * README (SLAVE): fix usage of 'buildbot slave' command. Thanks to
5018         Yoz Grahame. Closes SF#1050138.
5020         * docs/changes.xhtml (FreshCVSSourceNewcred): fix typo. Closes
5021         SF#1042563.
5023         * buildbot/process/step_twisted.py (Trial): update docs a bit
5025         * docs/factories.xhtml: fix Trial factory docs to match reality.
5026         Closes: SF#1049758.
5028         * buildbot/process/factory.py (Trial.__init__): add args for
5029         randomly= and recurse=, making them available to instantiators
5030         instead of only to subclassers. Closes: SF#1049759.
5032 2004-11-15  Brian Warner  <warner@lothar.com>
5034         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
5035         try to teach the Quick factory to use multiple versions of python
5037 2004-11-12  Brian Warner  <warner@lothar.com>
5039         * buildbot/status/builder.py (BuilderStatus.saveYourself): use a
5040         safer w32-compatible approach, and only use it on windows
5041         (BuildStatus.saveYourself): same
5043 2004-11-11  Brian Warner  <warner@lothar.com>
5045         * buildbot/status/builder.py (LogFile.addEntry): smarter way to do
5046         it: one string merge per chunk. There are now separate .entries
5047         and .runEntries lists: when enumerating over all chunks, make sure
5048         to look at both.
5049         * buildbot/test/test_status.py (Log): more tests
5051         * buildbot/status/builder.py (LogFile.addEntry): Merge string
5052         chunks together, up to 10kb per chunk. This ought to cut down on
5053         the CPU-burning overhead of large log files. Thanks to Alexander
5054         Staubo for spotting the problem.
5055         * buildbot/test/test_status.py (Log): tests for same
5057 2004-11-10  Brian Warner  <warner@lothar.com>
5059         * buildbot/status/mail.py (MailNotifier.buildMessage): add a Date
5060         header to outbound mail
5061         * buildbot/test/test_status.py (Mail.testBuild1): test for same
5063 2004-11-08  Brian Warner  <warner@lothar.com>
5065         * buildbot/status/builder.py (BuilderStatus.saveYourself): w32
5066         can't do os.rename() onto an existing file, so catch the exception
5067         and unlink the target file first. This introduces a slight window
5068         where the existing file could be lost, but the main failure case
5069         (disk full) should still be handled safely.
5070         (BuildStatus.saveYourself): same
5072         * buildbot/changes/pb.py (ChangePerspective): use a configurable
5073         separator character instead of os.sep, because the filenames being
5074         split here are coming from the VC system, which can have a
5075         different pathname convention than the local host. This should
5076         help a buildmaster running on windows that uses a CVS repository
5077         which runs under unix.
5078         * buildbot/changes/mail.py (MaildirSource): same, for all parsers
5080         * buildbot/process/step_twisted.py (Trial.createSummary): survive
5081         when there are no test failures to be parsed
5083         * buildbot/scripts/runner.py (createMaster): use shutil.copy()
5084         instead of the unix-specific os.system("cp"), thanks to Elliot
5085         Murphy for this and the other buildbot-vs-windows catches.
5086         * buildbot/test/test_maildir.py (MaildirTest.deliverMail): same
5088         * contrib/windows/buildbot.bat: prefix a '@', apparently to not
5089         echo the command as it is run
5091         * setup.py: install sample.mk too, not just sample.cfg
5092         (scripts): install contrib/windows/buildbot.bat on windows
5094 2004-11-07  Brian Warner  <warner@lothar.com>
5096         * buildbot/process/builder.py (Builder._detached): clear the
5097         self.currentBuild reference, otherwise the next build will be
5098         skipped because we think the Builder is already in use.
5100         * docs/examples/twisted_master.cfg: update to match current usage
5101         on the Twisted buildbot
5103 2004-10-29  Brian Warner  <warner@lothar.com>
5105         * buildbot/status/mail.py (MailNotifier): fix typo in docs
5107 2004-10-28  Brian Warner  <warner@lothar.com>
5109         * buildbot/slave/commands.py (SourceBase): refactor subclasses to
5110         have separate doVCUpdate/doVCFull methods. Catch an update failure
5111         and respond by clobbering the source directory and re-trying. This
5112         will handle local changes (like replacing a file with a directory)
5113         that will cause CVS and SVN updates to fail.
5114         * buildbot/test/test_vc.py (SetupMixin.do_vc): test the same
5116         * buildbot/process/step.py (LoggedRemoteCommand.__repr__): avoid a
5117         python-2.4 warning
5119 2004-10-19  Brian Warner  <warner@lothar.com>
5121         * buildbot/process/step_twisted.py (Trial.createSummary): bugfixes
5123         * buildbot/status/html.py (StatusResourceTestResults): display any
5124         TestResults that the Build might have
5125         (StatusResourceTestResult): and the logs for each TestResult
5126         (StatusResourceBuild): add link from the per-build page
5128 2004-10-15  Brian Warner  <warner@lothar.com>
5130         * buildbot/process/step_twisted.py (Trial.createSummary): parse
5131         the 'problems' portion of stdout, add TestResults to our build
5132         * buildbot/test/test_twisted.py (Parse.testParse): test it
5134         * buildbot/interfaces.py (IBuildStatus.getTestResults): new method
5135         to retrieve a dict of accumulated test results
5136         (ITestResult): define what a single test result can do
5137         * buildbot/status/builder.py (TestResult): implement ITestResult
5138         (BuildStatus.getTestResults): retrieve dict of TestResults
5139         (BuildStatus.addTestResult): add TestResults
5140         * buildbot/test/test_status.py (Results.testAddResults): test it
5142 2004-10-14  Brian Warner  <warner@lothar.com>
5144         * buildbot/test/test_maildir.py (MaildirTest): use shutil.rmtree
5145         instead of os.system("rm -rf") for win32 portability
5147         * buildbot/test/test_slavecommand.py (SlaveCommandTestCase): use
5148         SignalMixin instead of starting/stopping the reactor, which is
5149         likely to cause problems with other tests
5151         * buildbot/slave/commands.py (SourceBase.doCopy): remove leftover
5152         self.copyComplete() call. Yoz Grahame makes the catch.
5154         * contrib/windows/buildbot.bat: helper script to deal with path
5155         issues. Thanks to Yoz Grahame.
5157         * buildbot/master.py (BuildMaster.startService): don't register a
5158         SIGHUP handler if the signal module has no SIGHUP attribute.
5159         Apparently win32 does this.
5161         * buildbot/scripts/runner.py (start): add --reactor=win32 on win32
5163         * buildbot/test/test_web.py (WebTest.test_webPathname): skip the
5164         test if the reactor can't offer UNIX sockets
5166         * buildbot/status/html.py (StatusResourceBuild.body): fix syntax
5167         error introduced in the last commit. We really need that
5168         metabuildbot :).
5170 2004-10-12  Brian Warner  <warner@lothar.com>
5172         * buildbot/changes/mail.py (MaildirSource.describe): fix exception
5173         when describing a maildir source. Thanks to Stephen Davis.
5175         * buildbot/status/words.py (IrcStatusBot.command_WATCH): round off
5176         ETA seconds
5178         * buildbot/scripts/runner.py (createMaster): install Makefile too
5179         (start): add --no_save to 'start' command
5180         * buildbot/scripts/sample.mk: simple convenience Makefile with 
5181         start/stop/reload targets
5183         * buildbot/__init__.py (version): bump to 0.6.0+ while between
5184         releases
5186 2004-09-30  Brian Warner  <warner@lothar.com>
5188         * setup.py: Releasing buildbot-0.6.0
5190 2004-09-30  Brian Warner  <warner@lothar.com>
5192         * MANIFEST.in: add debian/*, sample.cfg, more docs files. Remove
5193         test_trial.py from the source tarball until support is complete.
5195         * NEWS: update for 0.6.0 release
5196         * buildbot/__init__.py (version): same
5197         * README: same
5199         * buildbot/status/words.py (IrcStatusBot.command_SOURCE): add
5200         'source' command to tell users where to get the Buildbot source
5202         * docs/examples/*.cfg: update to modern standards
5204         * NEWS: update for release
5206         * buildbot/scripts/runner.py (createMaster): remove the
5207         -shutdown.tap stuff now that it isn't necessary
5208         (createSlave): same
5209         (start): launch buildbot.tap, not buildbot-shutdown.tap
5212         * buildbot/status/mail.py (Domain): shorten class name
5213         (MailNotifier): if lookup= is a string, pass it to Domain()
5214         * buildbot/test/test_status.py (Mail.testBuild1): new class name
5215         (Mail.testBuild2): test the string-to-Domain shortcut
5216         (Mail.testMail): fix test
5219         * buildbot/scripts/sample.cfg: improve the build-the-buildbot
5220         example config file
5222         * buildbot/status/builder.py (BuildStatus.__setstate__): re-set
5223         more attributes on load
5224         (BuilderStatus.stubBuildCacheSize): bump to 30, this was too low
5225         to accomodate the whole waterfall page at once, and the thrashing
5226         results in a lot of unnecessary loads
5227         (BuildStatus.saveYourself): use binary pickles, not fluffy text
5228         (BuilderStatus.saveYourself): same
5229         (BuilderStatus.eventGenerator): stop generating on the first missing
5230         build. We assume that saved builds are deleted oldest-first.
5231         (BuildStepStatus.__getstate__): .progress might not exist
5233         * buildbot/changes/changes.py (ChangeMaster): make it
5234         serializable, in $masterdir/changes.pck
5235         (ChangeMaster.stopService): save on shutdown
5236         * buildbot/master.py (BuildMaster.loadChanges): load at startup
5237         * buildbot/test/test_config.py: load Changes before config file
5240         * buildbot/slave/commands.py (ShellCommand.doTimeout): put the
5241         "Oh my god, you killed the command" header on a separate line
5243         * buildbot/status/builder.py (BuilderStatus.getStubBuildByNumber):
5244         skip over corrupted build pickles
5245         (BuilderStatus.getFullBuildByNumber): same
5246         (BuilderStatus.eventGenerator): skip over unavailable builds
5247         (BuildStatus.saveYourself): save builds to a .tmp file first, then
5248         do an atomic rename. This prevents a corrupted pickle when some
5249         internal serialization error occurs.
5250         (BuilderStatus.saveYourself): same
5252         * buildbot/slave/commands.py (SlaveShellCommand): oops, restore
5253         the timeout for shell commands, it got lost somehow
5255         * buildbot/status/builder.py (BuilderStatus.eventGenerator): if we
5256         run out of build steps, return the rest of the builder events
5258         * buildbot/interfaces.py (IBuilderControl.ping): add method
5260         * buildbot/process/builder.py (BuilderControl.ping): move
5261         slave-ping to BuilderControl, and fix the failure case in the
5262         process (Event.finish() is the verb, Event.finished is the noun).
5264         * buildbot/status/html.py (StatusResourceBuilder.ping): ping
5265         through the BuilderControl instead of the BuilderStatus
5266         (EventBox): add adapter for builder.Event, allowing builder events to
5267         be displayed in the waterfall display
5269         * buildbot/master.py (BotMaster.stopService): add a 'master
5270         shutdown' event to the builder's log
5271         (BuildMaster.startService): and a 'master started' on startup
5273         * buildbot/status/builder.py (BuilderStatus.eventGenerator): merge
5274         builder events into the BuildStep event stream
5275         (Status.builderAdded): add a 'builder created' event
5278         * buildbot/status/words.py (IrcStatusBot.command_WATCH): new
5279         command to announce the completion of a running build
5280         (IrcStatusBot.command_FORCE): announce when the build finishes
5282         * buildbot/status/builder.py (BuilderStatus.addFullBuildToCache):
5283         don't evict unfinished builds from the cache: they must stay in
5284         the full-cache until their logfiles have stopped changing. Make
5285         sure the eviction loop terminates if an unfinished build was hit.
5286         (HTMLLogFile.getTextWithHeaders): return HTML as if it were text.
5287         This lets exceptions be dumped in an email status message. Really
5288         we need LogFiles which contain both text and HTML, instead of two
5289         separate classes.
5290         (BuildStatus.__getstate__): handle self.finished=False
5291         (Status.builderAdded): if the pickle is corrupted, abandon the
5292         history and create a new BuilderStatus object.
5294         * buildbot/process/base.py (Build.stopBuild): tolerate lack of a
5295         self.progress attribute, helped one test which doesn't fully set
5296         up the Build object.
5298         * buildbot/interfaces.py (IStatusLogStub): split out some of the
5299         IStatusLog methods into an Interface that is implemented by "stub"
5300         logs, for which all the actual text chunks are on disk (in the
5301         pickled Build instance). To show the log contents, you must first
5302         adapt the stub log to a full IStatusLog object.
5304         * buildbot/status/builder.py (LogFileStub): create separate stub
5305         log objects, which can be upgraded to a real one if necessary.
5306         (LogFile): make them persistable, and let them stubify themselves
5307         (HTMLLogFile): same
5308         (BuildStepStatus): same
5309         (BuildStatus): same
5310         (BuildStatus.saveYourself): save the whole build out to disk
5311         (BuilderStatus): make it persistable
5312         (BuilderStatus.saveYourself): save the builder to disk
5313         (BuilderStatus.addFullBuildToCache): implement two caches which
5314         hold Build objects: a small one which holds full Builds, and a
5315         larger one which holds "stubbed" Builds (ones with their LogFiles
5316         turned into LogFileStubs). This reduces memory usage by the
5317         buildmaster by not keeping more than a few (default is 2) whole
5318         build logs in RAM all the time.
5319         (BuilderStatus.getBuild): rewrite to pull from disk (through the
5320         cache)
5321         (BuilderStatus.eventGenerator): rewrite since .builds went away
5322         (BuilderStatus.buildStarted): remove the .builds array. Add the
5323         build to the "full" cache when it starts.
5324         (BuilderStatus._buildFinished): save the build to disk when it
5325         finishes
5326         (Status): give it a basedir (same as the BuildMaster's basedir)
5327         where the builder pickles can be saved
5328         (Status.builderAdded): create the BuilderStatus ourselves, by
5329         loading a pickle from disk (or creating a new instance if there
5330         was none on disk). Return the BuilderStatus so the master can glue
5331         it into the new Builder object.
5333         * buildbot/master.py (BotMaster.stopService): on shutdown, tell
5334         all BuilderStatuses to save themselves out to disk. This is in
5335         lieu of saving anything important in the main Application pickle
5336          (the -shutdown.tap file).
5337         (BuildMaster.__init__): give Status() a basedir for its files
5338         (BuildMaster.loadConfig_Builders): do status.builderAdded first,
5339         to get the BuilderStatus, then give it to the Builder (instead of
5340         doing it the other way around). It's ok if the status announces
5341         the new Builder before it's really ready, as the outside world can
5342         only see the BuilderStatus object anyway (and it is ready before
5343         builderAdded returns). Use the builder's "builddir" (which
5344         normally specifies where the slave will run the builder) as the
5345         master's basedir (for saving serialized builds).
5347         * buildbot/status/html.py (StatusResourceBuildStep.getChild):
5348         coerce the logfile to IStatusLog before trying to get the text
5349         chunks out of it. This will pull the full (non-stubified) Build in
5350         from disk if necessary.
5351         (TextLog): fix the adapter registration
5353         * buildbot/test/test_control.py (Force.setUp): create the basedir
5354         * buildbot/test/test_web.py: same
5355         * buildbot/test/test_vc.py (SetupMixin.setUp): same
5356         * buildbot/test/test_status.py (Mail.makeBuild): match new setup
5357         * buildbot/test/test_run.py (Run.testMaster): same
5358         (Status.setUp): same
5360 2004-09-29  Fred L. Drake, Jr.  <fdrake@acm.org>
5362         * buildbot/status/html.py (Waterfall.__init__): store actual
5363         allowForce flag passed in rather than using True for everyone;
5364         make sure setting it to False doesn't cause a NameError
5365         (Waterfall.setup).
5366         (StatusResourceBuilder.__init__) add the builder name to the page
5367         title.
5368         (StatusResourceBuilder.body) move HTML generation for a name/value
5369         row into a helper method (StatusResourceBuilder.make_row); only
5370         generate the "Force Build" form if allowForce was True and the
5371         slave is connected.  Use class attributes in the generated HTML to
5372         spread a little CSS-joy.
5374 2004-09-28  Brian Warner  <warner@lothar.com>
5376         * buildbot/process/step_twisted.py (Trial.createSummary): fix
5377         warning-scanner to not ignore things like
5378         'ComponentsDeprecationWarning' and 'exceptions.RuntimeWarning'
5380         * buildbot/status/html.py (StatusResource.control): add some
5381         class-level values for .control in an attempt to make upgrading
5382         smoother
5384         * buildbot/util.py (ComparableMixin): survive missing attributes,
5385         such as when a class is modified and we're comparing old instances
5386         against new ones
5388         * buildbot/status/words.py (IrcStatusBot.privmsg): clean up
5389         failure handling, remove a redundant try/except block. Don't
5390         return the full traceback to the IRC channel.
5391         (IrcStatusBot.command_FORCE): catch new exceptions, return useful
5392         error messages. Get ETA properly.
5394         * buildbot/status/html.py (StatusResourceBuild.body): html.escape
5395         the reason, since (at least) IRC message will have <> in them.
5396         (StatusResourceBuilder.__init__): take an IBuilderControl
5397         (StatusResourceBuilder.force): use the IBuilderControl we get in
5398         the constructor instead of trying to make our own. Catch the
5399         new exceptions and ignore them for now (until we make an
5400         intermediate web page where we could show the error message)
5401         (StatusResource): create with an IControl, use it to give an
5402         IBuilderControl to all children
5403         (Waterfall): take an allowForce= option, pass an IControl object
5404         to StatusResource if it is True
5406         * buildbot/test/test_web.py (ConfiguredMaster): handle IControl
5408         * buildbot/master.py (BotPerspective.perspective_forceBuild):
5409         catch new exceptions and return string forms
5411         * buildbot/interfaces.py: add NoSlaveError, BuilderInUseError
5412         * buildbot/process/builder.py (Builder.forceBuild): raise them
5413         * buildbot/test/test_control.py (Force.testNoSlave): new test
5414         (Force.testBuilderInUse): same
5417         * buildbot/status/words.py (IrcStatusBot): enable build-forcing
5419         * buildbot/test/test_run.py: use IControl
5420         * buildbot/test/test_vc.py: same
5422         * buildbot/status/html.py (StatusResourceBuilder.force): rewrite
5423         to use IControl. Still offline.
5424         * buildbot/status/words.py (IrcStatusBot.command_FORCE): same
5426         * buildbot/process/builder.py (Builder.doPeriodicBuild): set
5427         who=None so periodic builds don't send out status mail
5428         (Builder.forceBuild): include reason in the log message
5429         (BuilderControl.forceBuild): rename 'name' to 'who'
5431         * buildbot/master.py (BotPerspective.perspective_forceBuild): add
5432         'who' parameter, but make it None by default so builds forced by
5433         slave admins don't cause status mail to be sent to anybody
5434         (BotMaster.forceBuild): same. this method is deprecated.
5435         (DebugPerspective.perspective_forceBuild): same, use IControl.
5436         (DebugPerspective.perspective_fakeChange): use IControl..
5437         (Dispatcher.requestAvatar): .. so don't set .changemaster
5439         * buildbot/interfaces.py (IBuilderControl.forceBuild): rename 'who'
5440         parameter to avoid confusion with the name of the builder
5443         * buildbot/status/mail.py: refine comment about needing 2.3
5445         * buildbot/status/html.py: move all imports to the top
5447         * buildbot/test/test_control.py: test new interfaces
5448         * buildbot/test/test_run.py (Status): handle new interfaces
5449         * buildbot/test/test_vc.py (SetupMixin.doBuild): same
5451         * buildbot/process/base.py (BuildControl): implement IBuildControl
5452         and its lonely getStatus() method
5454         * buildbot/process/builder.py (BuilderControl): implement
5455         IBuilderControl, obtained by adapting the Builder instance
5456         (Builder.startBuild): return a BuilderControl instead of a
5457         Deferred. The caller can use bc.getStatus().waitUntilFinished() to
5458         accomplish the same thing.
5460         * buildbot/master.py: move all import statements to the top
5461         (Control): implement IControl, obtained by adapting the
5462         BuildMaster instance.
5464         * buildbot/interfaces.py: add IControl, IBuilderControl, and
5465         IBuildControl. These are used to force builds. Eventually they
5466         will provide ways to reconfigure the Builders, pause or abandon a
5467         Build, and perhaps control the BuildMaster itself.
5469 2004-09-26  Brian Warner  <warner@lothar.com>
5471         * buildbot/util.py (ComparableMixin): survive twisted>1.3.0 which
5472         ends up comparing us against something without a .__class__
5474 2004-09-24  Brian Warner  <warner@lothar.com>
5476         * buildbot/scripts/runner.py: rearrange option parsing a lot, to get
5477         usage text right.
5479         * Makefile: add 'deb-snapshot' target, to create a timestamped
5480         .deb package
5482         * debian/rules (binary-indep): skip CVS/ files in dh_installexamples
5484 2004-09-23  Brian Warner  <warner@lothar.com>
5486         * buildbot/__init__.py (version): move version string here
5487         * setup.py: get version string from buildbot.version
5488         * buildbot/status/html.py (WaterfallStatusResource.body): add
5489         buildbot version to the page footer
5490         * buildbot/status/words.py (IrcStatusBot.command_VERSION): provide
5491         version when asked
5493         * buildbot/master.py (BotMaster.getPerspective): detect duplicate
5494         slaves, let the second know where the first one is coming from
5495         (BuildMaster.__init__): turn on .unsafeTracebacks so the slave can
5496         see our exceptions. It would be nice if there were a way to just
5497         send them the exception type and value, not the full traceback.
5500         * buildbot/status/mail.py (MailNotifier): add a new argument
5501         sendToInterestedUsers=, which can be set to False to disable the
5502         usual send-to-blamelist behavior.
5503         (top): handle python-2.2 which has no email.MIMEMultipart
5504         (MailNotifier.buildMessage): don't send logs without MIMEMultipart
5505         (MailNotifier.disownServiceParent): unsubscribe on removal
5507         * buildbot/test/test_status.py (Mail.testBuild2): test it
5510         * buildbot/status/progress.py (Expectations.wavg): tolerate
5511         current=None, which happens when steps start failing badly
5512         * buildbot/test/test_status.py (Progress.testWavg): test for it
5514         * buildbot/process/step.py (SVN.startVC): when the (old) slave
5515         doesn't understand args['revision'], emit a warning instead of
5516         bailing completely. Updating to -rHEAD is probably close enough.
5518         * buildbot/process/step_twisted.py (Trial.start): fix sanity-check
5520         * buildbot/test/test_status.py: at least import bb.status.client
5521         even if we don't have any test coverage for it yet
5523         * contrib/svn_buildbot.py: don't require python2.3
5524         (main): wait, do require it (for sets.py), but explain how to
5525         make it work under python2.2
5527 2004-09-23  Brian Warner  <warner@lothar.com>
5529         * contrib/svn_buildbot.py: include the revision number in the Change
5531         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): use when=,
5532         using util.now() because FreshCVS is a realtime service
5534         * buildbot/status/event.py: delete dead code
5535         * buildbot/process/step.py: don't import dead Event class
5536         * buildbot/process/step_twisted.py: same
5537         * buildbot/status/builder.py: same
5538         * buildbot/status/client.py: same
5540         * buildbot/test/test_process.py: kill buggy out-of-date disabled test
5542         * buildbot/changes/changes.py (Change): set .when from an __init__
5543         argument (which defaults to now()), rather than having
5544         ChangeMaster.addChange set it later.
5545         (ChangeMaster.addChange): same
5547         * buildbot/changes/mail.py (parseFreshCVSMail): pass in when=
5548         (parseSyncmail): same. Just use util.now() for now.
5549         (parseBonsaiMail): parse the timestamp field for when=
5551         * buildbot/test/test_vc.py (SourceStamp.addChange): page in when=
5552         instead of setting .when after the fact
5554 2004-09-22  slyphon
5556         * buildbot/slave/trial.py: new SlaveCommand to machine-parse test
5557         results when the target project uses retrial. Still under
5558         development.
5559         * buildbot/test/test_trial.py: same
5561 2004-09-21  Brian Warner  <warner@lothar.com>
5563         * buildbot/status/mail.py (MailNotifier.__init__): include
5564         success/warnings/failure in the Subject line
5565         (MailNotifier.buildMessage): add the buildbot's URL to the body,
5566         use step.logname for the addLogs=True attachment filenames
5567         * buildbot/test/test_status.py (Mail): test Subject lines
5568         (Mail.testLogs): test attachment filenames
5570         * buildbot/master.py (DebugPerspective.perspective_fakeChange):
5571         accept a 'who' argument from the debug tool
5572         * contrib/debugclient.py (DebugWidget.do_commit): send 'who'
5573         * contrib/debug.glade: add text box to set 'who'
5575         * buildbot/interfaces.py (IBuildStatus.getBuilder): replace
5576         .getBuilderName with .getBuilder().getName(), more flexible
5577         (IStatusLog.getName): logs have short names, but you can prefix
5578         them with log.getStep().getName() to make them more useful
5579         * buildbot/status/builder.py: same
5580         * buildbot/status/client.py: same
5581         * buildbot/status/html.py: same
5582         * buildbot/test/test_run.py (Status.testSlave): same
5583         * buildbot/process/step.py: tweak logfile names
5585         * buildbot/status/mail.py (MailNotifier): add lookup, change
5586         argument to extraRecipients. The notifier is now aimed at sending
5587         mail to the people involved in a particular build, with additional
5588         constant recipients as a secondary function.
5590         * buildbot/test/test_status.py: add coverage for IEmailLookup,
5591         including slow-lookup and failing-lookup. Make sure the blamelist
5592         members are included.
5594         * buildbot/interfaces.py: new interfaces IEmailSender+IEmailLookup
5595         (IBuildStatus.getResponsibleUsers): rename from getBlamelist
5596         (IBuildStatus.getInterestedUsers): new method
5597         * buildbot/status/builder.py (BuildStatus.getResponsibleUsers): same
5598         * buildbot/status/client.py (remote_getResponsibleUsers): same
5599         * buildbot/status/html.py (StatusResourceBuild.body): same
5600         * buildbot/test/test_run.py (Status.testSlave): same
5602 2004-09-20  Brian Warner  <warner@lothar.com>
5604         * docs/users.xhtml: update concepts
5606         * Makefile: add a convenience makefile, for things like 'make
5607         test'. It is not included in the source tarball.
5609 2004-09-16  Brian Warner  <warner@lothar.com>
5611         * NEWS: mention /usr/bin/buildbot, debian/*
5613         * debian/*: add preliminary debian packaging. Many thanks to
5614         Kirill Lapshin (and Kevin Turner) for the hard work. I've mangled
5615         it considerably since it left their hands, I am responsible for
5616         all breakage that's resulted.
5618         * bin/buildbot: create a top-level 'buildbot' command, to be
5619         installed in /usr/bin/buildbot . For now it's just a simple
5620         frontend to mktap/twistd/kill, but eventually it will be the entry
5621         point to the 'try' command and also a status client. It is also
5622         intended to support the upcoming debian-packaging init.d scripts.
5623         * buildbot/scripts/runner.py: the real work is done here
5624         * buildbot/scripts/__init__.py: need this too
5625         * buildbot/scripts/sample.cfg: this is installed in new
5626         buildmaster directories
5627         * setup.py: install new stuff
5629 2004-09-15  Brian Warner  <warner@lothar.com>
5631         * buildbot/test/test_vc.py: skip SVN tests if svn can't handle the
5632         'file:' schema (the version shipped with OS-X was built without the
5633         ra_local plugin).
5634         (SetupMixin.tearDown): stop the goofy twisted.web timer which
5635         updates the log-timestamp, to make sure it isn't still running after
5636         the test finishes
5638         * docs/config.xhtml: Add projectName, projectURL, buildbotURL
5639         values to the config file.
5640         * docs/examples/hello.cfg: add examples
5641         * buildbot/interfaces.py (IStatus.getBuildbotURL): define accessors
5642         * buildbot/status/builder.py (Status.getProjectURL): implement them
5643         * buildbot/master.py (BuildMaster.loadConfig): set them from config
5644         * buildbot/test/test_config.py (ConfigTest.testSimple): test them
5645         * buildbot/status/html.py (WaterfallStatusResource): display them
5648         * buildbot/test/test_vc.py (FakeBuilder.name): add attribute so
5649         certain error cases don't suffer a secondary exception.
5650         (top): Skip tests if the corresponding VC tool is not installed.
5652         * buildbot/process/factory.py (Trial): introduce separate
5653         'buildpython' and 'trialpython' lists, since trialpython=[] is
5654         what you want to invoke /usr/bin/python, whereas ./setup.py is
5655         less likely to be executable. Add env= parameter to pass options
5656         to test cases (which is how I usually write tests, I don't know if
5657         anyone else does it this way).
5659         * buildbot/process/step_twisted.py (Trial): handle python=None.
5660         Require 'testpath' be a string, not a list. Fix tests= typo.
5661         (Trial.start): sanity-check any PYTHONPATH value for stringness.
5663         * buildbot/process/step.py (RemoteCommand._remoteFailed): goofy
5664         way to deal with the possibility of removing the disconnect notify
5665         twice.
5666         (CVS): add a 'login' parameter to give a password to 'cvs login',
5667         commonly used with pserver methods (where pw="" or pw="guest")
5669         * buildbot/slave/commands.py (SourceBase): move common args
5670         extraction and setup() to __init__, so everything is ready by the
5671         time setup() is called
5672         (CVS.start): call 'cvs login' if a password was supplied
5673         (ShellCommand): special-case PYTHONPATH: prepend the master's
5674         value to any existing slave-local value.
5676         * buildbot/process/builder.py (Builder.updateBigStatus): if we
5677         don't have a remote, mark the builder as Offline. This whole
5678         function should probably go away and be replaced by individual
5679         deltas.
5680         (Builder.buildFinished): return the results to the build-finished
5681         deferred callback, helps with testing
5683 2004-09-14  Brian Warner  <warner@lothar.com>
5685         * buildbot/test/test_vc.py: put all the repositories needed to run
5686         the complete tests into a single small (1.3MB) tarball, so I can
5687         make that tarball available on the buildbot web site. Test HTTP
5688         access (for Arch and Darcs) by spawning a temporary web server
5689         while the test runs.
5691         * docs/users.xhtml: new document, describe Buildbot's limited
5692         understanding of different human users
5694         * buildbot/test/test_vc.py: rearrange test cases a bit
5696         * buildbot/process/step_twisted.py (Trial): handle testpath=
5697         * buildbot/process/factory.py (Trial): update to use step.Trial
5699         * buildbot/slave/commands.py (ShellCommandPP): fix fatal typo
5701         * buildbot/status/builder.py (BuildStatus.getText): add text2 to
5702         the overall build text (which gives you 'failed 2 tests' rather
5703         than just 'failed')
5704         (BuildStepStatus.text2): default to [], not None
5706         * buildbot/process/step_twisted.py (Trial.commandComplete): text2
5707         must be a list
5709 2004-09-12  Brian Warner  <warner@lothar.com>
5711         * buildbot/master.py (BotPerspective._commandsUnavailable): don't
5712         log the whole exception if it's just an AttributeError (old slave)
5714         * buildbot/process/step.py (ShellCommand.__init__): stash .workdir
5715         so (e.g.) sub-commands can be run in the right directory.
5716         (ShellCommand.start): accept an optional errorMessage= argument
5717         to make life easier for SVN.start
5718         (SVN.startVC): put the "can't do mode=export" warning in the LogFile
5719         headers
5720         (ShellCommand.start): move ['dir'] compatibility hack..
5721         (RemoteShellCommand.start): .. to here so everyone can use it
5723         * buildbot/process/step_twisted.py (Trial): use .workdir
5725         * buildbot/process/step_twisted.py (BuildDebs.getText): fix the
5726         text displayed when debuild fails completely
5727         (Trial): snarf _trial_temp/test.log from the slave and display it
5729 2004-09-11  Brian Warner  <warner@lothar.com>
5731         * buildbot/process/step_twisted.py (ProcessDocs.getText): typo
5733         * buildbot/process/process_twisted.py (TwistedTrial.tests): oops,
5734         set to 'twisted', so --recurse can find twisted/web/test/*, etc
5736         * buildbot/process/step.py (ShellCommand): call .createSummary
5737         before .evaluateCommand instead of the other way around. This
5738         makes it slightly easier to count warnings and then use that to
5739         set results=WARNINGS
5740         * buildbot/process/step_twisted.py: cosmetic, swap the methods
5742         * buildbot/process/base.py (Build.buildFinished): update status
5743         before doing progress. It's embarrassing for the build to be stuck
5744         in the "building" state when an exceptions occurs elsewhere..
5746         * buildbot/status/progress.py (Expectations.expectedBuildTime):
5747         python2.2 doesn't have 'sum'
5749         * buildbot/status/builder.py (Status.getBuilderNames): return a copy,
5750         to prevent clients from accidentally sorting it
5752         * buildbot/master.py (Manhole): add username/password
5753         (BuildMaster.loadConfig): use c['manhole']=Manhole() rather than
5754         c['manholePort'], deprecate old usage
5755         * docs/config.xhtml: document c['manhole']
5756         * docs/examples/hello.cfg: show example of using a Manhole
5759         * buildbot/test/test_steps.py (FakeBuilder.getSlaveCommandVersion):
5760         pretend the slave is up to date
5762         * buildbot/status/builder.py (BuildStepStatus.stepFinished): 'log',
5763         the module, overlaps with 'log', the local variable
5765         * buildbot/status/html.py: oops, 2.2 needs __future__ for generators
5767         * buildbot/process/builder.py (Builder.getSlaveCommandVersion):
5768         new method to let Steps find out the version of their
5769         corresponding SlaveCommand.
5770         * buildbot/process/step.py (BuildStep.slaveVersion): utility method
5771         (ShellCommand.start): add 'dir' argument for <=0.5.0 slaves
5772         (CVS.startVC): backwards compatibility for <=0.5.0 slaves
5773         (SVN.startVC): same
5774         (Darcs.startVC): detect old slaves (missing the 'darcs' command)
5775         (Arch.startVC): same
5776         (P4Sync.startVC): same
5778         * buildbot/process/step.py (LoggedRemoteCommand.start): return the
5779         Deferred so we can catch errors in remote_startCommand
5780         (RemoteShellCommand.start): same
5782         * docs/examples/twisted_master.cfg: update sample config file
5784         * buildbot/slave/commands.py (ShellCommandPP): write to stdin
5785         after connectionMade() is called, not before. Close stdin at that
5786         point too.
5788         * buildbot/process/process_twisted.py: update to use Trial, clean
5789         up argument passing (move to argv arrays instead of string
5790         commands)
5792         * buildbot/process/step_twisted.py (Trial): new step to replace
5793         RunUnitTests, usable by any trial-using project (not just
5794         Twisted). Arguments have changed, see the docstring for details.
5796         * buildbot/process/base.py (Build.startBuild): this now returns a
5797         Deferred. Exceptions that occur during setupBuild are now
5798         caught better and lead to fewer build_status weirdnesses, like
5799         finishing a build that was never started.
5800         (Build.buildFinished): fire the Deferred instead of calling
5801         builder.buildFinished directly. The callback argument is this
5802         Build, everything else can be extracted from it, including the
5803         new build.results attribute.
5804         * buildbot/process/builder.py (Builder.startBuild): same
5805         (Builder.buildFinished): same, extract results from build
5807         * buildbot/process/step.py (ShellCommands): remove dead code
5809 2004-09-08  Brian Warner  <warner@lothar.com>
5811         * buildbot/test/test_vc.py (VC.doPatch): verify that a new build
5812         doesn't try to use the leftover patched workdir
5813         (SourceStamp): test source-stamp computation for CVS and SVN
5815         * buildbot/slave/commands.py (SourceBase.doPatch): mark the
5816         patched workdir ('touch .buildbot-patched') so we don't try to
5817         update it later
5818         (SourceBase.start): add ['revision'] for all Source steps
5819         (CVS): change args: use ['branch'] for -r, remove ['files']
5820         (CVS.buildVC): fix revision/branch stuff
5821         (SVN): add revision stuff
5823         * buildbot/process/step.py (BuildStep.__init__): reject unknown
5824         kwargs (except 'workdir') to avoid silent spelling errors
5825         (ShellCommand.__init__): same
5826         (Source): new base class for CVS/SVN/etc. Factor out everything
5827         common, add revision computation (perform the checkout with a -D
5828         DATE or -r REVISION that gets exactly the sources described by the
5829         last Change), overridable with step.alwaysUseLatest. Add patch
5830         handling (build.getSourceStamp can trigger the use of a base
5831         revision and a patch).
5832         (CVS, SVN, Darcs, Arch, P4Sync): refactor, remove leftover arguments
5833         * docs/steps.xhtml: update docs
5834         * docs/source.xhtml: mention .checkoutDelay
5835         * docs/examples/hello.cfg: show use of checkoutDelay, alwaysUseLatest
5837         * buildbot/process/base.py (Build.setSourceStamp): add a
5838         .sourceStamp attribute to each Build. If set, this indicates that
5839         the build should be done with something other than the most
5840         recent source tree. This will be used to implement "try" builds.
5841         (Build.allChanges): new support method
5842         (Build.lastChangeTime): remove, functionality moved to Source steps
5843         (Build.setupBuild): copy the Step args before adding ['workdir'],
5844         to avoid modifying the BuildFactory (and thus triggering spurious
5845         config changes)
5848         * buildbot/status/html.py: rename s/commits/changes/
5849         (StatusResourceChanges): same
5850         (CommitBox.getBox): same, update URL
5851         (WaterfallStatusResource): same
5852         (StatusResource.getChild): same
5854         * contrib/debugclient.py (DebugWidget.do_commit): send .revision
5855         * contrib/debug.glade: add optional 'revision' to the fakeChange
5857         * buildbot/changes/changes.py (html_tmpl): display .revision
5858         (ChangeMaster.addChange): note .revision in log
5859         * buildbot/changes/pb.py (ChangePerspective.perspective_addChange):
5860         accept a ['revision'] attribute
5862         * buildbot/process/factory.py (BuildFactory): use ComparableMixin
5864         * buildbot/master.py (BotMaster.getPerspective): update the
5865         .connected flag in SlaveStatus when it connects
5866         (BotMaster.detach): and when it disconnects
5867         (DebugPerspective.perspective_fakeChange): take a 'revision' attr
5868         (BuildMaster.loadConfig_Builders): walk old list correctly
5870         * buildbot/test/test_config.py: fix prefix= usage
5872 2004-09-06  Brian Warner  <warner@lothar.com>
5874         * NEWS: mention P4
5876         * buildbot/changes/p4poller.py (P4Source): New ChangeSource to
5877         poll a P4 depot looking for recent changes. Thanks to Dave
5878         Peticolas for the contribution. Probably needs some testing after
5879         I mangled it.
5881         * buildbot/process/step.py (P4Sync): simple P4 source-updater,
5882         requires manual client setup for each buildslave. Rather
5883         experimental. Thanks again to Dave Peticolas.
5884         * buildbot/slave/commands.py (P4Sync): slave-side source-updater
5886         * buildbot/changes/changes.py (Change): add a .revision attribute,
5887         which will eventually be used to generate source-stamp values.
5889         * buildbot/process/step.py (RemoteCommand.start): use
5890         notifyOnDisconnect to notice when we lose the slave, then treat it
5891         like an exception. This allows LogFiles to be closed and the build
5892         to be wrapped up normally. Be sure to remove the disconnect
5893         notification when the step completes so we don't accumulate a
5894         bazillion such notifications which will fire weeks later (when the
5895         slave finally disconnects normally). Fixes SF#915807, thanks to
5896         spiv (Andrew Bennetts) for the report.
5897         (LoggedRemoteCommand): move __init__ code to RemoteCommand, since it
5898         really isn't Logged- specific
5899         (LoggedRemoteCommand.remoteFailed): Add an extra newline to the
5900         header, since it's almost always going to be appended to an
5901         incomplete line
5902         * buildbot/test/test_steps.py (BuildStep.testShellCommand1):
5903         update test to handle use of notifyOnDisconnect
5905         * buildbot/status/builder.py (BuilderStatus.currentlyOffline):
5906         don't clear .ETA and .currentBuild when going offline, let the
5907         current build clean up after itself
5909         * buildbot/process/builder.py (Builder.detached): wait a moment
5910         before doing things like stopping the current build, because the
5911         current step will probably notice the disconnect and cleanup the
5912         build by itself
5913         * buildbot/test/test_run.py (Status.tearDown): update test to
5914         handle asynchronous build-detachment
5916         * buildbot/process/base.py (Build.stopBuild): minor shuffles
5918         * buildbot/status/html.py (WaterfallStatusResource.buildGrid):
5919         hush a debug message
5921 2004-09-05  Brian Warner  <warner@lothar.com>
5923         * buildbot/changes/maildir.py (Maildir.start): catch an IOError
5924         when the dnotify fcntl() fails and fall back to polling. Linux 2.2
5925         kernels do this: the fcntl module has the F_NOTIFY constant, but
5926         the kernel itself doesn't support the operation. Thanks to Olly
5927         Betts for spotting the problem.
5929         * buildbot/process/step.py (Darcs): new source-checkout command
5930         (Arch): new source-checkout command
5931         (todo_P4): fix constructor syntax, still just a placeholder
5932         * buildbot/test/test_vc.py (VC.testDarcs): test it
5933         (VC.testDarcsHTTP): same, via localhost HTTP
5934         (VC.testArch): same
5935         (VC.testArchHTTP): same
5936         * NEWS: mention new features
5938         * buildbot/slave/commands.py (ShellCommand): add .keepStdout,
5939         which tells the step to stash stdout text locally (in .stdout).
5940         Slave-side Commands can use this to make decisions based upon the
5941         output of the the ShellCommand (not just the exit code).
5942         (Darcs): New source-checkout command
5943         (Arch): New source-checkout command, uses .keepStdout in one place
5944         where it needs to discover the archive's default name.
5946         * docs/steps.xhtml: Document options taken by Darcs and Arch.
5947         * docs/source.xhtml: add brief descriptions of Darcs and Arch
5948         * docs/examples/hello.cfg: add examples of Darcs and Arch checkout
5950         * buildbot/process/step.py (ShellCommand.describe): add an
5951         alternate .descriptionDone attribute which provides descriptive
5952         text when the step is complete. .description can be ["compiling"],
5953         for use while the step is running, then .descriptionDone can be
5954         ["compile"], used alone when the step succeeds or with "failed" when
5955         it does not. Updated other steps to use the new text.
5956         * buildbot/process/step_twisted.py: same
5957         * buildbot/test/test_run.py: update tests to match
5959 2004-08-30  Brian Warner  <warner@lothar.com>
5961         * buildbot/process/step.py (ShellCommand.createSummary): fix docs
5962         (CVS.__init__): send 'patch' argument to slave
5963         (CVS.start): don't create the LoggedRemoteCommand until start(),
5964         so we can catch a .patch added after __init__
5965         (SVN.__init__): add 'patch' to SVN too
5966         (SVN.start): same
5968         * buildbot/slave/commands.py (ShellCommand): add a 'stdin'
5969         argument, to let commands push data into the process' stdin pipe.
5970         Move usePTY to a per-instance attribute, and clear it if 'stdin'
5971         is in use, since closing a PTY doesn't really affect the process
5972         in the right way (in particular, I couldn't run /usr/bin/patch
5973         under a pty).
5974         (SourceBase.doPatch): handle 'patch' argument
5976         * buildbot/test/test_vc.py (VC.doPatch): test 'patch' argument for
5977         both CVS and SVN
5979         * buildbot/slave/commands.py (cvs_ver): fix version-parsing goo
5980         * buildbot/slave/bot.py (Bot.remote_getCommands): send command
5981         versions to master
5982         * buildbot/master.py (BotPerspective.got_commands): get command
5983         versions from slave, give to each builder
5984         * buildbot/process/builder.py (Builder.attached): stash slave
5985         command versions in .remoteCommands
5987         * docs/steps.xhtml: bring docs in-line with reality
5989         * buildbot/process/step.py (CVS.__init__): more brutal
5990         compatibility code removal
5991         (SVN.__init__): same
5993         * buildbot/slave/commands.py (SlaveShellCommand): update docs
5994         (SlaveShellCommand.start): require ['workdir'] argument, remove
5995         the ['dir'] fallback (compatibility will come later)
5996         (SourceBase): update docs
5997         (SourceBase.start): remove ['directory'] fallback
5998         (CVS): update docs
5999         (SVN): update docs
6000         * buildbot/test/test_config.py (ConfigTest.testBuilders): update test
6001         * buildbot/test/test_steps.py (BuildStep.testShellCommand1): same
6002         * buildbot/test/test_slavecommand.py (SlaveCommandTestCase): same
6004         * buildbot/process/step.py (RemoteShellCommand.__init__): add
6005         want_stdout/want_stderr. remove old 'dir' keyword (to simplify the
6006         code.. I will figure out 0.5.0-compatibility hooks later)
6008 2004-08-30  Brian Warner  <warner@lothar.com>
6010         * buildbot/process/process_twisted.py: rewrite in terms of new
6011         BuildFactory base class. It got significantly shorter. Yay
6012         negative code days.
6014         * buildbot/process/step_twisted.py (HLint.start): fix to make it
6015         work with the new "self.build isn't nailed down until we call
6016         step.start()" scheme: specifically, __init__ is called before the
6017         build has decided on which Changes are going in, so we don't scan
6018         build.allFiles() for .xhtml files until start()
6019         (HLint.commandComplete): use getText(), not getStdout()
6020         (RunUnitTests.start): same: don't use .build until start()
6021         (RunUnitTests.describe): oops, don't report (None) when using
6022         the default reactor
6023         (RunUnitTests.commandComplete): use getText()
6024         (RunUnitTests.createSummary): same
6025         (BuildDebs.commandComplete): same
6027         * buildbot/process/step.py (RemoteShellCommand.__init__): don't
6028         set args['command'] until start(), since our BuildStep is allowed
6029         to change their mind up until that point
6030         (TreeSize.commandComplete): use getText(), not getStdout()
6032         * docs/examples/twisted_master.cfg: update to current standards
6034         * docs/factories.xhtml: update
6035         * buildbot/process/factory.py: implement all the common factories
6036         described in the docs. The Trial factory doesn't work yet, and
6037         I've probably broken all the process_twisted.py factories in the
6038         process. There are compatibility classes left in for things like
6039         the old BasicBuildFactory, but subclasses of them are unlikely to
6040         work.
6041         * docs/examples/glib_master.cfg: use new BuildFactories
6042         * docs/examples/hello.cfg: same
6044         * buildbot/test/test_config.py (ConfigTest.testBuilders): remove
6045         explicit 'workdir' args
6047         * buildbot/process/base.py (BuildFactory): move factories to ..
6048         * buildbot/process/factory.py (BuildFactory): .. here
6049         * buildbot/process/process_twisted.py: handle move
6050         * buildbot/test/test_config.py: same
6051         * buildbot/test/test_run.py: same
6052         * buildbot/test/test_steps.py: same
6053         * buildbot/test/test_vc.py: same
6054         * docs/factories.xhtml: same
6056         * NEWS: mention config changes that require updating master.cfg
6058         * buildbot/process/base.py (Build.setupBuild): add a 'workdir'
6059         argument to all steps that weren't given one already, pointing at
6060         the "build/" directory.
6062         * docs/examples/hello.cfg: remove explicit 'workdir' args
6064         * docs/factories.xhtml: document standard BuildFactory clases,
6065         including a bunch which are have not yet been written
6067 2004-08-29  Brian Warner  <warner@lothar.com>
6069         * buildbot/interfaces.py (IBuildStepStatus.getResults): move
6070         result constants (SUCCESS, WARNINGS, FAILURE, SKIPPED) to
6071         buildbot.status.builder so they aren't quite so internal
6072         * buildbot/process/base.py, buildbot/process/builder.py: same
6073         * buildbot/process/maxq.py, buildbot/process/step.py: same
6074         * buildbot/process/step_twisted.py, buildbot/status/builder.py: same
6075         * buildbot/status/mail.py, buildbot/test/test_run.py: same
6076         * buildbot/test/test_status.py, buildbot/test/test_vc.py: same
6078         * buildbot/status/html.py (StatusResourceBuildStep): oops, update
6079         to handle new getLogs()-returns-list behavior
6080         (StatusResourceBuildStep.getChild): same
6081         (StepBox.getBox): same
6082         (WaterfallStatusResource.phase0): same
6084         * docs/source.xhtml: document how Buildbot uses version-control
6085         systems (output side: how we get source trees)
6086         * docs/changes.xhtml: rename from sources.xhtml, documents VC
6087         systems (input side: how we learn about Changes)
6089         * buildbot/master.py (Manhole): use ComparableMixin
6090         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): same
6091         * buildbot/changes/mail.py (MaildirSource): same
6092         * buildbot/status/client.py (PBListener): same
6093         * buildbot/status/html.py (Waterfall): same
6094         * buildbot/status/words.py (IRC): same
6096         * NEWS: start describing new features
6098         * buildbot/status/mail.py (MailNotifier): finish implementation.
6099         The message body is still a bit sparse.
6100         * buildbot/test/test_status.py (Mail): test it
6102         * buildbot/util.py (ComparableMixin): class to provide the __cmp__
6103         and __hash__ methods I wind up adding everywhere. Specifically
6104         intended to support the buildbot config-file update scheme where
6105         we compare, say, the old list of IStatusTargets against the new
6106         one and don't touch something which shows up on both lists.
6107         * buildbot/test/test_util.py (Compare): test case for it
6109         * buildbot/interfaces.py (IBuildStatus): change .getLogs() to
6110         return a list instead of a dict
6111         (IBuildStepStatus.getLogs): same. The idea is that steps create
6112         logs with vaguely unique names (although their uniqueness is not
6113         guaranteed). Thus a compilation step should create its sole
6114         logfile with the name 'compile', and contribute it to the
6115         BuildStatus. If a step has two logfiles, try to create them with
6116         different names (like 'test.log' and 'test.summary'), and only
6117         contribute the important ones to the overall BuildStatus.
6118         * buildbot/status/builder.py (Event.getLogs): same
6119         (BuildStepStatus): fix default .text and .results
6120         (BuildStepStatus.addLog): switch to list-like .getLogs()
6121         (BuildStepStatus.stepFinished): same
6122         (BuildStatus.text): fix default .text
6123         (BuildStatus.getLogs): temporary hack to return all logs (from all
6124         child BuildStepStatus objects). Needs to be fixed to only report
6125         the significant ones (as contributed by the steps themselves)
6126         * buildbot/test/test_run.py: handle list-like .getLogs()
6127         * buildbot/test/test_steps.py (BuildStep.testShellCommand1): same
6129 2004-08-28  Brian Warner  <warner@lothar.com>
6131         * buildbot/process/builder.py (Builder.attached): serialize the
6132         attachment process, so the attach-watcher isn't called until the
6133         slave is really available. Add detached watchers too, which makes
6134         testing easier.
6136         * buildbot/test/test_vc.py: test VC modes (clobber/update/etc)
6138         * buildbot/test/test_swap.py: remove dead code
6140         * buildbot/slave/commands.py (ShellCommandPP): add debug messages
6141         (ShellCommand.start): treat errors in _startCommand/spawnProcess
6142         sort of as if the command being run exited with a -1. There may
6143         still be some holes in this scheme.
6144         (CVSCommand): add 'revision' tag to the VC commands, make sure the
6145         -r option appears before the module list
6146         * buildbot/process/step.py (CVS): add 'revision' argument
6148         * buildbot/slave/bot.py (SlaveBuilder._ackFailed): catch failures
6149         when sending updates or stepComplete messages to the master, since
6150         we don't currently care whether they arrive or not. When we revamp
6151         the master/slave protocol to really resume interrupted builds,
6152         this will need revisiting.
6153         (lostRemote): remove spurious print
6155         * buildbot/master.py (BotPerspective.attached): serialize the
6156         new-builder interrogation process, to make testing easier
6157         (BotMaster.waitUntilBuilderDetached): convenience function
6159         * buildbot/status/builder.py (BuilderStatus): prune old builds
6160         (BuildStatus.pruneSteps): .. and steps
6161         (BuildStepStatus.pruneLogs): .. and logs
6162         (BuilderStatus.getBuild): handle missing builds
6163         * buildbot/status/html.py (StatusResourceBuild.body): display build
6164         status in the per-build page
6165         (BuildBox.getBox): color finished builds in the per-build box
6167 2004-08-27  Brian Warner  <warner@lothar.com>
6169         * buildbot/status/mail.py (MailNotifier): new notification class,
6170         not yet finished
6172         * buildbot/slave/commands.py (SourceBase): refactor SVN and CVS into
6173         variants of a common base class which handles all the mode= logic
6175         * buildbot/interfaces.py (IBuildStatus.getPreviousBuild): add
6176         convenience method
6177         * buildbot/status/builder.py (BuildStatus.getPreviousBuild): same
6179 2004-08-26  Brian Warner  <warner@lothar.com>
6181         * buildbot/test/test_slavecommand.py: accomodate new slavecommand
6182         interfaces
6184         * buildbot/test/test_run.py: update to new Logfile interface, new
6185         buildbot.slave modules
6186         * buildbot/test/test_steps.py: same, remove Swappable, add timeouts
6188         * MANIFEST.in: new sample config file
6189         * docs/examples/hello.cfg: same
6191         * buildbot/process/step_twisted.py: remove dead import
6193         * buildbot/process/step.py (RemoteCommand.run): catch errors
6194         during .start
6195         (RemoteCommand.remote_update): ignore updates that arrive after
6196         we've shut down
6197         (RemoteCommand.remote_complete): ignore duplicate complete msgs
6198         (RemoteCommand._remoteComplete): cleanup failure handling, reduce
6199         the responsibilities of the subclass's methods
6200         (BuildStep.failed): catch errors during failure processing
6201         (BuildStep.addHTMLLog): provide all-HTML logfiles (from Failures)
6202         (CVS): move to a mode= argument (described in docstring), rather
6203         than the ungainly clobber=/export=/copydir= combination.
6204         (SVN): add mode= functionality to SVN too
6205         (todo_Darcs, todo_Arch, todo_P4): placeholders for future work
6207         * buildbot/process/base.py (Build.startNextStep): catch errors
6208         during s.startStep()
6210         * buildbot/clients/base.py: update to new PB client interface.
6211         gtkPanes is still broken
6213         * buildbot/bot.py, buildbot/slavecommand.py: move to..
6214         * buildbot/slave/bot.py, buildbot/slave/commands.py: .. new directory
6215         * setup.py: add buildbot.slave module
6216         * buildbot/bb_tap.py: handle move
6217         * buildbot/slave/registry.py: place to register commands, w/versions
6218         * buildbot/slave/bot.py: major simplifications
6219         (SlaveBuilder.remote_startCommand): use registry for slave commands,
6220         instead of a fixed table. Eventually this will make the slave more
6221         extensible. Use 'start' method on the command, not .startCommand.
6222         Fix unsafeTracebacks handling (I think).
6223         * buildbot/slave/commands.py: major cleanup. ShellCommand is now a
6224         helper class with a .start method that returns a Deferred.
6225         SlaveShellCommand is the form reached by the buildmaster. Commands
6226         which use multiple ShellCommands can just chain them as Deferreds,
6227         with some helper methods in Command (_abandonOnFailure and
6228         _checkAbandoned) to bail on rc!=0.
6229         (CVSCommand): prefer new mode= argument
6230         (SVNFetch): add mode= argument
6232         * buildbot/master.py (DebugPerspective.perspective_forceBuild):
6233         put a useful reason string on the build
6235         * buildbot/status/builder.py (LogFile): do LogFile right: move the
6236         core functionality into an IStatusLog object
6237         (BuildStatus.sendETAUpdate): don't send empty build-eta messages
6238         * buildbot/status/html.py (TextLog): HTML-rendering goes here
6239         (StatusResourceBuild.body): use proper accessor methods
6240         * buildbot/status/client.py (RemoteLog): PB-access goes here
6241         (StatusClientPerspective.perspective_subscribe): add "full" mode,
6242         which delivers log contents too
6243         (PBListener.__cmp__): make PBListeners comparable, thus removeable
6244         * buildbot/status/event.py: remove old Logfile completely
6246         * buildbot/interfaces.py (IStatusLog.subscribe): make the
6247         subscription interface for IStatusLog subscriptions just like all
6248         other the status subscriptions
6249         (IStatusReceiver.logChunk): method called on subscribers
6251 2004-08-24  Brian Warner  <warner@lothar.com>
6253         * buildbot/process/builder.py (Builder._pong): oops, ping response
6254         includes a result (the implicit None returned by remote_print).
6255         Accept it so the _pong method handles the response correctly.
6257 2004-08-06  Brian Warner  <warner@lothar.com>
6259         * buildbot/test/test_config.py: update IRC, PBListener tests
6261         * buildbot/status/client.py (StatusClientPerspective): total
6262         rewrite to match new IStatus interfaces. New subscription scheme.
6263         There are still a few optimizations to make (sending down extra
6264         information with event messages so the client doesn't have to do a
6265         round trip). The logfile-retrieval code is probably still broken.
6266         Moved the PB service into its own port, you can no longer share a
6267         TCP socket between a PBListener and, say, the slaveport (this
6268         should be fixed eventually).
6269         * buildbot/clients/base.py (Client): revamp to match. still needs
6270         a lot of work, but basic event reporting works fine. gtkPanes is
6271         completely broken.
6273         * buildbot/status/words.py (IRC): move to c['status']. Each IRC
6274         instance talks to a single irc server. Threw out all the old
6275         multi-server handling code. Still need to add back in
6276         builder-control (i.e. "force build")
6278         * buildbot/status/html.py (StatusResourceBuildStep.body): add some
6279         more random text to the as-yet-unreachable per-step page
6281         * buildbot/status/builder.py (BuildStepStatus.sendETAUpdate):
6282         rename to stepETAUpdate
6283         (BuildStatus.subscribe): add build-wide ETA updates
6284         (BuilderStatus.getState): remove more cruft
6285         (BuilderStatus.getCurrentBuild): remove more cruft
6286         (BuilderStatus.buildStarted): really handle tuple-subscription
6287         * buildbot/test/test_run.py (Status.testSlave): handle the
6288         stepETAUpdate rename
6290         * buildbot/master.py (BuildMaster): don't add a default
6291         StatusClientService. Don't add a default IrcStatusFactory. Both
6292         are now added through c['status'] in the config file. c['irc'] is
6293         accepted for backwards compatibility, the only quirk is you cannot
6294         use c['irc'] to specify IRC servers on ports other than 6667.
6296         * buildbot/interfaces.py (IBuildStatus.getCurrentStep): add method
6297         (IStatusReceiver.buildStarted): allow update-interval on subscribe
6298         (IStatusReceiver.buildETAUpdate): send build-wide ETA updates
6299         (IStatusReceiver.stepETAUpdate): rename since it's step-specific
6302         * buildbot/master.py (BuildMaster.startService): SIGHUP now causes
6303         the buildmaster to re-read its config file
6306         * buildbot/test/test_web.py (test_webPortnum): need a new hack to
6307         find out the port our server is running on
6308         (WebTest.test_webPathname_port): same
6310         * buildbot/test/test_config.py (testWebPortnum): test it
6311         (testWebPathname): ditto
6313         * docs/config.xhtml: document new c['status'] configuration option
6315         * buildbot/status/html.py (Waterfall): new top-level class which
6316         can be added to c['status']. This creates the Site as well as the
6317         necessary TCPServer/UNIXServer. It goes through the BuildMaster,
6318         reachable as .parent, for everything.
6320         * buildbot/master.py (Manhole): make it a normal service Child
6321         (BuildMaster.loadConfig_status): c['status'] replaces webPortnum and
6322         webPathname. It will eventually replace c['irc'] and the implicit
6323         PB listener as well. c['webPortnum'] and c['webPathname'] are left
6324         in as (deprecated) backward compatibility hooks for now.
6327         * buildbot/process/builder.py (Builder.buildFinished): don't
6328         inform out builder_status about a finished build, as it finds out
6329         through its child BuildStatus object
6331         * buildbot/status/html.py: extensive revamp. Use adapters to make
6332         Boxes out of BuildStepStatus and friends. Acknowledge that Steps
6333         have both starting and finishing times and adjust the waterfall
6334         display accordingly, using spacers if necessary. Use SlaveStatus
6335         to get buildslave info.
6336         (StatusResourceBuildStep): new just-one-step resource, used to get
6337         logfiles. No actual href to it yet.
6339         * buildbot/status/event.py (Logfile.doSwap): disable Swappable for
6340         the time being, until I get the file-naming scheme right
6342         * buildbot/status/builder.py (Event): clean started/finished names
6343         (BuildStatus.isFinished): .finished is not None is the right test
6344         (BuildStatus.buildStarted): track started/finished times ourselves
6345         (BuilderStatus.getSlave): provide access to SlaveStatus object
6346         (BuilderStatus.getLastFinishedBuild): all builds are now in
6347         .builds, even the currently-running one. Accomodate this change.
6348         (BuilderStatus.eventGenerator): new per-builder event generator.
6349         Returns BuildStepStatus and BuildStatus objects, since they can
6350         both be adapted as necessary.
6351         (BuilderStatus.addEvent): clean up started/finished attributes
6352         (BuilderStatus.startBuild,finishBuild): remove dead code
6353         (SlaveStatus): new object to provide ISlaveStatus
6355         * buildbot/process/step.py (ShellCommand.getColor): actually
6356         return the color instead of setting it ourselves
6357         (CVS.__init__): pull .timeout and .workdir options out of
6358         **kwargs, since BuildStep will ignore them. Without this neither
6359         will be sent to the slave correctly.
6360         (SVN.__init__): same
6362         * buildbot/process/builder.py (Builder): move flags to class-level
6363         attributes
6364         (Builder.attached): remove .remoteInfo, let the BotPerspective and
6365         SlaveStatus handle that
6367         * buildbot/process/base.py (Build.firstEvent): remove dead code
6368         (Build.stopBuild): bugfix
6370         * buildbot/changes/pb.py (PBChangeSource.describe): add method
6372         * buildbot/changes/changes.py (Change): add IStatusEvent methods
6373         (ChangeMaster.eventGenerator): yield Changes, since there are now
6374         Adapters to turn them into HTML boxes
6376         * buildbot/master.py (BotMaster): track SlaveStatus from BotMaster
6377         (BotPerspective.attached): feed a SlaveStatus object
6378         (BuildMaster.loadConfig): add a manhole port (debug over telnet)
6379         (BuildMaster.loadConfig_Builders): give BuilderStatus a parent
6381         * buildbot/interfaces.py: API additions
6382         (ISlaveStatus): place to get slave status
6384 2004-08-04  Brian Warner  <warner@lothar.com>
6386         * buildbot/slavecommand.py (DummyCommand.finished): send rc=0 when
6387         the delay finishes, so the step is marked as SUCCESS
6389         * buildbot/test/test_run.py (Status.testSlave): cover more of
6390         IBuildStatus and IBuildStepStatus
6392         * buildbot/status/progress.py (StepProgress): move some flags to
6393         class-level attributes
6394         (StepProgress.remaining): if there are no other progress metrics
6395         to go by, fall back to elapsed time
6396         (StepProgress.setExpectations): take a dict of metrics instead of
6397         a list
6398         (BuildProgress.setExpectationsFrom): pull expectations from the
6399         Expectations, instead of having it push them to the BuildProgress
6400         (Expectations): move some flags to class-level attributes
6401         (Expectations.__init__): copy per-step times from the
6402         BuildProgress too
6403         (Expectations.expectedBuildTime): new method for per-build ETA
6405         * buildbot/status/event.py (Logfile): move some flags to
6406         class-level attributes
6407         (Logfile.logProgressTo): better method name, let step set the
6408         progress axis name (instead of always being "output")
6410         * buildbot/status/builder.py (BuildStepStatus.getTimes): track the
6411         times directly, rather than depending upon the (possibly missing)
6412         .progress object. Use 'None' to indicate "not started/finished
6413         yet"
6414         (BuildStepStatus.getExpectations): oops, return the full list of
6415         expectations
6416         (BuilderStatus._buildFinished): append finished builds to .builds
6418         * buildbot/process/step.py (BuildStep): add separate .useProgress
6419         flag, since empty .progressMetrics[] still implies that time is a
6420         useful predictor
6421         (CVS): set up the cmd in __init__, instead of waiting for start()
6423         * buildbot/process/base.py (Build.startBuild): disable the 'when'
6424         calculation, this will eventually turn into a proper sourceStamp
6425         (Build.setupBuild): tell the Progress to load from the Expectations,
6426         instead of having the Expectations stuff things into the Progress
6427         (Build.buildException): add a build-level errback to make sure the
6428         build's Deferred fires even in case of exceptions
6430         * buildbot/master.py (BotMaster.forceBuild): convey the reason into
6431         the forced build
6432         * buildbot/process/builder.py (Builder.forceBuild): convey the
6433         reason instead of creating a fake Change
6435         * docs/examples/twisted_master.cfg: update to match reality
6437         * buildbot/test/test_config.py, buildbot/test/test_process.py:
6438         * buildbot/test/test_run.py, buildbot/test/test_steps.py:
6439         fix or remove broken/breaking tests
6441         * buildbot/status/event.py (Logfile.__len__): remove evil method
6443         * buildbot/status/builder.py (BuildStepStatus.stepStarted): tolerate
6444         missing .build, for test convenience
6446         * buildbot/process/step_twisted.py: import fixes
6448         * buildbot/process/step.py (BuildStep.failed): exception is FAILURE
6450         * buildbot/master.py (BuildMaster.loadConfig_Builders): leftover
6451         .statusbag reference
6453         * buildbot/bot.py (BuildSlave.stopService): tear down the TCP
6454         connection at shutdown, and stop it from reconnecting
6456         * buildbot/test/test_run.py (Run.testSlave): use a RemoteDummy to
6457         chase down remote-execution bugs
6459         * buildbot/process/step.py: more fixes, remove
6460         BuildStep.setStatus()
6461         * buildbot/status/builder.py: move setStatus() functionality into
6462         BuildStatus.addStep
6463         * buildbot/status/event.py: minor fixes
6465 2004-08-03  Brian Warner  <warner@lothar.com>
6467         * buildbot/process/base.py, buildbot/process/builder.py
6468         * buildbot/process/step.py, buildbot/status/builder.py
6469         * buildbot/status/event.py, buildbot/test/test_run.py:
6470         fix status delivery, get a basic test case working
6471         * buildbot/master.py: finish implementing basic status delivery,
6472         temporarily disable HTML/IRC/PB status sources
6474         * buildbot/bot.py (Bot.remote_setBuilderList): remove debug noise
6476         * buildbot/status/progress.py (BuildProgress): remove dead code
6478         * buildbot/interfaces.py
6479         * buildbot/process/base.py, buildbot/process/builder.py
6480         * buildbot/process/step.py, buildbot/process/step_twisted.py
6481         * buildbot/status/builder.py: Complete overhaul of the all
6482         status-delivery code, unifying all types of status clients (HTML,
6483         IRC, PB). See interfaces.IBuildStatus for an idea of what it will
6484         look like. This commit is a checkpointing of the work-in-progress:
6485         the input side is mostly done (Builders/Builds sending status
6486         to the BuilderStatus/BuildStatus objects), but the output side has
6487         not yet been started (HTML resources querying BuilderStatus
6488         objects). Things are probably very broken right now and may remain
6489         so for several weeks, I apologize for the disruption.
6491         * buildbot/status/event.py: add a setHTML method to use pre-rendered
6492         HTML as the log's contents. Currently used for exception tracebacks.
6493         * buildbot/status/progress.py: minor spelling changes
6495 2004-08-02  Brian Warner  <warner@lothar.com>
6497         * docs/config.xhtml: XHTML fixes, makes raw .xhtml files viewable
6498         in mozilla. Also added stylesheets copied from Twisted's docs.
6499         Remember that these files are meant to be run through Lore first.
6500         Thanks to Philipp Frauenfelder for the fixes.
6501         * docs/factories.xhtml, docs/sources.xhtml, docs/steps.xhtml: same
6502         * docs/stylesheet-unprocessed.css, docs/stylesheet.css: same
6503         * docs/template.tpl: added a Lore template
6505 2004-07-29  Brian Warner  <warner@lothar.com>
6507         * buildbot/interfaces.py: revamp status delivery. This is the
6508         preview: these are the Interfaces that will be provided by new
6509         Builder code, and to which the current HTML/IRC/PB status
6510         displayers will be adapted.
6512         * buildbot/slavecommand.py (ShellCommand.start): look for .usePTY
6513         on the SlaveBuilder, not the Bot.
6514         * buildbot/bot.py (Bot.remote_setBuilderList): copy Bot.usePTY to
6515         SlaveBuilder.usePTY
6516         * buildbot/test/test_slavecommand.py (FakeSlaveBuilder.usePTY):
6517         set .usePTY on the FakeSlaveBuilder
6519 2004-07-25  Brian Warner  <warner@lothar.com>
6521         * buildbot/changes/freshcvs.py: add some debug log messages
6522         (FreshCVSConnectionFactory.gotPerspective): pre-emptively fix the
6523         disabled 'setFilter' syntax
6524         (FreshCVSSourceNewcred.__init__): warn about prefix= values that
6525         don't end with a slash
6527         * buildbot/process/base.py (Builder._pong_failed): add TODO note
6529         * setup.py: bump to 0.5.0+ while between releases
6531 2004-07-23  Brian Warner  <warner@lothar.com>
6533         * setup.py (version): Releasing buildbot-0.5.0
6535 2004-07-23  Brian Warner  <warner@lothar.com>
6537         * README: update for 0.5.0 release
6539         * NEWS: update for 0.5.0 release
6541 2004-07-22  Brian Warner  <warner@lothar.com>
6543         * buildbot/slavecommand.py (ShellCommand): make usePTY a
6544         mktap-time configuration flag (--usepty=1, --usepty=0)
6545         * buildbot/bot.py: same
6547         * buildbot/master.py (BotPerspective.got_dirs): don't complain about
6548         an 'info' directory being unwanted
6550         * buildbot/changes/freshcvs.py (FreshCVSSource): flip the
6551         newcred/oldcred switch. Newcred (for CVSToys-1.0.10 and later) is now
6552         the default. To communicate with an oldcred daemond (CVSToys-1.0.9
6553         and earlier), use a FreshCVSSourceOldcred instead.
6554         (test): simple test routine: connect to server, print changes
6556         * buildbot/changes/changes.py (Change.getTime): make it possible
6557         to print un-timestamped changes
6559         * buildbot/master.py (makeApp): delete ancient dead code
6560         (BuildMaster.loadTheConfigFile): make "master.cfg" name configurable
6561         * buildbot/test/test_config.py (testFindConfigFile): test it
6563         * docs/examples/twisted_master.cfg (b22w32): use iocp reactor
6564         instead of win32 one
6567         * buildbot/master.py (BuildMaster.loadConfig_Builders): config file
6568         now takes a dictionary instead of a tuple. See docs/config.xhtml for
6569         details.
6571         * buildbot/process/base.py (Builder.__init__): change constructor
6572         to accept a dictionary of config data, rather than discrete
6573         name/slave/builddir/factory arguments
6575         * docs/examples/twisted_master.cfg: update to new syntax
6576         * docs/examples/glib_master.cfg: same
6577         * buildbot/test/test_config.py (ConfigTest.testBuilders): some
6578         rough tests of the new syntax
6580         
6581         * buildbot/master.py (BuildMaster.loadConfig): allow webPathname
6582         to be an int, which means "run a web.distrib sub-server on a TCP
6583         port". This lets you publish the buildbot status page to a remote
6584         twisted.web server (using distrib.ResourceSubscription). Also
6585         rename the local attributes used to hold these web things so
6586         they're more in touch with reality.
6587         * buildbot/test/test_web.py: test webPortnum and webPathname
6588         * docs/config.xhtml: document this new use of webPathname
6590         * docs/config.xhtml: new document, slightly ahead of reality
6591         
6592         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred.notify): fix
6593         'prefix' handling: treat it as a simple string to check with
6594         .startswith, instead of treating it as a directory. This allows
6595         sub-directories to be used. If you use prefix=, you should give it
6596         a string that starts just below the CVSROOT and ends with a slash.
6597         This prefix will be stripped from all filenames, and filenames
6598         which do not start with it will be ignored.
6600 2004-07-20  Cory Dodt  <corydodt@twistedmatrix.com>
6602         * contrib/svn_buildbot.py: Add --include (synonym for --filter)
6603         and --exclude (inverse of --include).  SVN post-commit hooks
6604         now have total control over which changes get sent to buildbot and which
6605         do not.
6607 2004-07-10  Brian Warner  <warner@lothar.com>
6609         * buildbot/test/test_twisted.py (Case1.testCountFailedTests): fix
6610         test case to match new API
6612         * buildbot/status/event.py (Logfile.getEntries): fix silly bug
6613         which crashed HTML display when self.entries=[] (needed to
6614         distinguish between [], which means "no entries yet", and None,
6615         which means "the entries have been swapped out to disk, go fetch
6616         them").
6618 2004-07-04  Brian Warner  <warner@lothar.com>
6620         * buildbot/process/step_twisted.py (countFailedTests): Count
6621         skips, expectedFailures, and unexpectedSuccesses. Start scanning
6622         10kb from the end because any import errors are wedged there and
6623         they would make us think the test log was unparseable.
6624         (RunUnitTests.finishStatus): add skip/todo counts to the event box
6626 2004-06-26  Brian Warner  <warner@lothar.com>
6628         * buildbot/process/step_twisted.py (RemovePYCs): turn the
6629         delete-*.pyc command into an actual BuildStep, so we can label it
6630         nicely
6631         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
6632         (FullTwistedBuildFactory): same
6634 2004-06-25  Cory Dodt  <corydodt@twistedmatrix.com>
6636         * contrib/fakechange.py: Add an errback when sending the fake 
6637         change, so we know it didn't work.
6639 2004-06-25  Christopher Armstrong  <radix@twistedmatrix.com>
6641         * buildbot/process/step_twisted.py: Delete *.pyc files before
6642         calling trial, so it doesn't catch any old .pyc files whose .py
6643         files have been moved or deleted.
6645         * buildbot/process/step_twisted.py (RunUnitTests): 1) Add a new
6646         parameter, 'recurse', that passes -R to trial. 2) have 'runAll'
6647         imply 'recurse'. 3) Make the default 'allTests' be ["twisted"]
6648         instead of ["twisted.test"], so that the end result is "trial -R
6649         twisted".
6651         * contrib/svn_buildbot.py: Add a --filter parameter that accepts a
6652         regular expression to match filenames that should be ignored when
6653         changed. Also add a --revision parameter that specifies the
6654         revision to examine, which is useful for debugging.
6656 2004-06-25  Brian Warner  <warner@lothar.com>
6658         * buildbot/process/step_twisted.py (trialTextSummarizer): create a
6659         summary of warnings (like DeprecationWarnings), next to the
6660         "summary" file
6662 2004-05-13  Brian Warner  <warner@lothar.com>
6664         * docs/examples/twisted_master.cfg: enable the win32 builder, as
6665         we now have a w32 build slave courtesy of Mike Taylor.
6667         * buildbot/process/base.py (Build.checkInterlocks): OMG this was
6668         so broken. Fixed a race condition that tripped up interlocked
6669         builds and caused the status to be stuck at "Interlocked" forever.
6670         The twisted buildbot's one interlocked build just so happened to
6671         never hit this case until recently (the feeding builds both pass
6672         before the interlocked build is attempted.. usually it has to wait
6673         a while).
6674         (Builder._pong_failed): fix method signature
6676         * setup.py: bump to 0.4.3+ while between releases
6678 2004-04-30  Brian Warner  <warner@lothar.com>
6680         * setup.py (version): Releasing buildbot-0.4.3
6682 2004-04-30  Brian Warner  <warner@lothar.com>
6684         * MANIFEST.in: add the doc fragments in  docs/*.xhtml
6686         * README: update for 0.4.3 release
6688         * NEWS: update for 0.4.3 release
6690         * buildbot/master.py (BuildMaster.__getstate__): make sure
6691         Versioned.__getstate__ is invoked, for upgrade from 0.4.2
6693         * buildbot/process/step_twisted.py (RunUnitTests.trial): add
6694         .trial as a class attribute, for upgrade from 0.4.2
6696         * buildbot/changes/changes.py (Change.links): add .links for
6697         upgrade from 0.4.2
6699         * buildbot/status/event.py (Logfile.__getstate__): get rid of both
6700         .textWatchers and .htmlWatchers at save time, since they are both
6701         volatile, should allow smooth 0.4.2 upgrade
6703         * buildbot/process/step.py (CVS.finishStatus): catch failed
6704         CVS/SVN commands so we can make the status box red
6706 2004-04-29  Brian Warner  <warner@lothar.com>
6708         * buildbot/changes/freshcvs.py
6709         (FreshCVSConnectionFactory.gotPerspective): add (commented-out)
6710         code to do setFilter(), which tells the freshcvs daemon to not
6711         send us stuff that we're not interested in. I will uncomment it
6712         when a new version of CVSToys is available in which setFilter()
6713         actually works, and I get a chance to test it better.
6715         * docs/examples/twisted_master.cfg: start using a PBChangeSource
6717         * buildbot/master.py (Dispatcher): use a registration scheme
6718         instead of hardwired service names
6719         (BuildMaster): keep track of the Dispatcher to support
6720         registration
6722         * buildbot/changes/changes.py (ChangeMaster): create a distinct
6723         PBChangeSource class instead of having it be an undocumented
6724         internal feature of the ChangeMaster. Split out the code into a
6725         new file.
6726         * buildbot/changes/pb.py (PBChangeSource): same
6727         * buildbot/test/test_changes.py: a few tests for PBChangeSource
6729         * docs/{factories|sources|steps}.xhtml: document some pieces
6731         * docs/examples/twisted_master.cfg: use SVN instead of CVS, stop
6732         using FCMaildirSource
6733         (f23osx): update OS-X builder to use python2.3, since the slave
6734         was updated to Panther (10.3.3)
6736 2004-03-21  Brian Warner  <warner@lothar.com>
6738         * buildbot/process/process_twisted.py: factor out doCheckout, change
6739         to use SVN instead of CVS
6741         * buildbot/process/base.py (BasicBuildFactory): refactor to make
6742         an SVN subclass easier
6743         (BasicSVN): subclass which uses Subversion instead of CVS
6745 2004-03-15  Christopher Armstrong  <radix@twistedmatrix.com>
6747         * buildbot/slavecommand.py (ShellCommand.start): use COMSPEC instead
6748         of /bin/sh on win32
6749         (CVSCommand.cvsComplete): don't assume chdir worked on win32
6751 2004-02-25  Brian Warner  <warner@lothar.com>
6753         * buildbot/slavecommand.py (ShellCommand): ['commands'] argument
6754         is now either a list (which is passed to spawnProcess directly) or
6755         a string (which gets passed to /bin/sh -c). This removes the useSH
6756         flag and the ArgslistCommand class. Also send status header at the
6757         start and end of each command, instead of having the master-side
6758         code do that.
6759         (CVSCommand): fix the doUpdate command, it failed to do the 'cp
6760         -r'. Update to use list-based arguments.
6761         (SVNFetch): use list-based arguments, use ['dir'] argument to
6762         simplify code.
6763         * buildbot/test/test_steps.py (Commands): match changes
6765         * buildbot/process/step.py (InternalShellCommand.words): handle
6766         command lists
6767         (SVN): inherit from CVS, cleanup
6769         * buildbot/status/event.py (Logfile.content): render in HTML, with
6770         stderr in red and headers (like the name of the command we're
6771         about to run) in blue. Add link to a second URL (url + "?text=1")
6772         to get just stdout/stderr in text/plain without markup. There is
6773         still a problem with .entries=None causing a crash, it seems to occur
6774         when the logfile is read before it is finished.
6776         * buildbot/bot.py (BotFactory.doKeepalive): add a 30-second
6777         timeout to the keepalives, and use it to explicitly do a
6778         loseConnection instead of waiting for TCP to notice the loss. This
6779         ought to clear up the silent-lossage problem.
6780         (unsafeTracebacks): pass exception tracebacks back to the master,
6781         makes it much easier to debug problems
6783 2004-02-23  Brian Warner  <warner@lothar.com>
6785         * buildbot/slavecommand.py (ShellCommand): add useSH flag to pass
6786         the whole command to /bin/sh instead of execve [Johan Dahlin]
6787         (CVSCommand): drop '-r BRANCH' if BRANCH==None instead of usiing
6788         '-r HEAD' [Johan Dahlin]
6789         (CVSCommand.start2): fix cvsdir calculation [Johan Dahlin]
6791         * buildbot/changes/changes.py (Change): add links= argument, add
6792         asHTML method [Johan Dahlin]. Modified to make a bit more
6793         XHTMLish. Still not sure how to best use links= .
6795         * buildbot/status/html.py (StatusResourceCommits.getChild): use 
6796         Change.asHTML to display the change, not asText
6798         * buildbot/status/html.py (StatusResourceBuilder): web button to
6799         ping slave
6801         * buildbot/test/test_run.py: test to actually start a buildmaster
6802         and poke at it
6804         * MANIFEST.in: bring back accidentally-dropped test helper files
6806         * buildbot/test/test_config.py (ConfigTest.testSources): skip tests
6807         that require cvstoys if it is not installed
6809         * buildbot/process/step_twisted.py (RunUnitTests): allow other
6810         values of "bin/trial" [Dave Peticolas]
6811         (RunUnitTests.finishStatus): say "no tests run" instead of "0
6812         tests passed" when we didn't happen to run any tests
6814         * buildbot/process/step.py (Compile): use haltOnFailure instead of
6815         flunkOnFailure [Johan Dahlin]
6817         * buildbot/process/base.py (ConfigurableBuild.setSteps): allow
6818         multiple instances of the same Step class by suffixing "_2", etc,
6819         to the name until it is unique. This name needs to be unique
6820         because it is used as a key in the dictionary that tracks build
6821         progress.
6822         * buildbot/test/test_steps.py (Steps.testMultipleStepInstances):
6823         add test for it
6825         * buildbot/process/base.py (Builder.ping): add "ping slave" command
6827 2004-01-14  Brian Warner  <warner@lothar.com>
6829         * buildbot/status/words.py (IrcStatusBot): when we leave or get
6830         kicked from a channel, log it
6832         * buildbot/master.py (Dispatcher): add "poke IRC" command to say
6833         something over whatever IRC channels the buildmaster is currently
6834         connected to. Added to try and track down a problem in which the
6835         master thinks it is still connected but the IRCd doesn't see it. I
6836         used a styles.Versioned this time, so hopefully users won't have
6837         to rebuild their .tap files this time.
6838         * contrib/debug.glade: add a "Poke IRC" button
6839         * contrib/debugclient.py: same
6841         * setup.py: bump to 0.4.2+ while between releases
6843 2004-01-08  Brian Warner  <warner@lothar.com>
6845         * setup.py (version): Releasing buildbot-0.4.2
6847 2004-01-08  Brian Warner  <warner@lothar.com>
6849         * NEWS: update for 0.4.2 release
6851         * README: document how to run the tests, now that they all pass
6853         * buildbot/changes/maildir.py (Maildir.poll): minor comment
6855         * buildbot/process/step.py (CVS): add a global_options= argument,
6856         which lets you set CVS global options for the command like "-r"
6857         for read-only checkout, or "-R" to avoid writing in the
6858         repository.
6859         * buildbot/slavecommand.py (CVSCommand): same
6861         * buildbot/status/event.py (Logfile): add a .doSwap switch to make
6862         testing easier (it is turned off when testing, to avoid the
6863         leftover timer)
6865         * buildbot/process/step.py (InternalBuildStep): shuffle code a bit
6866         to make it easier to test: break generateStepID() out to a
6867         separate function, only update statusbag if it exists.
6868         (ShellCommands): create useful text for dict-based commands too.
6870         * test/*, buildbot/test/*: move unit tests under the buildbot/
6871         directory
6872         * setup.py (packages): install buildbot.test too
6874         * buildbot/test/test_slavecommand.py: fix it, tests pass now
6875         * buildbot/test/test_steps.py: fix it, tests pass now
6877 2004-01-06  Brian Warner  <warner@lothar.com>
6879         * buildbot/changes/mail.py (parseFreshCVSMail): looks like new
6880         freshcvs mail uses a slightly different syntax for new
6881         directories. Update parser to handle either.
6882         * test/test_mailparse.py (Test1.testMsg9): test for same
6884 2003-12-21  Brian Warner  <warner@lothar.com>
6886         * buildbot/process/process_twisted.py (TwistedDebsBuildFactory): set
6887         'warnOnWarnings' so that lintian errors mark the build orange
6889 2003-12-17  Brian Warner  <warner@lothar.com>
6891         * buildbot/changes/mail.py (parseBonsaiMail): parser for commit
6892         messages emitted by Bonsai, contributed by Stephen Davis.
6894         * test/*: moved all tests to use trial instead of unittest. Some
6895         still fail (test_steps, test_slavecommand, and test_process).
6897         * setup.py (version): bump to 0.4.1+ while between releases
6899 2003-12-09  Brian Warner  <warner@lothar.com>
6901         * setup.py (version): Releasing buildbot-0.4.1
6903 2003-12-09  Brian Warner  <warner@lothar.com>
6905         * NEWS: update for 0.4.1 release
6907         * docs/examples/twisted_master.cfg: add netbsd builder, shuffle
6908         freebsd builder code a little bit
6910         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred.__cmp__):
6911         don't try to compare attributes of different classes
6912         * buildbot/changes/mail.py (MaildirSource.__cmp__): same
6913         (MaildirSource.messageReceived): fix Change delivery
6915         * buildbot/master.py (BuildMaster.loadConfig): insert 'basedir'
6916         into the config file's namespace before loading it, like the
6917         documentation claims it does
6918         * docs/examples/twisted_master.cfg: remove explicit 'basedir'
6919         (useFreshCVS): switch to using a maildir until Twisted's freshcvs
6920         daemon comes back online
6922 2003-12-08  Brian Warner  <warner@lothar.com>
6924         * docs/examples/twisted_master.cfg: provide an explicit 'basedir'
6925         so the example will work with online=0 as well
6927         * buildbot/changes/mail.py (FCMaildirSource, SyncmailMaildirSource):
6928         fix the __implements__ line
6930         * buildbot/changes/maildirtwisted.py (MaildirTwisted): make this
6931         class a twisted.application.service.Service, use startService to
6932         get it moving.
6934         * buildbot/changes/dnotify.py (DNotify): use os.open to get the
6935         directory fd instead of simple open(). I'm sure this used to work,
6936         but the current version of python refuses to open directories with
6937         open().
6939 2003-12-05  Brian Warner  <warner@lothar.com>
6941         * setup.py (version): bump to 0.4.0+ while between releases
6943 2003-12-05  Brian Warner  <warner@lothar.com>
6945         * setup.py (version): Releasing buildbot-0.4.0
6947 2003-12-05  Brian Warner  <warner@lothar.com>
6949         * docs/examples/glib_master.cfg: replace old sample scripts with
6950         new-style config files
6951         * MANIFEST.in: include .cfg files in distribution tarball
6953         * buildbot/changes/freshcvs.py (FreshCVSListener.remote_goodbye):
6954         implement a dummy method to avoid the exception that occurs when
6955         freshcvs sends this to us.
6957         * buildbot/pbutil.py (ReconnectingPBClientFactory.stopFactory):
6958         removed the method, as it broke reconnection. Apparently
6959         stopFactory is called each time the connection attempt fails. Must
6960         rethink this.
6961         (ReconnectingPBClientFactory.__getstate__): squash the _callID
6962         attribute before serialization, since without stopFactory the
6963         reconnect timer may still be active and they aren't serializable.
6965         * test/test_mailparse.py (ParseTest): test with 'self' argument
6967         * buildbot/changes/mail.py (parseFreshCVSMail): add (silly) 'self'
6968         argument, as these "functions" are invoked like methods from class
6969         attributes and therefore always get an instance as the first
6970         argument.
6972         * buildbot/changes/maildir.py (Maildir.start): fix error in error
6973         message: thanks to Stephen Davis for the catch
6975 2003-12-04  Brian Warner  <warner@lothar.com>
6977         * buildbot/pbutil.py: complete rewrite using PBClientFactory and
6978         twisted's standard ReconnectingClientFactory. Handles both oldcred
6979         and newcred connections. Also has a bug-workaround for
6980         ReconnectingClientFactory serializing its connector when it
6981         shouldn't.
6983         * buildbot/bot.py (BotFactory): rewrite connection layer with new
6984         pbutil. Replace makeApp stuff with proper newcred/mktap
6985         makeService(). Don't serialize Ephemerals on shutdown.
6987         * buildbot/changes/changes.py (ChangeMaster): make it a
6988         MultiService and add the sources as children, to get startService
6989         and stopService for free. This also gets rid of the .running flag.
6991         * buildbot/changes/freshcvs.py (FreshCVSSource): rewrite to use
6992         new pbutil, turn into a TCPClient at the same time (to get
6993         startService for free). Two variants exist: FreshCVSSourceOldcred
6994         and FreshCVSSourceNewcred (CVSToys doesn't actualy support newcred
6995         yet, but when it does, we'll be ready).
6996         (FreshCVSSource.notify): handle paths which are empty after the
6997         prefix is stripped. This only happens when the top-level (prefix)
6998         directory is added, at the very beginning of a Repository's life.
7000         * buildbot/clients/base.py: use new pbutil, clean up startup code.
7001         Now the only reconnecting code is in the factory where it belongs.
7002         (Builder.unsubscribe): unregister the disconnect callback when we
7003         delete the builder on command from the master (i.e. when the
7004         buildmaster is reconfigured and that builder goes away). This
7005         fixes a multiple-delete exception when the status client is shut
7006         down afterwards.
7007         * buildbot/clients/gtkPanes.py (GtkClient): cleanup, match the
7008         base Client. 
7010         * buildbot/status/words.py (IrcStatusBot): add some more sillyness
7011         (IrcStatusBot.getBuilderStatus): fix minor exception in error message
7013 2003-10-20  Christopher Armstrong  <radix@twistedmatrix.com>
7015         * contrib/run_maxq.py: Accept a testdir as an argument rather than
7016         a list of globs (ugh). The testdir will be searched for files
7017         named *.tests and run the tests in the order specified in each of
7018         those files. This allows for "dependancies" between tests to be
7019         codified.
7021         * buildbot/process/maxq.py (MaxQ.__init__): Accept a testdir
7022         argument to pass to run_maxq.py, instead of a glob.
7024 2003-10-17  Brian Warner  <warner@lothar.com>
7026         * buildbot/process/step_twisted.py (HLint.start): ignore .xhtml
7027         files that live in the sandbox
7029 2003-10-15  Brian Warner  <warner@lothar.com>
7031         * buildbot/process/step_twisted.py (ProcessDocs.finished): fix
7032         spelling error in "docs" count-warnings output
7033         (HLint.start): stupid thinko meant .xhtml files were ignored
7035         * docs/examples/twisted_master.cfg (reactors): disable cReactor
7036         tests now that cReactor is banished to the sandbox
7038 2003-10-10  Brian Warner  <warner@lothar.com>
7040         * buildbot/process/step_twisted.py (ProcessDocs, HLint): new Twisted
7041         scheme: now .xhtml are sources and .html are generated
7043 2003-10-08  Brian Warner  <warner@lothar.com>
7045         * buildbot/process/step_twisted.py (RunUnitTests.__init__): oops,
7046         we were ignoring the 'randomly' parameter.
7048 2003-10-01  Brian Warner  <warner@lothar.com>
7050         * buildbot/slavecommand.py (ShellCommand.start): set usePTY=1 on
7051         posix, to kill sub-children of aborted slavecommands.
7053         * buildbot/status/builder.py: rename Builder to BuilderStatus.
7054         Clean up initialization: lastBuildStatus remains None until the
7055         first build has been completed.
7057         * buildbot/status/html.py (WaterfallStatusResource.body): handle
7058         None as a lastBuildStatus
7059         * buildbot/clients/gtkPanes.py: same
7061         * buildbot/status/client.py (StatusClientService): keep
7062         BuilderStatus objects in self.statusbags . These objects now live
7063         here in the StatusClientService and are referenced by the Builder
7064         object, rather than the other way around.
7065         * buildbot/status/words.py (IrcStatusBot.getBuilderStatus): same
7066         * buildbot/process/base.py (Builder): same
7067         * test/test_config.py (ConfigTest.testBuilders): same
7069         * buildbot/master.py (BuildMaster.loadConfig_Builders): when modifying
7070         an existing builder, leave the statusbag alone. This will preserve the
7071         event history.
7073         * buildbot/pbutil.py (ReconnectingPB.connect): add initial newcred
7074         hook. This will probably go away in favor of a class in upcoming
7075         Twisted versions.
7077         * buildbot/changes/freshcvs.py (FreshCVSSource.start): Remove old
7078         serviceName from newcred FreshCVSNotifiee setup
7080 2003-09-29  Brian Warner  <warner@lothar.com>
7082         * buildbot/process/process_twisted.py: switch to new reactor
7083         abbreviations
7084         * docs/examples/twisted_master.cfg: same
7086         * README (REQUIREMENTS): mention twisted-1.0.8a3 requirement
7088         * buildbot/status/words.py (IrcStatusBot.getBuilder): use the
7089         botmaster reference instead of the oldapp service lookup
7091         * buildbot/master.py (BuildMaster.__init__): give the
7092         StatusClientService a reference to the botmaster to make it easier to
7093         force builds
7095 2003-09-24  Christopher Armstrong  <radix@twistedmatrix.com>
7097         * buildbot/status/html.py (Box.td): escape hreffy things so you
7098         can have spaces in things like builder names
7099         (StatusResourceBuilder.body)
7100         (WaterfallStatusResource.body)
7101         (WaterfallStatusResource.body0): same
7103 2003-09-25  Brian Warner  <warner@lothar.com>
7105         * buildbot/master.py (BuildMaster.loadConfig_Builders): don't
7106         rearrange the builder list when adding or removing builders: keep
7107         them in the order the user requested.
7108         * test/test_config.py (ConfigTest.testBuilders): verify it
7110         * contrib/debug.glade: give the debug window a name
7112         * buildbot/process/base.py (Builder.buildTimerFired): builders can
7113         now wait on multiple interlocks. Fix code relating to that.
7114         (Builder.checkInterlocks): same
7115         * buildbot/status/builder.py (Builder.currentlyInterlocked): same
7117         * buildbot/master.py (BuildMaster.loadConfig): move from
7118         deprecated pb.BrokerFactory to new pb.PBServerFactory
7119         * test/test_config.py (ConfigTest.testWebPathname): same
7121         * docs/examples/twisted_master.cfg: fix interlock declaration
7123         * buildbot/master.py (BotMaster.addInterlock): move code to attach
7124         Interlocks to their Builders into interlock.py .
7125         (BuildMaster.loadConfig_Interlocks): fix interlock handling
7127         * test/test_config.py (ConfigTest.testInterlocks): validate
7128         interlock handling
7130         * buildbot/process/base.py (Builder.__init__): better comments
7131         * buildbot/process/interlock.py (Interlock.__repr__): same
7132         (Interlock.deactivate): add .active flag, move the code that
7133         attaches/detaches builders into the Interlock
7135 2003-09-24  Christopher Armstrong  <radix@twistedmatrix.com>
7137         * buildbot/process/maxq.py (MaxQ): support for running a set of MaxQ
7138         tests using the new run_maxq.py script, and reporting failures by
7139         parsing its output.
7141         * contrib/run_maxq.py: Hacky little script for running a set of maxq
7142         tests, reporting their success or failure in a buildbot-friendly 
7143         manner.
7145 2003-09-24  Brian Warner  <warner@lothar.com>
7147         * docs/examples/twisted_master.cfg: example of a new-style config
7148         file. This lives in the buildmaster base directory as
7149         "master.cfg".
7151         * contrib/debugclient.py (DebugWidget.do_rebuild): add 'reload'
7152         button to make the master re-read its config file
7154         * buildbot/master.py (BuildMaster.loadConfig): new code to load
7155         buildmaster configuration from a file. This file can be re-read
7156         later, and the buildmaster will update itself to match the new
7157         desired configuration. Also use new Twisted Application class.
7158         * test/Makefile, test/test_config.py: unit tests for same
7160         * buildbot/changes/freshcvs.py (FreshCVSSource.__cmp__): make
7161         FreshCVSSources comparable, to support reload.
7162         * buildbot/changes/mail.py (MaildirSource.__cmp__): same
7164         * buildbot/process/base.py (Builder): make them comparable, make
7165         Interlocks easier to attach, to support reload. Handle
7166         re-attachment of remote slaves.
7167         * buildbot/process/interlock.py (Interlock): same
7169         * buildbot/bot.py, bb_tap.py, changes/changes.py: move to
7170         Twisted's new Application class. Requires Twisted >= 1.0.8 .
7171         buildmaster taps are now constructed with mktap.
7172         * buildbot/status/client.py (StatusClientService): same
7174         * buildbot/status/words.py: move to new Services, add support to
7175         connect to multiple networks, add reload support, allow nickname
7176         to be configured on a per-network basis
7178 2003-09-20  Brian Warner  <warner@lothar.com>
7180         * docs/examples/twisted_master.py (twisted_app): use python2.3 for
7181         the freebsd builder, now that the machine has been upgraded and no
7182         longer has python2.2
7184         * setup.py (version): bump to 0.3.5+ while between releases
7186 2003-09-19  Brian Warner  <warner@lothar.com>
7188         * setup.py (version): Releasing buildbot-0.3.5
7190 2003-09-19  Brian Warner  <warner@lothar.com>
7192         * NEWS: add post-0.3.4 notes
7194         * README (REQUIREMENTS): note twisted-1.0.7 requirement
7196         * MANIFEST.in: add contrib/*
7198         * docs/examples/twisted_master.py (twisted_app): all build slaves must
7199         use a remote root now: cvs.twistedmatrix.com
7201         * buildbot/changes/freshcvs.py (FreshCVSNotifiee.connect): update
7202         to newcred
7203         (FreshCVSNotifieeOldcred): but retain a class that uses oldcred for
7204         compatibility with old servers
7205         (FreshCVSSource.start): and provide a way to use it
7206         (FreshCVSNotifiee.disconnect): handle unconnected notifiee
7208         * docs/examples/twisted_master.py (twisted_app): update to new
7209         makeApp interface.
7210         (twisted_app): listen on new ~buildbot socket
7211         (twisted_app): Twisted CVS has moved to cvs.twistedmatrix.com
7213         * buildbot/process/process_twisted.py: Use 'copydir' on CVS steps
7214         to reduce cvs bandwidth (update instead of full checkout)
7216 2003-09-11  Brian Warner  <warner@lothar.com>
7218         * contrib/fakechange.py: demo how to connect to the changemaster
7219         port. You can use this technique to submit changes to the
7220         buildmaster from source control systems that offer a hook to run a
7221         script when changes are committed.
7223         * contrib/debugclient.py: tool to connect to the debug port. You
7224         can use it to force builds, submit fake changes, and wiggle the
7225         builder state
7227         * buildbot/master.py: the Big NewCred Reorganization. Use a single
7228         'Dispatcher' realm to handle all the different kinds of
7229         connections and Perspectives: buildslaves, the changemaster port,
7230         the debug port, and the status client port. NewCredPerspectives
7231         now have .attached/.detached methods called with the remote 'mind'
7232         reference, much like old perspectives did. All the pb.Services
7233         turned into ordinary app.ApplicationServices .
7234         (DebugService): went away, DebugPerspectives are now created
7235         directly by the Dispatcher.
7236         (makeApp): changed interface a little bit
7238         * buildbot/changes/changes.py: newcred
7239         * buildbot/status/client.py: newcred
7241         * buildbot/clients/base.py: newcred client side changes
7242         * buildbot/bot.py: ditto
7244         * docs/examples/glib_master.py: handle new makeApp() interface
7245         * docs/examples/twisted_master.py: ditto
7247         * buildbot/pbutil.py (NewCredPerspective): add a helper class to
7248         base newcred Perspectives on. This should go away once Twisted
7249         itself provides something sensible.
7252 2003-09-11  Christopher Armstrong  <radix@twistedmatrix.com>
7254         * contrib/svn_buildbot.py: A program that you can call from your
7255         SVNREPO/hooks/post-commit file that will notify a BuildBot master
7256         when a change in an SVN repository has happened. See the top of
7257         the file for some minimal usage info.
7259 2003-09-10  Christopher Armstrong  <radix@twistedmatrix.com>
7261         * buildbot/slavecommand.py (ArglistCommand): Add new
7262         ArglistCommand that takes an argument list rather than a string as
7263         a parameter. Using a st.split() for argv is very bad.
7265         * buildbot/slavecommand.py (SVNFetch): Now has the ability to
7266         update to a particular revision rather than always checking out
7267         (still not very smart about it, there may be cases where the
7268         checkout becomes inconsistent).
7270 2003-09-10  Christopher Armstrong  <radix@twistedmatrix.com>
7272         * buildbot/{bot.py,slavecommand.py,process/step.py}: Rudimentary
7273         SVN fetch support. It can checkout (not update!) a specified
7274         revision from a specified repository to a specified directory.
7276         * buildbot/status/progress.py (Expectations.update): Fix an
7277         obvious bug (apparently created by the change described in the
7278         previous ChangeLog message) by moving a check to *after* the
7279         variable it checks is defined.
7282 2003-09-08  Brian Warner  <warner@lothar.com>
7284         * buildbot/status/progress.py (Expectations.update): hack to catch
7285         an exception TTimo sees: sometimes the update() method seems to
7286         get called before the step has actually finished, so the .stopTime
7287         is not set, so no totalTime() is available and we average None
7288         with the previous value. Catch this and just don't update the
7289         metrics, and emit a log message.
7291 2003-08-24  Brian Warner  <warner@lothar.com>
7293         * buildbot/process/base.py (BasicBuildFactory): accept 'cvsCopy'
7294         parameter to set copydir='original' in CVS commands.
7296         * buildbot/process/step.py (CVS): accept 'copydir' parameter.
7298         * buildbot/slavecommand.py (CVSCommand): add 'copydir' parameter,
7299         which tells the command to maintain a separate original-source CVS
7300         workspace. For each build, this workspace will be updated, then
7301         the tree copied into a new workdir. This reduces CVS bandwidth
7302         (from a full checkout to a mere update) while doubling the local
7303         disk usage (to keep two copies of the tree).
7305 2003-08-21  Brian Warner  <warner@lothar.com>
7307         * buildbot/status/event.py (Logfile.addEntry): if the master web
7308         server dies while we're serving a page, request.write raises
7309         pb.DeadReferenceError . Catch this and treat it like a
7310         notifyFinish event by dropping the request.
7312 2003-08-18  Brian Warner  <warner@lothar.com>
7314         * buildbot/status/words.py (IrcStatusBot.command_FORCE): complain
7315         (instead of blowing up) if a force-build command is given without
7316         a reason field
7318         * buildbot/changes/changes.py (ChangeMaster.getChangeNumbered):
7319         don't blow up if there aren't yet any Changes in the list
7321 2003-08-02  Brian Warner  <warner@lothar.com>
7323         * buildbot/bot.py (updateApplication): don't set the .tap name,
7324         since we shouldn't assume we own the whole .tap file
7326         * buildbot/bb_tap.py (updateApplication): clean up code, detect
7327         'mktap buildbot' (without a subcommand) better
7329 2003-07-29  Brian Warner  <warner@lothar.com>
7331         * buildbot/status/words.py
7332         (IrcStatusFactory.clientConnectionLost): when we lose the
7333         connection to the IRC server, schedule a reconnection attempt.
7335         * buildbot/slavecommand.py (CVSCommand.doClobber): on non-posix,
7336         use shutil.rmtree instead of forking off an "rm -rf" command.
7337         rmtree may take a while and will block until it finishes, so we
7338         use "rm -rf" if available.
7340         * docs/examples/twisted_master.py: turn off kqreactor, it hangs
7341         freebsd buildslave badly
7343         * setup.py (version): bump to 0.3.4+ while between releases
7345 2003-07-28  Brian Warner  <warner@lothar.com>
7347         * setup.py (version): Releasing buildbot-0.3.4
7349 2003-07-28  Brian Warner  <warner@lothar.com>
7351         * NEWS: update in preparation for release
7353         * buildbot/slavecommand.py (ShellCommand.doTimeout): use
7354         process.signalProcess instead of os.kill, to improve w32
7355         portability
7357         * docs/examples/twisted_master.py (twisted_app): turn off
7358         win32eventreactor: the tests hang the buildslave badly
7360         * buildbot/process/base.py (Build.buildFinished): update ETA even on
7361         failed builds, since usually the failures are consistent
7363         * buildbot/process/process_twisted.py (TwistedReactorsBuildFactory):
7364         add compileOpts/compileOpts2 to reactors build
7366         * docs/examples/twisted_master.py (twisted_app): add "-c mingw32"
7367         (twisted_app): use both default and win32eventreactor on w32 build.
7368         Use both default and kqreactor on freebsd build.
7370         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
7371         add compileOpts2, which is put after the build_ext argument. w32
7372         needs "-c mingw32" here.
7374         * buildbot/status/html.py (StatusResourceBuilder.getChild): don't
7375         touch .acqpath, it goes away in recent Twisted releases
7377         * docs/examples/twisted_master.py (twisted_app): use "python" for
7378         the w32 buildslave, not "python2.2"
7380         * buildbot/bot.py (Bot.remote_getSlaveInfo): only look in info/ if
7381         the directory exists.. should hush an exception under w32
7383         * buildbot/slavecommand.py (ShellCommandPP.processEnded): use
7384         ProcessTerminated -provided values for signal and exitCode rather
7385         than parsing the unix status code directly. This should remove one
7386         more roadblock for a w32-hosted buildslave.
7388         * test/test_mailparse.py: add test cases for Syncmail parser
7390         * Buildbot/changes/freshcvsmail.py: remove leftover code, leave a
7391         temporary compatibility import. Note! Start importing
7392         FCMaildirSource from changes.mail instead of changes.freshcvsmail
7394         * buildbot/changes/mail.py (parseSyncmail): finish Syncmail parser
7396 2003-07-27  Brian Warner  <warner@lothar.com>
7398         * NEWS: started adding new features
7400         * buildbot/changes/mail.py: start work on Syncmail parser, move
7401         mail sources into their own file
7403         * buildbot/changes/freshcvs.py (FreshCVSNotifiee): mark the class
7404         as implementing IChangeSource
7405         * buildbot/changes/freshcvsmail.py (FCMaildirSource): ditto
7407         * buildbot/interfaces.py: define the IChangeSource interface
7409 2003-07-26  Brian Warner  <warner@lothar.com>
7411         * buildbot/master.py (makeApp): docstring (thanks to Kevin Turner)
7413 2003-06-25  Brian Warner  <warner@lothar.com>
7415         * buildbot/status/words.py (IrcStatusBot.emit_last): round off
7416         seconds display
7418 2003-06-17  Brian Warner  <warner@lothar.com>
7420         * buildbot/status/words.py: clean up method usage to avoid error
7421         in silly IRC command
7422         (IrcStatusBot.emit_status): round off seconds display
7424         * buildbot/process/base.py (Build): delete the timer when saving
7425         to the .tap file, and restore it (if it should still be running)
7426         upon restore. This should fix the "next build in -34 seconds"
7427         messages that result when the master is restarted while builds are
7428         sitting in the .waiting slot. If the time for the build has
7429         already passed, start it very soon (in 1 second).
7431         * buildbot/status/words.py: more silly commands
7433         * README (REQUIREMENTS): add URLs to all required software
7435         * buildbot/status/words.py ('last'): mention results of, and time
7436         since last build
7438 2003-05-28  Brian Warner  <warner@lothar.com>
7440         * buildbot/status/words.py: add 'last' command
7441         (IrcStatusBot.emit_status): add current-small text to 'status' output
7443         * docs/examples/twisted_master.py (twisted_app): turn on IRC bot
7444         (twisted_app): remove spaces from OS-X builder name
7446         * buildbot/master.py (makeApp): add knob to turn on IRC bot
7447         * buildbot/status/words.py: IRC bot should actually be useful now
7449 2003-05-23  Brian Warner  <warner@lothar.com>
7451         * buildbot/bot.py (Bot.remote_getSlaveInfo): add routines to get
7452         "slave information" from $(slavedir)/info/* . These files are
7453         maintained by the slave administrator, and describe the
7454         machine/environment that is hosting the slave. Information from
7455         them is put into the "Builder" HTML page. Still need to establish
7456         a set of well-known filenames and meanings for this data: at the
7457         moment, *all* info/* files are sent to the master, but only
7458         'admin' and 'host' are used on that end.
7459         * buildbot/status/html.py (StatusResourceBuilder.body): ditto
7460         * buildbot/process/base.py (Builder.setRemoteInfo):  ditto
7461         * buildbot/master.py (BotPerspective.got_info):  ditto
7463 2003-05-22  Brian Warner  <warner@lothar.com>
7465         * setup.py (version): bump version to 0.3.3+ while between releases
7467 2003-05-21  Brian Warner  <warner@lothar.com>
7469         * setup.py: Releasing buildbot-0.3.3
7471 2003-05-21  Brian Warner  <warner@lothar.com>
7473         * NEWS: 0.3.3 news items
7475         * README: describe --keepalive and life behind a NAT box
7477         * buildbot/bot.py (Bot.connected): implement application-level
7478         keepalives to deal with NAT timeouts, turn them on with
7479         --keepalive option or when SO_KEEPALIVE doesn't work.
7481         * buildbot/master.py (BotPerspective): accept keepalives silently
7483         * buildbot/process/base.py (Build.buildException): CopiedFailures
7484         don't carry as much information as local ones, so don't try to
7485         create a big HTMLized version of them.
7487         * buildbot/process/step.py (InternalShellCommand.stepFailed): close
7488         log file when step fails due to an exception, such as when the slave
7489         becomes unreachable
7491         * buildbot/process/step_twisted.py (RunUnitTests): use trial's new
7492         --testmodule argument instead of grepping for test-case-name tags
7493         ourselves. Remove FindUnitTests code.
7494         * buildbot/slavecommand.py, buildbot/bot.py: remove old code
7496         * MANIFEST.in: Add docs/examples, files under test/ . Oops!
7498 2003-05-16  Brian Warner  <warner@lothar.com>
7500         * buildbot/process/base.py (BasicBuildFactory): add 'configureEnv'
7501         argument to allow things like CFLAGS=-O0 to be passed without relying
7502         upon /bin/sh processing on the slave.
7504         * buildbot/process/step.py (InternalShellCommand.start): send
7505         'env' dict to slave
7506         * buildbot/slavecommand.py (ShellCommand.start): create argv with
7507         'split' instead of letting /bin/sh do it. This should also remove
7508         the need for /bin/sh on the buildslave, making it more likely to
7509         work with win32.
7511         * buildbot/status/html.py: html-escape text in blamelist.
7512         Add "force build" button to the Builder page.
7514         * buildbot/process/step_twisted.py (countFailedTests): look at
7515         last 1000 characters for status line, as import errors can put it
7516         before the -200 point.
7518 2003-05-15  Brian Warner  <warner@lothar.com>
7520         * docs/examples/twisted_master.py: use clobber=0 for remote builds
7522         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
7523         make 'clobber' a parameter, so it is possible to have builds which
7524         do full tests but do a cvs update instead of hammering the CVS
7525         server with a full checkout each build
7527         * buildbot/process/step.py (InternalShellCommand): bump default
7528         timeout to 20 minutes
7530         * buildbot/bot.py (Bot.debug_forceBuild): utility method to ask
7531         the master to trigger a build. Run it via manhole.
7533         * buildbot/master.py (BotPerspective.perspective_forceBuild):
7534         allow slaves to trigger any build that they host, to make life
7535         easier for slave admins who are testing out new build processes
7537         * buildbot/process/process_twisted.py (TwistedReactorsBuildFactory):
7538         don't flunk cReactor or qtreactor on failure, since they fail alot
7539         these days. Do warnOnFailure instead.
7541         * buildbot/process/base.py: change Builder.buildable from a list
7542         into a single slot. When we don't have a slave, new builds (once
7543         they make it past the timeout) are now merged into an existing
7544         buildable one instead of being queued. With this change, a slave
7545         which has been away for a while doesn't get pounded with all the
7546         builds it missed, but instead just does a single build.
7548 2003-05-07  Brian Warner  <warner@lothar.com>
7550         * setup.py (version): bump version to 0.3.2+ while between releases
7552 2003-05-07  Brian Warner  <warner@lothar.com>
7554         * setup.py: Releasing buildbot-0.3.2
7556 2003-05-07  Brian Warner  <warner@lothar.com>
7558         * setup.py: fix major packaging error: include subdirectories!
7559         
7560         * NEWS: add changes since last release
7562         * README (REQUIREMENTS): update twisted/python dependencies
7564         * buildbot/status/builder.py (Builder.startBuild): change
7565         BuildProcess API: now they should call startBuild/finishBuild
7566         instead of pushing firstEvent / setLastBuildStatus. Moving towards
7567         keeping a list of builds in the statusbag, to support other kinds of
7568         status delivery.
7569         (Builder.addClient): send current-activity-small to new clients
7570         * buildbot/process/base.py (Build.startBuild, .buildFinished): use
7571         new API
7573         * buildbot/status/client.py: drop RemoteReferences at shutdown
7575         * buildbot/status/event.py (Event.stoppedObserving): oops, add it
7577         * buildbot/status/progress.py (BuildProgress.remote_subscribe):
7578         more debug messages for remote status client
7580         * buildbot/process/step.py (InternalBuildStep.stepComplete)
7581         (.stepFailed): only fire the Deferred once, even if both
7582         stepComplete and stepFailed are called. I think this can happen if
7583         an exception occurs at a weird time.
7585         * buildbot/status/words.py: work-in-progress: IRC status delivery
7587 2003-05-05  Brian Warner  <warner@lothar.com>
7589         * docs/examples/twisted_master.py (twisted_app): hush internal
7590         python2.3 distutils deprecation warnings
7591         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
7592         add compileOpts= argument which inserts extra args before the
7593         "setup.py build_ext" command. This can be used to give -Wignore
7594         warnings, to hush some internal python-2.3 deprecation messages.
7596         * buildbot/process/step_twisted.py (RunUnitTests): parameterize
7597         the ['twisted.test'] default test case to make it easier to change
7598         in subclasses
7600         * buildbot/clients/base.py: switch to pb.Cacheable-style Events
7601         * buildbot/clients/gtkPanes.py: ditto
7603         * buildbot/process/step_twisted.py (RunUnitTests): use randomly=
7604         arg to collapse RunUnitTestsRandomly into RunUnitTests
7605         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
7606         use RunUnitTests(randomly=1) instead of RunUnitTestsRandomly
7608         * buildbot/status/html.py (StatusResource): shuffle Resources
7609         around to fix a bug: both 'http://foo:8080' and 'http://foo:8080/'
7610         would serve the waterfall display, but the internal links were
7611         only valid on the trailing-slash version. The correct behavior is
7612         for the non-slashed one to serve a Redirect to the slashed one.
7613         This only shows up when the buildbot page is hanging off another
7614         server, like a Twisted-Web distributed server.
7616         * buildbot/status/event.py (Event, RemoteEvent): make Events
7617         pb.Cacheable, with RemoteEvent as the cached version. This removes
7618         a lot of explicit send-an-update code.
7619         * buildbot/status/builder.py (Builder): remove send-update code
7620         * buildbot/status/client.py (ClientBuilder): remove send-update
7621         code, and log errors that occur during callRemote (mostly to catch
7622         InsecureJelly exceptions)
7624         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
7625         run Lore with the same python used in the rest of the build
7627         * buildbot/process/step_twisted2.py (RunUnitTestsJelly): moved
7629         * buildbot/process/step_twisted.py (HLint): accept 'python'
7630         argument. Catch rc!=0 and mark the step as failed. This marks the
7631         build orange ("has warnings").
7632         (RunUnitTestsJelly): move out to step_twisted2.py
7634         * buildbot/util.py (ignoreStaleRefs): add utility function
7636         * buildbot/master.py (DebugPerspective.perspective_setCurrentState):
7637         don't fake ETA object, it's too hard to get right
7639 2003-05-02  Brian Warner  <warner@lothar.com>
7641         * docs/examples/twisted_master.py (twisted_app): add FreeBSD builder
7643 2003-05-01  Brian Warner  <warner@lothar.com>
7645         * buildbot/status/html.py (StatusResource.body): oops, I was
7646         missing a <tr>, causing the waterfall page to be misrendered in
7647         everything except Galeon.
7649 2003-04-29  Brian Warner  <warner@lothar.com>
7651         * docs/examples/twisted_master.py: make debuild use python-2.2
7652         explicitly, now that Twisted stopped supporting 2.1
7654         * buildbot/process/step_twisted.py (BuildDebs.finishStatus): oops,
7655         handle tuple results too. I keep forgetting this, which suggests
7656         it needs to be rethought.
7658         * setup.py (setup): bump version to 0.3.1+ while between releases
7659         
7660 2003-04-29  Brian Warner  <warner@lothar.com>
7662         * setup.py: Releasing buildbot-0.3.1
7664 2003-04-29  Brian Warner  <warner@lothar.com>
7666         * README (SUPPORT): add plea to send questions to the mailing list
7668         * NEWS, MANIFEST.in: add description of recent changes
7670         * docs/examples/twisted_master.py: add the code used to create the
7671         Twisted buildmaster, with passwords and such removed out to a
7672         separate file.
7674         * buildbot/changes/changes.py, freshcvs.py, freshcvsmail.py: split
7675         out cvstoys-using bits from generic changes.py, to allow non-cvstoys
7676         buildmasters to not require CVSToys be installed.
7677         * README, docs/examples/glib_master: update to match the change
7679         * buildbot/clients/base.py, buildbot/bot.py,
7680         buildbot/changes/changes.py, buildbot/pbutil.py: copy
7681         ReconnectingPB from CVSToys distribution to remove CVSToys
7682         dependency for build slaves and status clients. Buildmasters which
7683         use FreshCVSSources still require cvstoys be installed, of course.
7685 2003-04-25  Brian Warner  <warner@lothar.com>
7687         * buildbot/process/process_twisted.py (FullTwistedBuildFactory): add
7688         runTestsRandomly arg to turn on trial -z
7690         * buildbot/process/step_twisted.py (TwistedJellyTestResults):
7691         experimental code to use trial's machine-parseable output to get
7692         more detailed test results. Still has some major issues.
7693         (RunUnitTestsRandomly): subclass to add "-z 0" option, runs tests
7694         in random sequence
7696         * buildbot/status/builder.py (Builder.setCurrentBuild):
7697         anticipating moving build history into statusbag, not used yet
7699         * buildbot/status/tests.py: code to centralize test results,
7700         doesn't work quite yet
7702         * buildbot/status/event.py (Event): use hasattr("setName") instead
7703         of isinstance for now.. need better long-term solution
7705         * buildbot/status/html.py: Remove old imports
7707 2003-04-24  Brian Warner  <warner@lothar.com>
7709         * buildbot/process/process_twisted.py (TwistedBuild.isFileImportant):
7710         ignore changes under doc/fun/ and sandbox/
7712         * buildbot/process/step_twisted.py: update pushEvent and friends.
7714         * buildbot/status/html.py (Box.td): replace event.buildername with
7715         event.parent.getSwappableName(). Needs more thought.
7717         * buildbot/status/builder.py (Builder): Replace pushEvent and
7718         getLastEvent with {set|update|addFileTo|finish}CurrentActivity.
7719         Tell events they are being pruned with event.delete().
7721         * buildbot/process/base.py (Build): Remove Builder status-handling
7722         methods. s/pushEvent/setCurrentActivity/.
7724         * buildbot/process/step.py (BuildStep): clean up status delivery.
7725         Gouse builder.statusbag methods instead of intermediate builder
7726         methods. s/updateLastEvent/updateCurrentActivity/.
7727         s/finalizeLastEvent/finishCurrentActivity/. Use
7728         addFileToCurrentActivity for summaryFunction.
7730         * buildbot/status/event.py (Logfile): put data in a Swappable when
7731         .finish is called.
7732         (Event): add more setter methods. Remove .buildername, use .parent
7733         and getSwappableName instead (needs more thought).
7735         * buildbot/util.py (Swappable):
7736         * test/test_swap.py: don't bother setting filename at __init__
7737         time, do it later. Change setFilename args to take parent first,
7738         since it provides the most significant part of the filename.
7740 2003-04-23  Brian Warner  <warner@lothar.com>
7742         * buildbot/status/event.py (Logfile.addEntry): append to previous
7743         entry, if possible
7745         * buildbot/process/step.py (BuildStep.finalizeLastEvent):
7746         anticipating Swappable
7747         (InternalShellCommand.remoteUpdate): split out various log-adding
7748         methods so subclasses can snarf stdout separately
7750         * buildbot/process/base.py (Builder.finalizeLastEvent): more code
7751         in anticipation of Swappable build logs
7752         (Builder.testsFinished): anticipating TestResults, still disabled
7754         * buildbot/status/builder.py (Builder.pruneEvents): only keep the
7755         last 100 events
7757         * buildbot/status/event.py (Logfile): add (disabled) support for
7758         Swappable, not ready for use yet
7760         * buildbot/util.py (Swappable): object which is swapped out to
7761         disk after some period of no use.
7762         * test/test_swap.py: test buildbot.utils.Swappable
7764 2003-04-14  Brian Warner  <warner@lothar.com>
7766         * buildbot/process/base.py (Builder.doPeriodicBuild): add simple
7767         periodic-build timer. Set the .periodicBuildTime on a builder
7768         instance to some number of seconds to activate it.
7770         * buildbot/master.py (BotMaster.forceBuild): change forceBuild API
7772         * buildbot/process/step.py (ShellCommand.finishStatus): use log.msg in
7773         a way that survives result tuples
7775 2003-04-12  Brian Warner  <warner@lothar.com>
7777         * buildbot/process/step.py (ShellCommand.finishStatusSummary):
7778         return a dict instead of a tuple: allow summarizers to provide
7779         multiple summaries if they want
7780         * buildbot/process/step_twisted.py (trialTextSummarizer): return dict
7781         (debuildSummarizer): summarize lintian warnings/errors
7783 2003-04-10  Brian Warner  <warner@lothar.com>
7785         * README (REQUIREMENTS): slave requires twisted-1.0.4a2
7787 2003-04-09  Brian Warner  <warner@lothar.com>
7789         * buildbot/process/step_twisted.py (trialTextSummarizer): Don't create
7790         empty summaries: happens when the tests fail so hard they don't emit
7791         a parseable summary line.
7793         * buildbot/process/step.py (ShellCommand.finishStatusSummary):
7794         Allow summaryFunction to return None to indicate no summary should
7795         be added.
7797         * buildbot/status/event.py (Logfile.removeHtmlWatcher): avoid
7798         writing to stale HTTP requests: notice when they disconnect and
7799         remove the request from the list. Also add CacheToFile from
7800         moshez, will be used later.
7802 2003-04-08  Brian Warner  <warner@lothar.com>
7804         * buildbot/process/step_twisted.py (ProcessDocs.finished): warnings
7805         should be an int, not a list of strings
7807         * buildbot/changes/changes.py (FreshCVSSource.stop): don't disconnect
7808         if we weren't actually connected
7810         * buildbot/process/step_twisted.py (trialTextSummarizer): function
7811         to show the tail end of the trial text output
7813         * buildbot/process/step.py (ShellCommand.finishStatusSummary): add
7814         hook to summarize the results of a ShellCommand
7816 2003-04-07  Brian Warner  <warner@lothar.com>
7818         * buildbot/process/step_twisted.py (RunUnitTests): consolidate all
7819         twisted test suite code into a single class.
7820         * buildbot/process/process_twisted.py: same
7822 2003-04-04  Brian Warner  <warner@lothar.com>
7824         * setup.py, MANIFEST.in: hack to make sure plugins.tml gets installed
7826         * README (SLAVE): document use of mktap to create slave .tap file
7827         (REQUIREMENTS): describe dependencies
7829         * buildbot/bb_tap.py, buildbot/plugins.tml:
7830         * buildbot/bot.py (updateApplication): Add mktap support for creating
7831         buildslave .tap files
7833 2003-03-28  Brian Warner  <warner@lothar.com>
7835         * buildbot/process/step.py (InternalShellCommand.finished): handle
7836         new tuple result values (fix embarrasing bug that appeared during
7837         PyCon demo)
7839 2003-03-27  Brian Warner  <warner@lothar.com>
7841         * docs/examples/glib_master.py, README: add sample buildmaster.tap
7842         -making program
7844 2003-03-25  Brian Warner  <warner@lothar.com>
7846         * buildbot/process/step.py (CVS, ShellCommand): add reason for failure
7847         to overall build status
7848         * buildbot/clients/base.py (Builder): improve event printing
7849         * buildbot/process/base.py (BasicBuildFactory): use specific steps
7850         instead of generic ShellCommand
7851         (Build): Add .stopBuild, use it when slave is detached
7853         * buildbot/process/step.py (Configure,Test): give the steps their
7854         own names and status strings
7856         * buildbot/status/html.py (StatusResource): add "show" argument,
7857         lets you limit the set of Builders being displayed.
7859 2003-03-20  Brian Warner  <warner@lothar.com>
7861         * buildbot/process/basic.py: removed
7863 2003-03-19  Brian Warner  <warner@lothar.com>
7865         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
7866         turn off process-docs by default
7868         * buildbot/process/base.py (Builder.getBuildNumbered): Don't blow up
7869         when displaying build information without anything in allBuilds[]
7871         * buildbot/bot.py (makeApp): really take password from sys.argv
7873 2003-03-18  Brian Warner  <warner@lothar.com>
7875         * buildbot/bot.py (buildApp): take password from sys.argv
7877         * README: replace with more useful text
7879         * setup.py: add a real one
7880         * MANIFEST.in, .cvsignore: more distutils packaging stuff
7881         
7882         * docs/PyCon-2003/: added sources for PyCon paper.
7884         * buildbot/process/base.py, step.py: revamp. BuildProcess is gone,
7885         now Build objects control the process and Builder only handles
7886         slave stuff and distribution of changes/status. A new BuildFactory
7887         class creates Build objects on demand.
7889         Created ConfigurableBuild which takes a list of steps to run. This
7890         makes it a lot easier to set up a new kind of build and moves us
7891         closer to being able to configure a build from a web page.
7893         * buildbot/process/step_twisted.py, process_twisted.py: move to
7894         new model. A lot of code went away.
7895         
7896         * buildbot/status/progress.py (BuildProgress.newProgress): Don't
7897         send lots of empty progress messages to the client.
7899         * buildbot/master.py (makeApp): enforce builder-name uniqueness
7901 2003-02-20  Brian Warner  <warner@lothar.com>
7903         * buildbot/process/step_twisted.py (BuildDebs): count lintian hits
7905         * buildbot/slavecommand.py (ShellCommand): back to usePTY=0. The
7906         Twisted bug that prevented non-pty processes from working just got
7907         fixed, and the bug that leaks ptys is still being investigated.
7909         * buildbot/process/step.py (CVS): send timeout arg to slave
7911         * buildbot/clients/gtkPanes.py: add connection-status row, handle
7912         builders coming and going
7913         * buildbot/clients/base.py: clean up protocol, move to ReconnectingPB
7914         from CVSToys, handle lost-buildmaster
7916         * buildbot/status/client.py (StatusClientService.removeBuilder):
7917         Clean up status client protocol: send builders (with references)
7918         as they are created, rather than sending a list and requiring the
7919         client to figure out which ones are new.
7920         * buildbot/master.py (BotMaster.forceBuild): Log debugclient
7921         attempts to force a build on an unknown builder
7923 2003-02-19  Brian Warner  <warner@lothar.com>
7925         * buildbot/slavecommand.py (CVSCommand): add timeout to sub-commands
7926         * buildbot/slavecommand.py (ShellCommand.start): stop using PTYs until
7927         Twisted stops leaking them.
7928         * buildbot/clients/gtkPanes.py (CompactBuilder): forget ETA when the
7929         builder goes to an idle state.
7931         * buildbot/slavecommand.py (ShellCommand.start): bring back PTYs until
7932         I figure out why CVS commands hang without them, and/or I fix the
7933         hung-command timeout
7935 2003-02-16  Brian Warner  <warner@lothar.com>
7937         * buildbot/process/step_twisted.py: bin/hlint went away, replace
7938         with 'bin/lore --output lint'. Use 'bin/trial -o' to remove
7939         ansi-color markup. Remove GenerateLore step. Count hlint warnings in
7940         GenerateDocs now that they are prefixed with WARNING:.
7942         * buildbot/status/html.py (StatusResource.body): Fix Builder link,
7943         use manual href target instead of request.childLink
7945         * buildbot/clients/gtkPanes.py: Fix progress countdown: update the
7946         display every second, but update the ETA every 5 seconds (or
7947         whenever) as remote_progress messages arrive.
7950 2003-02-12  Brian Warner  <warner@lothar.com>
7952         * *: import current sources from home CVS repository
7953         
7955 # Local Variables:
7956 # add-log-time-format: add-log-iso8601-time-string
7957 # End: