webstatus: add a preliminary XMLRPC server
[buildbot.git] / ChangeLog
blob88c96bb9a4f0286e8d4ec07ba116630f0c48b784
1 2007-08-12  Brian Warner  <warner@lothar.com>
3         * buildbot/status/web/xmlrpc.py (XMLRPCServer): add preliminary
4         XMLRPC server to the WebStatus page. This only has two methods
5         right now (getAllBuildsInInterval and getBuild), but we'll be
6         adding more in the future. This server is extracted from the
7         trac-plugin branch.
9         * buildbot/status/web/baseweb.py (OneLinePerBuild): refactor using
10         generateFinishedBuilds, and improve the data displayed.
11         * buildbot/status/web/build.py (StatusResourceBuild): rearrange
12         the per-Build page, add some information like ETA and got_revision
13         * buildbot/status/web/builder.py (StatusResourceBuilder): same,
14         adding a list of recently completed builds
15         * buildbot/status/web/base.py (css_classes): factor this out
17         * buildbot/interfaces.py (IStatus.generateFinishedBuilds): define
18         new method, to make status display classes easier to write,
19         especially the WebStatus 'one_line_per_build' page.
20         (IBuilderStatus.generateFinishedBuilds): same
21         * buildbot/status/builder.py (BuilderStatus.generateFinishedBuilds):
22         (Status.generateFinishedBuilds): implement it
24         * buildbot/process/factory.py (GNUAutoconf.__init__): allow
25         'source' to be a BuildStep instance, since BuildFactory accepts
26         them now.
27         (CPAN.__init__): same
28         (Distutils.__init__): same
29         (Trial.__init__): same
31         * buildbot/interfaces.py (IBuildStatus.getProperty): note that
32         this might raise KeyError
34 2007-08-07  Brian Warner  <warner@lothar.com>
36         * buildbot/slave/commands.py (P4): use 'p4user' to construct the
37         'Owner:' field of the view, rather than 'p4logname', since
38         p4logname comes from the buildslave's environment and seems
39         unlikely to ever do the right thing. Thanks to Wade Brainerd for
40         the patch. Closes #40.
42         * buildbot/buildslave.py (BuildSlave.__init__): add max_builds=,
43         which imposes a per-slave limit on how many builds are allowed to
44         run simultaneously. This has a the same scope than the SlaveLock,
45         but is different because max_builds= gives the buildmaster the
46         freedom to assign the build to a different slave, whereas the
47         SlaveLock doesn't get tested until after the build is irrevocably
48         assigned to a slave. Therefore using max_builds= will improve
49         utilization in the presence of multiple buildslaves that are
50         attached to the same Builder. This completes the incorporation of
51         Dustin Mitchell's patches, and closes ticket #48. Thanks Dustin!
52         * buildbot/process/builder.py (SlaveBuilder.buildFinished): when
53         any Builder finishes, potentially trigger *all* Builders, since
54         max_builds= may have stalled someone else while waiting for the
55         slave.
56         * buildbot/scripts/sample.cfg: mention max_builds=
57         * buildbot/test/test_run.py (ConcurrencyLimit): test it
58         * docs/buildbot.texinfo (Buildslave Specifiers): document it
60         * buildbot/test/test_run.py (CanStartBuild._do_test2): tests which
61         inherit from RunMixin do not need to call master.stopService()
62         themselves, since RunMixin.tearDown does that. The double call
63         fails on Twisted-2.0.x, which didn't happen to protect against it.
64         * buildbot/test/test_slaves.py (BuildSlave.test_track_builders): same
66         * buildbot/buildslave.py (BuildSlave.addSlaveBuilder): third patch
67         from #48, this one to have the BuildSlave objects track
68         SlaveBuilders, so they'll be able to use that knowledge to
69         influence their canStartBuild() response.
70         * buildbot/process/builder.py (SlaveBuilder.attached): call it
71         (SlaveBuilder.detached): same
72         * buildbot/test/test_slaves.py (BuildSlave): test it
74         * buildbot/buildslave.py (BuildSlave.canStartBuild): incorporate
75         the second of Dustin's #48 patches, this one adding a method to
76         the BuildSlave that allows it to decide whether it is willing to
77         participate in a build or not.
78         (SlaveBuilder.isAvailable): use canStartBuild() to decide
80         * buildbot/test/test_run.py (CanStartBuild): test for it
82         * all: incorporate the first of four patches by Dustin Mitchell
83         from ticket #48, working towards improving control over slave
84         concurrency. The first patch is to use a long-lived BuildSlave
85         object per slave, on which other behavior can be added later. I've
86         modified his patch considerably.
87         * buildbot/buildslave.py (BuildSlave): move class out of
88         slave/__init__.py (where it would get loaded by the slave as well
89         as the master, making dependencies trickier), and merge it with
90         BotPerspective. Now these BuildSlave instances are created once in
91         the master.cfg file, and not destroyed until they are either
92         removed from the config file or changed so
93         much (name/password/class changes) that we cannot continue to use
94         the old one. This affects config files: they must use
95         'from buildbot.buildslave import BuildSlave' instead of using
96         'from buildbot.slave import BuildSlave'.
97         * buildbot/master.py: move BotPerspective out
98         (BuildMaster.loadConfig_Slaves): examine old and new slaves,
99         add or remove as necessary, update the rest using data from
100         the new config file.
101         * buildbot/slave/__init__.py: move BuildSlave out
102         * buildbot/test/test*.py: import BuildSlave from the new place
103         * buildbot/scripts/sample.cfg: update to match
104         * docs/buildbot.texinfo: update to match
105         * buildbot/process/builder.py: update comments to match
107 2007-08-02  Brian Warner  <warner@lothar.com>
109         * buildbot/status/web/baseweb.py (OneLinePerBuild): improve
110         one-line-per-build pages a bit, add a header, refactor slightly
112         * buildbot/test/test_maildir.py (MaildirTest.testMaildir): cleanup
113         the TimeOutError timer, patch by Dustin Mitchell.
115 2007-08-01  Brian Warner  <warner@lothar.com>
117         * buildbot/status/web/baseweb.py (OneLinePerBuild): make this
118         mostly work (branch= is still ignored, we need a useful header)
119         (OneLinePerBuildOneBuilder.body): this too
121         * buildbot/status/web/builder.py (StatusResourceBuilder.force):
122         bring this up-to-date w.r.t. recent refactorings, and fix
123         redirections to bounce the browser to the top page after hitting
124         the 'force' button. This needs to be improved, but at least it now
125         redirects to a valid page.
126         (StatusResourceBuilder.ping): same
127         (StatusResourceBuilder.getChild): same, although I think this code
128         might be dead anyways
130         * buildbot/status/web/waterfall.py (WaterfallStatusResource): add
131         a branch= query argument, to filter the display down to builds and
132         changes that involve the given branch. You can add multiple
133         branch= arguments to see multiple branches (using a logical OR).
134         Note that there is no way to include the default branch (i.e.
135         None, i.e. trunk) yet, there is still work to be done to allow for
136         simple+uniform names of branches (i.e. removing the VC-specific
137         details of how branches are implemented, so calling the branch
138         'beta4' even though the SVN checkout step requires
139         'branches/beta4').
140         * buildbot/status/builder.py (BuilderStatus.eventGenerator): same
141         * buildbot/changes/changes.py (ChangeMaster.eventGenerator): same
142         * buildbot/interfaces.py (IEventSource.eventGenerator): same
143         * docs/buildbot.texinfo (Buildbot Web Resources): document it
145         * all: bring import statements up-to-date: don't import
146         __future__, assume cPickle and cStringIO are always available.
147         Also remove #!/usr/bin/python lines from non-scripts, my editor
148         has been a bit over-enthusiastic about stuffing them into new .py
149         files.
151         * buildbot/status/web/index.html: put a link to the waterfall page
152         on the index, otherwise first-time users of WebStatus aren't going
153         to see anything very interesting.
155         * buildbot/interfaces.py (IEventSource): document this interface.
156         Thanks to Dustin Mitchell for the patch. Closes #60.
157         * buildbot/status/builder.py (BuilderStatus): same
158         * buildbot/changes/changes.py (ChangeMaster): same
160         * buildbot/status/web/waterfall.py (WaterfallStatusResource.buildGrid):
161         add a query arg of 'show_events=true' to display non-build events,
162         like slaves attaching/detaching and reconfig events, or
163         'show_events=false' to hide them. The default is 'true'.
164         * docs/buildbot.texinfo (Buildbot Web Resources): document it
166         * web-parts: merge in web-parts branch. Lots of changes. The new
167         functionality is to add buildbot.status.html.WebStatus, which is a
168         superset of the Waterfall that adds new status pages and serves
169         regular files from BASEDIR/public_html/ , which is now the preferred
170         place to put robots.txt, buildbot.css, and index.html .
171         * buildbot/scripts/runner.py: the 'create-master' command now
172         creates public_html/ too, and populates it with a couple of
173         static files.
174         * buildbot/status/web: split waterfall code into smaller pieces
176 2007-07-31  Brian Warner  <warner@lothar.com>
178         * buildbot/scripts/startup.py (launch): import twistd.run in a
179         different way to hush pyflakes
180         * buildbot/process/builder.py: remove unused import
182 2007-07-30  Brian Warner  <warner@lothar.com>
184         * buildbot/interfaces.py (ISourceStamp): cleanup patch by Dustin
185         Mitchell: pass SourceStamps around rather than branch/version/etc
186         tuples. Thanks Dustin! Closes #70.
187         * buildbot/sourcestamp.py (SourceStamp): insist that .changes is a
188         tuple rather than a list, to avoid surprising mutations
189         * buildbot/process/builder.py (BuilderControl.resubmitBuild): same
190         * buildbot/status/mail.py (MailNotifier.buildMessage): same
191         * buildbot/status/builder.py (BuildStatus.getSourceStamp): same
192         * buildbot/test/test_status.py (Subscription): same
193         * buildbot/test/test_control.py (Force): same
194         * buildbot/test/test_buildreq.py (Request.testMerge): same
196 2007-07-29  Brian Warner  <warner@lothar.com>
198         * buildbot/scripts/sample.cfg: remove the spurious 'builders'
199         variable, since it wasn't used and is confusing in the presence of
200         c['builders'] (which *is* used). Thanks to Thomas Vander Stichele
201         for the suggestion.
203         * buildbot/status/web/waterfall.py (WaterfallStatusResource): update
204         the Buildbot home-page link to point at buildbot.net instead of 
205         sourceforge, and add a current-version query parameter so we can
206         get some statistics on which versions are in use out there.
208 2007-07-28  Brian Warner  <warner@lothar.com>
210         * buildbot/master.py (BuildMaster.loadConfig): replace c['sources']
211         with c['change_source'], leaving c['sources'] for backwards
212         compatibility (but deprecated), scheduled for removal in 0.8.0
213         * docs/buildbot.texinfo: same
214         * buildbot/test/test_config.py: verify that c['sources'] still works
215         * buildbot/test/test_*.py: replace c['sources'] with c['change_source']
216         * buildbot/scripts/sample.cfg: update to match
218         * buildbot/changes/mail.py (MaildirSource): parse with python's
219         stdlib 'email' module, which has been available since python2.2,
220         and drop use of the 'rfc822' module, which has been depreceated
221         since python2.3 .
222         * buildbot/test/test_maildir.py: same: use parse_file() not parse
224         * buildbot/test/test_maildir.py (MaildirTest.testMaildir): oops,
225         this needs to match the renaming in test/mail/msg*
227         * README (SETTING UP A BUILD MASTER): fix capitalization-typo.
228         Closes SF#1752648.
230         * buildbot/test/test_mailparse.py: rename sample emails a bit
231         * buildbot/test/mail/msg*: same
233         * buildbot/changes/mail.py (SVNCommitEmailMaildirSource): add a
234         parser for the "commit-email.pl" script that is shipped with SVN,
235         written by Justin Mason. Thanks! Closes SF#1072845.
236         * buildbot/test/mail/svn-commit.*: sample messages
237         * buildbot/test/test_mailparse.py (TestSVNCommitEmail): test it
238         * docs/buildbot.texinfo (SVNCommitEmailMaildirSource): docs
240 2007-07-27  Brian Warner  <warner@lothar.com>
242         * buildbot/changes/mail.py: refactor: move parsing into a method
243         named 'parse', each parser type gets a separate subclass. Remove
244         the old 'sep' argument (hardcode it to '/'), fix usage of prefix=
245         to be a simple leading-substring match. Add a warning to the logs
246         if prefix= does not end in a slash, since that's probably a
247         mistake. Fix both places where a prefix= mismatch would skip all
248         subsequent files in the same email, instead of just skipping the
249         one that didn't match.
250         * buildbot/test/test_mailparse.py: match changes
252         * docs/buildbot.texinfo (Getting Source Code Changes): refactor
253         docs on email-based ChangeSources
255         * docs/buildbot.texinfo (Getting Source Code Changes): move all
256         the changesource types up a level, removing the one-entry menu in
257         the process
259         * buildbot/master.py (BuildMaster.loadConfig_Slaves): rename
260         c['bots'] to c['slaves'], and use buildbot.slave.BuildSlave
261         instances instead of tuples. Closes #63.
262         * buildbot/slave/__init__.py (BuildSlave): define marker class
263         * buildbot/scripts/sample.cfg: use c['slaves'] in sample config
264         * docs/buildbot.texinfo (Buildslave Specifiers): document c['slaves']
265         * buildbot/test/test_*.py: update tests to match
266         * buildbot/test/test_config.py (ConfigTest.testBots): verify that
267         the c['bots'] backwards-compatibility handler works
269 2007-07-26  Brian Warner  <warner@lothar.com>
271         * buildbot/changes/hgbuildbot.py (hook): add an in-process
272         Mercurial change-sending hook, contributed by Frederic Leroy.
273         Thanks! Addresses #50.
274         * docs/buildbot.texinfo (MercurialHook): document it
276         * buildbot/changes/hgbuildbot.py: change the way imports are done,
277         to make it compatible with at least hg-0.9.1 and the current 0.9.4
279 2007-07-17  Brian Warner  <warner@lothar.com>
281         * buildbot/process/buildstep.py (BuildStep.getLog): add a
282         convenience method to retrieve a log added with
283         addLog()/addCompleteLog()/etc or logfiles= . I should have added
284         this two years ago..
286 2007-07-03  Brian Warner  <warner@lothar.com>
288         * buildbot/slave/commands.py (ShellCommand._startCommand): when
289         logging the environment variables, put one variable on each line,
290         rather than having one really long line with all of them. This
291         should make them a bit more readable and not trigger the
292         horizontal scrollbar (when viewing it in a web browser) quite so
293         much. Thanks to Albert Hofkamp for the patch.
295         * buildbot/steps/shell.py (ShellCommand): allow workdir= to be a
296         WithProperties instance. Thanks to Axel Hecht for the patch.
297         Closes #43.
298         * buildbot/test/test_properties.py (Interpolate.testWorkdir): test it
299         * docs/buildbot.texinfo (Build Properties): document it
300         * buildbot/slave/commands.py (ShellCommand._startCommand): create the
301         workdir if it didn't already exist.
303         * docs/buildbot.texinfo (Scheduler Types): correct the description
304         of Dependent schedulers. Thanks to Greg Ward for the patch.
306         * buildbot/steps/source.py (SVN.startVC): when applying a patch,
307         add "[patch]" to the step's display. Thanks to Dustin Mitchell for
308         the patch. Closes #49.
310         * buildbot/slave/commands.py (rmdirRecursive): chmod everything to
311         0700 before removing it, to deal with situations where a build will
312         leave files around without write permissions and the 'copy' or
313         'clobber' VC checkout modes need to blow away the tree first.
314         Thanks to Steve Milner for the suggestion and the patch (which I
315         mangled horribly). Closes #29.
316         * buildbot/test/test_slavecommand.py (Utilities.test_rmdirRecursive):
317         test for it
319         * buildbot/test/runutils.py (RunMixin.disappearSlave): oops, add
320         an allowReconnect= argument to let callers control whether they
321         want this don't-let-it-reconnect behavior, since some tests care.
322         Factor out the .continueTrying=False lines from those callers.
323         * buildbot/test/test_slaves.py: same
324         * buildbot/test/test_run.py: same
326 2007-07-02  Brian Warner  <warner@lothar.com>
328         * buildbot/test/runutils.py (RunMixin.disappearSlave): once a
329         slave has been disappeared, don't let it reconnect. This was
330         causing an intermittent failure in test_slaves.py, when the slave
331         that was supposed to be gone managed to come back by the end of
332         the test and affect the count.
333         * buildbot/test/test_slaves.py (Slave.testFallback2): minor
334         refactorings
335         * buildbot/process/builder.py (SlaveBuilder.__repr__): added some
336         diagnostic messages to track down this problem
337         (Builder.startBuild): same
339         * buildbot/process/builder.py (Builder.maybeStartBuild): choose
340         the slave randomly rather than always taking the first one. Thanks
341         to Pike for the patch. Closes #36.
342         * buildbot/test/test_slaves.py: match the change. to avoid huge
343         changes to the tests, I added a CHOOSE_SLAVES_RANDOMLY flag which
344         enables/disables the round-robin-ness (enabled by default), and
345         some unit tests disable it.
346         * docs/buildbot.texinfo (Buildmaster Architecture): document it
348         * buildbot/slave/bot.py (BuildSlave.__init__): rename the 'host'
349         argument to 'buildmaster_host', to make it more obvious that this
350         points to the buildmaster. Thanks to Bob Proulx for the
351         suggestion.
352         * buildbot/scripts/runner.py (slaveTAC): same
353         * buildbot/test/test_runner.py (Create.testSlave): match the change
355         * contrib/hg_buildbot.py: patch from Frederic Leroy to make this
356         work better.
358 2007-06-17  Brian Warner  <warner@lothar.com>
360         * buildbot/test/test_config.py (Factories.testAllSteps): make sure
361         we can round-trip all of our current step classes by calling
362         getStepFactory() and using the results to make a clone of the
363         original step.
365         * buildbot/steps/maxq.py: fix import errors. Guess this hasn't been
366         used in a while..
368         * buildbot/process/factory.py (BuildFactory.addStep): To simplify
369         the config file, we're moving to using actual instances instead of
370         the (class, kwargs) 'step specification' tuples. BuildFactory
371         still keeps a list of tuples internally, but when real instances
372         are passed in to addStep(), they are asked for their class and
373         kwargs using the new BuildStep.getStepFactory method. BuildFactory
374         accepts both instances and the tuple form, and converts instances
375         to the tuple form, but the instance form is preferred because it
376         gives the Steps a chance to do argument validation. Closes: #11.
378         * buildbot/process/buildstep.py (BuildStep.__init__): record the
379         factory information necessary to implement getStepFactory. The
380         addFactoryArguments() method can be used to include arguments that
381         aren't passed to the BuildStep base class constructor.
382         (BuildStep.setBuild):
383         (BuildStep.setDefaultWorkdir): new methods to take parameters that
384         are needed for live BuildSteps but not to construct the specification
385         tuples that are stashed in the factory.
387         * buildbot/process/base.py (Build.setupBuild): pass 'build' and
388         'workdir' into new BuildSteps by using methods instead of
389         arguments. This makes the constructor for BuildSteps a lot
390         simpler.
392         * buildbot/steps/*.py: update to match this change. Basically this
393         means adding calls to addFactoryArguments() in the __init__
394         methods to capture the arguments that aren't passed through to the
395         base class.
396         * buildbot/steps/shell.py (ShellCommand.setDefaultWorkdir): copy
397         the new workdir (if any) into the RemoteShellCommands arguments.
398         * buildbot/steps/source.py: allow workdir= to be optional,
399         implement setDefaultWorkdir() since we don't inherit from
400         (CVS): finally remove old clobber=/export=/copydir= arguments,
401         in favor of the mode= argument that's been around forever now.
402         * buildbot/steps/transfer.py: remove build= argument
404         * buildbot/test/*.py: update to match, generally by turning all
405         build= arguments into subsequent calls to s.setBuild()
406         * buildbot/test/test_config.py (Factories): verify that we can
407         use either BuildStep instances or class/kwarg tuples in both
408         BuildFactory.addStep and BuildFactory.__init__
410         * docs/buildbot.texinfo (Build Steps): document the new approach,
411         mention compatibility with the old approach, update all examples
412         to use the new style.
414 2007-06-16  Brian Warner  <warner@lothar.com>
416         * buildbot/changes/svnpoller.py: when the poll fails, don't kill
417         the LoopingCall, just eat the failure so that we'll poll again
418         next time. This should allow us to tolerate (e.g.) sf.net SVN
419         failures more gracefully. Many thanks to Dustin Mitchell for the
420         patch. Closes #34.
422 2007-05-17  Brian Warner  <warner@lothar.com>
424         * buildbot/status/words.py: refactor the IRC status bot into
425         separate 'Contact' and 'Channel' classes. The base Contact class
426         contains the interaction code: commands and responses. The
427         IRCContact subclass (and IrcStatusBot 'Channel') handle the
428         IRC-specific aspects. The plan is to write other subclasses for
429         other IM protocols like AIM and Jabber.
431 2007-04-16  Brian Warner  <warner@lothar.com>
433         * CREDITS: update list of contributors. Thank you all!
435 2007-04-13  Brian Warner  <warner@lothar.com>
437         * buildbot/status/mail.py (MailNotifier): add the project name to
438         the subject line and message body, to make it easier to
439         distinguish email coming from different buildmasters. Thanks to
440         Benoit Sigoure for the patch.
441         * buildbot/test/test_status.py (Mail): update to match
443 2007-03-24  Brian Warner  <warner@lothar.com>
445         * buildbot/steps/transfer.py: open all files in 'b' binary mode to
446         avoid text-conversion problems between DOS/windows and unix.
447         Thanks to Phil Thompson for the patch. Fixes SF#1674927.
449 2007-03-03  Brian Warner  <warner@lothar.com>
451         * buildbot/status/html.py (_hush_pyflakes): hush a pyflakes
452         warning about the use of Waterfall here
454 2007-03-01  Brian Warner  <warner@lothar.com>
456         * buildbot/interfaces.py (IStatus.getBuilder): mention exceptions
458 2007-02-28  Brian Warner  <warner@lothar.com>
460         * buildbot/changes/p4poller.py (P4Source): apply change from Scott
461         Lamb to use a more optimal form of 'p4 changes', to reduce server
462         load. He reports that this optimization was added to p4d release
463         2005.2, but it should work in all versions. Closes #27.
464         * buildbot/test/test_p4poller.py: match it
466 2007-02-27  Brian Warner  <warner@lothar.com>
468         * buildbot/status/web/*.py: move all web status stuff into a
469         separate directory, in anticipation of splitting it into smaller
470         pieces and adding more files. html.py was getting way too big.
471         * buildbot/status/classic.css: move it too
472         * setup.py: add the new sub-package
473         * buildbot/test/test_web.py: match the changes
474         * MANIFEST.in: handle the move of classic.css
476 2007-02-07  Brian Warner  <warner@lothar.com>
478         * contrib/OS-X/*: add some launchd .plist files for automatically
479         starting a buildmaster or buildslave under OS-X (10.4 or later).
480         Thanks to Mark Pauley for these.
482 2007-02-06  Brian Warner  <warner@lothar.com>
484         * docs/buildbot.texinfo (Requirements): update requirements to
485         stop claiming compatibility with python-2.2 or twisted-1.3.x .
486         Closes #13.
487         * README: mention python-2.5 and twisted-2.5 compatibility
489         * buildbot/clients/debug.py: hush pyflakes warnings by removing a
490         redundant import
491         * buildbot/scripts/startup.py: same, by removing twisted-1.3.0
492         compatibility
493         * buildbot/status/builder.py: same, by requiring cStringIO
494         * buildbot/status/words.py: same, remove twisted-1.3.0 compat
495         * buildbot/test/test_vc.py: same
496         * buildbot/test/test_web.py:
497         * buildbot/test/test_steps.py: same, remove unused import
499         * buildbot/status/html.py (StatusResourceBuild.body): oops, close
500         the FORM tag
502         * buildbot/master.py (BuildMaster.loadConfig): warn the user if we
503         see any Builders that don't have Schedulers to drive them
505         * buildbot/master.py (BotPerspective.__repr__): fit bitrot, the
506         attributes this uses went away
508         * contrib/bb_applet.py (MyApplet.filled): add a small prefs
509         dialog, to allow you to reset the buildmaster and force
510         connect/disconnect. Correctly handle losing the buildmaster
511         connection (by switching the display to the hexnut, at which point
512         you can use the 'Connect' menu item to reconnect).
514         * buildbot/steps/source.py (Source.start): if we're using a patch,
515         add it as a LogFile to the checkout/update step. This will turn
516         into a link on the waterfall page.
518         * buildbot/scripts/tryclient.py (Try.createJob): implement --diff
519         option, to take the patch from a pre-made file rather than
520         generating it from the local tree. Thanks to Robert Helmer for the
521         idea. Closes #15 (the Trac ticket on the new http://buildbot.net/).
522         * buildbot/scripts/runner.py (TryOptions): add --diff,
523         --patchlevel, and --baserev options
524         * buildbot/scheduler.py (Try_Jobdir.parseJob): treat a baserev of ""
525         as None, meaning HEAD.
526         * buildbot/sourcestamp.py (SourceStamp): update docstring to
527         indicate that baserev=None means HEAD
528         * docs/buildbot.texinfo (try --diff): document it
530         * buildbot/test/test_steps.py (BuildStep): remove use of
531         reactor.iterate(), although the technique I replaced it with is a
532         gross polling hack that must be cleaned up properly some day. This
533         was the last use of reactor.iterate in the entire tree, yay.
535 2007-02-05  Brian Warner  <warner@lothar.com>
537         * buildbot/status/mail.py (MailNotifier.__init__): assert that 'mode'
538         is one of the three known values, otherwise we emit some confusing
539         messages later on. Thanks to Grig Gheorghiu for the catch.
541 2007-01-30  Brian Warner  <warner@lothar.com>
543         * buildbot/changes/bonsaipoller.py (BonsaiParser.__init__): Ben
544         Hearsum contributed a patch to let BonsaiPoller work with results
545         that contain non-ascii characters. Closes SF#1632641.
547 2007-01-27  Brian Warner  <warner@lothar.com>
549         * Makefile (release): produce both .tar.gz and .zip source bundles.
550         Closes SF#1222216.
552 2007-01-23  Brian Warner  <warner@lothar.com>
554         * buildbot/changes/freshcvsmail.py: hush a pyflakes warning
555         * buildbot/changes/monotone.py: same
557         * buildbot/changes/maildir.py: combine several files into one,
558         clean up maildir.py to use Services properly.
559         * buildbot/changes/maildirtwisted.py: remove
560         * buildbot/changes/maildirgtk.py: remove, it wasn't used by
561         buildbot anyways.
562         * buildbot/changes/mail.py: match the change
563         * buildbot/scheduler.py: same, since Try_Jobdir uses a maildir
564         * buildbot/test/test_maildir.py: remove use of reactor.iterate()
566         * buildbot/slave/commands.py (command_version): bump to "2.3" to
567         indicate that the buildslave knows about the 'bzr' command
569 2007-01-22  Brian Warner  <warner@lothar.com>
571         * buildbot/process/builder.py (Builder.fireTestEvent): don't use
572         'with', it will become a reserved work in python2.6 .
574         * contrib/bb_applet.py: add a simple gnome-panel applet, to
575         display a terse summary of buildbot status.
576         * docs/hexnut32.png, docs/hexnut48.png, docs/hexnut64.png: add
577         some icons, small versions of the Blender object that lives in
578         docs/images/icon.blend
580         * buildbot/steps/source.py (Bzr): add Bazaar-ng support
581         * buildbot/slave/commands.py (Bzr): same
582         * buildbot/scripts/tryclient.py (BzrExtractor): same
583         (SourceStampExtractor.dovc): modify this to allow non-zero exit
584         status, since 'bzr diff' does that
585         * buildbot/test/test_vc.py (Bzr): same
586         * docs/buildbot.texinfo (How Different VC Systems Specify Sources):
587         add notes on bzr
588         (Bzr): document it
590 2007-01-20  Brian Warner  <warner@lothar.com>
592         * contrib/darcs_buildbot.py: tidy up the progress messages
594 2007-01-17  Brian Warner  <warner@lothar.com>
596         * contrib/darcs_buildbot.py: enhance to handle multiple patches
597         being pushed at a time. This keeps state in the repository in a
598         small file named .darcs_buildbot-lastchange, but that shouldn't
599         interfere with normal repository operations. Fixes SF#1534049.
600         * buildbot/clients/sendchange.py (Sender): make a single Sender
601         capable of sending Changes with different usernames.
603 2006-12-11  Brian Warner  <warner@lothar.com>
605         * buildbot/changes/freshcvsmail.py: mark this file as deprecated,
606         scheduled for removal in 0.7.7 . The FCMaildirSource was moved to
607         buildbot.changes.mail a long time ago, but I forgot to add the
608         DeprecationWarning until now.
610         * buildbot/process/maxq.py: remove this, the functionality now
611         lives in buildbot.steps.maxq
613         * buildbot/clients/debug.py: remove an unnecessary gnome.ui import
614         * buildbot/clients/gtkPanes.py: remove unused import
616         * buildbot/slave/trial.py: remove an unused/incomplete/buggy file,
617         that was meant to provide a special Reporter to run inside trial
618         and give the buildslave lots of machine-readable status. We never
619         finished this project.
621         * buildbot/changes/bonsaipoller.py: remove unused imports
622         * buildbot/changes/svnpoller.py: same
623         * buildbot/process/builder.py: same
624         * buildbot/process/buildstep.py: same
625         * buildbot/slave/bot.py: hush pyflakes warning
626         * buildbot/status/tests.py: remove unused imports
627         * buildbot/status/tinderbox.py: same
628         * buildbot/steps/python_twisted.py: same
630         * buildbot/process/step.py: remove this file, these names were
631         deprecated in 0.7.5 and are now being removed.
632         * buildbot/process/step_twisted.py: same
633         * buildbot/test/test_steps.py (ReorgCompatibility): remove test
635         * buildbot/twcompat.py: remove the empty file, yay it is gone
637         * buildbot/twcompat.py (waitForDeferred): remove the monkeypatch,
638         tw-2.0.0 and newer have the method we need.
639         (getProcessOutputAndValue): same
640         (which): remove this method, tw-2.0.0 t.p.procutils has it
642         * buildbot/twcompat.py (implements): remove this method
643         * buildbot/*: import implements() from zope.interface directly
645         * buildbot/status/mail.py: stop falling back to importing
646         twisted.protocols.smtp.sendmail, now that we don't need tw-1.3.0
647         support
649         * buildbot/twcompat.py (Interface): remove this import
650         * buildbot/*: import Interface from zope.interface directly
652         * buildbot/twcompat.py (providedBy): remove this method
653         * buildbot/*: turn all uses of providedBy(obj, iface) into
654         iface.providedBy(obj)
656         * buildbot/twcompat.py (maybeWait): remove this method, now that
657         we no longer maintain compatibility with Twisted<=1.3.0 .
658         Twisted-2.0.0 and later allow trial methods to return Deferreds
659         directly.
660         * buildbot/test/*: remove all uses of maybeWait
662         * buildbot/__init__.py (version): bump to 0.7.5+ while between
663         releases
664         * docs/buildbot.texinfo: same
666 2006-12-10  Brian Warner  <warner@lothar.com>
668         * buildbot/__init__.py (version): Releasing buildbot-0.7.5
669         * docs/buildbot.texinfo: set version to match
671 2006-12-10  Brian Warner  <warner@lothar.com>
673         * README (REQUIREMENTS): update for release
674         * NEWS: update for release
675         * buildbot/slave/commands.py (command_version): mention that this
676         version (2.2) was released with buildbot-0.7.5
678         * buildbot/test/test_config.py (StartService.testStartService):
679         inhibit the usual read-config-on-startup behavior, since otherwise
680         the log.err that gets recorded causes the test to fail
682         * buildbot/status/builder.py (LogFile.finish): forget about all
683         subscribers once the log has finished, since after that point
684         we're never going to use them again. This might help free up some
685         memory somewhere.
687         * buildbot/clients/debug.py: update to use gtk.main_quit() rather
688         than the old/deprecated gtk.mainquit()
690 2006-12-09  Brian Warner  <warner@lothar.com>
692         * buildbot/steps/transfer.py (_FileWriter.__del__): handle errors
693         better when we can't open the masterdst file
695         * buildbot/scripts/startup.py (Follower._failure): add missing
696         import statement for BuildSlaveDetectedError
698         * buildbot/steps/transfer.py (FileUpload): cleanup
699         (FileDownload): same. Add tests for slave version, add mode=.
700         * buildbot/slave/commands.py (SlaveFileUploadCommand): same
701         (SlaveFileDownloadCommand): same
702         * buildbot/test/test_transfer.py: enhance tests
703         * buildbot/test/runutils.py (makeBuildStep): create a fake form of
704         step.slaveVersion
706 2006-12-08  Brian Warner  <warner@lothar.com>
708         * buildbot/scripts/runner.py (sendchange): halt the reactor on
709         both success *and* failure. Without this, the 'buildbot
710         sendchange' command would hang if it could not contact the
711         buildmaster or deliver the Change, which would generally cause the
712         user's commit/record/checkin command to hang too. Thanks to
713         Christian Unger for the catch.
715 2006-12-06  Brian Warner  <warner@lothar.com>
717         * NEWS: update with items for the next release
719         * docs/buildbot.texinfo (Adding LogObservers): add a somewhat
720         whimsical example pulled from a punch-drunk email I sent out late
721         one night.
722         (Transferring Files): document some of the other parameters
723         (Adding LogObservers): update to 0.7.5 buildbot.steps.*
724         (SVNPoller): rename svnpoller.SvnSource to SVNPoller
725         * buildbot/test/test_svnpoller.py: same
726         * buildbot/changes/svnpoller.py (SVNPoller): same
728 2006-11-26  Brian Warner  <warner@lothar.com>
730         * docs/buildbot.texinfo (Build Properties): remind users that
731         WithProperties must appear in a command= list, not as a top-level
732         instance.
733         * buildbot/steps/shell.py (ShellCommand.start): and assert that
734         we're sending a list or a single string to the RemoteShellCommand
736         * buildbot/scheduler.py (Nightly): Improve docs slightly.
738         * buildbot/scripts/startup.py (start): skip the whole
739         watch-the-logfile thing under windows, since it needs os.fork()
741         * buildbot/scripts/runner.py (restart): remove the old message
742         that got printed after the buildbot was restarted.. it most cases
743         it didn't get printed at the right time anyways
745 2006-11-25  Brian Warner  <warner@lothar.com>
747         * buildbot/scripts/runner.py: enhance 'start' and 'restart' to
748         follow twistd.log and print lines until the process has started
749         started properly. For the buildmaster, this means until the config
750         file has been parsed and accepted. For the buildslave, this means
751         until we've connected to the master. We give up after 5 seconds in
752         any case. Helpful error messages and troubleshooting suggestions
753         are printed when we don't see a successful startup. This closes the
754         remainder of SF#1517975.
755         * buildbot/scripts/startup.py: moved app startup code to here
756         * buildbot/scripts/logwatcher.py: utility class to follow log
757         * buildbot/scripts/reconfig.py: rewrite to use LogWatcher
758         * buildbot/slave/bot.py: announce our BuildSlaveness to the log
759         so the LogWatcher can tell the difference between a buildmaster
760         and a buildslave
762 2006-11-24  Brian Warner  <warner@lothar.com>
764         * docs/examples/twisted_master.cfg: update to match the version
765         in use on twistedmatrix.com
766         (IRC): re-enable IRC bot. The 'irc.us.freenode.net' hostname I
767         was using before stopped working, but 'irc.freenode.net' works
768         just fine.
770         * buildbot/scripts/runner.py (run): oops, forgot to enable the new
771         'reconfig' command
773         * buildbot/clients/base.py (TextClient.not_connected): upon
774         UnauthorizedLogin failures, remind the user to connect to the
775         PBListener port instead of the slaveport.
776         (TextClient.disconnected): shut down more quietly
777         * docs/buildbot.texinfo (statuslog): add another reminder
779         * buildbot/scripts/runner.py (Options.subCommands): rename
780         'buildbot sighup DIR' to 'buildbot reconfig DIR', but keep
781         'sighup' as an alias.
782         * buildbot/scripts/reconfig.py (Reconfigurator): enhance the
783         reconfig command to follow twistd.log and print all of the lines
784         from the start of the config-file reload to its completion. This
785         should make it a lot easier to discover bugs in the config file.
786         Use --quiet to disable this behavior. This addresses half of
787         SF#1517975, the other half will be to add this same utility to
788         'buildbot start' and 'buildbot restart'.
789         * docs/buildbot.texinfo (Loading the Config File): same
790         (Shutdown): same
792         * buildbot/interfaces.py (IBuilderControl.forceBuild): remove this
793         method, it has been deprecated for a long time. Use
794         IBuilderControl.requestBuild instead.
795         * buildbot/process/builder.py (BuilderControl.forceBuild): remove
796         * buildbot/master.py (BotPerspective.perspective_forceBuild): same
797         * buildbot/slave/bot.py (Bot.debug_forceBuild): same
798         * buildbot/test/test_control.py (Force.testForce): same
799         * buildbot/test/test_run.py: use requestBuild instead
801         * buildbot/clients/debug.py: replace 'Force Build' button with
802         'Request Build' (which just adds one to the queue), add Ping
803         Builder, add branch/revision fields to Request Build.
804         * buildbot/clients/debug.glade: same
805         * buildbot/master.py: update interface to match. This creates an
806         incompatibility between new debugclients and old buildmasters.
808         * buildbot/process/builder.py (Builder._attached): delay the call
809         to maybeStartBuild for a reactor turn, to avoid starting a build
810         in the middle of a reconfig (say, if the new Builder uses a new
811         slave which is already connected).
813 2006-11-23  Brian Warner  <warner@lothar.com>
815         * buildbot/test/test_transfer.py: appease pyflakes
816         * buildbot/test/test_steps.py: same
818         * buildbot/test/test_bonsaipoller.py: remove the 'import *' that
819         keeps pyflakes from finding undefined names
821         * buildbot/master.py (BuildMaster.loadConfig_Builders): changing a
822         Builder no longer induces a disconnect/reconnect cycle. This means
823         that any builds currently in progress will not be interrupted, and
824         any builds which are queued in the Builder will not be lost. This
825         is implemented by having the new Builder extract the state (i.e.
826         all pending Builds and any desired SlaveBuilders) from the old
827         Builder.
828         (BotPerspective): refactor. The BotPerspective no longer keeps
829         track of all the Builders that want to use this slave; instead, it
830         asks the BotMaster each time it needs this list. This removes
831         addBuilder and removeBuilder. Clean up attached() to acquire all
832         the slave's information in a more atomic fashion. updateSlave() is
833         now the way to make sure the slave is using the right set of
834         Builders: just call it after everything else has been
835         reconfigured.
836         (BotMaster): refactor, removing addBuilder/removeBuilder and
837         replacing them with an all-at-once setBuilders() call.
839         * buildbot/test/test_slaves.py (Reconfig): new test case to
840         exercise this functionality
841         * buildbot/steps/dummy.py (Wait): new dummy BuildStep for the test
842         * buildbot/slave/commands.py (WaitCommand): same
844         * docs/buildbot.texinfo (Loading the Config File): document the
845         changes
847         * buildbot/process/builder.py (SlaveBuilder): refactor. Allow the
848         SlaveBuilder to have its parent Builder changed.
849         (SlaveBuilder.isAvailable): new method to give access to state,
850         which is now a private attribute
851         (SlaveBuilder.buildStarted,buildFinished): new methods to inform
852         the SlaveBuilder about how it is being used. These methods update
853         its internal state. buildFinished() is now the place that invokes
854         maybeStartBuild() on its parent Builder.
855         (Builder.consumeTheSoulOfYourPredecessor): new method to allow a
856         new Builder to take over for an old one, transferring state from
857         the old one.
858         (Buider): refactor the way that SlaveBuilders are used to match,
859         giving them a bit more autonomy.
860         (Builder.buildFinished): this no longer calls maybeStartBuild():
861         instead the SlaveBuilder calls it on whoever its parent Builder is
862         at the time. This way, when an old Builder is replaced by a new
863         one, and there was a build in progress during the transition, when
864         that build finishes, it will be the new Builder that is told about
865         the newly available slave so it can start a new build.
867         * buildbot/process/base.py (Build.startBuild._release_slave): when
868         the Build finishes, tell the SlaveBuilder that they've been
869         released.
871         * buildbot/status/builder.py (SlaveStatus): add some new setter
872         methods for use by BotPerspective, to keep some attributes more
873         private
875         * buildbot/slave/bot.py (Bot.remote_getDirs): this is no longer
876         called by the buildmaster.
877         (Bot.setBuilderList): instead, we locally announce any leftover
878         directories based upon which Builders we were told about. The
879         master doesn't really care; it's the local admin who may or may not
880         wish to delete them.
883         * contrib/svn_buildbot.py: use /usr/bin/python, not /usr/bin/env,
884         to allow use of python2.4 or whatever. This tool still requires
885         python2.3 or newer.
887 2006-11-19  Brian Warner  <warner@lothar.com>
889         * NEWS (IStatusLog.readlines): more news items
891 2006-11-18  Brian Warner  <warner@lothar.com>
893         * NEWS: start collecting items for the next release.
895 2006-11-04  Brian Warner  <warner@lothar.com>
897         * buildbot/changes/bonsaipoller.py: apply updates from Ben
898         Hearsum. Closes SF#1590310.
899         * buildbot/test/test_bonsaipoller.py: and tests
901         * buildbot/status/tinderbox.py
902         (TinderboxMailNotifier.buildMessage): send out a "testfailed"
903         status when the build results in WARNINGS. Patch from Dave
904         Liebreich. Closes SF#1587352.
906         * buildbot/slave/commands.py (LogFileWatcher.poll): overcome a
907         linux-vs-osx behavior difference w.r.t. reading from files that
908         have reached EOF. This should fix LogFileWatcher on OS-X. Thanks
909         to Mark Rowe for the patch.
911 2006-10-15  Brian Warner  <warner@lothar.com>
913         * buildbot/interfaces.py (IStatus.getURLForThing): oops, the
914         method name was misspelled in the interface definition. Thanks to
915         Roy Rapoport for the catch.
917 2006-10-13  Brian Warner  <warner@lothar.com>
919         * docs/buildbot.texinfo (Adding LogObservers): update sample code
920         to match the great Steps renaming
922         * buildbot/steps/transfer.py (FileUpload.start): Fix stupid error.
923         Maybe I should run my own unit tests before recording a big
924         change. Good thing I've got a buildbot to remind me.
926 2006-10-12  Brian Warner  <warner@lothar.com>
928         * buildbot/steps/transfer.py: rework __init__ and args setup
929         * buildbot/slave/commands.py (SlaveFileDownloadCommand): minor
930         docs improvements
931         * buildbot/slave/commands.py (SlaveFileDownloadCommand.setup):
932         when opening the target file, only catch IOError (to report via
933         stderr/rc!=0), let the others be reported as normal exceptions
935 2006-10-08  Brian Warner  <warner@lothar.com>
937         * contrib/svn_watcher.py: fix security holes by using proper argv
938         arrays and subprocess.Popen() rather than commands.getoutput().
939         Thanks to Nick Mathewson for the patch. Note that svn_watcher.py
940         is deprecated in favor of buildbot/changes/svnpoller.py, and will
941         probably be removed by the next release.
942         * CREDITS: add Nick
944 2006-10-04  Brian Warner  <warner@lothar.com>
946         * buildbot/steps/python.py (PyFlakes.createSummary): skip any
947         initial lines that weren't emitted by pyflakes. When the pyflakes
948         command is run under a Makefile, 'make' will echo the command it
949         runs to stdio, and that was getting logged as a "misc" warning.
950         * buildbot/test/test_steps.py (Python.testPyFlakes2): test it
951         * buildbot/test/test_steps.py (testPyFlakes3): another test
953 2006-10-01  Brian Warner  <warner@lothar.com>
955         * buildbot/status/html.py (HtmlResource.render): if we get a
956         unicode object from our content() method, encode it into utf-8
957         like we've been claiming to all along. This allows the comments
958         and author names from svnpoller.py to be delivered properly.
960         * buildbot/changes/svnpoller.py (SvnSource.create_changes):
961         de-unicodify filenames before creating the Change, because the
962         rest of buildbot is unlikely to handle them well. Leave the 'who'
963         field as a unicode object.. I don't think there's anything that
964         will break very soon, and it will probably nudge us towards
965         accepting unicode everywhere sooner or later. Stop using the
966         "date" field that comes out of SVN, since it is using the
967         repository's clock (and timezone) and what we care about is the
968         buildmaster's (otherwise Changes from the future show up later
969         than the builds they triggered).
970         * buildbot/test/test_svnpoller.py (Everything.test1): match the
971         change to .when
973         * buildbot/changes/svnpoller.py (SvnSource): added Niklaus Giger's
974         Suvbersion repository polling ChangeSource. I've hacked it up
975         considerably: any bugs are entirely my own fault. Thank you
976         Niklaus!
977         * buildbot/test/test_svnpoller.py: tests for it
978         * docs/buildbot.texinfo (SvnSource): document it
980 2006-09-30  Brian Warner  <warner@lothar.com>
982         * buildbot/scheduler.py (Periodic): submit a reason= to the
983         BuildSet to indicate which Scheduler triggered the build. Thanks
984         to Mateusz Loskot for the suggestion.
985         (Nightly): same
986         * buildbot/test/test_scheduler.py (Scheduling.testPeriodic1): test it
988         * buildbot/changes/p4poller.py (P4Source): some minor stylistic
989         changes: set self.loop in __init__, remove unused volatile=
991         * docs/buildbot.texinfo (.buildbot config directory): add more
992         docs on the .buildbot/options keys used by "buildbot try"
993         * buildbot/scripts/tryclient.py (Try.createJob): remove dead code
994         (Try.deliverJob): same
996         * buildbot/changes/bonsaipoller.py (BonsaiParser): more updates
997         from Robert Helmer
998         (BonsaiPoller): same
1000         * buildbot/slave/commands.py (LogFileWatcher.stop): explicitly
1001         close the filehandle when we stop watching the file. Before, the
1002         filehandle was only closed when the LogFileWatcher was
1003         garbage-collected, which could be quite a while in the future. If
1004         it was still open by the time the next build started, windows will
1005         refuse to let the new build delete the old build/ directory. Fixes
1006         SF#1568415, thanks to <scmikes>, <FireMoth>, and <radix> on
1007         #twisted for the catch.
1009 2006-09-29  Brian Warner  <warner@lothar.com>
1011         * buildbot/status/tinderbox.py (TinderboxMailNotifier): updates
1012         from Robert Helmer
1014 2006-09-25  Brian Warner  <warner@lothar.com>
1016         * setup.py: the new buildbot.steps module wasn't being installed.
1017         Thanks to Jose Dapena Paz for the catch, fixes SF#1560631.
1018         (testmsgs): add the extra stuff from buildbot/test/* so you can
1019         run unit tests on an installed copy of buildbot, not just from
1020         the source tree.
1022         * contrib/svn_buildbot.py (ChangeSender.getChanges): the first *4*
1023         columns of 'svnlook changed' output contain status information, so
1024         strip [:4] instead of [:6]. Depending upon what the status flags
1025         were, this would sometimes lead to mangled filenames. Thanks to
1026         Riccardo Magliocchetti for the patch. Closes SF#1545146.
1028         * buildbot/steps/source.py (Monotone): initial Monotone support,
1029         contributed by Nathaniel Smith. Still needs docs and tests, but
1030         this code has been in use on the Monotone buildbot for a long
1031         time now.
1032         * buildbot/slave/commands.py (Monotone): slave-side support
1033         * buildbot/changes/monotone.py (MonotoneSource): polling change
1034         source
1036         * buildbot/changes/bonsaipoller.py (BonsaiPoller): Ben also
1037         contributed a Change Source that polls a Bonsai server (a
1038         kind of web-based viewcvs CGI script).
1040         * buildbot/status/tinderbox.py (TinderboxMailNotifier): Ben
1041         Hearsum contributed a status plugin which sends email in the same
1042         format that Tinderbox does: this allows a number of tinderbox
1043         tools to be driven by Buildbot instead. Thanks Ben!
1045 2006-09-24  Brian Warner  <warner@lothar.com>
1047         * buildbot/changes/mail.py (parseBonsaiMail): fix the parser.
1048         Thanks to Robert Helmer for the patch.
1050         * buildbot/process/base.py (Build.setupSlaveBuilder): tell our
1051         BuildStatus about the buildslave name at the *beginning* of the
1052         build, rather than at the end. Thanks to Alexander Lorenz for the
1053         patch.
1054         * buildbot/status/html.py (StatusResourceBuild.body): always
1055         include the slavename in the build page, not just when the build
1056         has finished.
1057         * buildbot/status/mail.py (MailNotifier.buildMessage): include the
1058         slavename in the email message
1060 2006-09-21  Brian Warner  <warner@lothar.com>
1062         * buildbot/scripts/sample.cfg: update to use new BuildStep classes
1063         from buildbot.steps
1064         * docs/examples/glib_master.cfg: same
1065         * docs/examples/hello.cfg: same
1066         * docs/examples/twisted_master.cfg: same, update to current usage
1068 2006-09-19  Brian Warner  <warner@lothar.com>
1070         * buildbot/steps/python.py (PyFlakes): refactor, add summary logs
1071         (PyFlakes.createSummary): make it compatible with python-2.2
1073         * buildbot/test/test_steps.py (Python.testPyFlakes): add a test
1074         for at least the output-parsing parts of PyFlakes
1076 2006-09-18  Brian Warner  <warner@lothar.com>
1078         * buildbot/steps/python.py: oops, fix import of StringIO
1080 2006-09-17  Brian Warner  <warner@lothar.com>
1082         * buildbot/test/test_vc.py (VCBase._do_vctest_update_retry_1): it
1083         turns out that SVN-1.4.0 doesn't fail to update once you've
1084         replaced a file with a directory, unlike older versions of SVN and
1085         pretty much every other VC tool we support. Since what we really
1086         care about is that the update succeeds anyway, stop checking that
1087         the tree got clobbered and just assert that the build succeeded.
1088         (VCBase.printLogs): add a utility function for debugging
1090         * buildbot/process/step.py: oops, added extra imports by mistake
1092         * buildbot/changes/p4poller.py (P4Source._process_describe): do an
1093         rstrip() on the first line coming out of the 'p4 describe'
1094         process, to remove the stray ^M that Wade Brainerd reports seeing
1095         in the 'when' field. Fixes SF#1555985.
1097         * buildbot/master.py (BuildMaster.loadConfig): improve the error
1098         message logged when c['schedulers'] is not right
1099         * buildbot/scheduler.py (Scheduler.__init__): improve error
1100         message when a Scheduler() is created with the wrong arguments
1101         * buildbot/test/test_config.py (ConfigTest.testSchedulerErrors):
1102         verify that these error messages are emitted
1104         * buildbot/process/buildstep.py: rename step.py to buildstep.py .
1105         The idea is that all the base classes (like BuildStep and
1106         RemoteCommand and LogObserver) live in b.p.buildstep, and b.p.step
1107         will be a leftover backwards-compatibility file that only contains
1108         aliases for the steps that were moved out to buildbot.steps.*
1109         * lots: change imports to match
1110         * buildbot/process/step.py: add a DeprecationWarning if it ever
1111         gets imported
1113 2006-09-12  Brian Warner  <warner@lothar.com>
1115         * buildbot/scheduler.py (Scheduler.__init__): make sure that
1116         builderNames= is actually a sequence, since if you happen to give
1117         it a single builder-specification dictionary instead, it won't get
1118         caught by the existing assert. Thanks to Brett Neely for the
1119         catch.
1121         * buildbot/steps/python.py (BuildEPYDoc, PyFlakes): add new steps. No
1122         tests yet, alas.
1123         * docs/buildbot.texinfo (Python BuildSteps): document them
1124         (sendchange): include a link to PBChangeSource, since you need one
1126         * buildbot/steps/shell.py: clean up test-case-name line, remove some
1127         unnecessary imports
1128         * buildbot/steps/dummy.py: same
1130 2006-09-08  Brian Warner  <warner@lothar.com>
1132         * buildbot/steps/transfer.py (FileUpload,FileDownload): new
1133         BuildStep which lets you transfer files from the master to the
1134         slave or vice versa. Thanks to Albert Hofkamp for the original
1135         patch. Fixes SF#1504631.
1136         * buildbot/slave/commands.py (SlaveFileUploadCommand): slave-side
1137         support for it
1138         (SlaveFileDownloadCommand): same
1139         * docs/buildbot.texinfo (Transferring Files): document it
1140         * buildbot/test/test_transfer.py: test it
1141         * buildbot/test/runutils.py (StepTester): new utility class for
1142         testing BuildSteps and RemoteCommands without Builds or Bots or PB
1143         * buildbot/test/test_steps.py (CheckStepTester): validate that the
1144         utility class works
1146         * buildbot/interfaces.py (IStatusLog.readlines): make it easier to
1147         walk through StatusLogs one line at a time, mostly for the benefit
1148         of ShellCommand.createSummary methods. You can either walk through
1149         STDOUT or STDERR, but the default is STDOUT.
1151         * buildbot/status/builder.py (LogFile.readlines): implement it.
1152         Note that this is not yet memory-efficient, it just pulls the
1153         whole file into RAM and then splits it up with a StringIO.
1154         Eventually this should be a generator that only pulls chunks from
1155         disk as necessary.
1156         * buildbot/test/test_status.py (Log.testReadlines): test it
1158         * docs/buildbot.texinfo: update to match changes
1159         * buildbot/process/factory.py: stop using old definitions
1160         * buildbot/process/process_twisted.py: same
1161         * buildbot/test/test_*.py: same
1163         * buildbot/process/step_twisted.py: move definition to..
1164         * buildbot/steps/python_twisted.py: .. here, unfortunately python's
1165         relative-import mechanisms prevent this from being named 'twisted'
1166         or 'python/twisted' as I would have preferred.
1168         * buildbot/process/maxq.py: move definition to..
1169         * buildbot/steps/maxq.py: .. here, leave a compatibility import
1171         * buildbot/process/step.py: split the user-visible BuildSteps into
1172         separate files, all under buildbot/steps/
1173         * buildbot/steps/source.py: this holds VC-checkout steps like SVN
1174         * buildbot/steps/shell.py: this holds ShellCommand and friends
1175         * buildbot/steps/dummy.py: this holds the testing steps like Dummy
1177 2006-09-05  Brian Warner  <warner@lothar.com>
1179         * lots: run pyflakes, removed a lot of unused imports, changed the
1180         form of some conditional imports to remove false pyflakes
1181         warnings. There are still a number of warnings left, mostly from
1182         imports that are done for their side-effects.
1183         * buildbot/test/test_vc.py: import twisted.python.failure, since it
1184         was missing
1186 2006-08-26  Brian Warner  <warner@lothar.com>
1188         * buildbot/test/test_locks.py (Unit.testLater): make the tests
1189         compatible with twisted-1.3.0, for some reason I just can't seem
1190         to let go of the past.
1192 2006-08-25  Brian Warner  <warner@lothar.com>
1194         * buildbot/status/mail.py (MailNotifier.__init__): fix typo in docs
1196         * buildbot/process/step.py (LoggingBuildStep.startCommand): set up
1197         all logfiles= in startCommand(), rather than in start() . This
1198         makes it easier to have the 'stdio' log come before any secondary
1199         logfiles, which I feel makes the waterfall display more
1200         understandable.
1201         (LoggingBuildStep.setupLogfiles): move the addLog/cmd.useLog code
1202         from ShellCommand up into LoggingBuildStep
1203         (LoggingBuildStep.__init__): move the handling of logfiles= from
1204         ShellCommand up to LoggingBuildStep, because startCommand is
1205         provided by LoggingBuildStep, whereas start() was specific to
1206         subclasses like ShellCommand and Source. This removes code
1207         duplication in those subclasses.
1208         (ShellCommand.__init__): same
1209         (ShellCommand.checkForOldSlaveAndLogfiles): split out the check
1210         for a slave that's too old to understand logfiles= into a separate
1211         method, so it can live in ShellCommand. The rest of
1212         setupLogfiles() can live in LoggingBuildStep.
1214 2006-08-24  Brian Warner  <warner@lothar.com>
1216         * buildbot/locks.py (BaseLock): you can now configure Locks to
1217         allow multiple simultaneous owners. They still default to
1218         maxCount=1. Fixes SF#1434997. Thanks to James Knight (foom) for
1219         the patch.
1220         * docs/buildbot.texinfo (Interlocks): document the new options
1221         * buildbot/test/test_locks.py: add a bunch of new unit tests
1222         * buildbot/process/base.py (Build.acquireLocks): locks now offer
1223         waitUntilMaybeAvailable, not waitUntilAvailable
1224         * buildbot/process/step.py (BuildStep.acquireLocks): same
1225         * buildbot/master.py (BotMaster.getLockByID): real locks now use
1226         the whole lockid in their constructor, not just the name. Also,
1227         keep track of which real locks we've handed out by the full
1228         lockid, not just class+name, otherwise changing just the maxCount=
1229         in the master.cfg file would not actually cause a behavioral
1230         change
1232 2006-08-23  Brian Warner  <warner@lothar.com>
1234         * buildbot/__init__.py (version): bump to 0.7.4+ while between
1235         releases
1236         * docs/buildbot.texinfo: same
1238 2006-08-23  Brian Warner  <warner@lothar.com>
1240         * buildbot/__init__.py (version): Releasing buildbot-0.7.4
1241         * docs/buildbot.texinfo: set version to match
1242         * NEWS: update for 0.7.4
1243         * buildbot/slave/commands.py (command_version): mention that this
1244         version (2.1) was released with buildbot-0.7.4
1246 2006-08-22  Brian Warner  <warner@lothar.com>
1248         * README: update
1250         * CREDITS: new file, list of people who have helped. Thanks!
1251         * MANIFEST.in: ship it
1253         * MANIFEST.in: stop shipping the old PyCon-2003 paper.. with the
1254         new diagrams, the user's manual is more informative than it was.
1255         Start shipping the .html user's manual (and generated .png
1256         images).
1257         * Makefile: update 'release' target to match
1259         * buildbot/test/test_web.py (GetURL.testBrokenStuff): delete this
1260         test.. I think the web-parts effort will render it pointless well
1261         before it ever actually starts to work.
1263 2006-08-20  Brian Warner  <warner@lothar.com>
1265         * buildbot/changes/pb.py (PBChangeSource): fix and simplify
1266         meaning of the prefix= argument. It is now just a string which is
1267         stripped from the beginning of the filename. If prefix= is set but
1268         not found on any given filename, that filename is ignored. If all
1269         filenames in a Change are ignored, the Change is dropped. This is
1270         much simpler than the previous sep= nonsense, and I should have
1271         implemented it this way from the beginning. Effectively resolves
1272         SF#1217699 and SF#1381867. Thanks to Gary Granger and Marius
1273         Gedminas for the catch and suggested fixes.
1274         (ChangePerspective.perspective_addChange): implement the actual
1275         prefix comparison
1276         * buildbot/test/test_changes.py (TestChangePerspective): test it
1277         * docs/buildbot.texinfo (PBChangeSource): document it, explain
1278         how to properly use prefix=
1279         * docs/examples/twisted_master.cfg (source): update prefix= by
1280         adding the trailing slash
1283         * docs/examples/twisted_master.cfg: update to actual practice
1285         * buildbot/test/test_web.py (WaterfallSteps.test_urls): oops,
1286         update test case to match new link text.. the HREF has both a
1287         class= setting and an enclosing [] pair that I didn't match in the
1288         test.
1290         * docs/buildbot.texinfo (ShellCommand.command=): explain why a
1291         list of strings is preferred over a single string with embedded
1292         spaces
1293         (ShellCommand.description=): explain that either single strings or
1294         a list of strings is acceptable, and why you might prefer one over
1295         the other. Add an example. Fixes SF#1524659, thanks to Paul
1296         Winkler for the catch.
1297         (Build Steps): update to use f.addStep() rather than using s()
1298         and the constructor list
1300         * buildbot/process/step.py (ShellCommand): accept either a single
1301         string or a list of strings in both description= and
1302         descriptionDone=
1303         * buildbot/test/test_steps.py (Steps.test_description): test it
1304         * buildbot/test/runutils.py (makeBuildStep): support for that test
1306         * contrib/CSS/*.css: add some contributed CSS stylesheets, to make
1307         the Waterfall display a bit less ugly. Thanks to John O'Duinn for
1308         collecting the files and creating the patch.
1310         * docs/buildbot.texinfo (BuildStep URLs): document new feature:
1311         per-step URLs that will be displayed on the waterfall display,
1312         for things like the HTML output of code-coverage tools, when
1313         the results are hosted elsewhere.
1314         * buildbot/interfaces.py (IBuildStepStatus.getURLs): document the
1315         way to retrieve these URLs
1316         * buildbot/status/builder.py (BuildStepStatus.getURLs): implement
1317         the method to retrieve these URLs. Also provide backwards
1318         compatibility for saved BuildStepStatus instances that didn't have
1319         the .urls attribute
1320         * buildbot/process/step.py (BuildStep.addURL): method to set these
1321         URLs from within a BuildStep
1322         * buildbot/status/html.py (StepBox.getBox): emit links to the URLs
1323         (StepBox.getBox): give these external links a distinct CSS class
1324         named "BuildStep external" so a .css file can display them
1325         differently
1327         * buildbot/test/test_web.py (WaterfallSteps): test that we really
1328         do emit those links
1329         * buildbot/test/test_steps.py (Steps): test that we can all the
1330         URLs. Also add a bunch of other tests on methods that can be
1331         called from within BuildSteps
1332         * buildbot/test/runutils.py (makeBuildStep): add utility function
1334 2006-08-13  Brian Warner  <warner@lothar.com>
1336         * docs/buildbot.texinfo (BuildStep LogFiles): document them
1338 2006-08-10  Brian Warner  <warner@lothar.com>
1340         * docs/buildbot.texinfo (Index of master.cfg keys): add another
1341         index, this one of things like c['sources'] and c['schedulers']
1342         (indices): it looks like my clever idea of putting the @fooindex
1343         commands in between the @node and the @subsection (to make the
1344         HREF anchor jump to slightly above the section title, which works
1345         much better in html) confused texinfo horribly, so I'm moving the
1346         index tags back to be just after the @subsection marker. I also
1347         added extra lines between the @node/@section paragraph and the
1348         index tags, since I think maybe texinfo wants to see these be
1349         separate paragraphs.
1351         * docs/Makefile (images): make sure images get built when
1352         rendering the manual
1353         * docs/images/Makefile: same
1355         * buildbot/scripts/runner.py: rename 'buildbot master' to
1356         'buildbot create-master', and 'buildbot slave' to 'buildbot
1357         create-slave'
1358         * docs/buildbot.texinfo: same
1359         * README: same
1361         * docs/buildbot.texinfo: reimplement the "useful classes" index
1362         with actual texinfo indices. The .info rendering is a bit
1363         weird-looking but it works well, and the HTML rendering is quite
1364         nice. This also puts the index targets in the regular flow of the
1365         text, which is easier to maintain.
1367 2006-08-06  Brian Warner  <warner@lothar.com>
1369         * buildbot/slave/commands.py (ShellCommand.__init__): patch from
1370         Kevin Turner to prefer the environ= argument be a list rather than
1371         a string. If it is a list, it will be joined with a platform-local
1372         os.pathsep delimiter, and then prepended to any existing
1373         $PYTHONPATH value. This works better in cross-platform (i.e.
1374         windows buildslaves) environments when you need to push multiple
1375         directories onto the front of the path.
1376         (SlaveShellCommand): documented the new magic
1377         * docs/buildbot.texinfo (ShellCommand): documented the new magic
1378         in a user-visible form
1380         * buildbot/test/test_vc.py (BaseHelper.dovc): patch from Kevin
1381         Turner to prefer lists over strings when creating/running VC
1382         commands during unit tests. This is clearly necessary to survive
1383         vcexe containing spaces, like "C:\Program Files\darcs.exe". I
1384         renamed the wq() function to qw() though, since that's how it's
1385         spelled in perl. Eventually I'd prefer all commands to be
1386         specified with lists.
1388         * buildbot/slave/commands.py (LogFileWatcher): handle logfiles
1389         which are deleted (or not yet created) correctly. Also add
1390         failsafe code to not explode if the file-watching poller doesn't
1391         get started. Thanks to JP Calderone for the catch and the poller
1392         patch.
1393         * buildbot/test/test_shell.py (SlaveSide._testLogFiles): add test
1394         for that case
1395         * buildbot/test/emitlogs.py: same
1397         * NEWS: summarize recent changes
1399         * docs/buildbot.texinfo (Debug options): suggest an .ssh/options
1400         clause to avoid the "host key mismatch" warning
1402         * buildbot/process/step_twisted.py (Trial.start): if the
1403         buildslave is too old to understand logfiles=, fall back to
1404         running 'cat _trial_temp/test.log' like before.
1405         (Trial.commandComplete): same. this takes advantage of the
1406         LoggingBuildStep refactoring to stall commandComplete long enough
1407         to run a second RemoteShellCommand.
1409         * buildbot/process/step.py (LoggingBuildStep.startCommand):
1410         refactor command-completion handling, to allow methods like
1411         commandComplete/createSummary/evaluateCommand to return Deferreds.
1412         (LoggingBuildStep._commandComplete): delete the refactored method
1413         (ShellCommand.setupLogfiles): if the buildslave is too old to
1414         understand logfiles=, put a warning message both into twistd.log
1415         and into the otherwise empty user-visible LogFiles.
1417         * buildbot/process/step.py (LoggedRemoteCommand.useLog): allow
1418         callers to provide the slave-side logfile name, rather than
1419         forcing it to come from the local name of the LogFile.
1420         (BuildStep.getSlaveName): new method
1422         * buildbot/process/base.py (Build.getSlaveName): new method, so
1423         steps can find out which buildslave they're running on
1425         * buildbot/test/test_steps.py (Version.checkCompare): oops, update
1426         to match the s/cvs_ver/command_version/ change
1428 2006-08-05  Brian Warner  <warner@lothar.com>
1430         * buildbot/slave/commands.py (command_version): replace the CVS
1431         auto-updated cvs_ver keyword with a manually-updated variable,
1432         since CVS is no longer the master repository. Add a description of
1433         the remote API change starting in this version (2.1), specifically
1434         the fact that SlaveShellCommand now accepts 'initial_stdin',
1435         'keep_stdin_open', and 'logfiles'.
1437 2006-07-31  Brian Warner  <warner@lothar.com>
1439         * docs/buildbot.texinfo (System Architecture): Finally add lots of
1440         diagrams to describe how the whole system fits together. The
1441         images themselves are kept in SVG files, with ascii-art versions
1442         in corresponding .txt files. Texinfo knows how to interpolate the
1443         text version into .info files, reference the .png versions from
1444         .html files, and include .eps versions in the .ps format.
1445         * docs/images/Makefile: tools to create .png and .eps
1446         * docs/images/*.svg: created pictures with Inkscape.
1447         * .darcs-boring: ignore the generated .eps and .png files
1449 2006-07-24  Brian Warner  <warner@lothar.com>
1451         * buildbot/master.py (BuildMaster.loadConfig): check for duplicate
1452         Scheduler names, since they cause setServiceParent to explode
1453         later.
1454         * buildbot/test/test_config.py (ConfigTest._testSchedulers_7): test it
1456 2006-07-20  Brian Warner  <warner@lothar.com>
1458         * buildbot/scripts/sample.cfg: simplify the sample BuildFactory,
1459         which runs the buildbot unit tests
1461         * docs/buildbot.texinfo (Index of Useful Classes): add a table of
1462         classes that are useful in master.cfg
1464 2006-07-15  Brian Warner  <warner@lothar.com>
1466         * Makefile (some-apidocs): new target to build only some epydocs
1468         * setup.py: minor comment.. does the classifiers= argument prevent
1469         the setup.py script from working on python2.2/2.3?
1471         * buildbot/scripts/sample.cfg: update manhole example, arrange into
1472         major sections
1474         * buildbot/twcompat.py: fix minor typo in comments
1476         * buildbot/manhole.py: move all Manhole-related code out to this
1477         module. Implement SSH-based manholes (with TwistedConch), and move
1478         to conch's nifty line-editing syntax-coloring REPL shell instead
1479         of the boring non-editing monochromatic (and deprecated) old
1480         'telnet' protocol.
1481         * buildbot/master.py: remove all Manhole-related code
1482         (BuildMaster.loadConfig._add): make sure the old manhole is
1483         removed before we add the new one
1484         * docs/buildbot.texinfo (Debug options): document new Manhole options
1486         * buildbot/twcompat.py (_which): fix some epydoc issues
1487         * buildbot/status/html.py (Waterfall.__init__): same
1489 2006-06-29  Brian Warner  <warner@lothar.com>
1491         * buildbot/interfaces.py: get Interface from b.twcompat to hush
1492         deprecation warnings under newer Twisteds (by using
1493         zope.interface.Interface instead of old twisted.python.components
1494         stuff)
1495         * buildbot/slave/interfaces.py: same
1497 2006-06-28  Brian Warner  <warner@lothar.com>
1499         * buildbot/slave/commands.py (SVN): add --non-interactive to all
1500         svn commands, so it will fail immediately instead of hanging while
1501         it waits for a username/password to be typed in.
1503         * buildbot/slave/bot.py (SlaveBuilder.commandComplete): add minor
1504         log message if the step was shut down
1506         * buildbot/scripts/runner.py (SlaveOptions.longdesc): remove
1507         obsolete reference to mktap.
1509 2006-06-20  Brian Warner  <warner@lothar.com>
1511         * buildbot/test/test_steps.py (BuildStep.testShellCommand1): update
1512         test to include new 'logfiles' argument sent from master to slave
1514 2006-06-19  Brian Warner  <warner@lothar.com>
1516         * buildbot/process/step_twisted.py (Trial): track Progress from
1517         _trial_temp/test.log too
1519         * buildbot/process/step.py (OutputProgressObserver): generalize
1520         the earlier StdioProgressObserver into an OutputProgressObserver
1521         that can track LogFiles other than stdio.
1522         (LoggingBuildStep.__init__): same
1524         * buildbot/process/step_twisted.py (Trial): use logfiles= to track
1525         _trial_temp/test.log, not a separate 'cat' command. TODO: this
1526         will fail under windows because of os.sep issues. It might have
1527         worked before if 'cat' was doing cygwin path conversion.
1529         * buildbot/slave/commands.py (LogFileWatcher.__init__): note the
1530         creation of LogFileWatchers
1531         (ShellCommand._startCommand): and record the files that were
1532         watched in the 'headers' section of the ShellCommand output
1534         * buildbot/process/step.py (RemoteShellCommand.__init__): duh, you
1535         need to actually pass it to the slave if you want it to work.
1536         (ShellCommand): document it a bit
1538         * buildbot/test/test_shell.py: new test to validate LogFiles
1539         * buildbot/test/runutils.py (SlaveCommandTestBase): updates to
1540         test LogFiles
1541         * buildbot/test/emitlogs.py: enhance to wait for a line on stdin
1542         before printing the last batch of lines, to test that the polling
1543         logic is working properly
1545         * buildbot/process/step.py (LoggedRemoteCommand): improve LogFile
1546         handling, making it possible to track multiple logs for a single
1547         RemoteCommand. The previous single logfile is now known as the
1548         'stdio' log.
1549         (LoggedRemoteCommand.remoteUpdate): accept key='log' updates
1550         (RemoteShellCommand.__init__): accept logfiles=
1551         (LoggingBuildStep.startCommand): stdio_log is now one of many
1552         (ShellCommand): added logfiles= argument, as well as a class-level
1553         .logfiles attribute, which will be merged together to figure out
1554         which logfiles should be tracked. The latter maybe be useful for
1555         subclasses of ShellCommand which know they will aways produce
1556         secondary logfiles in the same location.
1558         * buildbot/slave/commands.py (ShellCommandPP): add writeStdin()
1559         and closeStdin() methods, preparing to make it possible to write
1560         to a ShellCommand's stdin at any time, not just at startup. These
1561         writes are buffered if the child process hasn't started yet.
1562         (LogFileWatcher): new helper class to watch arbitrary logfiles
1563         while a ShellCommand runs. This class polls the file every two
1564         seconds, and sends back 10k chunks to the buildmaster.
1565         (ShellCommand): rename stdin= to initialStdin=, and add
1566         keepStdinOpen= and logfiles= to arguments. Set up LogFileWatchers
1567         at startup.
1568         (ShellCommand.addLogfile): LogFile text is sent in updates with a
1569         key of "log" and a value of (logname, data).
1570         (SlaveShellCommand): add 'initial_stdin', 'keep_stdin_open', and
1571         'logfiles' to the master-visible args dictionary.
1572         (SourceBase.doPatch): match s/stdin/initialStdin/ change
1573         (CVS.start): same
1574         (P4.doVCFull): same
1575         * buildbot/test/test_vc.py (Patch.testPatch): same
1578         * buildbot/test/emit.py: write to a logfile in the current
1579         directory. We use this to figure out what was used as a basedir
1580         rather than looking to see which copy of emit.py gets run, so that
1581         we can run the commands from inside _trial_temp rather than inside
1582         buildbot/test
1583         * buildbot/test/subdir/emit.py: same
1584         * buildbot/test/runutils.py (FakeSlaveBuilder): take a 'basedir'
1585         argument rather than running from buildbot/test/
1586         (SlaveCommandTestBase.setUpBuilder): explicitly set up the Builder
1587         rather than using an implicit setUp()
1588         * buildbot/test/test_slavecommand.py (ShellBase.setUp): same
1589         (ShellBase.testShell1, etc): use explicit path to emit.py instead
1590         of assuming that we're running in buildbot/test/ (and that '.' is
1591         on our $PATH)
1593         * buildbot/slave/commands.py (Command.doStart): refactor Command
1594         startup/completion a bit: now the SlaveBuilder calls doStart(),
1595         which is not meant for overridding by subclasses, and doStart()
1596         calls start(), which is. Likewise the SlaveBuilder calls
1597         doInterrupt(), and subclasses override interrupt(). This also puts
1598         responsibility for maintaining .running in Command rather than in
1599         SlaveBuilder.
1600         (Command.doInterrupt): same
1601         (Command.commandComplete): same, this is called when the deferred
1602         returned by start() completes.
1603         * buildbot/slave/bot.py (SlaveBuilder.remote_startCommand): same
1604         (SlaveBuilder.remote_interruptCommand): same
1605         (SlaveBuilder.stopCommand): same
1607 2006-06-16  Brian Warner  <warner@lothar.com>
1609         * buildbot/test/test_shell.py: new test file to contain everything
1610         relating to ShellCommand
1611         (SlaveSide.testLogFiles): (todo) test for the upcoming "watch
1612         multiple logfiles in realtime" feature, not yet implemented
1613         * buildbot/test/emitlogs.py: support file for testLogFiles
1614         * docs/buildbot.texinfo (ShellCommand): document the feature
1616         * buildbot/test/test_steps.py (BuildStep.setUp): rmtree refactoring
1618         * buildbot/test/runutils.py (SlaveCommandTestBase): utility class
1619         for tests which exercise SlaveCommands in isolation.
1621         * buildbot/test/test_slavecommand.py: Move some utilities like
1622         SignalMixin and FakeSlaveBuilder from here ..
1623         * buildbot/test/runutils.py: .. to here, so they can be used by
1624         other test classes too
1625         * buildbot/test/test_vc.py: more SignalMixin refactoring
1626         * buildbot/test/test_control.py: same
1627         * buildbot/test/test_run.py: and some rmtree refactoring
1629 2006-06-15  Brian Warner  <warner@lothar.com>
1631         * buildbot/test/test_vc.py (P4.testCheckoutBranch): rename from
1632         'testBranch' to match other VC tests and have the tests run in
1633         roughly increasing order of dependency
1635         * buildbot/test/test_steps.py (LogObserver): new test to verify
1636         LogObservers can be created at various times and still get
1637         connected up properly
1639         * buildbot/test/runutils.py (setupBuildStepStatus): utility method
1640         to create BuildStepStatus instances that actually work.
1642         * buildbot/process/step.py (LogObserver): add outReceived and
1643         errReceived base methods, to be overridden
1645         * buildbot/status/builder.py (BuildStatus.addStepWithName): change
1646         API to take a name instead of a step, reducing the coupling
1647         somewhat. This returns the BuildStepStatus object so it can be
1648         passed to the new Step, instead of jamming it directly into the
1649         Step.
1650         * buildbot/process/step.py (BuildStep.setStepStatus): add a setter
1651         method
1652         * buildbot/process/base.py (Build.setupBuild): use both methods
1653         * buildbot/test/test_web.py (Logfile.setUp): rearrange the setup
1654         process a bit to match
1656 2006-06-14  Brian Warner  <warner@lothar.com>
1658         * docs/buildbot.texinfo (Adding LogObservers): add some limited
1659         docs on writing new LogObserver classes
1660         (Writing New Status Plugins): brief docs on how Status Plugins fit
1661         together
1663         * buildbot/process/step_twisted.py (TrialTestCaseCounter):
1664         implement a LogObserver that counts how many unit tests have been
1665         run so far
1666         (Trial.__init__): wire it in
1667         * buildbot/test/test_twisted.py (Counter): unit test for it
1669         * buildbot/process/step_twisted.py (HLint.commandComplete): update
1670         to new cmd.logs['stdio'] scheme
1671         (Trial.commandComplete): same
1672         (BuildDebs.commandComplete): same
1674         * buildbot/process/step.py (LoggedRemoteCommand): use a dict of
1675         LogFiles, instead of just a single one. The old single logfile is
1676         now called "stdio". LoggedRemoteCommand no longer creates a
1677         LogFile for you (the code to do that was broken anyway). If you
1678         don't create a "stdio" LogFile, then stdout/stderr will be
1679         discarded.
1680         (LogObserver): implement "LogObservers", which a BuildStep can add
1681         to parse the output of a command in real-time. The primary use is
1682         to provide more useful information to the Progress code, allowing
1683         better ETA estimates.
1684         (LogLineObserver): utility subclass which feeds complete lines to
1685         the parser instead of bytes.
1686         (BuildStep.progressMetrics): this is safer as a tuple
1687         (BuildStep.setProgress): utility method, meant to be called by
1688         LogObservers
1689         (BuildStep.addLogObserver): new method, to be called at any time
1690         during the BuildStep (even before any LogFiles have been created),
1691         to attach (or schedule for eventual attachment) a LogObserver to a
1692         LogFile.
1693         (StdioProgressObserver): new LogObserver which replaces the old
1694         "output" progress gatherer
1695         (LoggingBuildStep.__init__): same
1696         (LoggingBuildStep.startCommand): set up the "stdio" LogFile
1697         (LoggingBuildStep._commandComplete): must use logs['stdio']
1698         instead of the old single ".log" attribute.
1699         * buildbot/status/builder.py (LogFile): remove old logProgressTo
1700         functionality, now subsumed into StdioProgressObserver
1701         * buildbot/test/test_status.py (Subscription._testSlave_2): the
1702         log name changed from "output" to "stdio".
1705         * buildbot/interfaces.py (ILogFile): add the Interface used from
1706         the BuildStep towards the LogFile
1707         (ILogObserver): and the one provided by a LogObserver
1708         * buildbot/status/builder.py (LogFile): implement it
1710         * buildbot/interfaces.py (LOG_CHANNEL_*): move STDOUT / STDERR /
1711         HEADER constants here ..
1712         * buildbot/status/builder.py (STDOUT): .. from here
1714 2006-06-13  Brian Warner  <warner@lothar.com>
1716         * buildbot/test/test_p4poller.py (TestP4Poller.failUnlessIn): fix
1717         compatibility with python2.2, which doesn't have the 'substr in
1718         str' feature.
1719         (TestP4Poller.makeTime): utility function to construct the
1720         timestamp using the same strptime() approach as p4poller does. It
1721         turns out that time.mktime() behaves slightly differently under
1722         python2.2, probably something to do with the DST flag, and that
1723         causes the test to fail under python2.2. (changing the mktime()
1724         arguments to have dst=0 instead of -1 caused it to fail under
1725         python2.3. Go figure.)
1726         (TestP4Poller._testCheck3): use our makeTime() instead of mktime()
1728 2006-06-12  Brian Warner  <warner@lothar.com>
1730         * buildbot/process/step.py (P4): merge in patch SF#1473939, adding
1731         proper Perforce (P4) support. Many many thanks to Scott Lamb for
1732         contributing such an excellent patch, including docs and unit
1733         tests! This makes it *so* much easier to apply. I had to update
1734         test_vc.py to handle some recent refactorings, but everything else
1735         applied smoothly. The only remaining thing I'd like to fix would
1736         be to remove the hard-wired port 1666 used by p4d, and allow it to
1737         claim any unused port. This would allow two copies of the test
1738         suite to run on the same host at the same time, as well as
1739         allowing the test suite to run while a real (production) p4d was
1740         running on the same host. Oh, and maybe we should add a warning to
1741         step.P4 that gets emitted if the slave is too old to provide the
1742         'p4' SlaveCommand. Otherwise it looks great. (closes: SF#1473939).
1743         * buildbot/slave/commands.py (P4): same
1744         (P4Sync): same, some minor updates
1745         * buildbot/changes/p4poller.py: same
1746         * docs/buildbot.texinfo: same
1747         * buildbot/test/test_p4poller.py: same
1748         * buildbot/test/test_vc.py (P4): same
1750         * setup.py: add Trove classifiers for PyPI
1752 2006-06-08  Brian Warner  <warner@allmydata.com>
1754         * buildbot/status/client.py
1755         (RemoteBuilder.remote_getCurrentBuilds): oops, I screwed up when
1756         changing this from getCurrentBuild() to getCurrentBuilds(). Each
1757         build needs to be IRemote'd separately, rather than IRemote'ing
1758         the whole list at once. I can't wait until newpb's serialization
1759         adapters make this unnecessary.
1761 2006-06-06  Brian Warner  <warner@lothar.com>
1763         * buildbot/process/step.py (WithProperties): make this inherit
1764         from ComparableMixin, so that reloading an unchanged config file
1765         doesn't cause us to spuriously reload any Builders which use them.
1766         * buildbot/test/test_config.py (ConfigTest.testWithProperties):
1767         add a test for it
1769 2006-06-03  Brian Warner  <warner@lothar.com>
1771         * contrib/windows/{setup.py, buildbot_service.py}: add support for
1772         running py2exe on windows, contributed by Mark Hammond. Addresses
1773         SF#1401121, but I think we still need to include
1774         buildbot/scripts/sample.cfg
1775         * setup.py: include buildbot_service.py as a script under windows
1776         * buildbot/status/html.py: when sys.frozen (i.e. we're running in
1777         a py2exe application), get the icon/css datafiles from a different
1778         place than usual.
1780         * buildbot/status/mail.py (MailNotifier.buildMessage): don't
1781         double-escape the build URL. Thanks to Olivier Bonnet for the
1782         patch. Fixes SF#1452801.
1784 2006-06-02  Brian Warner  <warner@lothar.com>
1786         * contrib/svn_buildbot.py (ChangeSender.getChanges): ignore the
1787         first six columns of 'svnlook' output, not just the first column,
1788         since property changes appear in the other five. Thanks to Olivier
1789         Bonnet for the patch. Fixes SF#1398174.
1791 2006-06-01  Brian Warner  <warner@lothar.com>
1793         * buildbot/test/test_web.py (Logfile.setUp): set the .reason on
1794         the fake build, so that title= has something to be set to
1796         * buildbot/status/html.py (BuildBox.getBox): set the 'title='
1797         attribute of the "Build #NN" link in the yellow start-the-build
1798         box to the build's reason. This means that you get a little
1799         tooltip explaining why the build was done when you hover over the
1800         yellow box. Thanks to Zandr Milewski for the suggestion.
1802         * buildbot/clients/gtkPanes.py (Box.setColor): ignore color=None
1803         (Box.setETA): handle ETA=None (by stopping the timer)
1804         (Box.update): make the [soon] text less different than the usual
1805         text, so the rest of the text doesn't flop around so much. It
1806         would be awfully nice to figure out how to center this stuff.
1807         (ThreeRowBuilder.stepETAUpdate): more debugging printouts
1809         * buildbot/process/step.py (ShellCommand): set flunkOnFailure=True
1810         by default, so that any ShellCommand which fails marks the overall
1811         build as a failure. I should have done this from the beginning.
1812         Add flunkOnFailure=False to the arguments if you want to turn off
1813         this behavior.
1815 2006-05-30  Brian Warner  <warner@lothar.com>
1817         * buildbot/clients/gtkPanes.py: add a third row: now it shows
1818         last-build/current-build/current-step. Show what step is currently
1819         running. Show ETA for both the overall build and the current step.
1820         Update GTK calls to modern non-deprecated forms. There's still a
1821         lot of dead code and debug noise to remove.
1823         * buildbot/process/step_twisted.py (Trial): set the step name, so it
1824         shows up properly in status displays
1826 2006-05-28  Brian Warner  <warner@lothar.com>
1828         * buildbot/test/test_properties.py (Run.testInterpolate): on the
1829         build we use to verify that WithProperties works:
1831         ** set flunkOnFailure=True so that build failures get noticed
1832         ** set workdir='.' so that the build succeeds, otherwise it is trying
1833             to touch 'build/something', and 'build/' doesn't exist because
1834             usually that's created by a Source step
1835         ** set timeout=10, because Twisted-1.3.0 has a race condition that
1836             this test somehow triggers, in which the 'touch' process becomes
1837             a zombie and we wait for th etimeout before giving up on it.
1839         * buildbot/test/runutils.py (RunMixin.logBuildResults): utility method
1840         to log the Build results and step logs to the twisted log.
1841         (RunMixin.failUnlessBuildSucceeded): use logBuildResults to record
1842         what went wrong if a build was expected to succeed but didn't.
1844         * buildbot/process/step_twisted.py (Trial): set the default
1845         trialMode to '--reporter=bwverbose', which specifies verbose
1846         black-and-white text. Back in twisted-1.3/2.0 days we had to use
1847         '-to', but those are completely missing in modern Twisteds.
1849         * buildbot/scripts/sample.cfg: make the sample Manhole config use
1850         a localhost-only port, to encourage better security
1852         * docs/buildbot.texinfo (Change Sources): mention
1853         darcs_buildbot.py
1855         * .darcs-boring: add a Darcs boringfile
1857         * README (REQUIREMENTS): stop claiming compatibility with
1858         Twisted-1.3.0
1860         * contrib/darcs_buildbot.py: write a darcs-commit-hook change
1861         sender
1863 2006-05-27  Brian Warner  <warner@lothar.com>
1865         * buildbot/__init__.py: bump to 0.7.3+ while between releases
1866         * docs/buildbot.texinfo: same
1868 2006-05-23  Brian Warner  <warner@lothar.com>
1870         * buildbot/__init__.py (version): Releasing buildbot-0.7.3
1871         * docs/buildbot.texinfo: set version to match
1872         * NEWS: update for 0.7.3
1874         * docs/buildbot.texinfo (Change Sources): mention hg_buildbot.py,
1875         give a quick mapping from VC system to possible ChangeSources
1876         (Build Properties): add 'buildername'
1878         * buildbot/process/base.py (Build.setupStatus): oops, set
1879         'buildername' and 'buildnumber' properties
1880         * buildbot/test/test_properties.py (Interpolate.testBuildNumber):
1881         test them
1883 2006-05-22  Brian Warner  <warner@lothar.com>
1885         * docs/buildbot.texinfo (Build Properties): explain the syntax of
1886         property interpolation better
1888         * README (INSTALLATION): remove old '-v' argument from recommended
1889         trial command line
1891         * docs/buildbot.texinfo (ShellCommand): add docs for description=
1892         and descriptionDone= arguments. Thanks to Niklaus Giger for the
1893         patch. SF#1475494.
1895         * buildbot/slave/commands.py (SVN.parseGotRevision._parse): use
1896         'svnversion' instead of grepping the output of 'svn info', much
1897         simpler and avoids CR/LF problems on windows. Thanks to Olivier
1898         Bonnet for the suggestion.
1899         (SVN.parseGotRevision): oops, older verisons of 'svnversion'
1900         require the WC_PATH argument, so run 'svnversion .' instead.
1902         * buildbot/interfaces.py (IChangeSource): methods in Interfaces
1903         aren't supposed to have 'self' in their argument list
1905 2006-05-21  Brian Warner  <warner@lothar.com>
1907         * buildbot/process/step.py (ShellCommand.start): make
1908         testInterpolate pass. I was passing the uninterpolated command to
1909         the RemoteShellCommand constructor
1910         (ShellCommand._interpolateProperties): oops, handle non-list
1911         commands (i.e. strings with multiple words separated by spaces in
1912         them) properly, instead of forgetting about them.
1914         * buildbot/test/test_properties.py (Run.testInterpolate): new test
1915         to actually try to use build properties in a real build. This test
1916         fails.
1917         * buildbot/test/runutils.py (RunMixin.requestBuild): utility methods
1918         to start and evaluate builds
1920         * buildbot/test/test__versions.py: add a pseudo-test to record
1921         what version of Twisted/Python/Buildbot are running. This should
1922         show up at the beginning of _trial_tmp/test.log, and exists to help
1923         debug other problems.
1925         * buildbot/status/html.py (Waterfall): add 'robots_txt=' argument,
1926         a filename to be served as 'robots.txt' to discourage web spiders.
1927         Adapted from a patch by Tobi Vollebregt, thanks!
1928         * buildbot/test/test_web.py (Waterfall._test_waterfall_5): test it
1929         (Waterfall.test_waterfall): tweak the way that filenames are put
1930         into the config file, to accomodate windows pathnames better.
1932         * docs/buildbot.texinfo (HTML Waterfall): document it
1934         * buildbot/process/process_twisted.py
1935         (QuickTwistedBuildFactory.__init__): recent versions of Twisted
1936         changed the build process. The new setup.py no longer takes the
1937         'all' argument.
1938         (FullTwistedBuildFactory.__init__): same
1939         (TwistedReactorsBuildFactory.__init__): same
1941         * contrib/hg_buildbot.py: wrote a commit script for mercurial, to
1942         be placed in the [hooks] section of the central repository (the
1943         one that everybody pushes changes to).
1945 2006-05-20  Brian Warner  <warner@lothar.com>
1947         * buildbot/slave/commands.py (Darcs.doVCFull): when writing the
1948         .darcs-context file, use binary mode. I think this was causing a
1949         Darcs failure under windows.
1951 2006-05-19  Brian Warner  <warner@lothar.com>
1953         * buildbot/scripts/tryclient.py (CVSExtractor.getBaseRevision):
1954         use a timezone string of +0000 and gmtime, since this timestamp is
1955         sent to a buildmaster and %z is broken.
1957         * buildbot/test/test_vc.py (CVSHelper.getdate): use no timezone
1958         string and localtime, since this timestamp will only be consumed
1959         locally, and %z is broken.
1961         * buildbot/slave/commands.py (CVS.parseGotRevision): use +0000 and
1962         gmtime, since this timestamp is returned to the buildmaster, and
1963         %z is broken.
1965 2006-05-18  Brian Warner  <warner@lothar.com>
1967         * NEWS: update in preparation for next release
1969         * buildbot/test/test_vc.py (VCS_Helper): factor out all the
1970         setup-repository and do-we-have-the-vc-tools code into a separate
1971         "helper" class, which sticks around in a single module-level
1972         object. This seems more likely to continue to work in the future
1973         than having it hide in the TestCase and hope that TestCases stick
1974         around for a long time.
1976         * buildbot/test/test_vc.py (MercurialSupport.vc_create): 'hg
1977         addremove' has been deprecated in recent versions of mercurial, so
1978         use 'hg add' instead
1980 2006-05-07  Brian Warner  <warner@lothar.com>
1982         * buildbot/scheduler.py (Try_Jobdir.messageReceived): when
1983         operating under windows, move the file before opening it, since
1984         you can't rename a file that somebody has open.
1986         * buildbot/process/base.py (Build.setupBuild): if something goes
1987         wrong while creating a Step, log the name and arguments, since the
1988         error message when you get the number of arguments wrong is really
1989         opaque.
1991 2006-05-06  Brian Warner  <warner@lothar.com>
1993         * buildbot/process/step_twisted.py (Trial.setupEnvironment): more
1994         bugs in twisted-specific code not covered by my unit tests, this
1995         time use 'cmd' argument instead of self.cmd
1997         * buildbot/process/process_twisted.py (TwistedBuild.isFileImportant):
1998         fix stupid braino: either use startwith or find()==0, not both.
1999         (TwistedReactorsBuildFactory.__init__): another dumb typo
2001         * buildbot/test/test_slavecommand.py (ShellBase.testInterrupt1): 
2002         mark this test as TODO under windows, since process-killing seems
2003         dodgy there. We'll come back to this later and try to fix it
2004         properly.
2006         * buildbot/test/test_vc.py (CVSSupport.getdate): use localtime,
2007         and don't include a timezone
2008         (CVSSupport.vc_try_checkout): stop trying to strip the timezone.
2009         This should avoid the windows-with-verbose-timezone-name problem
2010         altogether.
2011         (Patch.testPatch): add a test which runs 'patch' with less
2012         overhead than the full VCBase.do_patch sequence, to try to isolate
2013         a windows test failure. This one uses slave.commands.ShellCommand
2014         and 'patch', but none of the VC code.
2016         * buildbot/slave/commands.py (getCommand): use which() to find the
2017         executables for 'cvs', 'svn', etc. This ought to help under
2018         windows.
2020         * buildbot/test/test_vc.py (VCBase.do_getpatch): Delete the
2021         working directory before starting. If an earlier test failed, the
2022         leftover directory would mistakenly flunk a later test.
2023         (ArchCommon.registerRepository): fix some tla-vs-baz problems.
2024         Make sure that we use the right commandlines if which("tla") picks
2025         up "tla.exe" (as it does under windows).
2026         (TlaSupport.do_get): factor out this tla-vs-baz difference
2027         (TlaSupport.vc_create): more tla-vs-baz differences
2029         * buildbot/test/test_slavecommand.py
2030         (ShellBase.testShellMissingCommand): stop trying to assert
2031         anything about the error message: different shells on different
2032         OSes with different languages makes it hard, and it really isn't
2033         that interesting of a thing to test anyway.
2035         * buildbot/test/test_vc.py (CVSSupport.capable): skip CVS tests if
2036         we detect cvs-1.10 (which is the version shipped with OS-X 10.3
2037         "Panther"), because it has a bug which flunks a couple tests in
2038         weird ways. I've checked that cvs-1.12.9 (as shipped with debian)
2039         is ok. OS-X 10.4 "Tiger" ships with cvs-1.11, but I haven't been
2040         able to test that yet.
2042 2006-04-30  Brian Warner  <warner@lothar.com>
2044         * buildbot/test/test_vc.py (VCBase.runCommand): set $LC_ALL="C" to
2045         make sure child commands emit messages in english, so our regexps
2046         will match. Thanks to Nikaus Giger for identifying the problems.
2047         (VCBase._do_vctest_export_1): mode="export" is not responsible
2048         for setting the "got_revision" property, since in many cases it is
2049         not convenient to determine.
2050         (SVNSupport.capable): when running 'svn --version' to check for
2051         ra_local, we want error messages in english
2052         * buildbot/test/test_slavecommand.py 
2053         (ShellBase.testShellMissingCommand): set $LC_ALL="C" to get bash
2054         to emit the error message in english
2056         * buildbot/slave/commands.py (SourceBase.setup): stash a copy of
2057         the environment with $LC_ALL="C" so that Commands which need to
2058         parse the output of their child processes can obtain it in
2059         english.
2060         (SVN.parseGotRevision): call "svn info" afterwards instead of
2061         watching the output of the "svn update" or "svn checkout".
2062         (Darcs.parseGotRevision): use $LC_ALL="C" when running the command
2063         (Arch.parseGotRevision): same
2064         (Bazaar.parseGotRevision): same
2065         (Mercurial.parseGotRevision): same
2067         * buildbot/scripts/tryclient.py (SourceStampExtractor.dovc): set
2068         $LC_ALL="C" when running commands under 'buildbot try', too
2070         * buildbot/test/__init__.py: remove the global os.environ()
2071         setting, instead we do it just for the tests that run commands and
2072         need to parse their output.
2074         * buildbot/test/test_scheduler.py (Scheduling.testTryJobdir):
2075         remove the overly-short .timeout on this test, because non-DNotify
2076         platforms must fall back to polling which happens at 10 second
2077         intervals, so a 5 second timeout would never succeed.
2079 2006-04-24  Brian Warner  <warner@lothar.com>
2081         * docs/buildbot.texinfo (Installing the code): update trial
2082         invocation, SF#1469116 by Niklaus Giger.
2083         (Attributes of Changes): updated branch-name examples to be
2084         a bit more realistic, SF#1475240 by Stephen Davis.
2086         * contrib/windows/buildbot2.bat: utility wrapper for windows
2087         developers, contributed by Nick Trout (after a year of neglect..
2088         sorry!). SF#1194231.
2090         * buildbot/test/test_vc.py (*.capable): store the actual VC
2091         binary's pathname in VCS[vcname], so it can be retrieved later
2092         (CVSSupport.vc_try_checkout): incorporate Niklaus Giger's patch to
2093         strip out non-numeric timezone information, specifically the funky
2094         German string that his system produced that confuses CVS.
2095         (DarcsSupport.vc_create): use dovc() instead of vc(), this should
2096         allow Darcs tests to work on windows
2097         * buildbot/scripts/tryclient.py (SourceStampExtractor): use
2098         procutils.which() everywhere, to allow tryclient to work under
2099         windows. Also from Niklaus Giger, SF#1463394.
2101         * buildbot/twcompat.py (which): move the replacement for a missing
2102         twisted.python.procutils.which from test_vc.py to here, so it can
2103         be used in other places too (specifically tryclient.py)
2105 2006-04-23  Brian Warner  <warner@lothar.com>
2107         * buildbot/status/html.py (StatusResourceBuild.body): replace the
2108         bare buildbotURL/projectName line with a proper DIV, along with a
2109         CSS class of "title", from Stefan Seefeld (SF#1461675).
2110         (WaterfallStatusResource.body0): remove the redundant 'table'
2111         class from the table
2112         (WaterfallStatusResource.body): same. Also add class="LastBuild"
2113         to the top-row TR, and class="Activity" to the second-row TR,
2114         rather than putting them in the individual TD nodes.
2116         * buildbot/test/test_vc.py (VCBase.checkGotRevision): test
2117         'got_revision' build property for all VC systems that implement
2118         accurate ones: SVN, Darcs, Arch, Bazaar, Mercurial.
2120         * buildbot/slave/commands.py (SourceBase._handleGotRevision): try
2121         to determine which revision we actually obtained
2122         (CVS.parseGotRevision): implement this for CVS, which just means
2123         to grab a timestamp. Not ideal, and it depends upon the buildslave
2124         having a clock that is reasonably well syncronized with the server,
2125         but it's better than nothing.
2126         (SVN.parseGotRevision): implement it for SVN, which is accurate
2127         (Darcs.parseGotRevision): same
2128         (Arch.parseGotRevision): same
2129         (Bazaar.parseGotRevision): same
2130         (Mercurial.parseGotRevision): same
2132         * buildbot/process/step.py (LoggedRemoteCommand.remoteUpdate):
2133         keep a record of all non-stdout/stderr/header/rc status updates,
2134         for the benefit of RemoteCommands that send other useful things,
2135         like got_revision
2136         (Source.commandComplete): put any 'got_revision' status values
2137         into a build property of the same name
2140         * buildbot/process/step_twisted.py (Trial): update to deal with
2141         new ShellCommand refactoring
2143         * docs/buildbot.texinfo (Build Properties): document new feature
2144         that allows BuildSteps to get/set Build-wide properties like which
2145         revision was requested and/or checked out.
2147         * buildbot/interfaces.py (IBuildStatus.getProperty): new method
2148         * buildbot/status/builder.py (BuildStatus.getProperty): implement
2149         it. Note that this bumps the persistenceVersion of the saved Build
2150         object, so add the necessary upgrade-old-version logic to include
2151         an empty properties dict.
2153         * buildbot/process/base.py (Build.setProperty): implement it
2154         (Build.getProperty): same
2155         (Build.startBuild): change build startup to set 'branch',
2156         'revision', and 'slavename' properties at the right time
2158         * buildbot/process/step.py (BuildStep.__init__): change setup to
2159         require 'build' argument in a better way
2160         (LoggingBuildStep): split ShellCommand into two pieces, for better
2161         subclassing elsewhere. LoggingBuildStep is a BuildStep which runs
2162         a single RemoteCommand that sends stdout/stderr status text. It
2163         also provides the usual commandComplete / createSummary /
2164         evaluateCommand / getText methods to be overridden...
2165         (ShellCommand): .. whereas ShellCommand is specifically for
2166         running RemoteShellCommands. Other shell-like BuildSteps (like
2167         Source) can inherit from LoggingBuildStep instead of ShellCommand
2168         (WithProperties): marker class to do build-property interpolation
2169         (Source): inherit from LoggingBuildStep instead of ShellCommand
2170         (RemoteDummy): same
2172         * buildbot/test/test_properties.py: test new functionality
2174 2006-04-21  Brian Warner  <warner@lothar.com>
2176         * buildbot/test/test_vc.py: rename testBranch to
2177         testCheckoutBranch to keep the tests in about the right
2178         alphabetical order
2180 2006-04-18  Brian Warner  <warner@lothar.com>
2182         * docs/buildbot.texinfo (PBListener): improve cross-references
2183         between PBListener and 'buildbot statusgui', thanks to John Pye
2184         for the suggestion.
2186 2006-04-17  Brian Warner  <warner@lothar.com>
2188         * buildbot/twcompat.py (maybeWait): handle SkipTest properly when
2189         running under Twisted-1.3.0, otherwise skipped tests are reported
2190         as errors.
2192         * all: use isinstance() instead of 'type(x) is foo', suggested by
2193         Neal Norwitz
2195         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
2196         oops, fix a brain-fade from the other week, when making the
2197         addStep changes. I changed all the __init__ upcalls to use the
2198         wrong superclass name.
2199         (FullTwistedBuildFactory.__init__): same
2200         (TwistedDebsBuildFactory.__init__): same
2201         (TwistedReactorsBuildFactory.__init__): same
2202         (TwistedBuild.isFileImportant): use .startswith for clarity,
2203         thanks to Neal Norwitz for the suggestions.
2205         * contrib/viewcvspoll.py: script to poll a viewcvs database for
2206         changes, then deliver them over PB to a remote buildmaster.
2208         * contrib/svnpoller.py: added script by John Pye to poll a remote
2209         SVN repository (by running 'svn log') from a cronjob, and run
2210         'buildbot sendchange' to deliver the changes to a remote
2211         buildmaster.
2212         * contrib/svn_watcher.py: added script by Niklaus Giger (a
2213         modification of svnpoller.py), same purpose, but this one loops
2214         internally (rather than expecting to run from a cronjob) and works
2215         under windows.
2216         * contrib/README.txt: same
2218 2006-04-11  Brian Warner  <warner@lothar.com>
2220         * all: fix a number of incorrect names and missing imports, thanks
2221         to Anthony Baxter for the patch.
2222         * buildbot/status/html.py (WaterfallStatusResource.statusToHTML): 
2223         remove unused buggy method.
2224         * buildbot/status/builder.py (BuildStatus.saveYourself): rmtree
2225         comes from shutil, not "shutils"
2226         * buildbot/process/step.py (TreeSize.evaluateCommand): fix bad name
2227         (Arch.checkSlaveVersion): same
2228         * buildbot/process/step_twisted.py (Trial.commandComplete): same, in
2229         some disabled code
2230         * buildbot/process/step_twisted2.py: add some missing imports
2231         * buildbot/twcompat.py (_deferGenerator): fix cut-and-paste error,
2232         this code used to live in twisted.internet.defer
2234 2006-04-10  Brian Warner  <warner@lothar.com>
2236         * buildbot/process/step.py (Mercurial): add Mercurial support
2237         * buildbot/slave/commands.py (Mercurial): same
2238         * buildbot/scripts/tryclient.py (MercurialExtractor): same
2239         * buildbot/test/test_vc.py (Mercurial): same, checkout over HTTP is
2240         not yet tested, but 'try' support *is* covered
2241         * docs/buildbot.texinfo (Mercurial): document it
2243         * buildbot/process/step.py (LoggedRemoteCommand.remoteUpdate): add
2244         some debugging messages (turned off)
2245         * buildbot/test/test_vc.py: improve debug messages
2247 2006-04-07  Brian Warner  <warner@lothar.com>
2249         * buildbot/test/test_vc.py (which): define our own which() in case
2250         we can't import twisted.python.procutils, because procutils doesn't
2251         exist in Twisted-1.3
2253         * docs/buildbot.texinfo (Interlocks): fix some typos, mention use
2254         of SlaveLocks for performance tests
2256         * docs/examples/twisted_master.cfg: update to match current usage
2258         * buildbot/changes/p4poller.py (P4Source): add new arguments:
2259         password, p4 binary, pollinterval, maximum history to check.
2260         Patch from an anonymous sf.net contributor, SF#1219384.
2261         * buildbot/process/step.py (P4Sync.__init__): add username,
2262         password, and client arguments.
2263         * buildbot/slave/commands.py (P4Sync): same
2265 2006-04-05  Brian Warner  <warner@lothar.com>
2267         * buildbot/process/factory.py (BuildFactory.addStep): new method
2268         to add steps to a BuildFactory. Use it instead of f.steps.append,
2269         and you can probably avoid using the s() convenience function.
2270         Patch from Neal Norwitz, sf.net #1412605.
2271         (other): update all factories to use addStep
2272         * buildbot/process/process_twisted.py: update all factories to use
2273         addStep.
2275 2006-04-03  Brian Warner  <warner@lothar.com>
2277         * buildbot/test/test_vc.py: modified find-the-VC-command logic to
2278         work under windows too. Adapted from a patch by Niklaus Giger,
2279         addresses SF#1463399.
2281         * buildbot/test/__init__.py: set $LANG to 'C', to insure that
2282         spawned commands emit parseable results in english and not some
2283         other language. Patch from Niklaus Giger, SF#1463395.
2285         * README (INSTALLATION): discourage users from running unit tests on
2286         a "network drive", patch from Niklaus Giger, SF#1463394.
2288 2006-03-22  Brian Warner  <warner@lothar.com>
2290         * contrib/svn_buildbot.py: rearrange, add an easy-to-change
2291         function to turn a repository-relative pathname into a (branch,
2292         branch-relative-filename) tuple. Change this function to handle
2293         the branch naming policy used by your Subversion repository.
2294         Thanks to AllMyData.com for sponsoring this work.
2296 2006-03-16  Brian Warner  <warner@lothar.com>
2298         * buildbot/scripts/sample.cfg: add python-mode declaration for
2299         vim. Thanks to John Pye for the patch.
2301         * docs/buildbot.texinfo (Launching the daemons): fix @reboot job
2302         command line, mention the importance of running 'crontab' as the
2303         buildmaster/buildslave user. Thanks to John Pye for the catch.
2305 2006-03-13  Brian Warner  <warner@lothar.com>
2307         * buildbot/status/words.py (IRC): add an optional password=
2308         argument, which will be sent to Nickserv in an IDENTIFY message at
2309         login, to claim the nickname. freenode requires this before the
2310         bot can sent (or reply to) private messages. Thanks to Clement
2311         Stenac for the patch.
2312         * docs/buildbot.texinfo (IRC Bot): document it
2314         * buildbot/status/builder.py (LogFile.merge): don't write chunks
2315         larger than chunkSize. Fixes SF#1349253.
2316         * buildbot/test/test_status.py (Log.testLargeSummary): test it
2317         (Log.testConsumer): update to match new internal chunking behavior
2319 2006-03-12  Brian Warner  <warner@lothar.com>
2321         * buildbot/test/test_vc.py: remove the last use of waitForDeferred
2323         * buildbot/test/test_maildir.py (MaildirTest): rename the
2324         'timeout' method, as it collides with trial's internals
2326         * buildbot/scripts/runner.py: add 'buildbot restart' command
2327         (stop): don't sys.exit() out of here, otherwise restart can't work
2328         * docs/buildbot.texinfo (Shutdown): document it
2330         * buildbot/buildset.py (BuildSet.__init__): clean up docstring
2331         * buildbot/status/html.py (Waterfall.__init__): same
2332         * buildbot/process/builder.py (Builder.startBuild): same
2333         * buildbot/process/base.py (BuildRequest): same
2334         * buildbot/sourcestamp.py (SourceStamp): same
2335         * buildbot/scheduler.py (Nightly): same
2337         * buildbot/__init__.py (version): bump to 0.7.2+ while between
2338         releases
2339         * docs/buildbot.texinfo: same
2341 2006-02-17  Brian Warner  <warner@lothar.com>
2343         * buildbot/__init__.py (version): Releasing buildbot-0.7.2
2344         * docs/buildbot.texinfo: set version number to match
2345         * NEWS: update for 0.7.2
2347 2006-02-16  Brian Warner  <warner@lothar.com>
2349         * docs/buildbot.texinfo (Build Dependencies): add cindex tag
2351 2006-02-09  Brian Warner  <warner@lothar.com>
2353         * docs/buildbot.texinfo (How Different VC Systems Specify Sources):
2354         add text to explain per-build branch parameters
2355         * NEWS: mention --umask
2357 2006-02-08  Brian Warner  <warner@lothar.com>
2359         * buildbot/scripts/runner.py (Maker.makeSlaveTAC): remove unused
2360         method
2361         (SlaveOptions.optParameters): add --umask, to make it possible to
2362         make buildslave-generated files (including build products) be
2363         world-readable
2364         (slaveTAC): same
2365         * buildbot/slave/bot.py (BuildSlave.startService): same
2367 2006-01-23  Brian Warner  <warner@lothar.com>
2369         * buildbot/status/builder.py: urllib.quote() all URLs that include
2370         Builder names, so that builders can include characters like '/'
2371         and ' ' without completely breaking the resulting HTML. Thanks to
2372         Kevin Turner for the patch.
2373         * buildbot/status/html.py: same
2374         * buildbot/test/test_web.py (GetURL.testBuild): match changes
2376         * NEWS: update in preparation for upcoming release
2378 2006-01-18  Brian Warner  <warner@lothar.com>
2380         * docs/examples/twisted_master.cfg: update to match the Twisted
2381         buildbot: remove python2.2, switch to exarkun's buildslaves,
2382         disable the .deb builder until we figure out how to build twisted
2383         .debs from SVN, add some ktrace debugging to the OS-X build
2384         process and remove the qt build, remove threadless builders,
2385         change freebsd builder to use landonf's buildslave.
2387 2006-01-12  Brian Warner  <warner@lothar.com>
2389         * buildbot/master.py (Manhole.__init__): let port= be a strports
2390         specification string, but handle a regular int for backwards
2391         compatibility. This allows "tcp:12345:interface=127.0.0.1" to be
2392         used in master.cfg to limit connections to just the local host.
2393         (BuildMaster.loadConfig): same for c['slavePortnum']
2394         * buildbot/scheduler.py (Try_Userpass.__init__): same
2395         * buildbot/status/client.py (PBListener.__init__): same
2396         * buildbot/status/html.py (Waterfall.__init__): same, for both
2397         http_port and distrib_port. Include backwards-compatibility checks
2398         so distrib_port can be a filename string and still mean unix:/foo
2399         * docs/buildbot.texinfo (Setting the slaveport): document it
2400         (Debug options): same
2401         (HTML Waterfall): same
2402         (PBListener): same
2403         (try): same
2404         * buildbot/test/test_config.py (ConfigTest): test it
2406         * buildbot/master.py (BuildMaster.loadConfig): wait for the
2407         slaveport's disownServiceParent deferred to fire before opening
2408         the new one. Fixes an annoying bug in the unit tests.
2410 2006-01-03  Brian Warner  <warner@lothar.com>
2412         * buildbot/master.py (BuildMaster): remove the .schedulers
2413         attribute, replacing it with an allSchedulers() method that looks
2414         for all IService children that implement IScheduler. Having only
2415         one parent/child relationship means fewer opportunities for bugs.
2416         (BuildMaster.allSchedulers): new method
2417         (BuildMaster.loadConfig_Schedulers): update to use allSchedulers,
2418         also fix ugly bug that caused any config-file reload to
2419         half-forget about the earlier Schedulers, causing an exception
2420         when a Change arrived and was handed to a half-connected
2421         Scheduler. The exception was in scheduler.py line 54ish:
2422           self.parent.submitBuildSet(bs)
2423           exceptions.AttributeError: 'NoneType' object has no attribute
2424           'submitBuildSet'
2425         (BuildMaster.addChange): update to use allSchedulers()
2427         * buildbot/scheduler.py (BaseScheduler.__implements__): fix this
2428         to work properly with twisted-1.3.0, where you must explicitly
2429         include the __implements__ from parent classes
2430         (BaseScheduler.__repr__): make it easier to distinguish distinct
2431         instances
2432         (BaseUpstreamScheduler.__implements__): same
2434         * buildbot/status/builder.py (Status.getSchedulers): update to
2435         use allSchedulers()
2436         * buildbot/test/test_run.py (Run.testMaster): same
2437         * buildbot/test/test_dependencies.py (Dependencies.findScheduler): same
2438         * buildbot/test/test_config.py (ConfigTest.testSchedulers): same,
2439         make sure Scheduler instances are left alone when an identical
2440         config file is reloaded
2441         (ConfigElements.testSchedulers): make sure Schedulers are properly
2442         comparable
2444         * Makefile (TRIALARGS): my local default Twisted version is now
2445         2.1.0, update the trial arguments accordingly
2447 2005-12-22  Brian Warner  <warner@lothar.com>
2449         * docs/examples/twisted_master.cfg: merge changes from pyr: add
2450         new win32 builders
2452         * buildbot/scheduler.py (BaseScheduler.addChange): include a dummy
2453         addChange in the parent class, although I suspect this should be
2454         fixed better in the future.
2456 2005-11-26  Brian Warner  <warner@lothar.com>
2458         * buildbot/scheduler.py (AnyBranchScheduler.addChange): don't
2459         explode when branch==None, thanks to Kevin Turner for the catch
2460         * buildbot/test/test_scheduler.py (Scheduling.testAnyBranch): test
2461         it
2463         * buildbot/__init__.py (version): bump to 0.7.1+ while between
2464         releases
2465         * docs/buildbot.texinfo: same
2467 2005-11-26  Brian Warner  <warner@lothar.com>
2469         * buildbot/__init__.py (version): Releasing buildbot-0.7.1
2470         * docs/buildbot.texinfo: set version number to match
2472 2005-11-26  Brian Warner  <warner@lothar.com>
2474         * NEWS: update for 0.7.1
2476         * buildbot/status/builder.py (BuildStepStatus.unsubscribe): make
2477         sure that unsubscribe works even if we never sent an ETA update.
2478         Also, don't explode on duplicate unsubscribe.
2479         (BuildStepStatus.addLog): make the convenience "return self"-added
2480         watcher automatically unsubscribe when the Step finishes.
2481         (BuildStatus.unsubscribe): same handle-duplicate-unsubscribe
2482         (BuildStatus.stepStarted): same auto-unsubscribe
2483         (BuilderStatus.buildStarted): same auto-unsubscribe
2485         * buildbot/interfaces.py (IStatusReceiver.buildStarted): document
2486         auto-unsubscribe
2487         (IStatusReceiver.stepStarted): same
2488         (IStatusReceiver.logStarted): same
2490         * buildbot/test/test_run.py (Status): move the Status test..
2491         * buildbot/test/test_status.py (Subscription): .. to here
2493 2005-11-25  Brian Warner  <warner@lothar.com>
2495         * NEWS: more updates
2497         * buildbot/locks.py: fix the problem in which loading a master.cfg
2498         file that changes some Builders (but not all of them) can result
2499         in having multiple copies of the same Lock. Now, the real Locks
2500         are kept in a table inside the BotMaster, and the Builders/Steps
2501         use "LockIDs", which are still instances of MasterLock and
2502         SlaveLock. The real Locks are instances of the new RealMasterLock
2503         and RealSlaveLock classes.
2504         * buildbot/master.py (BotMaster.getLockByID): new method to
2505         convert LockIDs into real Locks.
2506         * buildbot/process/base.py (Build.startBuild): convert LockIDs
2507         into real Locks before building
2508         * buildbot/process/step.py (BuildStep.startStep): same
2509         * buildbot/test/test_locks.py (Locks.testLock1a): add a test which
2510         exercises the problem
2513         * docs/buildbot.texinfo (Scheduler Types): give a few hints about
2514         what Schedulers are available
2516         * buildbot/scheduler.py (Nightly): add new Scheduler based upon
2517         work by Dobes Vandermeer and hacked mercilessly by me. This offers
2518         'cron'-style build scheduling at certain times of day, week,
2519         month, or year.
2520         * buildbot/test/test_scheduler.py (Scheduling.testNightly): test it
2522         * buildbot/scheduler.py (Scheduler): change fileIsImportant
2523         handling: treat self.fileIsImportant more as an attribute that
2524         contains a callable than as a method. If the attribute is None,
2525         don't call it and assume all filenames are important. It is still
2526         possible to provide a fileIsImportant method in a subclass,
2527         however.
2528         (AnyBranchScheduler): handle fileIsImportant=None, previously it
2529         was broken
2530         * buildbot/test/test_scheduler.py (Scheduling.testAnyBranch2):
2531         test using AnyBranchScheduler with fileIsImportant=None
2533 2005-11-24  Brian Warner  <warner@lothar.com>
2535         * buildbot/test/test_config.py (StartService): don't claim a fixed
2536         port number, instead set slavePort=0 on the first pass, figure out
2537         what port was allocated, then switch to a config file that uses
2538         the allocated port.
2540         * buildbot/master.py (BuildMaster.loadConfig): close the old
2541         slaveport before opening the new one, because unit tests might
2542         replace slavePort=0 with the same allocated portnumber, and if we
2543         don't wait for the old port to close first, we get a "port already
2544         in use" error. There is a tiny race condition here, but the only
2545         threat is from other programs that bind (statically) to the same
2546         port number we happened to be allocated, and only if those
2547         programs use SO_REUSEADDR, and only if they get control in between
2548         reactor turns.
2550         * Makefile (TRIALARGS): update to handle Twisted > 2.1.0
2552         * buildbot/master.py (BuildMaster.loadConfig_Sources): remove all
2553         deleted ChangeSources before adding any new ones
2554         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): fix
2555         compare_attrs, to make sure that a config-file reload does not
2556         unnecessarily replace an unmodified ChangeSource instance
2557         * buildbot/test/test_config.py (ConfigTest.testSources): update
2559         * buildbot/scheduler.py (AnyBranchScheduler): fix branches=[] to
2560         mean "don't build anything", and add a warning if it gets used
2561         because it isn't actually useful.
2563         * contrib/svn_buildbot.py: update example usage to match the port
2564         number that gets used by the PBChangeSource
2565         * buildbot/scripts/sample.cfg: add example of PBChangeSource
2567 2005-11-22  Brian Warner  <warner@lothar.com>
2569         * NEWS: start collecting items for next release
2571         * buildbot/process/step.py (SVN.computeSourceRevision): assume
2572         revisions are strings
2573         (P4Sync.computeSourceRevision): same
2575         * buildbot/status/html.py (StatusResourceBuild.body): add a link
2576         to the Buildbot's overall status page
2577         (StatusResourceBuilder.body): same
2579 2005-11-15  Brian Warner  <warner@lothar.com>
2581         * buildbot/master.py (BuildMaster.loadConfig): serialize the
2582         config-file loading, specifically to make sure old StatusTargets
2583         are finished shutting down before new ones start up (thus
2584         resolving a bug in which changing the Waterfall object would fail
2585         because both new and old instances were claiming the same
2586         listening port). Also load new Schedulers after all the new
2587         Builders are set up, in case they fire off a new build right away.
2588         * buildbot/test/test_config.py (StartService): test it
2590         * buildbot/status/mail.py (MailNotifier.buildMessage): oops, add
2591         the branch name to the mail body
2593         * buildbot/changes/pb.py (PBChangeSource.compare_attrs): add this.
2594         Without it, a config-file reload fails to update an existing
2595         PBChangeSource.
2596         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): add
2597         username/passwd to compare_attrs, for the same reason
2598         * buildbot/status/html.py (Waterfall): add favicon to
2599         compare_attrs, same reason
2601 2005-11-05  Brian Warner  <warner@lothar.com>
2603         * buildbot/scripts/tryclient.py (createJobfile): stringify the
2604         baserev before stuffing it in the jobfile. This resolves problems
2605         under SVN (and probably Arch) where revisions are expressed as
2606         numbers. I'm inclined to use string-based revisions everywhere in
2607         the future, but this fix should be safe for now. Thanks to Steven
2608         Walter for the patch.
2610         * buildbot/changes/changes.py (ChangeMaster.saveYourself): use
2611         binary mode when opening pickle files, to make windows work
2612         better. Thanks to Dobes Vandermeer for the catch.
2613         * buildbot/status/builder.py (BuildStatus.saveYourself): same
2614         (BuilderStatus.getBuildByNumber): same
2615         (Status.builderAdded): same
2616         * buildbot/master.py (BuildMaster.loadChanges): same
2618         * buildbot/util.py (Swappable): delete unused leftover code
2620         * buildbot/process/step.py (SVN): when building on a non-default
2621         branch, add the word "[branch]" to the VC step's description, so
2622         it is obvious that we're not building the usual stuff. Likewise,
2623         when we are building a specific revision, add the text "rNNN" to
2624         indicate what that revision number is. Thanks to Brad Hards and
2625         Nathaniel Smith for the suggestion.
2626         (Darcs.startVC): same
2627         (Arch.startVC): same
2628         (Bazaar.startVC): same
2630         * buildbot/process/factory.py (GNUAutoconf.__init__): fix a silly
2631         typo, caught by Mark Dillavou, closes SF#1216636.
2633         * buildbot/test/test_status.py (Log.TODO_testDuplicate): add notes
2634         about a test to add some day
2636         * docs/examples/twisted_master.cfg: update: bot1 can now handle
2637         the 'full-2.3' build, and the 'reactors' build is now run under
2638         python-2.4 because the buildslave no longer has gtk/etc bindings
2639         for earlier versions.
2641 2005-11-03  Brian Warner  <warner@lothar.com>
2643         * buildbot/interfaces.py (IBuilderControl.resubmitBuild): new
2644         method, takes an IBuildStatus and rebuilds it. It might make more
2645         sense to add this to IBuildControl instead, but that instance goes
2646         away completely once the build has finished, and resubmitting
2647         builds can take place weeks later.
2648         * buildbot/process/builder.py (BuilderControl.resubmitBuild): same
2649         * buildbot/status/html.py (StatusResourceBuild): also stash an
2650         IBuilderControl so we can use resubmitBuild.
2651         (StatusResourceBuild.body): render "resubmit" button if we can.
2652         Also add hrefs for each BuildStep
2653         (StatusResourceBuild.rebuild): add action for "resubmit" button
2654         (StatusResourceBuilder.getChild): give it an IBuilderControl
2656         * buildbot/status/builder.py (Status.getURLForThing): change the
2657         URL for BuildSteps to have a "step-" prefix, so the magic URLs
2658         that live as targets of buttons like "stop" and "rebuild" can't
2659         collide with them.
2660         * buildbot/status/builder.py (Status.getURLForThing): same
2661         * buildbot/status/html.py (StatusResourceBuild.getChild): same
2662         (StepBox.getBox): same
2663         * buildbot/test/test_web.py (GetURL): same
2664         (Logfile): same
2666         * buildbot/process/step.py (SVN.__init__): put svnurl/baseURL
2667         exclusivity checks after Source.__init__ upcall, so misspelled
2668         arguments will be reported more usefully
2669         (Darcs.__init__): same
2671 2005-10-29  Brian Warner  <warner@lothar.com>
2673         * docs/examples/twisted_master.cfg: don't double-fire the 'quick'
2674         builder. Move the Try scheduler off to a separate port.
2676 2005-10-27  Brian Warner  <warner@lothar.com>
2678         * buildbot/clients/gtkPanes.py
2679         (TwoRowClient.remote_builderRemoved): disappearing Builders used
2680         to cause the app to crash, now they don't.
2682         * buildbot/clients/debug.py: display the buildmaster's location
2683         in the window's title bar
2685 2005-10-26  Brian Warner  <warner@lothar.com>
2687         * buildbot/status/mail.py (MailNotifier): urllib.escape the URLs
2688         in case they have spaces or whatnot. Patch from Dobes Vandermeer.
2689         * buildbot/test/test_status.py (MyStatus.getURLForThing): fix it
2691         * buildbot/status/html.py (td): put a single non-breaking space
2692         inside otherwise empty <td> elements, as a workaround for buggy
2693         browsers which would optimize them away (along with any associated
2694         styles, like the kind that create the waterfall grid borders).
2695         Patch from Frerich Raabe.
2697         * buildbot/process/step_twisted.py (Trial): expose the trialMode=
2698         argv-list as an argument, defaulting to ["-to"], which is
2699         appropriate for the Trial that comes with Twisted-2.1.0 and
2700         earlier. The Trial in current Twisted SVN wants
2701         ["--reporter=bwverbose"] instead. Also expose trialArgs=, which
2702         defaults to an empty list.
2703         * buildbot/process/process_twisted.py (TwistedTrial.trialMode):
2704         match it, now that trialMode= is a list instead of a single string
2706         * buildbot/__init__.py (version): bump to 0.7.0+ while between
2707         releases
2708         * docs/buildbot.texinfo: same
2710 2005-10-24  Brian Warner  <warner@lothar.com>
2712         * buildbot/__init__.py (version): Releasing buildbot-0.7.0
2713         * docs/buildbot.texinfo: set version number to match
2715 2005-10-24  Brian Warner  <warner@lothar.com>
2717         * README: update for 0.7.0
2718         * NEWS: same
2719         * docs/buildbot.texinfo: move the freshcvs stuff out of the README
2721         * buildbot/clients/debug.glade: add 'branch' box to fake-commit
2722         * buildbot/clients/debug.py (DebugWidget.do_commit): same. Don't
2723         send the branch= argument unless the user really provided one, to
2724         retain compatibility with older buildmasters that don't accept
2725         that argument.
2726         * buildbot/master.py (DebugPerspective.perspective_fakeChange):
2727         same
2729         * docs/buildbot.texinfo: update lots of stuff
2731         * buildbot/scripts/runner.py (sendchange): add a --branch argument
2732         to the 'buildbot sendchange' command
2733         * buildbot/clients/sendchange.py (Sender.send): same
2734         * buildbot/changes/pb.py (ChangePerspective): same
2735         * buildbot/test/test_changes.py (Sender.testSender): test it
2737         * buildbot/process/step.py (SVN.__init__): change 'base_url' and
2738         'default_branch' argument names to 'baseURL' and 'defaultBranch',
2739         for consistency with other BuildStep arguments that use camelCase.
2740         Well, at least more of them use camelCase (like flunkOnWarnings)
2741         than don't.. I wish I'd picked one style and stuck with it
2742         earlier. Annoying, but it's best done before the release, since
2743         these arguments didn't exist at all in 0.6.6 .
2744         (Darcs): same
2745         * buildbot/test/test_vc.py (SVN.testCheckout): same
2746         (Darcs.testPatch): same
2747         * docs/buildbot.texinfo (SVN): document the change
2748         (Darcs): same, add some build-on-branch docs
2749         * docs/examples/twisted_master.cfg: match change
2751         * buildbot/process/step.py (BuildStep): rename
2752         slaveVersionNewEnough to slaveVersionIsOlderThan, because that's
2753         how it is normally used.
2754         * buildbot/test/test_steps.py (Version.checkCompare): same
2756         * buildbot/process/step.py (CVS.startVC): refuse to build
2757         update/copy -style builds on a non-default branch with an old
2758         buildslave (<=0.6.6) that doesn't know how to do it properly. The
2759         concern is that it will do a VC 'update' in an existing tree when
2760         it is supposed to be switching branches (and therefore clobbering
2761         the tree to do a full checkout), thus building the wrong source.
2762         This used to be a warning, but I think the confusion it is likely
2763         to cause warrants making it an error.
2764         (SVN.startVC): same, also make mode=export on old slaves an error
2765         (Darcs.startVC): same
2766         (Git.startVC): improve error message for non-Git-enabled slaves
2767         (Arch.checkSlaveVersion): same. continue to emit a warning when a
2768         specific revision is built on a slave that doesn't pay attention
2769         to args['revision'], because for slowly-changing trees it will
2770         probably do the right thing, and because we have no way to tell
2771         whether we're asking it to build the most recent version or not.
2772         * buildbot/interfaces.py (BuildSlaveTooOldError): new exception
2774         * buildbot/scripts/runner.py (SlaveOptions.postOptions): assert
2775         that 'master' is in host:portnum format, to catch errors sooner
2777 2005-10-23  Brian Warner  <warner@lothar.com>
2779         * buildbot/process/step_twisted.py (ProcessDocs.createSummary):
2780         when creating the list of warning messages, include the line
2781         immediately after each WARNING: line, since that's usually where
2782         the file and line number wind up.
2784         * docs/examples/twisted_master.cfg: OS-X slave now does QT, add a
2785         TryScheduler
2787         * NEWS: update
2789 2005-10-22  Brian Warner  <warner@lothar.com>
2791         * buildbot/status/html.py (HtmlResource): incorporate valid-HTML
2792         patch from Brad Hards
2793         * buildbot/status/classic.css: same
2794         * buildbot/test/test_web.py (Waterfall): match changes
2796         * buildbot/test/test_steps.py (BuildStep.setUp): set
2797         nextBuildNumber so the test passes
2798         * buildbot/test/test_status.py (MyBuilder): same
2800         * buildbot/status/html.py (StatusResourceBuild.body): revision
2801         might be numeric, so stringify it before html-escapifying it
2802         (CurrentBox.getBox): add a "waiting" state, and show a countdown
2803         timer for the upcoming build
2804         * buildbot/status/classic.css: add background-color attributes for
2805         offline/waiting/building classes
2807         * buildbot/status/builder.py (BuildStatus): derive from
2808         styles.Versioned, fix upgrade of .sourceStamp attribute. Also set
2809         the default (i.e. unknown) .slavename to "???" instead of None,
2810         since even unknown slavenames need to be printed eventually.
2811         (BuilderStatus): also derive from styles.Versioned . More
2812         importantly, determine .nextBuildNumber at creation/unpickling
2813         time by scanning the directory of saved BuildStatus instances and
2814         choosing one larger than the highest-numbered one found. This
2815         should fix the problem where random errors during upgrades cause
2816         the buildbot to forget about earlier builds. .nextBuildNumber is
2817         no longer stored in the pickle.
2818         (Status.builderAdded): if we can't unpickle the BuilderStatus,
2819         at least log the error. Also call Builder.determineNextBuildNumber
2820         once the basedir is set.
2822         * buildbot/master.py (BuildMaster.loadChanges): do
2823         styles.doUpgrade afterwards, in case I decide to make Changes
2824         derived from styles.Versioned some day and forget to make this
2825         change later.
2828         * buildbot/test/test_runner.py (Options.testForceOptions): skip
2829         when running under older pythons (<2.3) in which the shlex module
2830         doesn't have a 'split' function.
2832         * buildbot/process/step.py (ShellCommand.start): make
2833         errorMessages= be a list of strings to stuff in the log before the
2834         command actually starts. This makes it easier to flag multiple
2835         warning messages, e.g. when the Source steps have to deal with an
2836         old buildslave.
2837         (CVS.startVC): handle slaves that don't handle multiple branches
2838         by switching into 'clobber' mode
2839         (SVN.startVC): same. Also reject branches without base_url
2840         (Darcs.startVC): same. Also reject revision= in older slaves
2841         (Arch.checkSlaveVersion): same (just the multiple-branches stuff)
2842         (Bazaar.startVC): same, and test for baz separately than for arch
2844         * buildbot/slave/commands.py (cvs_ver): document new features
2846         * buildbot/process/step.py (BuildStep.slaveVersion): document it
2847         (BuildStep.slaveVersionNewEnough): more useful utility method
2848         * buildbot/test/test_steps.py (Version): start testing it
2850         * buildbot/status/words.py (IrcStatusBot.command_FORCE): note that
2851         the 'force' command requires python2.3, for the shlex.split method
2853         * docs/examples/twisted_master.cfg: remove old freshcvs stuff,
2854         since we don't use it anymore. The Twisted buildbot uses a
2855         PBChangeSource now.
2857 2005-10-21  Brian Warner  <warner@lothar.com>
2859         * buildbot/process/process_twisted.py: rework all BuildFactory
2860         classes to take a 'source' step as an argument, instead of
2861         building up the SVN instance in the factory.
2862         * docs/examples/twisted_master.cfg: enable build-on-branch by
2863         providing a base_url and default_branch
2865         * buildbot/status/words.py (IrcStatusBot.command_FORCE): add
2866         control over --branch and --revision, not that they are always
2867         legal to provide
2868         * buildbot/status/html.py (StatusResourceBuilder.force): same
2869         (StatusResourceBuild.body): display SourceStamp components
2871         * buildbot/scripts/runner.py (ForceOptions): option parser for the
2872         IRC 'force' command, so it can be shared with an eventual
2873         command-line-tool 'buildbot force' mode.
2874         * buildbot/test/test_runner.py (Options.testForceOptions): test it
2876 2005-10-20  Brian Warner  <warner@lothar.com>
2878         * buildbot/status/mail.py (MailNotifier.buildMessage): reformat
2880         * docs/examples/twisted_master.cfg: update to use Schedulers
2882         * buildbot/scripts/sample.cfg: update with Schedulers
2884         * buildbot/interfaces.py (IBuilderControl.requestBuildSoon): new
2885         method specifically for use by HTML "force build" button and the
2886         IRC "force" command. Raises an immediate error if there are no
2887         slaves available.
2888         (IBuilderControl.requestBuild): make this just submit a build, not
2889         try to check for existing slaves or set up any when-finished
2890         Deferreds or anything.
2891         * buildbot/process/builder.py (BuilderControl): same
2892         * buildbot/status/html.py (StatusResourceBuilder.force): same
2893         * buildbot/status/words.py (IrcStatusBot.command_FORCE): same
2894         * buildbot/test/test_slaves.py: same
2895         * buildbot/test/test_web.py: same
2897 2005-10-19  Brian Warner  <warner@lothar.com>
2899         * docs/examples/twisted_master.cfg: re-sync with reality: bring
2900         back python2.2 tests, turn off OS-X threadedselect-reactor tests
2902 2005-10-18  Brian Warner  <warner@lothar.com>
2904         * buildbot/status/html.py: provide 'status' argument to most
2905         StatusResourceFOO objects
2906         (StatusResourceBuild.body): href-ify the Builder name, add "Steps
2907         and Logfiles" section to make the Build page into a more-or-less
2908         comprehensive source of status information about the build
2910         * buildbot/status/mail.py (MailNotifier): include the Build's URL
2911         * buildbot/status/words.py (IrcStatusBot.buildFinished): same
2913 2005-10-17  Brian Warner  <warner@lothar.com>
2915         * buildbot/process/process_twisted.py (TwistedTrial): update Trial
2916         arguments to accomodate Twisted >=2.1.0 . I will have to figure
2917         out what to do about other projects: the correct options for
2918         recent Twisteds will not work for older ones.
2920 2005-10-15  Brian Warner  <warner@lothar.com>
2922         * buildbot/status/builder.py (Status.getURLForThing): add method
2923         to provide a URL for arbitrary IStatusFoo objects. The idea is to
2924         use this in email/IRC status clients to make them more useful, by
2925         providing the end user with hints on where to learn more about the
2926         object being reported on.
2927         * buildbot/test/test_web.py (GetURL): tests for it
2929 2005-10-14  Brian Warner  <warner@lothar.com>
2931         * buildbot/test/test_config.py (ConfigTest._testSources_1): oops,
2932         fix bug resulting from deferredResult changes
2934 2005-10-13  Brian Warner  <warner@lothar.com>
2936         * buildbot/test/test_changes.py: remove use of deferredResult
2937         * buildbot/test/test_config.py: same
2938         * buildbot/test/test_control.py: same
2939         * buildbot/test/test_status.py: same
2940         * buildbot/test/test_vc.py: this is the only remaining use, since
2941         it gets used at module level. This needs to be replaced by some
2942         sort of class-level run-once routine.
2944         * buildbot/status/words.py (IrcStatusBot.command_WATCH): fix typo
2946         * lots: implement multiple slaves per Builder, which means multiple
2947         current builds per Builder. Some highlights:
2948         * buildbot/interfaces.py (IBuilderStatus.getState): return a tuple
2949         of (state,currentBuilds) instead of (state,currentBuild)
2950         (IBuilderStatus.getCurrentBuilds): replace getCurrentBuild()
2951         (IBuildStatus.getSlavename): new method, so you can tell which
2952         slave got used. This only gets set when the build completes.
2953         (IBuildRequestStatus.getBuilds): new method
2955         * buildbot/process/builder.py (SlaveBuilder): add a .state
2956         attribute to track things like ATTACHING and IDLE and BUILDING,
2957         instead of..
2958         (Builder): .. the .slaves attribute here, which has been turned
2959         into a simple list of available slaves. Added a separate
2960         attaching_slaves list to track ones that are not yet ready for
2961         builds.
2962         (Builder.fireTestEvent): put off the test-event callback for a
2963         reactor turn, to make tests a bit more consistent.
2964         (Ping): cleaned up the slaveping a bit, now it disconnects if the
2965         ping fails due to an exception. This needs work, I'm worried that
2966         a code error could lead to a constantly re-connecting slave.
2967         Especially since I'm trying to move to a distinct remote_ping
2968         method, separate from the remote_print that we currently use.
2969         (BuilderControl.requestBuild): return a convenience Deferred that
2970         provides an IBuildStatus when the build finishes.
2971         (BuilderControl.ping): ping all connected slaves, only return True
2972         if they all respond.
2974         * buildbot/slave/bot.py (BuildSlave.stopService): stop trying to
2975         reconnect when we shut down.
2977         * buildbot/status/builder.py: implement new methods, convert
2978         one-build-at-a-time methods to handle multiple builds
2979         * buildbot/status/*.py: do the same in all default status targets
2980         * buildbot/status/html.py: report the build's slavename in the
2981         per-Build page, report all buildslaves on the per-Builder page
2983         * buildbot/test/test_run.py: update/create tests
2984         * buildbot/test/test_slaves.py: same
2985         * buildbot/test/test_scheduler.py: remove stale test
2987         * docs/buildbot.texinfo: document the new builder-specification
2988         'slavenames' parameter
2990 2005-10-12  Brian Warner  <warner@lothar.com>
2992         * buildbot/buildset.py (BuildSet): fix bug where BuildSet did not
2993         report failure correctly, causing Dependent builds to run when
2994         they shouldn't have.
2995         * buildbot/status/builder.py (BuildSetStatus): same
2996         * buildbot/test/test_buildreq.py (Set.testBuildSet): verify it
2997         (Set.testSuccess): test the both-pass case too
2998         * buildbot/test/test_dependencies.py (Dependencies.testRun_Fail):
2999         fix this test: it was ending too early, masking the failure before
3000         (Logger): specialized StatusReceiver to make sure the dependent
3001         builds aren't even started, much less completed.
3003 2005-10-07  Brian Warner  <warner@lothar.com>
3005         * buildbot/slave/bot.py (SlaveBuilder.activity): survive
3006         bot.SlaveBuilder being disowned in the middle of a build
3008         * buildbot/status/base.py (StatusReceiverMultiService): oops, make
3009         this inherit from StatusReceiver. Also upcall in __init__. This
3010         fixes the embarrasing crash when the new buildSetSubmitted method
3011         is invoked and Waterfall/etc don't implement their own.
3012         * buildbot/test/test_run.py: add a TODO note about a test to catch
3013         just this sort of thing.
3015         * buildbot/process/builder.py (Builder.attached): remove the
3016         already-attached warning, this situation is normal. Add some
3017         comments explaining it.
3019 2005-10-02  Brian Warner  <warner@lothar.com>
3021         * buildbot/changes/maildir.py (Maildir.start): Tolerate
3022         OverflowError when setting up dnotify, because some 64-bit systems
3023         have problems with signed-vs-unsigned constants and trip up on the
3024         DN_MULTISHOT flag. Patch from Brad Hards.
3026 2005-09-06  Fred Drake  <fdrake@users.sourceforge.net>
3028         * buildbot/process/step.py (BuildStep, ShellCommand): Add
3029         progressMetrics, description, descriptionDone to the 'parms' list,
3030         and make use the 'parms' list from the implementation class
3031         instead of only BuildStep to initialize the parameters.  This
3032         allows buildbot.process.factory.s() to initialize all the parms,
3033         not just those defined in directly by BuildStep.
3035 2005-09-03  Brian Warner  <warner@lothar.com>
3037         * NEWS: start adding items for the next release
3039         * docs/examples/twisted_master.cfg: (sync with reality) turn off
3040         python2.2 tests, change 'Quick' builder to only use python2.3
3042 2005-09-02  Fred Drake  <fdrake@users.sourceforge.net>
3044         * buildbot/status/html.py (StatusResourceBuilder.body): only show
3045         the "Ping Builder" button if the build control is available; the
3046         user sees an exception otherwise
3048         * docs/buildbot.texinfo (PBChangeSource): fix a typo
3050 2005-09-01  Brian Warner  <warner@lothar.com>
3052         * buildbot/interfaces.py (IBuilderStatus.getState): update
3053         signature, point out that 'build' can be None
3054         (IBuildStatus.getETA): point out ETA can be none
3056         * buildbot/status/html.py (CurrentBox.getBox): tolerate build/ETA
3057         being None
3058         * buildbot/status/words.py (IrcStatusBot.emit_status): same
3060 2005-08-31  Brian Warner  <warner@lothar.com>
3062         * buildbot/status/base.py (StatusReceiver.builderChangedState):
3063         update to match correct signature: removed 'eta' argument
3064         * buildbot/status/mail.py (MailNotifier.builderChangedState): same
3066 2005-08-30  Brian Warner  <warner@lothar.com>
3068         * buildbot/status/builder.py (LogFile): remove the assertion that
3069         blows up when you try to overwrite an existing logfile, instead
3070         just emit a warning. This case gets hit when the buildmaster is
3071         killed and doesn't get a chance to write out the serialized
3072         BuilderStatus object, so the .nextBuildNumber attribute gets out
3073         of date.
3075         * buildbot/scripts/runner.py (sendchange): add --revision_file to
3076         the 'buildbot sendchange' arguments, for the Darcs context file
3077         * docs/buildbot.texinfo (sendchange): document it
3079         * buildbot/status/html.py: add pending/upcoming builds to CurrentBox
3080         * buildbot/interfaces.py (IScheduler.getPendingBuildTimes): new method
3081         (IStatus.getSchedulers): new method
3082         * buildbot/status/builder.py (BuilderStatus): track pendingBuilds
3083         (Status.getSchedulers): implement
3084         * buildbot/process/builder.py (Builder): maintain
3085         BuilderStatus.pendingBuilds
3086         * buildbot/scheduler.py (Scheduler.getPendingBuildTimes): new method
3087         (TryBase.addChange): Try schedulers should ignore Changes
3089         * buildbot/scripts/tryclient.py (getTopdir): implement getTopdir
3090         for 'try' on CVS/SVN
3091         * buildbot/test/test_runner.py (Try.testGetTopdir): test case
3093         * buildbot/scripts/tryclient.py (Try): make jobdir-style 'try'
3094         report status properly.
3095         (Try.createJob): implement unique buildset IDs
3097         * buildbot/status/client.py (StatusClientPerspective): add a
3098         perspective_getBuildSets method for the benefit of jobdir-style
3099         'try'.
3100         * docs/buildbot.texinfo (try): more docs
3101         * buildbot/test/test_scheduler.py (Scheduling.testGetBuildSets):
3102         new test case
3104 2005-08-18  Brian Warner  <warner@lothar.com>
3106         * buildbot/scripts/tryclient.py (Try): make 'try' status reporting
3107         actually work. It's functional but still kind of clunky. Also, it
3108         only works with the pb-style.. needs to be made to work with the
3109         jobdir-style too.
3111         * buildbot/status/client.py (RemoteBuildSet): new class
3112         (RemoteBuildRequest): same
3113         (RemoteBuild.remote_waitUntilFinished): return the RemoteBuild
3114         object, not the internal BuildStatus object.
3115         (RemoteBuild.remote_subscribe): new method to subscribe to builds
3116         outside of the usual buildStarted() return value.
3117         (BuildSubscriber): support class for RemoteBuild.remote_subscribe
3119         * buildbot/scheduler.py (Try_Jobdir): convey buildsetID properly
3120         (Try_Userpass_Perspective.perspective_try): return a remotely
3121         usable BuildSetStatus object
3123         * buildbot/interfaces.py (IBuildStatus): remove obsolete
3124         isStarted()/waitUntilStarted()
3126 2005-08-16  Brian Warner  <warner@lothar.com>
3128         * buildbot/status/builder.py: implement IBuildSetStatus and
3129         IBuildRequestStatus, wire them into place.
3130         * buildbot/buildset.py: same. Add ID, move wait-until-finished
3131         methods into the BuildSetStatus object.
3132         * buildbot/interfaces.py: same
3133         (IStatus.getBuildSets): new method to get pending BuildSets
3134         (IStatusReceiver.buildsetSubmitted): new method which hears about
3135         new BuildSets
3136         * buildbot/master.py (BuildMaster.submitBuildSet): same
3137         * buildbot/process/base.py (BuildRequest): same, replace
3138         waitUntilStarted with subscribe/unsubscribe
3139         * buildbot/process/builder.py (BuilderControl.forceBuild): use
3140         subscribe instead of waitUntilStarted
3141         * buildbot/status/base.py (StatusReceiver.buildsetSubmitted): stub
3142         for new method
3143         * buildbot/status/client.py (StatusClientPerspective.builderRemoved): 
3144         same
3145         * buildbot/test/test_buildreq.py: update for new code
3146         * buildbot/test/test_control.py (Force.testRequest): same
3149         * buildbot/slave/commands.py (Darcs.doVCFull): fix get-revision
3150         for Darcs to not use the tempfile module, so it works under
3151         python-2.2 too. We really didn't need the full cleverness of that
3152         module, since the slave has exclusive control of its own builddir.
3154 2005-08-15  Brian Warner  <warner@lothar.com>
3156         * buildbot/scripts/tryclient.py (CVSExtractor): implement 'try'
3157         for CVS trees. It doesn't work for non-trunk branches,
3158         unfortunately.
3159         * buildbot/test/test_vc.py (CVS.testTry): test it, but skip the
3160         branch test
3162         * Makefile: make it easier to test against python2.2
3164         * buildbot/test/test_vc.py (VCBase.tearDown): provide for
3165         tearDown2, so things like Arch can unregister archives as they're
3166         shutting down. The previous subclass-override-tearDown technique
3167         resulted in a nested maybeWait() and test failures under
3168         Twisted-1.3.0
3170         * buildbot/scripts/tryclient.py (getSourceStamp): extract branches
3171         where we can (Arch), add a branch= argument to set the branch used
3172         when we can't
3173         (BazExtractor): extract the branch too
3174         (TlaExtractor): same
3175         * buildbot/scripts/runner.py (TryOptions): add --branch
3176         * docs/buildbot.texinfo (try): document --branch/try_branch
3178         * buildbot/slave/commands.py (Darcs): implement get-revision for
3179         Darcs, so that 'try' will work. This requires the tempfile module
3180         from python-2.3 .
3182         * buildbot/test/test_vc.py: rewrite tests, getting better coverage
3183         of revisions, branches, and 'try' in the process.
3185 2005-08-11  Brian Warner  <warner@lothar.com>
3187         * buildbot/master.py (DebugPerspective.perspective_pokeIRC): fix
3188         this, it got broken at some point in the last few releases
3189         * buildbot/status/words.py (IrcBuildRequest): reply was broken
3190         (IrcStatusBot.emit_status): handle new IBuilderStatus.getState,
3191         specifically the removal of ETA information from the tuple
3193         * buildbot/locks.py: use %d for id() instead of %x, avoid a silly
3194         warning message
3196         * docs/buildbot.texinfo (try): document both --builder and
3197         'try_builders' in .buildbot/options
3198         * buildbot/scripts/runner.py (TryOptions): add --builder,
3199         accumulate the values into opts['builders']
3200         * buildbot/scripts/tryclient.py (Try.__init__): set builders
3201         * buildbot/test/test_runner.py (Try): add some quick tests to make
3202         sure 'buildbot try --options' and .buildbot/options get parsed
3203         * buildbot/test/test_scheduler.py (Scheduling.testTryUserpass):
3204         use --builder control
3206         * docs/buildbot.texinfo (try): add --port argument to PB style
3208         * buildbot/scripts/tryclient.py (SourceStampExtractor): return an
3209         actual SourceStamp. Still need to extract a branch name, somehow.
3210         (Try): finish implementing the try client side, still need a UI
3211         for specifying which builders to use
3212         (Try.getopt): factor our options/config-file reading
3213         * buildbot/test/test_scheduler.py (Scheduling.testTryUserpass):
3214         test it
3215         * buildbot/test/test_vc.py: match SourceStampExtractor change
3217         * buildbot/scripts/runner.py (Options.opt_verbose): --verbose
3218         causes the twisted log to be sent to stderr
3220         * buildbot/scheduler.py (Try_Userpass): implement the PB style
3222 2005-08-10  Brian Warner  <warner@lothar.com>
3224         * buildbot/scripts/runner.py: Add 'buildbot try' command, jobdir
3225         style is 90% done, still missing status reporting or waiting for
3226         the buildsets to finish, and it is completely untested.
3228         * buildbot/trybuild.py: delete file, move contents to ..
3229         * buildbot/scripts/tryclient.py (getSourceStamp): .. here
3230         * buildbot/test/test_vc.py: match the move
3232         * buildbot/scheduler.py (Try_Jobdir): implement the jobdir style
3233         of the TryScheduler, no buildsetID or status-tracking support yet
3234         * buildbot/test/test_scheduler.py (Scheduling.testTryJobdir): test it
3236         * buildbot/changes/maildir.py (Maildir.setBasedir): make it
3237         possible to set the basedir after __init__ time, so it is easier
3238         to use as a Service-child of the BuildMaster instance
3240         * buildbot/changes/maildirtwisted.py (MaildirService): make a form
3241         that delivers messages to its Service parent instead of requiring
3242         a subclass to be useful. This turns out to be much easier to build
3243         unit tests around.
3245         * buildbot/scripts/tryclient.py (createJob): utility code to
3246         create jobfiles, will eventually be used by 'buildbot try'
3248 2005-08-08  Brian Warner  <warner@lothar.com>
3250         * docs/buildbot.texinfo (try): add docs on the
3251         as-yet-unimplemented Try scheduler
3253         * buildbot/test/test_buildreq.py: move Scheduling tests out to ..
3254         * buildbot/test/test_scheduler.py: .. here
3255         (Scheduling.testTryJobdir): add placeholder test for 'try'
3257         * buildbot/test/test_status.py (Log.testMerge3): update to match new
3258         addEntry merging (>=chunkSize) behavior
3259         (Log.testConsumer): update to handle new callLater(0) behavior
3261         * buildbot/test/test_web.py: rearrange tests a bit, add test for
3262         both the MAX_LENGTH bugfix and the resumeProducing hang.
3264         * buildbot/status/builder.py (LogFileProducer.resumeProducing):
3265         put off the actual resumeProducing for a moment with
3266         reactor.callLater(0). This works around a twisted-1.3.0 bug which
3267         causes large logfiles to hang midway through.
3269         * buildbot/process/step.py (BuildStep.addCompleteLog): break the
3270         logfile up into chunks, both to avoid NetstringReceiver.MAX_LENGTH
3271         and to improve memory usage when streaming the file out to a web
3272         browser.
3273         * buildbot/status/builder.py (LogFile.addEntry): change > to >= to
3274         make this work cleanly
3276 2005-08-03  Brian Warner  <warner@lothar.com>
3278         * buildbot/trybuild.py: new file for 'try' utilities
3279         (getSourceStamp): run in a tree, find out the baserev+patch
3280         * buildbot/test/test_vc.py (VCBase.do_getpatch): test it,
3281         implemented for SVN and Darcs, still working on Arch. I don't know
3282         how to make CVS work yet.
3284         * docs/buildbot.texinfo: document the 'buildbot' command-line
3285         tool, including the not-yet-implemented 'try' feature, and the
3286         in-flux .buildbot/ options directory.
3288 2005-07-20  Brian Warner  <warner@lothar.com>
3290         * buildbot/locks.py: added temporary id() numbers to Lock
3291         descriptions, to track down a not-really-sharing-the-Lock bug
3293         * buildbot/test/runutils.py: must import errno, cut-and-paste bug
3295         * buildbot/test/test_slavecommand.py (ShellBase.failUnlessIn):
3296         needed for python2.2 compatibility
3297         * buildbot/test/test_vc.py: python2.2 compatibility: generators
3298         are from the __future__
3300 2005-07-19  Brian Warner  <warner@lothar.com>
3302         * buildbot/master.py (BuildMaster.loadConfig): give a better error
3303         message when schedulers use unknown builders
3305         * buildbot/process/builder.py (Builder.compareToSetup): make sure
3306         SlaveLock('name') and MasterLock('name') are distinct
3308         * buildbot/master.py (BuildMaster.loadConfig): oops, sanity-check
3309         c['schedulers'] in such a way that we can actually accept
3310         Dependent instances
3311         * buildbot/test/test_config.py: check it
3313         * buildbot/scheduler.py (Dependent.listBuilderNames): oops, add
3314         utility method to *all* the Schedulers
3315         (Periodic.listBuilderNames): same
3317         * docs/buildbot.texinfo (Interlocks): update chapter to match
3318         reality
3320         * buildbot/master.py (BuildMaster.loadConfig): Add sanity checks
3321         to make sure that c['sources'], c['schedulers'], and c['status']
3322         are all lists of the appropriate objects, and that the Schedulers
3323         all point to real Builders
3324         * buildbot/interfaces.py (IScheduler, IUpstreamScheduler): add
3325         'listBuilderNames' utility method to support this
3326         * buildbot/scheduler.py: implement the utility method
3327         * buildbot/test/test_config.py (ConfigTest.testSchedulers): test it
3329         * docs/buildbot.texinfo: add some @cindex entries
3331         * buildbot/test/test_vc.py (Arch.createRepository): set the tla ID
3332         if it wasn't already set: most tla commands will fail unless one
3333         has been set.
3334         (Arch.createRepository): and disable bazaar's revision cache, since
3335         they cause test failures (the multiple repositories we create all
3336         interfere with each other through the cache)
3338         * buildbot/test/test_web.py (WebTest): remove use of deferredResult,
3339         bring it properly up to date with twisted-2.0 test guidelines
3341         * buildbot/master.py (BuildMaster): remove references to old
3342         'interlock' module, this caused a bunch of post-merge test
3343         failures
3344         * buildbot/test/test_config.py: same
3345         * buildbot/process/base.py (Build): same
3347         * buildbot/test/test_slaves.py: stubs for new test case
3349         * buildbot/scheduler.py: add test-case-name tag
3350         * buildbot/test/test_buildreq.py: same
3352         * buildbot/slave/bot.py (SlaveBuilder.__init__): remove some
3353         unnecessary init code
3354         (Bot.remote_setBuilderList): match it
3356         * docs/buildbot.texinfo (@settitle): don't claim version 1.0
3358         * buildbot/changes/mail.py (parseSyncmail): update comment
3360         * buildbot/test/test_slavecommand.py: disable Shell tests on
3361         platforms that don't suport IReactorProcess
3363         * buildbot/status/builder.py (LogFile): remove the 't' mode from
3364         all places where we open logfiles. It causes OS-X to open the file
3365         in some weird mode that that prevents us from mixing reads and
3366         writes to the same filehandle, which we depend upon to implement
3367         _generateChunks properly. This change doesn't appear to break
3368         win32, on which "b" and "t" are treated differently but a missing
3369         flag seems to be interpreted as "t".
3371 2005-07-18  Brian Warner  <warner@lothar.com>
3373         * buildbot/slave/commands.py (ShellCommand): overhaul
3374         error-handling code, to try and make timeout/interrupt work
3375         properly, and make win32 happier
3376         * buildbot/test/test_slavecommand.py: clean up, stop using
3377         reactor.iterate, add tests for timeout and interrupt
3378         * buildbot/test/sleep.py: utility for a new timeout test
3380         * buildbot/twcompat.py: copy over twisted 1.3/2.0 compatibility
3381         code from the local-usebranches branch
3383 2005-07-17  Brian Warner  <warner@lothar.com>
3385         * buildbot/process/process_twisted.py
3386         (TwistedReactorsBuildFactory): change the treeStableTimer to 5
3387         minutes, to match the other twisted BuildFactories, and don't
3388         excuse failures in c/qt/win32 reactors any more.
3390         * docs/examples/twisted_master.cfg: turn off the 'threadless' and
3391         'freebsd' builders, since the buildslaves have been unavailable
3392         for quite a while
3394 2005-07-13  Brian Warner  <warner@lothar.com>
3396         * buildbot/test/test_vc.py (VCBase.do_branch): test the new
3397         build-on-branch feature
3399         * buildbot/process/step.py (Darcs.__init__): add base_url and
3400         default_branch arguments, just like SVN
3401         (Arch.__init__): note that the version= argument is really the
3402         default branch name
3404         * buildbot/slave/commands.py (SourceBase): keep track of the
3405         repository+branch that was used for the last checkout in
3406         SRCDIR/.buildbot-sourcedata . If the contents of this file do not
3407         match, we clobber the directory and perform a fresh checkout
3408         rather than trying to do an in-place update. This should protect
3409         us against trying to get to branch B by doing an update in a tree
3410         obtained from branch A.
3411         (CVS.setup): add CVS-specific sourcedata: root, module, and branch
3412         (SVN.setup): same, just the svnurl
3413         (Darcs.setup): same, just the repourl
3414         (Arch.setup): same, arch coordinates (url), version, and
3415         buildconfig. Also pull the buildconfig from the args dictionary,
3416         which we weren't doing before, so the build-config was effectively
3417         disabled.
3418         (Arch.sourcedirIsUpdateable): don't try to update when we're
3419         moving to a specific revision: arch can't go backwards, so it is
3420         safer to just clobber the tree and checkout a new one at the
3421         desired revision.
3422         (Bazaar.setup): same sourcedata as Arch
3424         * buildbot/test/test_dependencies.py (Dependencies.testRun_Fail):
3425         use maybeWait, to work with twisted-1.3.0 and twcompat
3426         (Dependencies.testRun_Pass): same
3428         * buildbot/test/test_vc.py: rearrange, cleanup
3430         * buildbot/twcompat.py: add defer.waitForDeferred and
3431         utils.getProcessOutputAndValue, so test_vc.py (which uses them)
3432         can work under twisted-1.3.0 .
3434         * buildbot/test/test_vc.py: rewrite. The sample repositories are
3435         now created at setUp time. This increases the runtime of the test
3436         suite considerably (from 91 seconds to 151), but it removes the
3437         need for an offline tarball, which should solve a problem I've
3438         seen where the test host has a different version of svn than the
3439         tarball build host. The new code also validates that mode=update
3440         really picks up recent commits. This approach will also make it
3441         easier to test out branches, because the code which creates the VC
3442         branches is next to the code which uses them. It will also make it
3443         possible to test some change-notification hooks, by actually
3444         performing a VC commit and watching to see the ChangeSource get
3445         notified.
3447 2005-07-12  Brian Warner  <warner@lothar.com>
3449         * docs/buildbot.texinfo (SVN): add branches example
3450         * docs/Makefile (buildbot.ps): add target for postscript manual
3452         * buildbot/test/test_dependencies.py: s/test_interlocks/test_locks/ 
3453         * buildbot/test/test_locks.py: same
3455         * buildbot/process/step.py (Darcs): comment about default branches
3457         * buildbot/master.py (BuildMaster.loadConfig): don't look for
3458         c['interlocks'] in the config file, complain if it is present.
3459         Scan all locks in c['builders'] to make sure the Locks they use
3460         are uniquely named.
3461         * buildbot/test/test_config.py: remove old c['interlocks'] test,
3462         add some tests to check for non-uniquely-named Locks
3463         * buildbot/test/test_vc.py (Patch.doPatch): fix factory.steps,
3464         since the unique-Lock validation code requires it now
3466         * buildbot/locks.py: fix test-case-name
3468         * buildbot/interlock.py: remove old file
3470 2005-07-11  Brian Warner  <warner@lothar.com>
3472         * buildbot/test/test_interlock.py: rename to..
3473         * buildbot/test/test_locks.py: .. something shorter
3475         * buildbot/slave/bot.py (BuildSlave.stopService): newer Twisted
3476         versions (after 2.0.1) changed internet.TCPClient to shut down the
3477         connection in stopService. Change the code to handle this
3478         gracefully.
3480         * buildbot/process/base.py (Build): handle whole-Build locks
3481         * buildbot/process/builder.py (Builder.compareToSetup): same
3482         * buildbot/test/test_interlock.py: make tests work
3484         * buildbot/process/step.py (BuildStep.startStep): complain if a
3485         Step tries to claim a lock that's owned by its own Build
3486         (BuildStep.releaseLocks): typo
3488         * buildbot/locks.py (MasterLock): use ComparableMixin so config
3489         file reloads don't replace unchanged Builders
3490         (SlaveLock): same
3491         * buildbot/test/test_config.py (ConfigTest.testInterlocks):
3492         rewrite to cover new Locks instead of old c['interlocks']
3493         * buildbot/test/runutils.py (RunMixin.connectSlaves): remember
3494         slave2 too
3497         * buildbot/test/test_dependencies.py (Dependencies.setUp): always
3498         start the master and connect the buildslave
3500         * buildbot/process/step.py (FailingDummy.done): finish with a
3501         FAILURE status rather than raising an exception
3503         * buildbot/process/base.py (BuildRequest.mergeReasons): don't try to
3504         stringify a BuildRequest.reason that is None
3506         * buildbot/scheduler.py (BaseUpstreamScheduler.buildSetFinished):
3507         minor fix
3508         * buildbot/status/builder.py (BuildSetStatus): implement enough to
3509         allow scheduler.Dependent to work
3510         * buildbot/buildset.py (BuildSet): set .reason and .results
3512         * buildbot/test/test_interlock.py (Locks.setUp): connect both
3513         slaves, to make the test stop hanging. It still fails, of course,
3514         because I haven't even started to implement Locks.
3516         * buildbot/test/runutils.py (RunMixin.connectSlaves): new utility
3518         * docs/buildbot.texinfo (Build-Dependencies): redesign the feature
3519         * buildbot/interfaces.py (IUpstreamScheduler): new Interface
3520         * buildbot/scheduler.py (BaseScheduler): factor out common stuff
3521         (Dependent): new class for downstream build dependencies
3522         * buildbot/test/test_dependencies.py: tests (still failing)
3524         * buildbot/buildset.py (BuildSet.waitUntilSuccess): minor notes
3526 2005-07-07  Brian Warner  <warner@lothar.com>
3528         * buildbot/test/runutils.py (RunMixin): factored this class out..
3529         * buildbot/test/test_run.py: .. from here
3530         * buildbot/test/test_interlock.py: removed old c['interlock'] tests,
3531         added new buildbot.locks tests (which all hang right now)
3532         * buildbot/locks.py (SlaveLock, MasterLock): implement Locks
3533         * buildbot/process/step.py: claim/release per-BuildStep locks
3535         * docs/Makefile: add 'buildbot.html' target
3537         * buildbot/process/step.py (CVS.__init__): allow branch=None to be
3538         interpreted as "HEAD", so that all VC steps can accept branch=None
3539         and have it mean the "default branch".
3541         * docs/buildbot.texinfo: add Schedulers, Dependencies, and Locks
3543 2005-07-07  Brian Warner  <warner@lothar.com>
3545         * docs/examples/twisted_master.cfg: update to match current usage
3547         * docs/buildbot.texinfo (System Architecture): comment out the
3548         image, it doesn't exist yet and just screws up the HTML manual.
3550 2005-07-05  Brian Warner  <warner@lothar.com>
3552         * debian/.cvsignore: oops, missed one. Removing leftover file.
3554 2005-06-17  Brian Warner  <warner@lothar.com>
3556         * buildbot/test/test_vc.py (VCSupport.__init__): svn --version
3557         changed its output in 1.2.0, don't mistakenly think that the
3558         subversion we find isn't capable of supporting our tests.
3560         * debian/*: remove the debian/ directory and its contents, to make
3561         life easier for the proper Debian maintainer
3562         * MANIFEST.in: same
3563         * Makefile (release): same
3565 2005-06-07  Brian Warner  <warner@lothar.com>
3567         * everything: create a distinct SourceStamp class to replace the
3568         ungainly 4-tuple, let it handle merging instead of BuildRequest.
3569         Changed the signature of Source.startVC to include the revision
3570         information (instead of passing it through self.args). Implement
3571         branches for SVN (now only Darcs/Git is missing support). Add more
3572         Scheduler tests.
3574 2005-06-06  Brian Warner  <warner@lothar.com>
3576         * everything: rearrange build scheduling. Create a new Scheduler
3577         object (configured in c['schedulers'], which submit BuildSets to a
3578         set of Builders. Builders can now use multiple slaves. Builds can
3579         be run on alternate branches, either requested manually or driven
3580         by changes. This changed some of the Status classes. Interlocks
3581         are out of service until they've been properly split into Locks
3582         and Dependencies. treeStableTimer, isFileImportant, and
3583         periodicBuild have all been moved from the Builder to the
3584         Scheduler.
3585         (BuilderStatus.currentBigState): removed the 'waiting' and
3586         'interlocked' states, removed the 'ETA' argument.
3588 2005-05-24  Brian Warner  <warner@lothar.com>
3590         * buildbot/pbutil.py (ReconnectingPBClientFactory): Twisted-1.3
3591         erroneously abandons the connection (in clientConnectionFailed)
3592         for non-UserErrors, which means that if we lose the connection due
3593         to a network problem or a timeout, we'll never try to reconnect.
3594         Fix this by not upcalling to the buggy parent method. Note:
3595         twisted-2.0 fixes this, but the function only has 3 lines so it
3596         makes more sense to copy it than to try and detect the buggyness
3597         of the parent class. Fixes SF#1207588.
3599         * buildbot/changes/changes.py (Change.branch): doh! Add a
3600         class-level attribute to accomodate old Change instances that were
3601         pickled before 0.6.5 (where .branch was added for new Changes).
3602         This fixes the exception that occurs when you try to look at an
3603         old Change (through asHTML).
3605         * buildbot/__init__.py (version): bump to 0.6.6+ while between
3606         releases
3608 2005-05-23  Brian Warner  <warner@lothar.com>
3610         * buildbot/__init__.py (version): release 0.6.6
3612 2005-05-23  Brian Warner  <warner@lothar.com>
3614         * NEWS: update for 0.6.6 release
3615         * debian/changelog: same
3617         * buildbot/scripts/runner.py (start): put the basedir in sys.path
3618         before starting: this was done by twistd back when we spawned it,
3619         now that we're importing the pieces and running them in the
3620         current process, we have to do it ourselves. This allows
3621         master.cfg to import files from the same directory without
3622         explicitly manipulating PYTHONPATH. Thanks to Thomas Vander
3623         Stichele for the catch.
3624         (Options.opt_version): Add a --version command (actually, just make
3625         the existing --version command emit Buildbot's version too)
3627         * buildbot/status/builder.py (HTMLLogFile.upgrade): oops! second
3628         fix to make this behave like other LogFiles, this time to handle
3629         existing LogFiles on disk. (add the missing .upgrade method)
3630         * buildbot/test/test_status.py (Log.testHTMLUpgrade): test it
3632 2005-05-21  Brian Warner  <warner@lothar.com>
3634         * buildbot/test/test_runner.py (Create.testMaster): match the
3635         rawstring change in runner.py:masterTAC
3637         * buildbot/test/test_config.py (ConfigTest.testIRC): skip unless
3638         TwistedWords is installed
3639         * buildbot/test/test_status.py: same, with TwistedMail
3641         * buildbot/master.py: remove old IRC/Waterfall imports (used by
3642         some old, deprecated, and removed config keys). This should enable
3643         you to use the base buildbot functionality with Twisted-2.0.0 when
3644         you don't also have TwistedWeb and TwistedWords installed
3646 2005-05-20  Brian Warner  <warner@lothar.com>
3648         * buildbot/scripts/runner.py (run): call sendchange(), not
3649         do_sendchange(): thus 'buildbot sendchange' was broken in 0.6.5
3650         (run): call stop("HUP"), not "-HUP", 'buildbot stop' was broken.
3651         (stop): don't wait for process to die when sending SIGHUP
3652         (masterTAC): use a rawstring for basedir=, otherwise '\' in the
3653         directory name gets interpreted, which you don't want
3654         (slaveTAC): same
3656         * buildbot/__init__.py (version): bump to 0.6.5+ while between
3657         releases
3659 2005-05-18  Brian Warner  <warner@lothar.com>
3661         * buildbot/__init__.py (version): Releasing buildbot-0.6.5
3663 2005-05-18  Brian Warner  <warner@lothar.com>
3665         * README: update for 0.6.5
3666         * debian/changelog: same
3668         * buildbot/changes/changes.py: rename tag= to branch=, since
3669         that's how we're using it, and my design for the upcoming "build a
3670         specific branch" feature wants it. also, tag= was too CVS-centric
3671         * buildbot/changes/mail.py (parseSyncmail): same
3672         * buildbot/process/base.py (Build.isBranchImportant): same
3673         * buildbot/test/test_mailparse.py (Test3.testMsgS4): same
3674         * docs/buildbot.texinfo (Attributes of Changes): same
3676         * NEWS: update tag=, update for upcoming release
3678 2005-05-17  Brian Warner  <warner@lothar.com>
3680         * buildbot/scripts/runner.py (stop): actually poll once per
3681         second, instead of re-killing the poor daemon once per second.
3682         Sleep briefly (0.1s) before the first poll, since there's a good
3683         chance we can avoid waiting the full second if the daemon shuts
3684         down quickly. Also remove the sys.exit() at the end.
3685         (start): remove the unneighborly sys.exit()
3687         * Makefile: improve permission-setting to not kick Arch so badly
3689         * buildbot/scripts/runner.py (SlaveOptions.optParameters): set a
3690         default --keepalive=600, since it doesn't hurt very much, and it's
3691         a hassle to discover that you need it.
3692         * buildbot/test/test_runner.py (Create.testSlave): test it
3694         * buildbot/status/words.py (IrcStatusBot.buildFinished): Teach the
3695         IRC bot about EXCEPTION
3697         * buildbot/status/client.py (PBListener): upcall more correctly
3699         * buildbot/process/base.py (Build.allStepsDone): if a step caused
3700         an exception mark the overall build with EXCEPTION, not SUCCESS
3702         * buildbot/scripts/runner.py (makefile_sample): remove the leading
3703         newline
3704         * buildbot/status/mail.py (MailNotifier): oops, forgot to upcall
3705         * Makefile: update some release-related stuff
3707         * buildbot/slave/commands.py (ShellCommand.kill): if somehow this
3708         gets called when there isn't actually an active process, just end
3709         the Command instead of blowing up. I don't know how it gets into
3710         this state, but the twisted win32 buildslave will sometimes hang,
3711         and when it shakes its head and comes back, it thinks it's still
3712         running a Command. The next build causes this command to be
3713         interrupted, but the lack of self.process.pid breaks the interrupt
3714         attempt.
3716         * NEWS: document changes since the last release
3718         * buildbot/scripts/runner.py (start): change 'buildbot start' to
3719         look for Makefile.buildbot instead of a bare Makefile . The
3720         'buildbot start' does not install this file, so you have to
3721         manually copy it if you want to customize startup behavior.
3722         (createMaster): change 'buildbot master' command to create
3723         Makefile.sample instead of Makefile, to create master.cfg.sample
3724         instead of master.cfg (requiring you to copy it before the
3725         buildmaster can be started). Both sample files are kept up to
3726         date, i.e. they are overwritten if they have been changed. The
3727         'buildbot.tac' file is *not* overwritten, but if the new contents
3728         don't match the old, a 'buildbot.tac.new' file is created and the
3729         user is warned. This seems to be a much more sane way to handle
3730         startup files. Also, don't sys.exit(0) when done, so we can run
3731         unit tests against it.
3732         (createSlave): same. Don't overwrite the sample info/ files.
3733         * buildbot/scripts/sample.mk: remove. the contents were pulled
3734         into runner.py, since they need to match the behavior of start()
3735         * setup.py: same
3736         * MANIFEST.in: same
3738         * docs/buildbot.texinfo (Launching the daemons): document it
3739         * buildbot/test/test_runner.py (Create): test it
3741         * buildbot/test/test_vc.py (SetupMixin.failUnlessIn): Add a
3742         version that can handle string-in-string tests, because otherwise
3743         python-2.2 fails the tests. It'd be tremendous if Trial's test
3744         took two strings under 2.2 too.
3746         * everything: fixed all deprecation warnings when running against
3747         Twisted-2.0 . (at least all the ones in buildbot code, there are a
3748         few that come from Twisted itself). This involved putting most of
3749         the Twisted-version specific code in the new buildbot.twcompat
3750         module, and creating some abstract base classes in
3751         buildbot.changes.base and buildbot.status.base (which might be
3752         useful anyway). __implements__ is a nuisance and requires an ugly
3753         'if' clause everywhere.
3755         * buildbot/test/test_status.py (Mail.testMail): add a 0.1 second
3756         delay before finishing the test: it seems that smtp.sendmail
3757         doesn't hang up on the server, so we must wait a moment so it can
3758         hang up on us. This removes the trial warning about an unclean
3759         reactor.
3761 2005-05-16  Brian Warner  <warner@lothar.com>
3763         * buildbot/process/step.py (Source): add 'retry' argument. It is a
3764         tuple of (delay, repeats).
3765         * buildbot/test/test_vc.py (Retry): test it
3766         * docs/buildbot.texinfo (Source Checkout): document it
3767         * buildbot/slave/commands.py (SourceBase): add 'retry' parameter.
3768         (SourceBase.maybeDoVCRetry): If 'retry' is set, failures in
3769         doVCFull() are handled by re-trying the checkout (after a delay)
3770         some number of times.
3771         (ShellCommand._startCommand): make header lines easier to read
3773         * buildbot/test/test_web.py (WebTest.tearDown): factor out master
3774         shutdown
3775         (WebTest.test_logfile): make sure master gets shut down, silences
3776         some "unclean reactor" test errors
3778         * buildbot/test/test_changes.py (Sender.tearDown): spin the
3779         reactor once after shutdown, something in certain versions of
3780         Twisted trigger a test failure. 1.3.0 is ok, 2.0.0 fails, 2.0.1pre
3781         fails, svn-trunk is ok.
3783         * buildbot/test/test_slavecommand.py (Shell.testShellZ): add a
3784         second win32 error message
3786         * buildbot/test/test_run.py (Status.testSlave): be smarter about
3787         validating the ETA, so the tests don't fail on slow systems
3789 2005-05-15  Brian Warner  <warner@lothar.com>
3791         * buildbot/status/builder.py (HTMLLogFile): make this behave like
3792         the new LogFile class, so upgrading works properly
3793         (LogFileProducer.resumeProducing): survive resumeProducing after
3794         we've exhausted the chunkGenerator
3796         * buildbot/test/test_web.py (WebTest.test_logfile): validate HTML
3797         logs too
3798         * buildbot/test/test_status.py (Log.testAdd): validate hasContents
3799         (Log.testUpgrade): same
3801         * docs/buildbot.texinfo (Maintenance): describe how to delete old
3802         Builds and logs with a cron job.
3804         * buildbot/status/builder.py (LogFile): revamp LogFiles. Got rid
3805         of the old non-offline LogFile, added code to upgrade these to
3806         new-style contents-live-on-disk instances at load time (in a way
3807         that doesn't invalidate the old Build pickles, so upgrading to
3808         0.6.5 is not a one-way operation). Got rid of everything related
3809         to 'stub' builds.
3810         (LogFile.__init__): create LogFiles with the parent step status,
3811         the log's name, and a builder-relative filename where it can keep
3812         the contents on disk.
3813         (LogFile.hasContents): new method, clients are advised to call it
3814         before getText or getChunks and friends. If it returns False, the
3815         log's contents have been deleted and getText() will raise an
3816         error.
3817         (LogFile.getChunks): made it a generator
3818         (LogFile.subscribeConsumer): new method, takes a Twisted-style
3819         Consumer (except one that takes chunks instead of strings). This
3820         enables streaming of very large logfiles without storing the whole
3821         thing in memory.
3822         (BuildStatus.generateLogfileName): create names like
3823         12-log-compile-output, with a _0 suffix if required to be unique
3824         (BuildStatus.upgradeLogfiles): transform any old-style (from 0.6.4
3825         or earlier) logfiles into new-style ones
3826         (BuilderStatus): remove everything related to 'stub' builds. There
3827         is now only one build cache, and we don't strip logs from old
3828         builds anymore.
3829         (BuilderStatus.getBuildByNumber): check self.currentBuild too,
3830         since we no longer fight to keep it in the cache
3832         * buildbot/status/html.py (TextLog.render_GET): use a
3833         ChunkConsumer to stream the log entries efficiently.
3834         (ChunkConsumer): wrapper which consumes chunks and writes
3835         formatted HTML.
3837         * buildbot/test/test_twisted.py (Parse.testParse): use a
3838         LogFile-like object instead of a real one
3840         * buildbot/test/test_status.py (MyLog): handle new LogFile code
3841         (Log.testMerge3): validate more merge behavior
3842         (Log.testChunks): validate LogFile.getChunks
3843         (Log.testUpgrade): validate old-style LogFile upgrading
3844         (Log.testSubscribe): validate LogFile.subscribe
3845         (Log.testConsumer): validate LogFile.subscribeConsumer
3847         * buildbot/interfaces.py (IStatusLogStub): remove
3848         (IStatusLog.subscribeConsumer): new method
3849         (IStatusLog.hasContents): new method
3850         (IStatusLogConsumer): describes things passed to subscribeConsumer
3852         * buildbot/status/html.py (StepBox.getBox): Don't offer an href to
3853         the log contents if it does not have any contents.
3854         (StatusResourceBuildStep.body): same
3855         (StatusResourceBuildStep.getChild): give a 404 for empty logs
3857 2005-05-14  Brian Warner  <warner@lothar.com>
3859         * buildbot/test/test_web.py (WebTest.test_logfile): add 5-second
3860         timeouts to try and make the windows metabuildslave not hang
3862 2005-05-13  Mike Taylor  <bear@code-bear.com>
3864         * buildbot/slave/commands.py (rmdirRecursive): added a check
3865         to ensure the path passed into rmdirRecursive actually exists.
3866         On win32 a non-existant path would generate an exception.
3868 2005-05-13  Brian Warner  <warner@lothar.com>
3870         * buildbot/slave/commands.py (rmdirRecursive): replacement for
3871         shutil.rmtree which behaves correctly on windows in the face of
3872         files that you have to chmod before deleting. Thanks to Bear at
3873         the OSAF for the routine.
3874         (SourceBase.doClobber): use rmdirRecursive
3876 2005-05-12  Brian Warner  <warner@lothar.com>
3878         * buildbot/status/builder.py (OfflineLogFile.getChunks): have this
3879         method generate chunks instead of returning a big list. This
3880         allows the same method to be used for both old LogFile and new
3881         OfflineLogFile.
3882         (OfflineLogFile.getText): use the generator
3883         (OfflineLogFile.subscribe): same
3884         * buildbot/status/html.py (TextLog.resumeProducing): same
3885         * buildbot/interfaces.py (IStatusLog.getChunks): document it
3887         * buildbot/test/test_web.py (WebTest.test_logfile): Add a test to
3888         point out that OfflineLogFile does not currently work with
3889         html.Waterfall . Fixing this is high-priority.
3891         * buildbot/scripts/runner.py (start): add --logfile=twistd.log, since
3892         apparently windows defaults to using stdout
3894         * buildbot/test/test_slavecommand.py (Shell.testShellZ): log a
3895         better message on failure so I can figure out the win32 problem
3897         * buildbot/slave/commands.py (ShellCommand._startCommand): update
3898         log messages to include more useful copies of the command being
3899         run, the argv array, and the child command's environment.
3900         (Git.doVCFull): update cg-close usage, patch from Brandon Philips.
3902 2005-05-11  Brian Warner  <warner@lothar.com>
3904         * setup.py: oops, install debug.glade so 'buildbot debugclient'
3905         will actually work
3906         * Makefile: update the deb-snapshot version
3908         * docs/buildbot.texinfo: move all .xhtml docs into a new
3909         .texinfo-format document, adding a lot of material in the process.
3910         This is starting to look like a real user's manual. Removed all
3911         the Lore-related files: *.xhtml, *.css, template.tpl .
3912         * docs/Makefile: simple makefile to run 'makeinfo'
3913         * buildbot/scripts/sample.cfg: rearrange slightly
3914         * MANIFEST.in: include .info and .textinfo, don't include *.xhtml
3916 2005-05-10  Brian Warner  <warner@lothar.com>
3918         * buildbot/scripts/runner.py (start): Twisted-1.3.0 used a
3919         different name for the internal twistw module, handle it.
3921         * MANIFEST.in: we deleted plugins.tml, so stop shipping it
3922         * setup.py: .. and stop trying to install it
3924         * buildbot/process/step.py (Git): added support for 'cogito' (aka
3925         'git'), the new linux kernel VC system (http://kernel.org/git/).
3926         Thanks to Brandon Philips for the patch.
3927         * buildbot/slave/commands.py (Git): same
3929 2005-05-06  Brian Warner  <warner@lothar.com>
3931         * buildbot/status/builder.py (OfflineLogFile): replace the default
3932         LogFile with a form that appends its new contents to a disk file
3933         as they arrive. The complete log data is never kept in RAM. This
3934         is the first step towards handling very large (100MB+) logfiles
3935         without choking quite so badly. (The other half is
3936         producer/consumer on the HTML pages).
3937         (BuildStepStatus.addLog): use OfflineLogFile by default
3938         (BuildStatus.getLogfileName): helper code to give the
3939         OfflineLogFile a filename to work with
3941         * buildbot/test/test_status.py (Results.testAddResults): update
3942         tests to handle new asserts
3943         * buildbot/test/test_vc.py (Patch.doPatch): same
3944         * buildbot/test/test_steps.py (BuildStep.setUp): same
3946 2005-05-05  Brian Warner  <warner@lothar.com>
3948         * buildbot/scripts/runner.py (start): if there is no Makefile,
3949         launch the app by importing twistd's internals and calling run(),
3950         rather than spawning a new twistd process. This stands a much
3951         better chance of working under windows.
3952         (stop): kill the process with os.kill instead of spawning
3953         /bin/kill, again to reduce the number of external programs which
3954         windows might not have in the PATH. Also wait up to 5 seconds for
3955         the process to go away, allowing things like 'buildbot stop;
3956         buildbot start' to be reliable in the face of slow shutdowns.
3958         * buildbot/master.py (Dispatcher.__getstate__): remove old
3959         .tap-related methods
3960         (BuildMaster.__getstate__): same
3961         (makeService): same
3962         * buildbot/slave/bot.py (makeService): same
3963         (Options.longdesc): same
3964         * buildbot/scripts/runner.py: copy over some old mktap option text
3966         * buildbot/scripts/runner.py (masterTAC): stop using mktap.
3967         'buildbot master' now creates a buildbot.tac file, so there is no
3968         longer a create-instance/save/reload sequence. mktap is dead, long
3969         live twistd -y.
3970         * buildbot/scripts/sample.mk: use twistd -y, not -f
3971         * buildbot/test/test_config.py: remove mktap-based test
3972         * buildbot/bb_tap.py, buildbot/plugins.tml: delete old files
3973         * README: don't reference mktap
3975         * docs/source.xhtml: document some of the attributes that Changes
3976         might have
3978         * docs/steps.xhtml (Bazaar): document the Bazaar checkout step
3980         * general: merge in Change(tag=) patch from Thomas Vander Stichele.
3981         [org.apestaart@thomas--buildbot/buildbot--cvstag--0-dev--patch-2]
3982         * buildbot/changes/changes.py (Change)
3983         * buildbot/changes/mail.py (parseSyncmail)
3984         * buildbot/test/test_mailparse.py (Test3.getNoPrefix)
3985         (Test3.testMsgS5)
3986         * buildbot/process/base.py (Build.isTagImportant)
3987         (Build.addChange)
3990 2005-05-04  Brian Warner  <warner@lothar.com>
3992         * buildbot/clients/sendchange.py (Sender.send): tear down the PB
3993         connection after sending the change, so that unit tests don't
3994         complain about sockets being left around
3996         * buildbot/status/html.py (WaterfallStatusResource.body): fix
3997         exception in phase=0 rendering
3998         * buildbot/test/test_web.py (WebTest.test_waterfall): test it
4000         * buildbot/changes/dnotify.py (DNotify.__init__): remove debug msg
4002         * buildbot/master.py (BuildMaster.loadConfig): finally remove
4003         deprecated config keys: webPortnum, webPathname, irc, manholePort,
4004         and configuring builders with tuples.
4005         * buildbot/test/test_config.py: stop testing compatibility with
4006         deprecated config keys
4007         * buildbot/test/test_run.py: same
4009 2005-05-03  Brian Warner  <warner@lothar.com>
4011         * contrib/arch_buildbot.py: survive if there are no logfiles
4012         (username): just use a string, os.getlogin isn't reliable
4014         * buildbot/scripts/runner.py (sendchange): oops, fix the command
4015         so 'buildbot sendchange' actually works. The earlier test only
4016         covered the internal (non-reactor-running) form.
4018         * contrib/arch_buildbot.py: utility that can run as an Arch hook
4019         script to notify the buildmaster about changes
4021         * buildbot/scripts/runner.py (sendchange): new command to send a
4022         change to a buildbot.changes.pb.PBChangeSource receiver.
4023         * buildbot/test/test_changes.py (Sender): test it
4025         * buildbot/master.py (BuildMaster.startService): mark .readConfig
4026         after any reading of the config file, not just when we do it in
4027         startService. This makes some tests a bit cleaner.
4029         * buildbot/changes/pb.py: add some log messages
4031         * buildbot/process/base.py (Build.startBuild): fix a bug that
4032         caused an exception when the build terminated in the very first
4033         step.
4034         (Build.stepDone): let steps return a status of EXCEPTION. This
4035         terminates the build right away, and sets the build's overall
4036         status to EXCEPTION too.
4037         * buildbot/process/step.py (BuildStep.failed): return a status of
4038         EXCEPTION when that is what has happened.
4040         * buildbot/process/step.py (Arch.computeSourceRevision): finally
4041         implement this, allowing Arch-based projects to get precise
4042         checkouts instead of always using the latest code
4043         (Bazaar): create variant of Arch to let folks use baz instead of
4044         tla. Requires a new buildslave too.
4045         * buildbot/slave/commands.py (Arch): add 'revision' argument
4046         (Bazaar): create variant of Arch that uses baz instead of tla.
4047         Remove the code that extracts the archive name from the
4048         register-archive output, since baz doesn't provide it, and require
4049         the user provide both the archive name and its location.
4050         * buildbot/test/test_vc.py (VC.testBazaar): added tests
4052 2005-05-02  Brian Warner  <warner@lothar.com>
4054         * buildbot/scripts/sample.cfg: improve docs for c['buildbotURL'],
4055         thanks to Nick Trout.
4057         * buildbot/scripts/runner.py (Maker.makefile): chmod before edit,
4058         deals better with source Makefile coming from a read-only CVS
4059         checkout. Thanks to Nick Trout for the catch.
4061         * buildbot/__init__.py (version): bump to 0.6.4+ while between
4062         releases
4064 2005-04-28  Brian Warner  <warner@lothar.com>
4066         * buildbot/__init__.py (version): Releasing buildbot-0.6.4
4068         * debian/changelog: update for 0.6.4
4070 2005-04-28  Brian Warner  <warner@lothar.com>
4072         * README.w32: add a checklist of steps for getting buildbot
4073         running on windows.
4074         * MANIFEST.in: include it in the tarball
4076         * NEWS: update
4078         * buildbot/master.py (BuildMaster.upgradeToVersion3): deal with
4079         broken .tap files from 0.6.3 by getting rid of .services,
4080         .namedServices, and .change_svc at load time.
4082 2005-04-27  Brian Warner  <warner@lothar.com>
4084         * NEWS: update in preparation for new release
4086         * buildbot/test/test_config.py (Save.testSave): don't pull in
4087         twisted.scripts.twistd, we don't need it and it isn't for windows
4088         anyway.
4090         * buildbot/changes/changes.py (ChangeMaster.saveYourself):
4091         accomodate win32 which can't do atomic-rename
4093 2005-04-27  Brian Warner  <warner@lothar.com>
4095         * buildbot/test/test_run.py (Disconnect.testBuild2): crank up some
4096         timeouts to help the slow metabuildbot not flunk them so much
4097         (Disconnect.testBuild3): same
4098         (Disconnect.testBuild4): same
4099         (Disconnect.testInterrupt): same
4101         * buildbot/master.py (BuildMaster.loadChanges): fix change_svc
4102         setup, it was completely broken for new buildmasters (those which
4103         did not have a 'change.pck' already saved. Thanks to Paul Warren
4104         for catching this (embarrassing!) bug.
4105         (Dispatcher.__getstate__): don't save our registered avatar
4106         factories, since they'll be re-populated when the config file is
4107         re-read.
4108         (BuildMaster.__init__): add a dummy ChangeMaster, used only by
4109         tests (since the real mktap-generated BuildMaster doesn't save
4110         this attribute).
4111         (BuildMaster.__getstate__): don't save any service children,
4112         they'll all be re-populated when the config file is re-read.
4113         * buildbot/test/test_config.py (Save.testSave): test for this
4115 2005-04-26  Brian Warner  <warner@lothar.com>
4117         * buildbot/buildbot.png: use a new, smaller (16x16) icon image,
4118         rendered with Blender.. looks a bit nicer.
4119         * buildbot/docs/images/icon.blend: add the Blender file for it
4121         * buildbot/slave/commands.py (ShellCommand._startCommand): prepend
4122         'cmd.exe' (or rather os.environ['COMSPEC']) to the argv list when
4123         running under windows. This appears to be the best way to allow
4124         BuildSteps to do something normal like 'trial -v buildbot.test' or
4125         'make foo' and still expect it to work. The idea is to make the
4126         BuildSteps look as much like what a developer would type when
4127         compiling or testing the tree by hand. This approach probably has
4128         problems when there are spaces in the arguments, so if you've got
4129         windows buildslaves, you'll need to pay close attention to your
4130         commands.
4132         * buildbot/status/html.py (WaterfallStatusResource.body): add the
4133         timezone to the timestamp column.
4134         * buildbot/test/test_web.py (WebTest.test_waterfall): test it
4136         * buildbot/scripts/runner.py (loadOptions): do something sane for
4137         windows, I think. We use %APPDATA%/buildbot instead of
4138         ~/.buildbot, but we still search everywhere from the current
4139         directory up to the root for a .buildbot/ subdir. The "is it under
4140         $HOME" security test was replaced with "is it owned by the current
4141         user", which is only performed under posix.
4142         * buildbot/test/test_runner.py (Options.testFindOptions): update
4143         tests to match. The "is it owned by the current user" check is
4144         untested. The test has been re-enabled for windows.
4146         * buildbot/test/test_slavecommand.py (Shell.checkOutput): replace
4147         any "\n" in the expected output with the platform-specific line
4148         separator. Make this separator "\r\n" on PTYs under unix, they
4149         seem to do that and I don't know why
4151         * buildbot/test/test_runner.py (Options.optionsFile): disable on
4152         windows for now, I don't know what ~/.buildbot/ should mean there.
4154         * buildbot/test/test_run.py (BuilderNames.testGetBuilderNames):
4155         win32 compatibility, don't use "/tmp"
4156         (Basedir.testChangeBuilddir): remove more unixisms
4158 2005-04-26  Brian Warner  <warner@lothar.com>
4160         * buildbot/test/test_control.py (Force.rmtree): python2.2
4161         compatibility, apparently its shutil.rmtree ignore_errors=
4162         argument is ignored.
4163         * buildbot/test/test_run.py (Run.rmtree): same
4164         (RunMixin.setUp): same
4166         * buildbot/test/test_runner.py (make): python2.2 has os.sep but
4167         not os.path.sep
4169         * buildbot/test/test_twisted.py (Parse.failUnlessIn): 2.2 has no
4170         'substring in string' operator, must use string.find(substr)!=-1
4171         * buildbot/test/test_vc.py (Patch.failUnlessIn): same
4172         * buildbot/test/test_web.py (WebTest.failUnlessIn): same
4174         * buildbot/scripts/runner.py (loadOptions): add code to search for
4175         ~/.buildbot/, a directory with things like 'options', containing
4176         defaults for various 'buildbot' subcommands. .buildbot/ can be in
4177         the current directory, your $HOME directory, or anywhere
4178         inbetween, as long as you're somewhere inside your home directory.
4179         (debugclient): look in ~/.buildbot/options for master and passwd
4180         (statuslog): look in ~/.buildbot/options for 'masterstatus'
4181         * buildbot/test/test_runner.py (Options.testFindOptions): test it
4183         * buildbot/status/client.py (makeRemote): new approach to making
4184         IRemote(None) be None, which works under Twisted-2.0
4185         * buildbot/test/test_status.py (Client.testAdaptation): test it
4187         * buildbot/status/builder.py (Status.builderAdded): when loading a
4188         pickled BuilderStatus in from disk, set its name after loading.
4189         The config file might have changed its name (but not its
4190         directory) while it wasn't looking.
4191         
4192         * buildbot/process/builder.py (Builder.attached): always return a
4193         Deferred, even if the builder was already attached
4194         * buildbot/test/test_run.py (Basedir.testChangeBuilddir): test it
4196 2005-04-25  Brian Warner  <warner@lothar.com>
4198         * buildbot/status/words.py (IrcStatusBot.buildFinished): fix a
4199         category-related exception when announcing a build has finished
4201         * buildbot/status/html.py (StatusResourceChanges.body): oops, don't
4202         reference no-longer-existent changemaster.sources
4203         * buildbot/test/test_web.py (WebTest.test_waterfall): test for it
4205         * buildbot/__init__.py (version): bump to 0.6.3+ while between
4206         releases
4208 2005-04-25  Brian Warner  <warner@lothar.com>
4210         * buildbot/__init__.py (version): Releasing buildbot-0.6.3
4212         * debian/changelog: update for 0.6.3
4214 2005-04-25  Brian Warner  <warner@lothar.com>
4216         * MANIFEST.in: make sure debug.glade is in the tarball
4218         * README (REQUIREMENTS): list necessary Twisted-2.0 packages
4220         * NEWS: update for the imminent 0.6.3 release
4222         * buildbot/status/html.py (HtmlResource.content): make the
4223         stylesheet <link> always point at "buildbot.css".
4224         (StatusResource.getChild): map "buildbot.css" to a static.File
4225         containing whatever css= argument was provided to Waterfall()
4226         (Waterfall): provide the "classic" css as the default.
4227         * docs/waterfall.classic.css: move default CSS from here ..
4228         * buildbot/status/classic.css: .. to here
4230         * MANIFEST.in: make sure classic.css is included in the tarball
4231         * setup.py: and that it is installed too, under buildbot/status/
4233         * buildbot/master.py (BuildMaster): oops, set .change_svc=None at
4234         the module level, because buildbot.tap files from 0.6.2 don't have
4235         it in their attribute dictionary.
4237         * buildbot/slave/bot.py (Bot.startService): make sure the basedir
4238         really exists at startup, might save some confusion somewhere.
4240 2005-04-24  Thomas Vander Stichele  <thomas at apestaart dot org>
4242         * docs/waterfall.classic.css:
4243           add a stylesheet that's almost the same as the "classic"
4244           buildbot style
4246         * buildbot/status/builder.py:
4247           add EXCEPTION as a result - this is a problem for the bot
4248           maintainer, not a build problem for the changers
4249         * buildbot/process/step.py:
4250           use EXCEPTION instead of FAILURE for exceptions
4251         * buildbot/status/html.py:
4252           add build_get_class to get a class out of a build/buildstep
4253           finish naming the classes
4254           split out sourceNames to changeNames and builderNames so we
4255           can style them separately
4256         * docs/config.xhtml:
4257           finish documenting classes as they are right now
4259         * buildbot/status/html.py:
4260           name the classes as we agreed on IRC
4261         * docs/config.xhtml:
4262           and document them
4264         * buildbot/status/html.py:
4265           same for cssclass->class_
4267         * buildbot/status/html.py:
4268           as decided on IRC, use class_ for the "class" attribute to not
4269           conflict with the class keyword, and clean up the messy **{} stuff.
4271         * buildbot/status/mail.py:
4272           put back "builders" argument, and fix docstring, because the
4273           code *ignores* builders listed in this argument
4275         * buildbot/process/builder.py:
4276           remove FIXME notes - category is now indeed a cvar of BuilderStatus
4278         * docs/config.xhtml:
4279           describe the category argument for builders
4281         * buildbot/status/builder.py:
4282           Fix a silly bug due to merging
4284         * buildbot/process/builder.py:
4285           remove category from the process Builder ...
4286         * buildbot/status/builder.py:
4287           ... and add it to BuilderStatus instead.
4288           Set category on unpickled builder statuses, they might not have it.
4289         * buildbot/master.py:
4290           include category when doing builderAdded
4291         * buildbot/status/mail.py:
4292           return None instead of self for builders we are not interested in.
4293         * buildbot/test/test_run.py:
4294           fix a bug due to only doing deferredResult on "dummy" waiting
4295         * buildbot/test/test_status.py:
4296           add checks for the Mail IStatusReceiver returning None or self
4298         * buildbot/status/html.py:
4299           fix testsuite by prefixing page title with BuildBot
4301         * buildbot/status/builder.py:
4302           have .category in builder status ...
4303         * buildbot/process/builder.py:
4304           ... and set it from Builder
4305         * buildbot/status/html.py:
4306           make .css a class variable 
4307         * buildbot/test/test_status.py:
4308           write more tests to cover our categories stuff ...
4309         * buildbot/status/mail.py:
4310           ... and fix the bug that this uncovered
4312         * buildbot/changes/mail.py:
4313         * buildbot/changes/pb.py:
4314         * buildbot/master.py:
4315         * buildbot/process/base.py:
4316         * buildbot/process/factory.py:
4317         * buildbot/process/interlock.py:
4318         * buildbot/process/step.py:
4319         * buildbot/process/step_twisted.py:
4320         * buildbot/slave/commands.py:
4321         * buildbot/status/builder.py:
4322         * buildbot/status/client.py:
4323         * buildbot/status/html.py:
4324         * buildbot/status/mail.py:
4325         * buildbot/status/progress.py:
4326         * buildbot/test/test_changes.py:
4327         * buildbot/test/test_config.py:
4328         * buildbot/test/test_control.py:
4329         * buildbot/test/test_interlock.py:
4330         * buildbot/test/test_maildir.py:
4331         * buildbot/test/test_mailparse.py:
4332         * buildbot/test/test_run.py:
4333         * buildbot/test/test_slavecommand.py:
4334         * buildbot/test/test_status.py:
4335         * buildbot/test/test_steps.py:
4336         * buildbot/test/test_twisted.py:
4337         * buildbot/test/test_util.py:
4338         * buildbot/test/test_vc.py:
4339         * buildbot/test/test_web.py:
4340         * buildbot/util.py:
4341           add test-case-name at the top of a whole set of files
4343         * buildbot/status/builder.py:
4344           keep order of addition when getting builder names
4345         * buildbot/status/words.py:
4346         * buildbot/test/test_run.py:
4347           add test for getBuilderNames
4349         * buildbot/process/base.py:
4350         * buildbot/process/step.py:
4351         * buildbot/status/builder.py:
4352         * buildbot/status/html.py:
4353           make buildbot css-able
4354           replace the color code for purple with purple, don't understand
4355           why it wasn't purple to start with
4357         * buildbot/status/words.py:
4358           ok, so it doesn't look like BuilderStatus.remote is still valid.
4359           Use what waterfall uses instead.
4361         * buildbot/interfaces.py:
4362         * buildbot/status/builder.py:
4363         * buildbot/status/html.py:
4364         * buildbot/status/mail.py:
4365         * buildbot/status/words.py:
4366         * buildbot/test/test_run.py:
4367           use categories everywhere and make it be a list.  More sensible
4368           for the future.  Also make words actually respect this in
4369           buildFinished.
4371         * buildbot/interfaces.py:
4372           add category argument to getBuilderNames
4373         * buildbot/process/builder.py:
4374         * buildbot/status/builder.py:
4375         * buildbot/status/html.py:
4376         * buildbot/status/mail.py:
4377         * buildbot/status/words.py:
4378         * buildbot/test/test_run.py:
4379           move from specifying builders by name to specifying the category
4381         * buildbot/status/html.py:
4382         * buildbot/status/words.py:
4383           add "builders=" to __init__ of status clients so they can
4384           limit themselves to the given list of builders to report on
4386         * buildbot/status/html.py: set the title to the product name
4388 2005-04-23  Thomas Vander Stichele  <thomas at apestaart dot org>
4390         * buildbot/interfaces.py:
4391         * buildbot/status/builder.py:
4392           more documentation.  Hm, not sure if ChangeLog entries make sense
4393           here...
4395 2005-04-23  Brian Warner  <warner@lothar.com>
4397         * buildbot/test/test_vc.py (SetupMixin.do_vc): increase timeouts
4399         * buildbot/test/test_slavecommand.py (Shell): increase timeouts
4401         * buildbot/scripts/runner.py: make 'statuslog' and 'statusgui' be
4402         the sub-commands that log buildmaster status to stdout and to a
4403         GUI window, respectively.
4405         * buildbot/clients/gtkPanes.py: overhaul. basic two-row
4406         functionality is working again, but all the step-status and ETA
4407         stuff is missing. Commented out a lot of code pending more
4408         overhaul work.
4410         * buildbot/status/client.py: make sure that IRemote(None) is None
4412         * buildbot/changes/changes.py: import defer, oops
4413         (ChangeMaster): remove the .sources list, rely upon the fact that
4414         MultiServices can be treated as sequences of their children. This
4415         cleans up the add/remove ChangeSource routines a lot, as we keep
4416         exactly one list of the current sources instead of three.
4418         * buildbot/master.py (BuildMaster.__init__): remove .sources, set
4419         up an empty ChangeMaster at init time.
4420         (BuildMaster.loadChanges): if there are changes to be had from
4421         disk, replace self.change_svc with the new ones. If not, keep
4422         using the empty ChangeMaster set up in __init__.
4423         (BuildMaster.loadConfig_Sources): use list(self.change_svc)
4424         instead of a separate list, makes the code a bit cleaner.
4425         * buildbot/test/test_config.py (ConfigTest.testSimple): match it
4426         (ConfigTest.testSources): same, also wait for loadConfig to finish.
4427         Extend the test to make sure we can get rid of the sources when
4428         we're done.
4430 2005-04-22  Brian Warner  <warner@lothar.com>
4432         * buildbot/scripts/runner.py (Maker.mkinfo): create the info/admin
4433         and info/host files when making the slave directory
4435         * buildbot/test/test_run.py (RunMixin.shutdownSlave): remove the
4436         whendone= argument, just return the Deferred and let the caller do
4437         what they want with it.
4438         (Disconnect.testBuild1): wait for shutdownSlave
4439         (Basedir.testChangeBuilddir): new test to make sure changes to the
4440         builddir actually get propagated to the slave
4442         * buildbot/slave/bot.py (SlaveBuilder.setBuilddir): use an
4443         explicit method, rather than passing the builddir in __init__ .
4444         Make sure to update self.basedir too, this was broken before.
4445         (Bot.remote_setBuilderList): use b.setBuilddir for both new
4446         builders and for ones that have just had their builddir changed.
4447         (BotFactory): add a class-level .perspective attribute, so
4448         BuildSlave.waitUntilDisconnected won't get upset when the
4449         connection hasn't yet been established
4450         (BuildSlave.__init__): keep track of the bot.Bot instance, so
4451         tests can reach through it to inspect the SlaveBuilders
4453         * buildbot/process/base.py (Build.buildException): explain the
4454         log.err with a log.msg
4455         * buildbot/process/builder.py (Builder.startBuild): same
4456         (Builder._startBuildFailed): improve error message
4458         * buildbot/pbutil.py (RBCP.failedToGetPerspective): if the failure
4459         occurred because we lost the brand-new connection, retry instead
4460         of giving up. If not, it's probably an authorization failure, and
4461         it makes sense to stop trying. Make sure we log.msg the reason
4462         that we're log.err'ing the failure, otherwise test failures are
4463         really hard to figure out.
4465         * buildbot/master.py: change loadConfig() to return a Deferred
4466         that doesn't fire until the change has been fully implemented.
4467         This means any connected slaves have been updated with the new
4468         builddir. This change makes it easier to test the code which
4469         actually implements this builddir-updating.
4470         (BotPerspective.addBuilder): return Deferred
4471         (BotPerspective.removeBuilder): same
4472         (BotPerspective.attached): same
4473         (BotPerspective._attached): same. finish with remote_print before
4474         starting the getSlaveInfo, instead of doing them in parallel
4475         (BotPerspective.list_done): same
4476         (BotMaster.removeSlave): same. Fix the typo that meant we weren't
4477         actually calling slave.disconnect()
4478         (BotMaster.addBuilder): same
4479         (BotMaster.removeBuilder): same
4480         (BuildMaster.loadConfig): same
4481         (BuildMaster.loadConfig_Slaves): same
4482         (BuildMaster.loadConfig_Sources): same
4483         (BuildMaster.loadConfig_Builders): same
4484         (BuildMaster.loadConfig_status): same
4486         * buildbot/changes/changes.py (ChangeMaster.removeSource): return
4487         a Deferred that fires when the source is finally removed
4489         * buildbot/slave/commands.py (SourceBase.doClobber): when removing
4490         the previous tree on win32, where we have to do it synchronously,
4491         make sure we return a Deferred anyway.
4492         (SourceBase.doCopy): same
4494         * buildbot/scripts/runner.py (statusgui): use the text client for
4495         now, while I rewrite the Gtk one
4496         * buildbot/clients/base.py: strip out old code, leaving just the
4497         basic print-message-on-event functionality. I also remove the
4498         ReconnectingPBClientFactory, but it does at least quit when it
4499         loses the connection instead of going silent
4501 2005-04-21  Brian Warner  <warner@lothar.com>
4503         * Makefile: minor tweaks
4505         * NEWS: point out deprecation warnings, new features for
4506         /usr/bin/buildbot
4508         * buildbot/master.py (BuildMaster.loadConfig): emit
4509         DeprecationWarnings for Builders defined with tuples. Rearrange
4510         code to facility removal of deprecated configuration keys in the
4511         next release.
4513         * buildbot/scripts/runner.py (createMaster,createSlave): rewrite
4514         'buildbot' command to put a little Makefile in the target that
4515         helps you re-create the buildbot.tap file, start or stop the
4516         master/slave, and reconfigure (i.e. SIGHUP) the master. Also chmod
4517         all the files 0600, since they contain passwords.
4518         (start): if there is a Makefile, and /usr/bin/make exists, use
4519         'make start' in preference to a raw twistd command. This lets
4520         slave admins put things like PYTHONPATH variables in their
4521         Makefiles and have them still work when the slave is started with
4522         'buildbot start ~/slave/foo'. The test is a bit clunky, it would
4523         be nice to first try the 'make' command and only fall back to
4524         twistd if it fails. TODO: the Makefile's "start" command does not
4525         add the --reactor=win32 argument when running under windows.
4526         (Options.debugclient, Options.statusgui): add sub-commands to launch
4527         the debug client (formerly in contrib/debugclient.py) and the
4528         Gtk status application (currently broken)
4529         * buildbot/clients/debug.py: move from contrib/debugclient.py
4530         * buildbot/clients/debug.glade: same
4532         * buildbot/test/test_trial.py: remove it. This requires some
4533         functionality out of Twisted that isn't there yet, and until then
4534         having it around just confuses things.
4536         * buildbot/test/test_slavecommand.py (Shell): test both with and
4537         without PTYs, and make sure that command output is properly
4538         interleaved in the with-PTY case. I think the without-PTY test
4539         should pass on windows, where we never use PTYs anyway.
4541 2005-04-20  Brian Warner  <warner@lothar.com>
4543         * README (REQUIREMENTS): mention Twisted-2.0.0 compatibility
4545         * MANIFEST.in: add epyrun, gen-reference, buildbot.png
4547         * NEWS: start creating entries for the next release
4549         * buildbot/slave/commands.py (ShellCommand.__init__): use os.pathsep
4551         * buildbot/test/test_web.py (WebTest.test_webPortnum): add timeout
4552         (WebTest.test_webPathname): same
4553         (WebTest.test_webPathname_port): same
4554         (WebTest.test_waterfall): use the default favicon rather than
4555         rooting around the filesystem for it. Open the expected-icon file
4556         in binary mode, to make win32 tests happier (thanks to Nick Trout
4557         for the catch)
4558         * buildbot/status/html.py (buildbot_icon): win32 portability
4560         * buildbot/test/test_slavecommand.py (SlaveCommandTestCase.testShellZ):
4561         win32-compatibility fixes from Nick Trout, the "file not found" message
4562         is different under windows
4563         (FakeSlaveBuilder.__init__): clean up setup a bit
4564         * buildbot/test/test_vc.py (VCSupport.__init__): win32: use os.pathsep
4566 2005-04-19  Brian Warner  <warner@lothar.com>
4568         * buildbot/test/test_vc.py (SetupMixin.setUpClass): fix the
4569         skip-if-repositories-are-unavailable test to not kill the trial
4570         that comes with Twisted-1.3.0
4572         * setup.py: install buildbot.png icon file when installing code
4574         * buildbot/slave/commands.py (ShellCommand._startCommand): log the
4575         environment used by the command, at least on the child side.
4577         * buildbot/status/html.py (TextLog.pauseProducing): add a note,
4578         this method needs to be added and implemented because it gets
4579         called under heavy load. I don't quite understand the
4580         producer/consumer API enough to write it.
4581         (StatusResource.getChild): add a resource for /favicon.ico
4582         (Waterfall.__init__): add favicon= argument
4583         * buildbot/test/test_web.py (WebTest.test_waterfall): test it
4584         (WebTest.test_webPortnum): stop using deprecated 'webPortnum'
4585         (WebTest.test_webPathname): same
4586         (WebTest.test_webPathname_port): same
4587         * docs/config.xhtml: mention favicon=
4588         * buildbot/buildbot.png: add a default icon, dorky as it is
4590 2005-04-18  Thomas Vander Stichele  <thomas at apestaart dot org>
4592         * buildbot/master.py:
4593         * buildbot/process/base.py:
4594         * buildbot/process/builder.py:
4595         * buildbot/process/interlock.py:
4596         * buildbot/status/builder.py:
4597         * buildbot/status/html.py:
4598         * buildbot/status/mail.py:
4599         * buildbot/status/words.py:
4600           new documentation while digging through the code
4602 2005-04-17  Brian Warner  <warner@lothar.com>
4604         * general: try to fix file modes on all .py files: a+r, a-x,
4605         but let buildbot/clients/*.py be +x since they're tools
4607         * docs/epyrun (addMod): when an import fails, say why
4609         * Makefile: Add a 'docs' target, hack on the PYTHONPATH stuff
4611 2005-04-17  Thomas Vander Stichele  <thomas at apestaart dot org>
4613         * buildbot/process/base.py:
4614         * buildbot/process/builder.py:
4615         * buildbot/status/builder.py:
4616           new documentation while digging through the code
4618 2005-04-17  Thomas Vander Stichele  <thomas at apestaart dot org>
4620         * buildbot/changes/changes.py:
4621         * buildbot/changes/p4poller.py:
4622         * buildbot/interfaces.py:
4623         * buildbot/process/base.py:
4624         * buildbot/process/builder.py:
4625         * buildbot/process/step.py:
4626         * buildbot/process/step_twisted.py:
4627         * buildbot/slave/bot.py:
4628         * buildbot/slave/commands.py:
4629         * buildbot/status/builder.py:
4630           fix all docstrings to make epydoc happy.  In the process of fixing
4631           some, I also moved pieces of docs, and removed some deprecated
4632           documentation
4634 2005-04-17  Thomas Vander Stichele  <thomas at apestaart dot org>
4636         * buildbot/process/builder.py:
4637         * buildbot/process/interlock.py:
4638         * buildbot/process/process_twisted.py:
4639         * buildbot/process/step.py:
4640           BuildProcess -> Build, as it looks like that's what happened
4641         * buildbot/process/base.py:
4642         * buildbot/process/factory.py:
4643           update epydoc stuff
4645 2005-04-17  Brian Warner  <warner@lothar.com>
4647         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
4648         update compile command to accomodate the Twisted split.. now
4649         instead of './setup.py build_ext -i', you do './setup.py all
4650         build_ext -i', to run build_ext over all sub-projects.
4651         (FullTwistedBuildFactory): same
4652         (TwistedReactorsBuildFactory): same
4654         * buildbot/status/html.py (TextLog.finished): null out self.req
4655         when we're done, otherwise the reference cycle of TextLog to .req
4656         to .notifications to a Deferred to TextLog.stop keeps them from
4657         being collected, and consumes a huge (610MB on pyramid at last
4658         check) amount of memory.
4660 2005-04-11  Brian Warner  <warner@lothar.com>
4662         * buildbot/test/test_vc.py (VCSupport.__init__): use abspath() to
4663         normalize the VC-repository location.. makes SVN happier with
4664         certain test environments.
4666         * buildbot/process/step.py (RemoteShellCommand.__init__): let each
4667         RemoteShellCommand gets its own .env dictionary, so that code in
4668         start() doesn't mutate the original. I think this should fix the
4669         step_twisted.Trial problem where multiple identical components
4670         kept getting added to PYTHONPATH= over and over again.
4672         * general: merge org.apestaart@thomas/buildbot--doc--0--patch-3,
4673         adding epydoc-format docstrings to many classes. Thanks to Thomas
4674         Vander Stichele for the patches.
4675         * docs/epyrun, docs/gen-reference: add epydoc-generating tools
4676         * buildbot/status/mail.py, buildbot/process/step_twisted.py: same
4677         * buildbot/slave/bot.py, commands.py, registry.py: same
4679 2005-04-05  Brian Warner  <warner@lothar.com>
4681         * buildbot/slave/commands.py (SourceBase.doCopy): use cp -p to
4682         preserve timestamps, helps incremental builds of large trees.
4683         Patch from Rene Rivera.
4685         * buildbot/slave/bot.py (SlaveBuilder.commandComplete): oops, log
4686         'failure' and not the non-existent 'why'. Thanks to Rene Rivera
4687         for the catch.
4689 2005-04-03  Brian Warner  <warner@lothar.com>
4691         * buildbot/master.py (BuildMaster.loadConfig): only call exec()
4692         with one dict, apparently exec has some scoping bugs when used
4693         with both global/local dicts. Thanks to Nathaniel Smith for the
4694         catch.
4696 2005-04-02  Brian Warner  <warner@lothar.com>
4698         * buildbot/process/step_twisted.py (countFailedTests): the new
4699         trial in Twisted-2.0 emits a slightly different status line than
4700         old trial ("PASSED.." instead of "OK.."). Handle it so we don't
4701         mistakenly think the test count is unparseable.
4702         (Trial.start): note that for some reason each build causes another
4703         copy of self.testpath to be prepended to PYTHONPATH. This needs to
4704         be fixed but I'm not sure quite where the problem is.
4706 2005-04-01  Brian Warner  <warner@lothar.com>
4708         * buildbot/test/test_run.py (Run.testMaster): change some uses of
4709         deferredResult to avoid hangs/warnings under twisted-2.0
4710         (RunMixin.tearDown): same
4711         (RunMixin.shutdownSlave): same
4712         (Disconnect.testIdle1): same
4713         (Disconnect.testBuild2): same: wait one second after the build
4714         finishes for test to really be done.. this should be cleaned up to
4715         avoid wasting that second. Builder.detach uses a callLater(0),
4716         either that should be done in-line (something else needed that
4717         behavior), or it should return a Deferred that fires when the
4718         builder is really offline.
4719         (Disconnect.testBuild3): same
4720         (Disconnect.testDisappear): same
4722         * buildbot/test/test_web.py: rearrange server-setup and teardown
4723         code to remove unclean-reactor warnings from twisted-2.0
4725         * buildbot/test/test_vc.py: rearrange probe-for-VC-program routine
4726         so the tests don't hang under twisted-2.0
4728 2005-03-31  Brian Warner  <warner@lothar.com>
4730         * buildbot/slave/bot.py (Bot.remote_setBuilderList): fix typo that
4731         caused a warning each time the master changed our set of builders
4733         * buildbot/status/builder.py (BuildStatus.saveYourself): under
4734         w32, don't unlink the file unless it already exists. Thanks to
4735         Baptiste Lepilleur for the catch.
4736         (BuilderStatus.saveYourself): same
4738 2005-02-01  Brian Warner  <warner@lothar.com>
4740         * buildbot/status/html.py (TextLog.getChild): use a /text child
4741         URL, such as http://foo.com/svn-hello/builds/1/test/0/text instead
4742         of http://foo.com/svn-hello/builds/1/test/0 , to retrieve the
4743         logfile as text/plain (no markup, no headers). This replaces the
4744         previous scheme (which used an ?text=1 argument), and gets us back
4745         to a relative link (which works better when the buildbot lives
4746         behind another web server, such as Apache configured as a reverse
4747         proxy). Thanks to Gerald Combs for spotting the problem.
4749         * buildbot/__init__.py (version): bump to 0.6.2+ while between
4750         releases
4752 2004-12-13  Brian Warner  <warner@lothar.com>
4754         * buildbot/__init__.py (version): Releasing buildbot-0.6.2
4756         * debian/changelog: update for 0.6.2
4757         * NEWS: finalize for 0.6.2
4759 2004-12-11  Brian Warner  <warner@lothar.com>
4761         * NEWS: bring it up to date
4763         * buildbot/slave/bot.py (BotFactory): revamp keepalive/lost-master
4764         detection code. Require some sign of life from the buildmaster
4765         every BotFactory.keepaliveInterval seconds. Provoke this
4766         indication at BotFactory.keepaliveTimeout seconds before the
4767         deadline by sending a keepalive request. We don't actually care if
4768         that request is answered in a timely fashion, what we care about
4769         is that .activity() is called before the deadline. .activity() is
4770         triggered by any PB message from the master (including an ack to
4771         one of the slave's status-update messages). With this new scheme,
4772         large status messages over slow pipes are OK, as long as any given
4773         message can be sent (and thus acked) within .keepaliveTimeout
4774         seconds (which defaults to 30).
4775         (SlaveBuilder.remote_startCommand): record activity
4776         (SlaveBuilder.ackUpdate): same
4777         (SlaveBuilder.ackComplete): same
4778         (BotFactory.gotPerspective): same
4779         * buildbot/test/test_run.py (Disconnect.testSlaveTimeout): test it
4781 2004-12-09  Brian Warner  <warner@lothar.com>
4783         * buildbot/status/html.py (StatusResourceBuilder.getChild): remove
4784         debug message
4786         * buildbot/process/step_twisted.py (Trial._commandComplete):
4787         update self.cmd when we start the 'cat test.log' transfer. Without
4788         this, we cannot interrupt the correct RemoteCommand when we lose
4789         the connection.
4791         * buildbot/process/step.py (RemoteCommand.interrupt): don't bother
4792         trying to tell the slave to stop the command if we're already
4793         inactive, or if we no longer have a .remote
4795         * buildbot/process/builder.py (Builder._detached): don't let an
4796         exception in currentBuild.stopBuild() prevent the builder from
4797         being marked offline
4799 2004-12-07  Brian Warner  <warner@lothar.com>
4801         * buildbot/status/words.py (IrcStatusBot.getBuilder): catch the
4802         KeyError that happens when you ask for a non-existent Builder, and
4803         translate it into a UsageError.
4805         * buildbot/test/test_run.py (Disconnect.testBuild4): validate that
4806         losing the slave in the middle of a remote step is handled too
4808         * buildbot/process/step.py (ShellCommand.interrupt): 'reason' can
4809         be a Failure, so be sure to stringify it before using it as the
4810         contents of the 'interrupt' logfile
4811         (RemoteCommand.interrupt): use stringified 'why' in
4812         remote_interruptCommand too, just in case
4814 2004-12-06  Brian Warner  <warner@lothar.com>
4816         * buildbot/slave/commands.py (Arch.doVCUpdate): use 'tla replay'
4817         instead of 'tla update', which is more efficient in case we've
4818         missed a couple of patches since the last update.
4820         * debian/changelog: update for previous (0.6.1) release. Obviously
4821         this needs to be handled better.
4823 2004-12-05  Brian Warner  <warner@lothar.com>
4825         * NEWS: update for stuff since last release
4827         * buildbot/master.py (DebugPerspective.attached): return 'self', to
4828         match the maybeDeferred change in Dispatcher.requestAvatar
4829         * buildbot/changes/pb.py (ChangePerspective.attached): same
4830         * buildbot/status/client.py (StatusClientPerspective.attached): same
4831         * buildbot/process/builder.py (Builder._attached3): same
4832         * buildbot/pbutil.py (NewCredPerspective.attached): same
4834         * buildbot/status/html.py (WaterfallStatusResource.phase2): Add
4835         the date to the top-most box, if it is not the same as today's
4836         date.
4838         * docs/slave.xhtml: provide a buildslave setup checklist
4840         * docs/source.xhtml (Arch): correct terminology
4842 2004-12-04  Brian Warner  <warner@lothar.com>
4844         * buildbot/test/test_slavecommand.py: use sys.executable instead
4845         of hard-coding 'python' for child commands, might help portability
4847         * docs/examples/twisted_master.cfg: update to current usage
4849         * buildbot/status/words.py (IrcStatusBot.command_STOP): add a
4850         'stop build' command to the IRC bot
4852         * buildbot/master.py (Dispatcher.requestAvatar): remove debug
4853         message that broke PBChangeSource
4855         * buildbot/slave/bot.py: clean up shutdown/lose-master code
4856         (SlaveBuilder): make some attributes class-level, remove the old
4857         "update queue" which existed to support resuming a build after the
4858         master connection was lost. Try to reimplement that feature later.
4859         (SlaveBuilder.stopCommand): clear self.command when the
4860         SlaveCommand finishes, so that we don't try to kill a leftover one
4861         at shutdown time.
4862         (SlaveBuilder.commandComplete): same, merge with commandFailed and
4863         .finishCommand
4865         * buildbot/slave/commands.py (SourceBase): set self.command for
4866         all VC commands, so they can be interrupted.
4868 2004-12-03  Brian Warner  <warner@lothar.com>
4870         * buildbot/master.py: clean up slave-handling code, to handle
4871         slave-disconnect and multiple-connect better
4872         (BotPerspective): make these long-lasting, exactly one per bot
4873         listed in the config file.
4874         (BotPerspective.attached): if a slave connects while an existing
4875         one appears to still be connected, disconnect the old one first.
4876         (BotPerspective.disconnect): new method to forcibly disconnect a
4877         buildslave. Use some hacks to empty the transmit buffer quickly to
4878         avoid the long (20-min?) TCP timeout that could occur if the old
4879         slave has dropped off the net.
4880         (BotMaster): Keep persistent BotPerspectives in .slaves, let them
4881         own their own SlaveStatus objects. Remove .attached/.detached, add
4882         .addSlave/.removeSlave, treat slaves like Builders (config file
4883         parsing sends deltas to the BotMaster). Inform the slave
4884         instances, i.e. the BotPerspective, about addBuilder and
4885         removeBuilder.
4886         (BotMaster.getPerspective): turns into a single dict lookup
4887         (Dispatcher.requestAvatar): allow .attached to return a Deferred,
4888         which gives BotPerspective.attached a chance to disconnect the old
4889         slave first.
4890         (BuildMaster.loadConfig): add code (disabled) to validate that all
4891         builders use known slaves (listed in c['bots']). The check won't
4892         work with tuple-specified builders, which are deprecated but not
4893         yet invalid, so the check is disabled for now.
4894         (BuildMaster.loadConfig_Slaves): move slave-config into a separate
4895         routine, do the add/changed/removed dance with them like we do
4896         with builders.
4897         (BuildMaster.loadConfig_Sources): move source-config into a
4898         separate routine too
4900         * buildbot/status/builder.py (Status.getSlave): get the
4901         SlaveStatus object from the BotPerspective, not the BotMaster.
4903         * buildbot/test/test_run.py: bunch of new tests for losing the
4904         buildslave at various points in the build, handling a slave that
4905         connects multiple times, and making sure we can interrupt a
4906         running build
4908         * buildbot/slave/bot.py (BuildSlave): make it possible to use
4909         something other than 'Bot' for the Bot object, to make certain
4910         test cases easier to write.
4911         (BuildSlave.waitUntilDisconnected): utility method for testing
4913 2004-11-30  Brian Warner  <warner@lothar.com>
4915         * buildbot/test/test_run.py (RunMixin): refactor, remove debug msg
4917         * buildbot/interfaces.py (IBuilderControl.ping): add timeout=
4918         argument, return a Deferred that always fires with True or False.
4919         I don't use an errback to indicate 'ping failed' so that callers
4920         are free to ignore the deferred without causing spurious errors in
4921         the logs.
4922         * buildbot/process/builder.py (BuilderControl.ping): implement it
4924         * buildbot/test/test_run.py (Status.testDisappear): test ping
4925         (Status.disappearSlave): fix it
4927 2004-11-30  Brian Warner  <warner@lothar.com>
4929         * buildbot/interfaces.py (IBuildControl): add .stopBuild
4930         (IBuilderControl): add .getBuild(num), only works for the current
4931         build, of course, although it might be interesting to offer
4932         something for builds in the .waiting or .interlocked state.
4934         * buildbot/process/base.py (Build): have .stopBuild just do the
4935         interrupt, then let the build die by itself.
4936         (BuildControl): add .stopBuild, and add a point-event named
4937         'interrupt' just after the build so status viewers can tell that
4938         someone killed it.
4939         (BuilderControl): add .getBuild
4941         * buildbot/process/step.py (Dummy): use haltOnFailure so it really
4942         stops when you kill it, good for testing
4943         (ShellCommand.interrupt): add a logfile named 'interrupt' which
4944         contains the 'reason' text.
4946         * buildbot/status/html.py: Add Stop Build button, if the build can
4947         still be stopped. Send a Redirect (to the top page) one second
4948         later, hopefully long enough for the interrupt to have an effect.
4949         Move make_row() up to top-level to share it between Stop Build and
4950         Force Build.
4952         * buildbot/slave/commands.py: only kill the child process once
4954         * buildbot/test/test_run.py: add testInterrupt
4956 2004-11-29  Brian Warner  <warner@lothar.com>
4958         * buildbot/process/base.py: Refactor command interruption. The
4959         Build is now responsible for noticing that the slave has gone
4960         away: Build.lostRemote() interrupts the current step and makes
4961         sure that no further ones will be started.
4962         
4963         * buildbot/process/builder.py: When the initial remote_startBuild
4964         message fails, log it: this usually indicates that the slave has
4965         gone away, but we don't really start paying attention until they
4966         fail to respond to the first step's command.
4968         * buildbot/process/step.py (RemoteCommand): Does *not* watch for
4969         slave disconnect. Now sports a new interrupt() method. Error
4970         handling was simplified a lot by chaining deferreds, so
4971         remoteFailed/remoteComplete were merged into a single
4972         remoteComplete method (which can now get a Failure object).
4973         Likewise failed/finished were merged into just _finished.
4974         (BuildStep): Add interrupt(why) method, and if why is a
4975         ConnectionLost Failure then the step is failed with some useful
4976         error text.
4978         * buildbot/slave/bot.py: stop the current command when the remote
4979         Step reference is lost, and when the slave is shut down.
4980         (Bot): make it a MultiService, so it can have children. Use
4981         stopService to tell when the slave is shutting down.
4982         (SlaveBuilder): make it a Service, and a child of the Bot. Add
4983         remote_interruptCommand (which asks the current SlaveCommand to
4984         stop but allows it to keep emitting status messages), and
4985         stopCommand (which tells it to shut up and die).
4987         * buildbot/slave/commands.py: make commands interruptible
4988         (ShellCommand.kill): factor out os.kill logic
4989         (Command): factor out setup()
4990         (Command.sendStatus): don't send status if .running is false, this
4991         happens when the command has been halted.
4992         (Command.interrupt): new method, used to tell the command to die
4993         (SlaveShellCommand): implement .interrupt
4994         (DummyCommand): implement .interrupt
4995         (SourceBase, etc): factor out setup(), don't continue substeps if
4996         .interrupted is set
4998         * buildbot/status/builder.py: fix all waitUntilFinished() methods
4999         so they can be called after finishing
5001         * buildbot/test/test_run.py: new tests for disconnect behavior,
5002         refactor slave-shutdown routines, add different kinds of
5003         slave-shutdown
5005 2004-11-27  Brian Warner  <warner@lothar.com>
5007         * buildbot/status/words.py (IrcStatusBot.convertTime): utility
5008         method to express ETA time like "2m45s" instead of "165 seconds"
5010 2004-11-24  Brian Warner  <warner@lothar.com>
5012         * buildbot/test/test_vc.py (VC.testArch): unregister the test
5013         archive after the test completes, to avoid cluttering the user's
5014         'tla archives' listing with a bogus entry. Arch doesn't happen to
5015         provide any way to override the use of ~/.arch-params/, so there
5016         isn't a convenient way to avoid touching the setup of the user who
5017         runs the test.
5018         (VC_HTTP.testArchHTTP): same
5020 2004-11-23  Brian Warner  <warner@lothar.com>
5022         * buildbot/status/html.py (TextLog): split render() up into
5023         render_HEAD and render_GET. Use a Producer when sending log
5024         chunks, to reduce memory requirements and avoid sending huge
5025         non-Banana-able strings over web.distrib connections. Requires
5026         peeking under the covers of IStatusLog.
5027         (TextLog.resumeProducing): fix the "as text" link, handle client
5028         disconnects that occur while we're still sending old chunks.
5030         * buildbot/status/builder.py (HTMLLogFile.waitUntilFinished): oops,
5031         use defer.succeed, not the non-existent defer.success
5032         (LogFile.waitUntilFinished): same
5033         (LogFile.subscribe): don't add watchers to a finished logfile
5035         * buildbot/__init__.py (version): bump to 0.6.1+ while between
5036         releases
5038 2004-11-23  Brian Warner  <warner@lothar.com>
5040         * buildbot/__init__.py (version): Releasing buildbot-0.6.1
5042 2004-11-23  Brian Warner  <warner@lothar.com>
5044         * NEWS: update for the 0.6.1 release
5045         * MANIFEST.in: add new files
5047         * README (INSTALLATION): explain how to enable the extra VC tests
5049         * buildbot/status/builder.py (LogFile): add .runEntries at the class
5050         level to, so old pickled builds can be displayed ok
5052 2004-11-22  Brian Warner  <warner@lothar.com>
5054         * NEWS: summarize updates since last release
5056         * README (SLAVE): fix usage of 'buildbot slave' command. Thanks to
5057         Yoz Grahame. Closes SF#1050138.
5059         * docs/changes.xhtml (FreshCVSSourceNewcred): fix typo. Closes
5060         SF#1042563.
5062         * buildbot/process/step_twisted.py (Trial): update docs a bit
5064         * docs/factories.xhtml: fix Trial factory docs to match reality.
5065         Closes: SF#1049758.
5067         * buildbot/process/factory.py (Trial.__init__): add args for
5068         randomly= and recurse=, making them available to instantiators
5069         instead of only to subclassers. Closes: SF#1049759.
5071 2004-11-15  Brian Warner  <warner@lothar.com>
5073         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
5074         try to teach the Quick factory to use multiple versions of python
5076 2004-11-12  Brian Warner  <warner@lothar.com>
5078         * buildbot/status/builder.py (BuilderStatus.saveYourself): use a
5079         safer w32-compatible approach, and only use it on windows
5080         (BuildStatus.saveYourself): same
5082 2004-11-11  Brian Warner  <warner@lothar.com>
5084         * buildbot/status/builder.py (LogFile.addEntry): smarter way to do
5085         it: one string merge per chunk. There are now separate .entries
5086         and .runEntries lists: when enumerating over all chunks, make sure
5087         to look at both.
5088         * buildbot/test/test_status.py (Log): more tests
5090         * buildbot/status/builder.py (LogFile.addEntry): Merge string
5091         chunks together, up to 10kb per chunk. This ought to cut down on
5092         the CPU-burning overhead of large log files. Thanks to Alexander
5093         Staubo for spotting the problem.
5094         * buildbot/test/test_status.py (Log): tests for same
5096 2004-11-10  Brian Warner  <warner@lothar.com>
5098         * buildbot/status/mail.py (MailNotifier.buildMessage): add a Date
5099         header to outbound mail
5100         * buildbot/test/test_status.py (Mail.testBuild1): test for same
5102 2004-11-08  Brian Warner  <warner@lothar.com>
5104         * buildbot/status/builder.py (BuilderStatus.saveYourself): w32
5105         can't do os.rename() onto an existing file, so catch the exception
5106         and unlink the target file first. This introduces a slight window
5107         where the existing file could be lost, but the main failure case
5108         (disk full) should still be handled safely.
5109         (BuildStatus.saveYourself): same
5111         * buildbot/changes/pb.py (ChangePerspective): use a configurable
5112         separator character instead of os.sep, because the filenames being
5113         split here are coming from the VC system, which can have a
5114         different pathname convention than the local host. This should
5115         help a buildmaster running on windows that uses a CVS repository
5116         which runs under unix.
5117         * buildbot/changes/mail.py (MaildirSource): same, for all parsers
5119         * buildbot/process/step_twisted.py (Trial.createSummary): survive
5120         when there are no test failures to be parsed
5122         * buildbot/scripts/runner.py (createMaster): use shutil.copy()
5123         instead of the unix-specific os.system("cp"), thanks to Elliot
5124         Murphy for this and the other buildbot-vs-windows catches.
5125         * buildbot/test/test_maildir.py (MaildirTest.deliverMail): same
5127         * contrib/windows/buildbot.bat: prefix a '@', apparently to not
5128         echo the command as it is run
5130         * setup.py: install sample.mk too, not just sample.cfg
5131         (scripts): install contrib/windows/buildbot.bat on windows
5133 2004-11-07  Brian Warner  <warner@lothar.com>
5135         * buildbot/process/builder.py (Builder._detached): clear the
5136         self.currentBuild reference, otherwise the next build will be
5137         skipped because we think the Builder is already in use.
5139         * docs/examples/twisted_master.cfg: update to match current usage
5140         on the Twisted buildbot
5142 2004-10-29  Brian Warner  <warner@lothar.com>
5144         * buildbot/status/mail.py (MailNotifier): fix typo in docs
5146 2004-10-28  Brian Warner  <warner@lothar.com>
5148         * buildbot/slave/commands.py (SourceBase): refactor subclasses to
5149         have separate doVCUpdate/doVCFull methods. Catch an update failure
5150         and respond by clobbering the source directory and re-trying. This
5151         will handle local changes (like replacing a file with a directory)
5152         that will cause CVS and SVN updates to fail.
5153         * buildbot/test/test_vc.py (SetupMixin.do_vc): test the same
5155         * buildbot/process/step.py (LoggedRemoteCommand.__repr__): avoid a
5156         python-2.4 warning
5158 2004-10-19  Brian Warner  <warner@lothar.com>
5160         * buildbot/process/step_twisted.py (Trial.createSummary): bugfixes
5162         * buildbot/status/html.py (StatusResourceTestResults): display any
5163         TestResults that the Build might have
5164         (StatusResourceTestResult): and the logs for each TestResult
5165         (StatusResourceBuild): add link from the per-build page
5167 2004-10-15  Brian Warner  <warner@lothar.com>
5169         * buildbot/process/step_twisted.py (Trial.createSummary): parse
5170         the 'problems' portion of stdout, add TestResults to our build
5171         * buildbot/test/test_twisted.py (Parse.testParse): test it
5173         * buildbot/interfaces.py (IBuildStatus.getTestResults): new method
5174         to retrieve a dict of accumulated test results
5175         (ITestResult): define what a single test result can do
5176         * buildbot/status/builder.py (TestResult): implement ITestResult
5177         (BuildStatus.getTestResults): retrieve dict of TestResults
5178         (BuildStatus.addTestResult): add TestResults
5179         * buildbot/test/test_status.py (Results.testAddResults): test it
5181 2004-10-14  Brian Warner  <warner@lothar.com>
5183         * buildbot/test/test_maildir.py (MaildirTest): use shutil.rmtree
5184         instead of os.system("rm -rf") for win32 portability
5186         * buildbot/test/test_slavecommand.py (SlaveCommandTestCase): use
5187         SignalMixin instead of starting/stopping the reactor, which is
5188         likely to cause problems with other tests
5190         * buildbot/slave/commands.py (SourceBase.doCopy): remove leftover
5191         self.copyComplete() call. Yoz Grahame makes the catch.
5193         * contrib/windows/buildbot.bat: helper script to deal with path
5194         issues. Thanks to Yoz Grahame.
5196         * buildbot/master.py (BuildMaster.startService): don't register a
5197         SIGHUP handler if the signal module has no SIGHUP attribute.
5198         Apparently win32 does this.
5200         * buildbot/scripts/runner.py (start): add --reactor=win32 on win32
5202         * buildbot/test/test_web.py (WebTest.test_webPathname): skip the
5203         test if the reactor can't offer UNIX sockets
5205         * buildbot/status/html.py (StatusResourceBuild.body): fix syntax
5206         error introduced in the last commit. We really need that
5207         metabuildbot :).
5209 2004-10-12  Brian Warner  <warner@lothar.com>
5211         * buildbot/changes/mail.py (MaildirSource.describe): fix exception
5212         when describing a maildir source. Thanks to Stephen Davis.
5214         * buildbot/status/words.py (IrcStatusBot.command_WATCH): round off
5215         ETA seconds
5217         * buildbot/scripts/runner.py (createMaster): install Makefile too
5218         (start): add --no_save to 'start' command
5219         * buildbot/scripts/sample.mk: simple convenience Makefile with 
5220         start/stop/reload targets
5222         * buildbot/__init__.py (version): bump to 0.6.0+ while between
5223         releases
5225 2004-09-30  Brian Warner  <warner@lothar.com>
5227         * setup.py: Releasing buildbot-0.6.0
5229 2004-09-30  Brian Warner  <warner@lothar.com>
5231         * MANIFEST.in: add debian/*, sample.cfg, more docs files. Remove
5232         test_trial.py from the source tarball until support is complete.
5234         * NEWS: update for 0.6.0 release
5235         * buildbot/__init__.py (version): same
5236         * README: same
5238         * buildbot/status/words.py (IrcStatusBot.command_SOURCE): add
5239         'source' command to tell users where to get the Buildbot source
5241         * docs/examples/*.cfg: update to modern standards
5243         * NEWS: update for release
5245         * buildbot/scripts/runner.py (createMaster): remove the
5246         -shutdown.tap stuff now that it isn't necessary
5247         (createSlave): same
5248         (start): launch buildbot.tap, not buildbot-shutdown.tap
5251         * buildbot/status/mail.py (Domain): shorten class name
5252         (MailNotifier): if lookup= is a string, pass it to Domain()
5253         * buildbot/test/test_status.py (Mail.testBuild1): new class name
5254         (Mail.testBuild2): test the string-to-Domain shortcut
5255         (Mail.testMail): fix test
5258         * buildbot/scripts/sample.cfg: improve the build-the-buildbot
5259         example config file
5261         * buildbot/status/builder.py (BuildStatus.__setstate__): re-set
5262         more attributes on load
5263         (BuilderStatus.stubBuildCacheSize): bump to 30, this was too low
5264         to accomodate the whole waterfall page at once, and the thrashing
5265         results in a lot of unnecessary loads
5266         (BuildStatus.saveYourself): use binary pickles, not fluffy text
5267         (BuilderStatus.saveYourself): same
5268         (BuilderStatus.eventGenerator): stop generating on the first missing
5269         build. We assume that saved builds are deleted oldest-first.
5270         (BuildStepStatus.__getstate__): .progress might not exist
5272         * buildbot/changes/changes.py (ChangeMaster): make it
5273         serializable, in $masterdir/changes.pck
5274         (ChangeMaster.stopService): save on shutdown
5275         * buildbot/master.py (BuildMaster.loadChanges): load at startup
5276         * buildbot/test/test_config.py: load Changes before config file
5279         * buildbot/slave/commands.py (ShellCommand.doTimeout): put the
5280         "Oh my god, you killed the command" header on a separate line
5282         * buildbot/status/builder.py (BuilderStatus.getStubBuildByNumber):
5283         skip over corrupted build pickles
5284         (BuilderStatus.getFullBuildByNumber): same
5285         (BuilderStatus.eventGenerator): skip over unavailable builds
5286         (BuildStatus.saveYourself): save builds to a .tmp file first, then
5287         do an atomic rename. This prevents a corrupted pickle when some
5288         internal serialization error occurs.
5289         (BuilderStatus.saveYourself): same
5291         * buildbot/slave/commands.py (SlaveShellCommand): oops, restore
5292         the timeout for shell commands, it got lost somehow
5294         * buildbot/status/builder.py (BuilderStatus.eventGenerator): if we
5295         run out of build steps, return the rest of the builder events
5297         * buildbot/interfaces.py (IBuilderControl.ping): add method
5299         * buildbot/process/builder.py (BuilderControl.ping): move
5300         slave-ping to BuilderControl, and fix the failure case in the
5301         process (Event.finish() is the verb, Event.finished is the noun).
5303         * buildbot/status/html.py (StatusResourceBuilder.ping): ping
5304         through the BuilderControl instead of the BuilderStatus
5305         (EventBox): add adapter for builder.Event, allowing builder events to
5306         be displayed in the waterfall display
5308         * buildbot/master.py (BotMaster.stopService): add a 'master
5309         shutdown' event to the builder's log
5310         (BuildMaster.startService): and a 'master started' on startup
5312         * buildbot/status/builder.py (BuilderStatus.eventGenerator): merge
5313         builder events into the BuildStep event stream
5314         (Status.builderAdded): add a 'builder created' event
5317         * buildbot/status/words.py (IrcStatusBot.command_WATCH): new
5318         command to announce the completion of a running build
5319         (IrcStatusBot.command_FORCE): announce when the build finishes
5321         * buildbot/status/builder.py (BuilderStatus.addFullBuildToCache):
5322         don't evict unfinished builds from the cache: they must stay in
5323         the full-cache until their logfiles have stopped changing. Make
5324         sure the eviction loop terminates if an unfinished build was hit.
5325         (HTMLLogFile.getTextWithHeaders): return HTML as if it were text.
5326         This lets exceptions be dumped in an email status message. Really
5327         we need LogFiles which contain both text and HTML, instead of two
5328         separate classes.
5329         (BuildStatus.__getstate__): handle self.finished=False
5330         (Status.builderAdded): if the pickle is corrupted, abandon the
5331         history and create a new BuilderStatus object.
5333         * buildbot/process/base.py (Build.stopBuild): tolerate lack of a
5334         self.progress attribute, helped one test which doesn't fully set
5335         up the Build object.
5337         * buildbot/interfaces.py (IStatusLogStub): split out some of the
5338         IStatusLog methods into an Interface that is implemented by "stub"
5339         logs, for which all the actual text chunks are on disk (in the
5340         pickled Build instance). To show the log contents, you must first
5341         adapt the stub log to a full IStatusLog object.
5343         * buildbot/status/builder.py (LogFileStub): create separate stub
5344         log objects, which can be upgraded to a real one if necessary.
5345         (LogFile): make them persistable, and let them stubify themselves
5346         (HTMLLogFile): same
5347         (BuildStepStatus): same
5348         (BuildStatus): same
5349         (BuildStatus.saveYourself): save the whole build out to disk
5350         (BuilderStatus): make it persistable
5351         (BuilderStatus.saveYourself): save the builder to disk
5352         (BuilderStatus.addFullBuildToCache): implement two caches which
5353         hold Build objects: a small one which holds full Builds, and a
5354         larger one which holds "stubbed" Builds (ones with their LogFiles
5355         turned into LogFileStubs). This reduces memory usage by the
5356         buildmaster by not keeping more than a few (default is 2) whole
5357         build logs in RAM all the time.
5358         (BuilderStatus.getBuild): rewrite to pull from disk (through the
5359         cache)
5360         (BuilderStatus.eventGenerator): rewrite since .builds went away
5361         (BuilderStatus.buildStarted): remove the .builds array. Add the
5362         build to the "full" cache when it starts.
5363         (BuilderStatus._buildFinished): save the build to disk when it
5364         finishes
5365         (Status): give it a basedir (same as the BuildMaster's basedir)
5366         where the builder pickles can be saved
5367         (Status.builderAdded): create the BuilderStatus ourselves, by
5368         loading a pickle from disk (or creating a new instance if there
5369         was none on disk). Return the BuilderStatus so the master can glue
5370         it into the new Builder object.
5372         * buildbot/master.py (BotMaster.stopService): on shutdown, tell
5373         all BuilderStatuses to save themselves out to disk. This is in
5374         lieu of saving anything important in the main Application pickle
5375          (the -shutdown.tap file).
5376         (BuildMaster.__init__): give Status() a basedir for its files
5377         (BuildMaster.loadConfig_Builders): do status.builderAdded first,
5378         to get the BuilderStatus, then give it to the Builder (instead of
5379         doing it the other way around). It's ok if the status announces
5380         the new Builder before it's really ready, as the outside world can
5381         only see the BuilderStatus object anyway (and it is ready before
5382         builderAdded returns). Use the builder's "builddir" (which
5383         normally specifies where the slave will run the builder) as the
5384         master's basedir (for saving serialized builds).
5386         * buildbot/status/html.py (StatusResourceBuildStep.getChild):
5387         coerce the logfile to IStatusLog before trying to get the text
5388         chunks out of it. This will pull the full (non-stubified) Build in
5389         from disk if necessary.
5390         (TextLog): fix the adapter registration
5392         * buildbot/test/test_control.py (Force.setUp): create the basedir
5393         * buildbot/test/test_web.py: same
5394         * buildbot/test/test_vc.py (SetupMixin.setUp): same
5395         * buildbot/test/test_status.py (Mail.makeBuild): match new setup
5396         * buildbot/test/test_run.py (Run.testMaster): same
5397         (Status.setUp): same
5399 2004-09-29  Fred L. Drake, Jr.  <fdrake@acm.org>
5401         * buildbot/status/html.py (Waterfall.__init__): store actual
5402         allowForce flag passed in rather than using True for everyone;
5403         make sure setting it to False doesn't cause a NameError
5404         (Waterfall.setup).
5405         (StatusResourceBuilder.__init__) add the builder name to the page
5406         title.
5407         (StatusResourceBuilder.body) move HTML generation for a name/value
5408         row into a helper method (StatusResourceBuilder.make_row); only
5409         generate the "Force Build" form if allowForce was True and the
5410         slave is connected.  Use class attributes in the generated HTML to
5411         spread a little CSS-joy.
5413 2004-09-28  Brian Warner  <warner@lothar.com>
5415         * buildbot/process/step_twisted.py (Trial.createSummary): fix
5416         warning-scanner to not ignore things like
5417         'ComponentsDeprecationWarning' and 'exceptions.RuntimeWarning'
5419         * buildbot/status/html.py (StatusResource.control): add some
5420         class-level values for .control in an attempt to make upgrading
5421         smoother
5423         * buildbot/util.py (ComparableMixin): survive missing attributes,
5424         such as when a class is modified and we're comparing old instances
5425         against new ones
5427         * buildbot/status/words.py (IrcStatusBot.privmsg): clean up
5428         failure handling, remove a redundant try/except block. Don't
5429         return the full traceback to the IRC channel.
5430         (IrcStatusBot.command_FORCE): catch new exceptions, return useful
5431         error messages. Get ETA properly.
5433         * buildbot/status/html.py (StatusResourceBuild.body): html.escape
5434         the reason, since (at least) IRC message will have <> in them.
5435         (StatusResourceBuilder.__init__): take an IBuilderControl
5436         (StatusResourceBuilder.force): use the IBuilderControl we get in
5437         the constructor instead of trying to make our own. Catch the
5438         new exceptions and ignore them for now (until we make an
5439         intermediate web page where we could show the error message)
5440         (StatusResource): create with an IControl, use it to give an
5441         IBuilderControl to all children
5442         (Waterfall): take an allowForce= option, pass an IControl object
5443         to StatusResource if it is True
5445         * buildbot/test/test_web.py (ConfiguredMaster): handle IControl
5447         * buildbot/master.py (BotPerspective.perspective_forceBuild):
5448         catch new exceptions and return string forms
5450         * buildbot/interfaces.py: add NoSlaveError, BuilderInUseError
5451         * buildbot/process/builder.py (Builder.forceBuild): raise them
5452         * buildbot/test/test_control.py (Force.testNoSlave): new test
5453         (Force.testBuilderInUse): same
5456         * buildbot/status/words.py (IrcStatusBot): enable build-forcing
5458         * buildbot/test/test_run.py: use IControl
5459         * buildbot/test/test_vc.py: same
5461         * buildbot/status/html.py (StatusResourceBuilder.force): rewrite
5462         to use IControl. Still offline.
5463         * buildbot/status/words.py (IrcStatusBot.command_FORCE): same
5465         * buildbot/process/builder.py (Builder.doPeriodicBuild): set
5466         who=None so periodic builds don't send out status mail
5467         (Builder.forceBuild): include reason in the log message
5468         (BuilderControl.forceBuild): rename 'name' to 'who'
5470         * buildbot/master.py (BotPerspective.perspective_forceBuild): add
5471         'who' parameter, but make it None by default so builds forced by
5472         slave admins don't cause status mail to be sent to anybody
5473         (BotMaster.forceBuild): same. this method is deprecated.
5474         (DebugPerspective.perspective_forceBuild): same, use IControl.
5475         (DebugPerspective.perspective_fakeChange): use IControl..
5476         (Dispatcher.requestAvatar): .. so don't set .changemaster
5478         * buildbot/interfaces.py (IBuilderControl.forceBuild): rename 'who'
5479         parameter to avoid confusion with the name of the builder
5482         * buildbot/status/mail.py: refine comment about needing 2.3
5484         * buildbot/status/html.py: move all imports to the top
5486         * buildbot/test/test_control.py: test new interfaces
5487         * buildbot/test/test_run.py (Status): handle new interfaces
5488         * buildbot/test/test_vc.py (SetupMixin.doBuild): same
5490         * buildbot/process/base.py (BuildControl): implement IBuildControl
5491         and its lonely getStatus() method
5493         * buildbot/process/builder.py (BuilderControl): implement
5494         IBuilderControl, obtained by adapting the Builder instance
5495         (Builder.startBuild): return a BuilderControl instead of a
5496         Deferred. The caller can use bc.getStatus().waitUntilFinished() to
5497         accomplish the same thing.
5499         * buildbot/master.py: move all import statements to the top
5500         (Control): implement IControl, obtained by adapting the
5501         BuildMaster instance.
5503         * buildbot/interfaces.py: add IControl, IBuilderControl, and
5504         IBuildControl. These are used to force builds. Eventually they
5505         will provide ways to reconfigure the Builders, pause or abandon a
5506         Build, and perhaps control the BuildMaster itself.
5508 2004-09-26  Brian Warner  <warner@lothar.com>
5510         * buildbot/util.py (ComparableMixin): survive twisted>1.3.0 which
5511         ends up comparing us against something without a .__class__
5513 2004-09-24  Brian Warner  <warner@lothar.com>
5515         * buildbot/scripts/runner.py: rearrange option parsing a lot, to get
5516         usage text right.
5518         * Makefile: add 'deb-snapshot' target, to create a timestamped
5519         .deb package
5521         * debian/rules (binary-indep): skip CVS/ files in dh_installexamples
5523 2004-09-23  Brian Warner  <warner@lothar.com>
5525         * buildbot/__init__.py (version): move version string here
5526         * setup.py: get version string from buildbot.version
5527         * buildbot/status/html.py (WaterfallStatusResource.body): add
5528         buildbot version to the page footer
5529         * buildbot/status/words.py (IrcStatusBot.command_VERSION): provide
5530         version when asked
5532         * buildbot/master.py (BotMaster.getPerspective): detect duplicate
5533         slaves, let the second know where the first one is coming from
5534         (BuildMaster.__init__): turn on .unsafeTracebacks so the slave can
5535         see our exceptions. It would be nice if there were a way to just
5536         send them the exception type and value, not the full traceback.
5539         * buildbot/status/mail.py (MailNotifier): add a new argument
5540         sendToInterestedUsers=, which can be set to False to disable the
5541         usual send-to-blamelist behavior.
5542         (top): handle python-2.2 which has no email.MIMEMultipart
5543         (MailNotifier.buildMessage): don't send logs without MIMEMultipart
5544         (MailNotifier.disownServiceParent): unsubscribe on removal
5546         * buildbot/test/test_status.py (Mail.testBuild2): test it
5549         * buildbot/status/progress.py (Expectations.wavg): tolerate
5550         current=None, which happens when steps start failing badly
5551         * buildbot/test/test_status.py (Progress.testWavg): test for it
5553         * buildbot/process/step.py (SVN.startVC): when the (old) slave
5554         doesn't understand args['revision'], emit a warning instead of
5555         bailing completely. Updating to -rHEAD is probably close enough.
5557         * buildbot/process/step_twisted.py (Trial.start): fix sanity-check
5559         * buildbot/test/test_status.py: at least import bb.status.client
5560         even if we don't have any test coverage for it yet
5562         * contrib/svn_buildbot.py: don't require python2.3
5563         (main): wait, do require it (for sets.py), but explain how to
5564         make it work under python2.2
5566 2004-09-23  Brian Warner  <warner@lothar.com>
5568         * contrib/svn_buildbot.py: include the revision number in the Change
5570         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): use when=,
5571         using util.now() because FreshCVS is a realtime service
5573         * buildbot/status/event.py: delete dead code
5574         * buildbot/process/step.py: don't import dead Event class
5575         * buildbot/process/step_twisted.py: same
5576         * buildbot/status/builder.py: same
5577         * buildbot/status/client.py: same
5579         * buildbot/test/test_process.py: kill buggy out-of-date disabled test
5581         * buildbot/changes/changes.py (Change): set .when from an __init__
5582         argument (which defaults to now()), rather than having
5583         ChangeMaster.addChange set it later.
5584         (ChangeMaster.addChange): same
5586         * buildbot/changes/mail.py (parseFreshCVSMail): pass in when=
5587         (parseSyncmail): same. Just use util.now() for now.
5588         (parseBonsaiMail): parse the timestamp field for when=
5590         * buildbot/test/test_vc.py (SourceStamp.addChange): page in when=
5591         instead of setting .when after the fact
5593 2004-09-22  slyphon
5595         * buildbot/slave/trial.py: new SlaveCommand to machine-parse test
5596         results when the target project uses retrial. Still under
5597         development.
5598         * buildbot/test/test_trial.py: same
5600 2004-09-21  Brian Warner  <warner@lothar.com>
5602         * buildbot/status/mail.py (MailNotifier.__init__): include
5603         success/warnings/failure in the Subject line
5604         (MailNotifier.buildMessage): add the buildbot's URL to the body,
5605         use step.logname for the addLogs=True attachment filenames
5606         * buildbot/test/test_status.py (Mail): test Subject lines
5607         (Mail.testLogs): test attachment filenames
5609         * buildbot/master.py (DebugPerspective.perspective_fakeChange):
5610         accept a 'who' argument from the debug tool
5611         * contrib/debugclient.py (DebugWidget.do_commit): send 'who'
5612         * contrib/debug.glade: add text box to set 'who'
5614         * buildbot/interfaces.py (IBuildStatus.getBuilder): replace
5615         .getBuilderName with .getBuilder().getName(), more flexible
5616         (IStatusLog.getName): logs have short names, but you can prefix
5617         them with log.getStep().getName() to make them more useful
5618         * buildbot/status/builder.py: same
5619         * buildbot/status/client.py: same
5620         * buildbot/status/html.py: same
5621         * buildbot/test/test_run.py (Status.testSlave): same
5622         * buildbot/process/step.py: tweak logfile names
5624         * buildbot/status/mail.py (MailNotifier): add lookup, change
5625         argument to extraRecipients. The notifier is now aimed at sending
5626         mail to the people involved in a particular build, with additional
5627         constant recipients as a secondary function.
5629         * buildbot/test/test_status.py: add coverage for IEmailLookup,
5630         including slow-lookup and failing-lookup. Make sure the blamelist
5631         members are included.
5633         * buildbot/interfaces.py: new interfaces IEmailSender+IEmailLookup
5634         (IBuildStatus.getResponsibleUsers): rename from getBlamelist
5635         (IBuildStatus.getInterestedUsers): new method
5636         * buildbot/status/builder.py (BuildStatus.getResponsibleUsers): same
5637         * buildbot/status/client.py (remote_getResponsibleUsers): same
5638         * buildbot/status/html.py (StatusResourceBuild.body): same
5639         * buildbot/test/test_run.py (Status.testSlave): same
5641 2004-09-20  Brian Warner  <warner@lothar.com>
5643         * docs/users.xhtml: update concepts
5645         * Makefile: add a convenience makefile, for things like 'make
5646         test'. It is not included in the source tarball.
5648 2004-09-16  Brian Warner  <warner@lothar.com>
5650         * NEWS: mention /usr/bin/buildbot, debian/*
5652         * debian/*: add preliminary debian packaging. Many thanks to
5653         Kirill Lapshin (and Kevin Turner) for the hard work. I've mangled
5654         it considerably since it left their hands, I am responsible for
5655         all breakage that's resulted.
5657         * bin/buildbot: create a top-level 'buildbot' command, to be
5658         installed in /usr/bin/buildbot . For now it's just a simple
5659         frontend to mktap/twistd/kill, but eventually it will be the entry
5660         point to the 'try' command and also a status client. It is also
5661         intended to support the upcoming debian-packaging init.d scripts.
5662         * buildbot/scripts/runner.py: the real work is done here
5663         * buildbot/scripts/__init__.py: need this too
5664         * buildbot/scripts/sample.cfg: this is installed in new
5665         buildmaster directories
5666         * setup.py: install new stuff
5668 2004-09-15  Brian Warner  <warner@lothar.com>
5670         * buildbot/test/test_vc.py: skip SVN tests if svn can't handle the
5671         'file:' schema (the version shipped with OS-X was built without the
5672         ra_local plugin).
5673         (SetupMixin.tearDown): stop the goofy twisted.web timer which
5674         updates the log-timestamp, to make sure it isn't still running after
5675         the test finishes
5677         * docs/config.xhtml: Add projectName, projectURL, buildbotURL
5678         values to the config file.
5679         * docs/examples/hello.cfg: add examples
5680         * buildbot/interfaces.py (IStatus.getBuildbotURL): define accessors
5681         * buildbot/status/builder.py (Status.getProjectURL): implement them
5682         * buildbot/master.py (BuildMaster.loadConfig): set them from config
5683         * buildbot/test/test_config.py (ConfigTest.testSimple): test them
5684         * buildbot/status/html.py (WaterfallStatusResource): display them
5687         * buildbot/test/test_vc.py (FakeBuilder.name): add attribute so
5688         certain error cases don't suffer a secondary exception.
5689         (top): Skip tests if the corresponding VC tool is not installed.
5691         * buildbot/process/factory.py (Trial): introduce separate
5692         'buildpython' and 'trialpython' lists, since trialpython=[] is
5693         what you want to invoke /usr/bin/python, whereas ./setup.py is
5694         less likely to be executable. Add env= parameter to pass options
5695         to test cases (which is how I usually write tests, I don't know if
5696         anyone else does it this way).
5698         * buildbot/process/step_twisted.py (Trial): handle python=None.
5699         Require 'testpath' be a string, not a list. Fix tests= typo.
5700         (Trial.start): sanity-check any PYTHONPATH value for stringness.
5702         * buildbot/process/step.py (RemoteCommand._remoteFailed): goofy
5703         way to deal with the possibility of removing the disconnect notify
5704         twice.
5705         (CVS): add a 'login' parameter to give a password to 'cvs login',
5706         commonly used with pserver methods (where pw="" or pw="guest")
5708         * buildbot/slave/commands.py (SourceBase): move common args
5709         extraction and setup() to __init__, so everything is ready by the
5710         time setup() is called
5711         (CVS.start): call 'cvs login' if a password was supplied
5712         (ShellCommand): special-case PYTHONPATH: prepend the master's
5713         value to any existing slave-local value.
5715         * buildbot/process/builder.py (Builder.updateBigStatus): if we
5716         don't have a remote, mark the builder as Offline. This whole
5717         function should probably go away and be replaced by individual
5718         deltas.
5719         (Builder.buildFinished): return the results to the build-finished
5720         deferred callback, helps with testing
5722 2004-09-14  Brian Warner  <warner@lothar.com>
5724         * buildbot/test/test_vc.py: put all the repositories needed to run
5725         the complete tests into a single small (1.3MB) tarball, so I can
5726         make that tarball available on the buildbot web site. Test HTTP
5727         access (for Arch and Darcs) by spawning a temporary web server
5728         while the test runs.
5730         * docs/users.xhtml: new document, describe Buildbot's limited
5731         understanding of different human users
5733         * buildbot/test/test_vc.py: rearrange test cases a bit
5735         * buildbot/process/step_twisted.py (Trial): handle testpath=
5736         * buildbot/process/factory.py (Trial): update to use step.Trial
5738         * buildbot/slave/commands.py (ShellCommandPP): fix fatal typo
5740         * buildbot/status/builder.py (BuildStatus.getText): add text2 to
5741         the overall build text (which gives you 'failed 2 tests' rather
5742         than just 'failed')
5743         (BuildStepStatus.text2): default to [], not None
5745         * buildbot/process/step_twisted.py (Trial.commandComplete): text2
5746         must be a list
5748 2004-09-12  Brian Warner  <warner@lothar.com>
5750         * buildbot/master.py (BotPerspective._commandsUnavailable): don't
5751         log the whole exception if it's just an AttributeError (old slave)
5753         * buildbot/process/step.py (ShellCommand.__init__): stash .workdir
5754         so (e.g.) sub-commands can be run in the right directory.
5755         (ShellCommand.start): accept an optional errorMessage= argument
5756         to make life easier for SVN.start
5757         (SVN.startVC): put the "can't do mode=export" warning in the LogFile
5758         headers
5759         (ShellCommand.start): move ['dir'] compatibility hack..
5760         (RemoteShellCommand.start): .. to here so everyone can use it
5762         * buildbot/process/step_twisted.py (Trial): use .workdir
5764         * buildbot/process/step_twisted.py (BuildDebs.getText): fix the
5765         text displayed when debuild fails completely
5766         (Trial): snarf _trial_temp/test.log from the slave and display it
5768 2004-09-11  Brian Warner  <warner@lothar.com>
5770         * buildbot/process/step_twisted.py (ProcessDocs.getText): typo
5772         * buildbot/process/process_twisted.py (TwistedTrial.tests): oops,
5773         set to 'twisted', so --recurse can find twisted/web/test/*, etc
5775         * buildbot/process/step.py (ShellCommand): call .createSummary
5776         before .evaluateCommand instead of the other way around. This
5777         makes it slightly easier to count warnings and then use that to
5778         set results=WARNINGS
5779         * buildbot/process/step_twisted.py: cosmetic, swap the methods
5781         * buildbot/process/base.py (Build.buildFinished): update status
5782         before doing progress. It's embarrassing for the build to be stuck
5783         in the "building" state when an exceptions occurs elsewhere..
5785         * buildbot/status/progress.py (Expectations.expectedBuildTime):
5786         python2.2 doesn't have 'sum'
5788         * buildbot/status/builder.py (Status.getBuilderNames): return a copy,
5789         to prevent clients from accidentally sorting it
5791         * buildbot/master.py (Manhole): add username/password
5792         (BuildMaster.loadConfig): use c['manhole']=Manhole() rather than
5793         c['manholePort'], deprecate old usage
5794         * docs/config.xhtml: document c['manhole']
5795         * docs/examples/hello.cfg: show example of using a Manhole
5798         * buildbot/test/test_steps.py (FakeBuilder.getSlaveCommandVersion):
5799         pretend the slave is up to date
5801         * buildbot/status/builder.py (BuildStepStatus.stepFinished): 'log',
5802         the module, overlaps with 'log', the local variable
5804         * buildbot/status/html.py: oops, 2.2 needs __future__ for generators
5806         * buildbot/process/builder.py (Builder.getSlaveCommandVersion):
5807         new method to let Steps find out the version of their
5808         corresponding SlaveCommand.
5809         * buildbot/process/step.py (BuildStep.slaveVersion): utility method
5810         (ShellCommand.start): add 'dir' argument for <=0.5.0 slaves
5811         (CVS.startVC): backwards compatibility for <=0.5.0 slaves
5812         (SVN.startVC): same
5813         (Darcs.startVC): detect old slaves (missing the 'darcs' command)
5814         (Arch.startVC): same
5815         (P4Sync.startVC): same
5817         * buildbot/process/step.py (LoggedRemoteCommand.start): return the
5818         Deferred so we can catch errors in remote_startCommand
5819         (RemoteShellCommand.start): same
5821         * docs/examples/twisted_master.cfg: update sample config file
5823         * buildbot/slave/commands.py (ShellCommandPP): write to stdin
5824         after connectionMade() is called, not before. Close stdin at that
5825         point too.
5827         * buildbot/process/process_twisted.py: update to use Trial, clean
5828         up argument passing (move to argv arrays instead of string
5829         commands)
5831         * buildbot/process/step_twisted.py (Trial): new step to replace
5832         RunUnitTests, usable by any trial-using project (not just
5833         Twisted). Arguments have changed, see the docstring for details.
5835         * buildbot/process/base.py (Build.startBuild): this now returns a
5836         Deferred. Exceptions that occur during setupBuild are now
5837         caught better and lead to fewer build_status weirdnesses, like
5838         finishing a build that was never started.
5839         (Build.buildFinished): fire the Deferred instead of calling
5840         builder.buildFinished directly. The callback argument is this
5841         Build, everything else can be extracted from it, including the
5842         new build.results attribute.
5843         * buildbot/process/builder.py (Builder.startBuild): same
5844         (Builder.buildFinished): same, extract results from build
5846         * buildbot/process/step.py (ShellCommands): remove dead code
5848 2004-09-08  Brian Warner  <warner@lothar.com>
5850         * buildbot/test/test_vc.py (VC.doPatch): verify that a new build
5851         doesn't try to use the leftover patched workdir
5852         (SourceStamp): test source-stamp computation for CVS and SVN
5854         * buildbot/slave/commands.py (SourceBase.doPatch): mark the
5855         patched workdir ('touch .buildbot-patched') so we don't try to
5856         update it later
5857         (SourceBase.start): add ['revision'] for all Source steps
5858         (CVS): change args: use ['branch'] for -r, remove ['files']
5859         (CVS.buildVC): fix revision/branch stuff
5860         (SVN): add revision stuff
5862         * buildbot/process/step.py (BuildStep.__init__): reject unknown
5863         kwargs (except 'workdir') to avoid silent spelling errors
5864         (ShellCommand.__init__): same
5865         (Source): new base class for CVS/SVN/etc. Factor out everything
5866         common, add revision computation (perform the checkout with a -D
5867         DATE or -r REVISION that gets exactly the sources described by the
5868         last Change), overridable with step.alwaysUseLatest. Add patch
5869         handling (build.getSourceStamp can trigger the use of a base
5870         revision and a patch).
5871         (CVS, SVN, Darcs, Arch, P4Sync): refactor, remove leftover arguments
5872         * docs/steps.xhtml: update docs
5873         * docs/source.xhtml: mention .checkoutDelay
5874         * docs/examples/hello.cfg: show use of checkoutDelay, alwaysUseLatest
5876         * buildbot/process/base.py (Build.setSourceStamp): add a
5877         .sourceStamp attribute to each Build. If set, this indicates that
5878         the build should be done with something other than the most
5879         recent source tree. This will be used to implement "try" builds.
5880         (Build.allChanges): new support method
5881         (Build.lastChangeTime): remove, functionality moved to Source steps
5882         (Build.setupBuild): copy the Step args before adding ['workdir'],
5883         to avoid modifying the BuildFactory (and thus triggering spurious
5884         config changes)
5887         * buildbot/status/html.py: rename s/commits/changes/
5888         (StatusResourceChanges): same
5889         (CommitBox.getBox): same, update URL
5890         (WaterfallStatusResource): same
5891         (StatusResource.getChild): same
5893         * contrib/debugclient.py (DebugWidget.do_commit): send .revision
5894         * contrib/debug.glade: add optional 'revision' to the fakeChange
5896         * buildbot/changes/changes.py (html_tmpl): display .revision
5897         (ChangeMaster.addChange): note .revision in log
5898         * buildbot/changes/pb.py (ChangePerspective.perspective_addChange):
5899         accept a ['revision'] attribute
5901         * buildbot/process/factory.py (BuildFactory): use ComparableMixin
5903         * buildbot/master.py (BotMaster.getPerspective): update the
5904         .connected flag in SlaveStatus when it connects
5905         (BotMaster.detach): and when it disconnects
5906         (DebugPerspective.perspective_fakeChange): take a 'revision' attr
5907         (BuildMaster.loadConfig_Builders): walk old list correctly
5909         * buildbot/test/test_config.py: fix prefix= usage
5911 2004-09-06  Brian Warner  <warner@lothar.com>
5913         * NEWS: mention P4
5915         * buildbot/changes/p4poller.py (P4Source): New ChangeSource to
5916         poll a P4 depot looking for recent changes. Thanks to Dave
5917         Peticolas for the contribution. Probably needs some testing after
5918         I mangled it.
5920         * buildbot/process/step.py (P4Sync): simple P4 source-updater,
5921         requires manual client setup for each buildslave. Rather
5922         experimental. Thanks again to Dave Peticolas.
5923         * buildbot/slave/commands.py (P4Sync): slave-side source-updater
5925         * buildbot/changes/changes.py (Change): add a .revision attribute,
5926         which will eventually be used to generate source-stamp values.
5928         * buildbot/process/step.py (RemoteCommand.start): use
5929         notifyOnDisconnect to notice when we lose the slave, then treat it
5930         like an exception. This allows LogFiles to be closed and the build
5931         to be wrapped up normally. Be sure to remove the disconnect
5932         notification when the step completes so we don't accumulate a
5933         bazillion such notifications which will fire weeks later (when the
5934         slave finally disconnects normally). Fixes SF#915807, thanks to
5935         spiv (Andrew Bennetts) for the report.
5936         (LoggedRemoteCommand): move __init__ code to RemoteCommand, since it
5937         really isn't Logged- specific
5938         (LoggedRemoteCommand.remoteFailed): Add an extra newline to the
5939         header, since it's almost always going to be appended to an
5940         incomplete line
5941         * buildbot/test/test_steps.py (BuildStep.testShellCommand1):
5942         update test to handle use of notifyOnDisconnect
5944         * buildbot/status/builder.py (BuilderStatus.currentlyOffline):
5945         don't clear .ETA and .currentBuild when going offline, let the
5946         current build clean up after itself
5948         * buildbot/process/builder.py (Builder.detached): wait a moment
5949         before doing things like stopping the current build, because the
5950         current step will probably notice the disconnect and cleanup the
5951         build by itself
5952         * buildbot/test/test_run.py (Status.tearDown): update test to
5953         handle asynchronous build-detachment
5955         * buildbot/process/base.py (Build.stopBuild): minor shuffles
5957         * buildbot/status/html.py (WaterfallStatusResource.buildGrid):
5958         hush a debug message
5960 2004-09-05  Brian Warner  <warner@lothar.com>
5962         * buildbot/changes/maildir.py (Maildir.start): catch an IOError
5963         when the dnotify fcntl() fails and fall back to polling. Linux 2.2
5964         kernels do this: the fcntl module has the F_NOTIFY constant, but
5965         the kernel itself doesn't support the operation. Thanks to Olly
5966         Betts for spotting the problem.
5968         * buildbot/process/step.py (Darcs): new source-checkout command
5969         (Arch): new source-checkout command
5970         (todo_P4): fix constructor syntax, still just a placeholder
5971         * buildbot/test/test_vc.py (VC.testDarcs): test it
5972         (VC.testDarcsHTTP): same, via localhost HTTP
5973         (VC.testArch): same
5974         (VC.testArchHTTP): same
5975         * NEWS: mention new features
5977         * buildbot/slave/commands.py (ShellCommand): add .keepStdout,
5978         which tells the step to stash stdout text locally (in .stdout).
5979         Slave-side Commands can use this to make decisions based upon the
5980         output of the the ShellCommand (not just the exit code).
5981         (Darcs): New source-checkout command
5982         (Arch): New source-checkout command, uses .keepStdout in one place
5983         where it needs to discover the archive's default name.
5985         * docs/steps.xhtml: Document options taken by Darcs and Arch.
5986         * docs/source.xhtml: add brief descriptions of Darcs and Arch
5987         * docs/examples/hello.cfg: add examples of Darcs and Arch checkout
5989         * buildbot/process/step.py (ShellCommand.describe): add an
5990         alternate .descriptionDone attribute which provides descriptive
5991         text when the step is complete. .description can be ["compiling"],
5992         for use while the step is running, then .descriptionDone can be
5993         ["compile"], used alone when the step succeeds or with "failed" when
5994         it does not. Updated other steps to use the new text.
5995         * buildbot/process/step_twisted.py: same
5996         * buildbot/test/test_run.py: update tests to match
5998 2004-08-30  Brian Warner  <warner@lothar.com>
6000         * buildbot/process/step.py (ShellCommand.createSummary): fix docs
6001         (CVS.__init__): send 'patch' argument to slave
6002         (CVS.start): don't create the LoggedRemoteCommand until start(),
6003         so we can catch a .patch added after __init__
6004         (SVN.__init__): add 'patch' to SVN too
6005         (SVN.start): same
6007         * buildbot/slave/commands.py (ShellCommand): add a 'stdin'
6008         argument, to let commands push data into the process' stdin pipe.
6009         Move usePTY to a per-instance attribute, and clear it if 'stdin'
6010         is in use, since closing a PTY doesn't really affect the process
6011         in the right way (in particular, I couldn't run /usr/bin/patch
6012         under a pty).
6013         (SourceBase.doPatch): handle 'patch' argument
6015         * buildbot/test/test_vc.py (VC.doPatch): test 'patch' argument for
6016         both CVS and SVN
6018         * buildbot/slave/commands.py (cvs_ver): fix version-parsing goo
6019         * buildbot/slave/bot.py (Bot.remote_getCommands): send command
6020         versions to master
6021         * buildbot/master.py (BotPerspective.got_commands): get command
6022         versions from slave, give to each builder
6023         * buildbot/process/builder.py (Builder.attached): stash slave
6024         command versions in .remoteCommands
6026         * docs/steps.xhtml: bring docs in-line with reality
6028         * buildbot/process/step.py (CVS.__init__): more brutal
6029         compatibility code removal
6030         (SVN.__init__): same
6032         * buildbot/slave/commands.py (SlaveShellCommand): update docs
6033         (SlaveShellCommand.start): require ['workdir'] argument, remove
6034         the ['dir'] fallback (compatibility will come later)
6035         (SourceBase): update docs
6036         (SourceBase.start): remove ['directory'] fallback
6037         (CVS): update docs
6038         (SVN): update docs
6039         * buildbot/test/test_config.py (ConfigTest.testBuilders): update test
6040         * buildbot/test/test_steps.py (BuildStep.testShellCommand1): same
6041         * buildbot/test/test_slavecommand.py (SlaveCommandTestCase): same
6043         * buildbot/process/step.py (RemoteShellCommand.__init__): add
6044         want_stdout/want_stderr. remove old 'dir' keyword (to simplify the
6045         code.. I will figure out 0.5.0-compatibility hooks later)
6047 2004-08-30  Brian Warner  <warner@lothar.com>
6049         * buildbot/process/process_twisted.py: rewrite in terms of new
6050         BuildFactory base class. It got significantly shorter. Yay
6051         negative code days.
6053         * buildbot/process/step_twisted.py (HLint.start): fix to make it
6054         work with the new "self.build isn't nailed down until we call
6055         step.start()" scheme: specifically, __init__ is called before the
6056         build has decided on which Changes are going in, so we don't scan
6057         build.allFiles() for .xhtml files until start()
6058         (HLint.commandComplete): use getText(), not getStdout()
6059         (RunUnitTests.start): same: don't use .build until start()
6060         (RunUnitTests.describe): oops, don't report (None) when using
6061         the default reactor
6062         (RunUnitTests.commandComplete): use getText()
6063         (RunUnitTests.createSummary): same
6064         (BuildDebs.commandComplete): same
6066         * buildbot/process/step.py (RemoteShellCommand.__init__): don't
6067         set args['command'] until start(), since our BuildStep is allowed
6068         to change their mind up until that point
6069         (TreeSize.commandComplete): use getText(), not getStdout()
6071         * docs/examples/twisted_master.cfg: update to current standards
6073         * docs/factories.xhtml: update
6074         * buildbot/process/factory.py: implement all the common factories
6075         described in the docs. The Trial factory doesn't work yet, and
6076         I've probably broken all the process_twisted.py factories in the
6077         process. There are compatibility classes left in for things like
6078         the old BasicBuildFactory, but subclasses of them are unlikely to
6079         work.
6080         * docs/examples/glib_master.cfg: use new BuildFactories
6081         * docs/examples/hello.cfg: same
6083         * buildbot/test/test_config.py (ConfigTest.testBuilders): remove
6084         explicit 'workdir' args
6086         * buildbot/process/base.py (BuildFactory): move factories to ..
6087         * buildbot/process/factory.py (BuildFactory): .. here
6088         * buildbot/process/process_twisted.py: handle move
6089         * buildbot/test/test_config.py: same
6090         * buildbot/test/test_run.py: same
6091         * buildbot/test/test_steps.py: same
6092         * buildbot/test/test_vc.py: same
6093         * docs/factories.xhtml: same
6095         * NEWS: mention config changes that require updating master.cfg
6097         * buildbot/process/base.py (Build.setupBuild): add a 'workdir'
6098         argument to all steps that weren't given one already, pointing at
6099         the "build/" directory.
6101         * docs/examples/hello.cfg: remove explicit 'workdir' args
6103         * docs/factories.xhtml: document standard BuildFactory clases,
6104         including a bunch which are have not yet been written
6106 2004-08-29  Brian Warner  <warner@lothar.com>
6108         * buildbot/interfaces.py (IBuildStepStatus.getResults): move
6109         result constants (SUCCESS, WARNINGS, FAILURE, SKIPPED) to
6110         buildbot.status.builder so they aren't quite so internal
6111         * buildbot/process/base.py, buildbot/process/builder.py: same
6112         * buildbot/process/maxq.py, buildbot/process/step.py: same
6113         * buildbot/process/step_twisted.py, buildbot/status/builder.py: same
6114         * buildbot/status/mail.py, buildbot/test/test_run.py: same
6115         * buildbot/test/test_status.py, buildbot/test/test_vc.py: same
6117         * buildbot/status/html.py (StatusResourceBuildStep): oops, update
6118         to handle new getLogs()-returns-list behavior
6119         (StatusResourceBuildStep.getChild): same
6120         (StepBox.getBox): same
6121         (WaterfallStatusResource.phase0): same
6123         * docs/source.xhtml: document how Buildbot uses version-control
6124         systems (output side: how we get source trees)
6125         * docs/changes.xhtml: rename from sources.xhtml, documents VC
6126         systems (input side: how we learn about Changes)
6128         * buildbot/master.py (Manhole): use ComparableMixin
6129         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): same
6130         * buildbot/changes/mail.py (MaildirSource): same
6131         * buildbot/status/client.py (PBListener): same
6132         * buildbot/status/html.py (Waterfall): same
6133         * buildbot/status/words.py (IRC): same
6135         * NEWS: start describing new features
6137         * buildbot/status/mail.py (MailNotifier): finish implementation.
6138         The message body is still a bit sparse.
6139         * buildbot/test/test_status.py (Mail): test it
6141         * buildbot/util.py (ComparableMixin): class to provide the __cmp__
6142         and __hash__ methods I wind up adding everywhere. Specifically
6143         intended to support the buildbot config-file update scheme where
6144         we compare, say, the old list of IStatusTargets against the new
6145         one and don't touch something which shows up on both lists.
6146         * buildbot/test/test_util.py (Compare): test case for it
6148         * buildbot/interfaces.py (IBuildStatus): change .getLogs() to
6149         return a list instead of a dict
6150         (IBuildStepStatus.getLogs): same. The idea is that steps create
6151         logs with vaguely unique names (although their uniqueness is not
6152         guaranteed). Thus a compilation step should create its sole
6153         logfile with the name 'compile', and contribute it to the
6154         BuildStatus. If a step has two logfiles, try to create them with
6155         different names (like 'test.log' and 'test.summary'), and only
6156         contribute the important ones to the overall BuildStatus.
6157         * buildbot/status/builder.py (Event.getLogs): same
6158         (BuildStepStatus): fix default .text and .results
6159         (BuildStepStatus.addLog): switch to list-like .getLogs()
6160         (BuildStepStatus.stepFinished): same
6161         (BuildStatus.text): fix default .text
6162         (BuildStatus.getLogs): temporary hack to return all logs (from all
6163         child BuildStepStatus objects). Needs to be fixed to only report
6164         the significant ones (as contributed by the steps themselves)
6165         * buildbot/test/test_run.py: handle list-like .getLogs()
6166         * buildbot/test/test_steps.py (BuildStep.testShellCommand1): same
6168 2004-08-28  Brian Warner  <warner@lothar.com>
6170         * buildbot/process/builder.py (Builder.attached): serialize the
6171         attachment process, so the attach-watcher isn't called until the
6172         slave is really available. Add detached watchers too, which makes
6173         testing easier.
6175         * buildbot/test/test_vc.py: test VC modes (clobber/update/etc)
6177         * buildbot/test/test_swap.py: remove dead code
6179         * buildbot/slave/commands.py (ShellCommandPP): add debug messages
6180         (ShellCommand.start): treat errors in _startCommand/spawnProcess
6181         sort of as if the command being run exited with a -1. There may
6182         still be some holes in this scheme.
6183         (CVSCommand): add 'revision' tag to the VC commands, make sure the
6184         -r option appears before the module list
6185         * buildbot/process/step.py (CVS): add 'revision' argument
6187         * buildbot/slave/bot.py (SlaveBuilder._ackFailed): catch failures
6188         when sending updates or stepComplete messages to the master, since
6189         we don't currently care whether they arrive or not. When we revamp
6190         the master/slave protocol to really resume interrupted builds,
6191         this will need revisiting.
6192         (lostRemote): remove spurious print
6194         * buildbot/master.py (BotPerspective.attached): serialize the
6195         new-builder interrogation process, to make testing easier
6196         (BotMaster.waitUntilBuilderDetached): convenience function
6198         * buildbot/status/builder.py (BuilderStatus): prune old builds
6199         (BuildStatus.pruneSteps): .. and steps
6200         (BuildStepStatus.pruneLogs): .. and logs
6201         (BuilderStatus.getBuild): handle missing builds
6202         * buildbot/status/html.py (StatusResourceBuild.body): display build
6203         status in the per-build page
6204         (BuildBox.getBox): color finished builds in the per-build box
6206 2004-08-27  Brian Warner  <warner@lothar.com>
6208         * buildbot/status/mail.py (MailNotifier): new notification class,
6209         not yet finished
6211         * buildbot/slave/commands.py (SourceBase): refactor SVN and CVS into
6212         variants of a common base class which handles all the mode= logic
6214         * buildbot/interfaces.py (IBuildStatus.getPreviousBuild): add
6215         convenience method
6216         * buildbot/status/builder.py (BuildStatus.getPreviousBuild): same
6218 2004-08-26  Brian Warner  <warner@lothar.com>
6220         * buildbot/test/test_slavecommand.py: accomodate new slavecommand
6221         interfaces
6223         * buildbot/test/test_run.py: update to new Logfile interface, new
6224         buildbot.slave modules
6225         * buildbot/test/test_steps.py: same, remove Swappable, add timeouts
6227         * MANIFEST.in: new sample config file
6228         * docs/examples/hello.cfg: same
6230         * buildbot/process/step_twisted.py: remove dead import
6232         * buildbot/process/step.py (RemoteCommand.run): catch errors
6233         during .start
6234         (RemoteCommand.remote_update): ignore updates that arrive after
6235         we've shut down
6236         (RemoteCommand.remote_complete): ignore duplicate complete msgs
6237         (RemoteCommand._remoteComplete): cleanup failure handling, reduce
6238         the responsibilities of the subclass's methods
6239         (BuildStep.failed): catch errors during failure processing
6240         (BuildStep.addHTMLLog): provide all-HTML logfiles (from Failures)
6241         (CVS): move to a mode= argument (described in docstring), rather
6242         than the ungainly clobber=/export=/copydir= combination.
6243         (SVN): add mode= functionality to SVN too
6244         (todo_Darcs, todo_Arch, todo_P4): placeholders for future work
6246         * buildbot/process/base.py (Build.startNextStep): catch errors
6247         during s.startStep()
6249         * buildbot/clients/base.py: update to new PB client interface.
6250         gtkPanes is still broken
6252         * buildbot/bot.py, buildbot/slavecommand.py: move to..
6253         * buildbot/slave/bot.py, buildbot/slave/commands.py: .. new directory
6254         * setup.py: add buildbot.slave module
6255         * buildbot/bb_tap.py: handle move
6256         * buildbot/slave/registry.py: place to register commands, w/versions
6257         * buildbot/slave/bot.py: major simplifications
6258         (SlaveBuilder.remote_startCommand): use registry for slave commands,
6259         instead of a fixed table. Eventually this will make the slave more
6260         extensible. Use 'start' method on the command, not .startCommand.
6261         Fix unsafeTracebacks handling (I think).
6262         * buildbot/slave/commands.py: major cleanup. ShellCommand is now a
6263         helper class with a .start method that returns a Deferred.
6264         SlaveShellCommand is the form reached by the buildmaster. Commands
6265         which use multiple ShellCommands can just chain them as Deferreds,
6266         with some helper methods in Command (_abandonOnFailure and
6267         _checkAbandoned) to bail on rc!=0.
6268         (CVSCommand): prefer new mode= argument
6269         (SVNFetch): add mode= argument
6271         * buildbot/master.py (DebugPerspective.perspective_forceBuild):
6272         put a useful reason string on the build
6274         * buildbot/status/builder.py (LogFile): do LogFile right: move the
6275         core functionality into an IStatusLog object
6276         (BuildStatus.sendETAUpdate): don't send empty build-eta messages
6277         * buildbot/status/html.py (TextLog): HTML-rendering goes here
6278         (StatusResourceBuild.body): use proper accessor methods
6279         * buildbot/status/client.py (RemoteLog): PB-access goes here
6280         (StatusClientPerspective.perspective_subscribe): add "full" mode,
6281         which delivers log contents too
6282         (PBListener.__cmp__): make PBListeners comparable, thus removeable
6283         * buildbot/status/event.py: remove old Logfile completely
6285         * buildbot/interfaces.py (IStatusLog.subscribe): make the
6286         subscription interface for IStatusLog subscriptions just like all
6287         other the status subscriptions
6288         (IStatusReceiver.logChunk): method called on subscribers
6290 2004-08-24  Brian Warner  <warner@lothar.com>
6292         * buildbot/process/builder.py (Builder._pong): oops, ping response
6293         includes a result (the implicit None returned by remote_print).
6294         Accept it so the _pong method handles the response correctly.
6296 2004-08-06  Brian Warner  <warner@lothar.com>
6298         * buildbot/test/test_config.py: update IRC, PBListener tests
6300         * buildbot/status/client.py (StatusClientPerspective): total
6301         rewrite to match new IStatus interfaces. New subscription scheme.
6302         There are still a few optimizations to make (sending down extra
6303         information with event messages so the client doesn't have to do a
6304         round trip). The logfile-retrieval code is probably still broken.
6305         Moved the PB service into its own port, you can no longer share a
6306         TCP socket between a PBListener and, say, the slaveport (this
6307         should be fixed eventually).
6308         * buildbot/clients/base.py (Client): revamp to match. still needs
6309         a lot of work, but basic event reporting works fine. gtkPanes is
6310         completely broken.
6312         * buildbot/status/words.py (IRC): move to c['status']. Each IRC
6313         instance talks to a single irc server. Threw out all the old
6314         multi-server handling code. Still need to add back in
6315         builder-control (i.e. "force build")
6317         * buildbot/status/html.py (StatusResourceBuildStep.body): add some
6318         more random text to the as-yet-unreachable per-step page
6320         * buildbot/status/builder.py (BuildStepStatus.sendETAUpdate):
6321         rename to stepETAUpdate
6322         (BuildStatus.subscribe): add build-wide ETA updates
6323         (BuilderStatus.getState): remove more cruft
6324         (BuilderStatus.getCurrentBuild): remove more cruft
6325         (BuilderStatus.buildStarted): really handle tuple-subscription
6326         * buildbot/test/test_run.py (Status.testSlave): handle the
6327         stepETAUpdate rename
6329         * buildbot/master.py (BuildMaster): don't add a default
6330         StatusClientService. Don't add a default IrcStatusFactory. Both
6331         are now added through c['status'] in the config file. c['irc'] is
6332         accepted for backwards compatibility, the only quirk is you cannot
6333         use c['irc'] to specify IRC servers on ports other than 6667.
6335         * buildbot/interfaces.py (IBuildStatus.getCurrentStep): add method
6336         (IStatusReceiver.buildStarted): allow update-interval on subscribe
6337         (IStatusReceiver.buildETAUpdate): send build-wide ETA updates
6338         (IStatusReceiver.stepETAUpdate): rename since it's step-specific
6341         * buildbot/master.py (BuildMaster.startService): SIGHUP now causes
6342         the buildmaster to re-read its config file
6345         * buildbot/test/test_web.py (test_webPortnum): need a new hack to
6346         find out the port our server is running on
6347         (WebTest.test_webPathname_port): same
6349         * buildbot/test/test_config.py (testWebPortnum): test it
6350         (testWebPathname): ditto
6352         * docs/config.xhtml: document new c['status'] configuration option
6354         * buildbot/status/html.py (Waterfall): new top-level class which
6355         can be added to c['status']. This creates the Site as well as the
6356         necessary TCPServer/UNIXServer. It goes through the BuildMaster,
6357         reachable as .parent, for everything.
6359         * buildbot/master.py (Manhole): make it a normal service Child
6360         (BuildMaster.loadConfig_status): c['status'] replaces webPortnum and
6361         webPathname. It will eventually replace c['irc'] and the implicit
6362         PB listener as well. c['webPortnum'] and c['webPathname'] are left
6363         in as (deprecated) backward compatibility hooks for now.
6366         * buildbot/process/builder.py (Builder.buildFinished): don't
6367         inform out builder_status about a finished build, as it finds out
6368         through its child BuildStatus object
6370         * buildbot/status/html.py: extensive revamp. Use adapters to make
6371         Boxes out of BuildStepStatus and friends. Acknowledge that Steps
6372         have both starting and finishing times and adjust the waterfall
6373         display accordingly, using spacers if necessary. Use SlaveStatus
6374         to get buildslave info.
6375         (StatusResourceBuildStep): new just-one-step resource, used to get
6376         logfiles. No actual href to it yet.
6378         * buildbot/status/event.py (Logfile.doSwap): disable Swappable for
6379         the time being, until I get the file-naming scheme right
6381         * buildbot/status/builder.py (Event): clean started/finished names
6382         (BuildStatus.isFinished): .finished is not None is the right test
6383         (BuildStatus.buildStarted): track started/finished times ourselves
6384         (BuilderStatus.getSlave): provide access to SlaveStatus object
6385         (BuilderStatus.getLastFinishedBuild): all builds are now in
6386         .builds, even the currently-running one. Accomodate this change.
6387         (BuilderStatus.eventGenerator): new per-builder event generator.
6388         Returns BuildStepStatus and BuildStatus objects, since they can
6389         both be adapted as necessary.
6390         (BuilderStatus.addEvent): clean up started/finished attributes
6391         (BuilderStatus.startBuild,finishBuild): remove dead code
6392         (SlaveStatus): new object to provide ISlaveStatus
6394         * buildbot/process/step.py (ShellCommand.getColor): actually
6395         return the color instead of setting it ourselves
6396         (CVS.__init__): pull .timeout and .workdir options out of
6397         **kwargs, since BuildStep will ignore them. Without this neither
6398         will be sent to the slave correctly.
6399         (SVN.__init__): same
6401         * buildbot/process/builder.py (Builder): move flags to class-level
6402         attributes
6403         (Builder.attached): remove .remoteInfo, let the BotPerspective and
6404         SlaveStatus handle that
6406         * buildbot/process/base.py (Build.firstEvent): remove dead code
6407         (Build.stopBuild): bugfix
6409         * buildbot/changes/pb.py (PBChangeSource.describe): add method
6411         * buildbot/changes/changes.py (Change): add IStatusEvent methods
6412         (ChangeMaster.eventGenerator): yield Changes, since there are now
6413         Adapters to turn them into HTML boxes
6415         * buildbot/master.py (BotMaster): track SlaveStatus from BotMaster
6416         (BotPerspective.attached): feed a SlaveStatus object
6417         (BuildMaster.loadConfig): add a manhole port (debug over telnet)
6418         (BuildMaster.loadConfig_Builders): give BuilderStatus a parent
6420         * buildbot/interfaces.py: API additions
6421         (ISlaveStatus): place to get slave status
6423 2004-08-04  Brian Warner  <warner@lothar.com>
6425         * buildbot/slavecommand.py (DummyCommand.finished): send rc=0 when
6426         the delay finishes, so the step is marked as SUCCESS
6428         * buildbot/test/test_run.py (Status.testSlave): cover more of
6429         IBuildStatus and IBuildStepStatus
6431         * buildbot/status/progress.py (StepProgress): move some flags to
6432         class-level attributes
6433         (StepProgress.remaining): if there are no other progress metrics
6434         to go by, fall back to elapsed time
6435         (StepProgress.setExpectations): take a dict of metrics instead of
6436         a list
6437         (BuildProgress.setExpectationsFrom): pull expectations from the
6438         Expectations, instead of having it push them to the BuildProgress
6439         (Expectations): move some flags to class-level attributes
6440         (Expectations.__init__): copy per-step times from the
6441         BuildProgress too
6442         (Expectations.expectedBuildTime): new method for per-build ETA
6444         * buildbot/status/event.py (Logfile): move some flags to
6445         class-level attributes
6446         (Logfile.logProgressTo): better method name, let step set the
6447         progress axis name (instead of always being "output")
6449         * buildbot/status/builder.py (BuildStepStatus.getTimes): track the
6450         times directly, rather than depending upon the (possibly missing)
6451         .progress object. Use 'None' to indicate "not started/finished
6452         yet"
6453         (BuildStepStatus.getExpectations): oops, return the full list of
6454         expectations
6455         (BuilderStatus._buildFinished): append finished builds to .builds
6457         * buildbot/process/step.py (BuildStep): add separate .useProgress
6458         flag, since empty .progressMetrics[] still implies that time is a
6459         useful predictor
6460         (CVS): set up the cmd in __init__, instead of waiting for start()
6462         * buildbot/process/base.py (Build.startBuild): disable the 'when'
6463         calculation, this will eventually turn into a proper sourceStamp
6464         (Build.setupBuild): tell the Progress to load from the Expectations,
6465         instead of having the Expectations stuff things into the Progress
6466         (Build.buildException): add a build-level errback to make sure the
6467         build's Deferred fires even in case of exceptions
6469         * buildbot/master.py (BotMaster.forceBuild): convey the reason into
6470         the forced build
6471         * buildbot/process/builder.py (Builder.forceBuild): convey the
6472         reason instead of creating a fake Change
6474         * docs/examples/twisted_master.cfg: update to match reality
6476         * buildbot/test/test_config.py, buildbot/test/test_process.py:
6477         * buildbot/test/test_run.py, buildbot/test/test_steps.py:
6478         fix or remove broken/breaking tests
6480         * buildbot/status/event.py (Logfile.__len__): remove evil method
6482         * buildbot/status/builder.py (BuildStepStatus.stepStarted): tolerate
6483         missing .build, for test convenience
6485         * buildbot/process/step_twisted.py: import fixes
6487         * buildbot/process/step.py (BuildStep.failed): exception is FAILURE
6489         * buildbot/master.py (BuildMaster.loadConfig_Builders): leftover
6490         .statusbag reference
6492         * buildbot/bot.py (BuildSlave.stopService): tear down the TCP
6493         connection at shutdown, and stop it from reconnecting
6495         * buildbot/test/test_run.py (Run.testSlave): use a RemoteDummy to
6496         chase down remote-execution bugs
6498         * buildbot/process/step.py: more fixes, remove
6499         BuildStep.setStatus()
6500         * buildbot/status/builder.py: move setStatus() functionality into
6501         BuildStatus.addStep
6502         * buildbot/status/event.py: minor fixes
6504 2004-08-03  Brian Warner  <warner@lothar.com>
6506         * buildbot/process/base.py, buildbot/process/builder.py
6507         * buildbot/process/step.py, buildbot/status/builder.py
6508         * buildbot/status/event.py, buildbot/test/test_run.py:
6509         fix status delivery, get a basic test case working
6510         * buildbot/master.py: finish implementing basic status delivery,
6511         temporarily disable HTML/IRC/PB status sources
6513         * buildbot/bot.py (Bot.remote_setBuilderList): remove debug noise
6515         * buildbot/status/progress.py (BuildProgress): remove dead code
6517         * buildbot/interfaces.py
6518         * buildbot/process/base.py, buildbot/process/builder.py
6519         * buildbot/process/step.py, buildbot/process/step_twisted.py
6520         * buildbot/status/builder.py: Complete overhaul of the all
6521         status-delivery code, unifying all types of status clients (HTML,
6522         IRC, PB). See interfaces.IBuildStatus for an idea of what it will
6523         look like. This commit is a checkpointing of the work-in-progress:
6524         the input side is mostly done (Builders/Builds sending status
6525         to the BuilderStatus/BuildStatus objects), but the output side has
6526         not yet been started (HTML resources querying BuilderStatus
6527         objects). Things are probably very broken right now and may remain
6528         so for several weeks, I apologize for the disruption.
6530         * buildbot/status/event.py: add a setHTML method to use pre-rendered
6531         HTML as the log's contents. Currently used for exception tracebacks.
6532         * buildbot/status/progress.py: minor spelling changes
6534 2004-08-02  Brian Warner  <warner@lothar.com>
6536         * docs/config.xhtml: XHTML fixes, makes raw .xhtml files viewable
6537         in mozilla. Also added stylesheets copied from Twisted's docs.
6538         Remember that these files are meant to be run through Lore first.
6539         Thanks to Philipp Frauenfelder for the fixes.
6540         * docs/factories.xhtml, docs/sources.xhtml, docs/steps.xhtml: same
6541         * docs/stylesheet-unprocessed.css, docs/stylesheet.css: same
6542         * docs/template.tpl: added a Lore template
6544 2004-07-29  Brian Warner  <warner@lothar.com>
6546         * buildbot/interfaces.py: revamp status delivery. This is the
6547         preview: these are the Interfaces that will be provided by new
6548         Builder code, and to which the current HTML/IRC/PB status
6549         displayers will be adapted.
6551         * buildbot/slavecommand.py (ShellCommand.start): look for .usePTY
6552         on the SlaveBuilder, not the Bot.
6553         * buildbot/bot.py (Bot.remote_setBuilderList): copy Bot.usePTY to
6554         SlaveBuilder.usePTY
6555         * buildbot/test/test_slavecommand.py (FakeSlaveBuilder.usePTY):
6556         set .usePTY on the FakeSlaveBuilder
6558 2004-07-25  Brian Warner  <warner@lothar.com>
6560         * buildbot/changes/freshcvs.py: add some debug log messages
6561         (FreshCVSConnectionFactory.gotPerspective): pre-emptively fix the
6562         disabled 'setFilter' syntax
6563         (FreshCVSSourceNewcred.__init__): warn about prefix= values that
6564         don't end with a slash
6566         * buildbot/process/base.py (Builder._pong_failed): add TODO note
6568         * setup.py: bump to 0.5.0+ while between releases
6570 2004-07-23  Brian Warner  <warner@lothar.com>
6572         * setup.py (version): Releasing buildbot-0.5.0
6574 2004-07-23  Brian Warner  <warner@lothar.com>
6576         * README: update for 0.5.0 release
6578         * NEWS: update for 0.5.0 release
6580 2004-07-22  Brian Warner  <warner@lothar.com>
6582         * buildbot/slavecommand.py (ShellCommand): make usePTY a
6583         mktap-time configuration flag (--usepty=1, --usepty=0)
6584         * buildbot/bot.py: same
6586         * buildbot/master.py (BotPerspective.got_dirs): don't complain about
6587         an 'info' directory being unwanted
6589         * buildbot/changes/freshcvs.py (FreshCVSSource): flip the
6590         newcred/oldcred switch. Newcred (for CVSToys-1.0.10 and later) is now
6591         the default. To communicate with an oldcred daemond (CVSToys-1.0.9
6592         and earlier), use a FreshCVSSourceOldcred instead.
6593         (test): simple test routine: connect to server, print changes
6595         * buildbot/changes/changes.py (Change.getTime): make it possible
6596         to print un-timestamped changes
6598         * buildbot/master.py (makeApp): delete ancient dead code
6599         (BuildMaster.loadTheConfigFile): make "master.cfg" name configurable
6600         * buildbot/test/test_config.py (testFindConfigFile): test it
6602         * docs/examples/twisted_master.cfg (b22w32): use iocp reactor
6603         instead of win32 one
6606         * buildbot/master.py (BuildMaster.loadConfig_Builders): config file
6607         now takes a dictionary instead of a tuple. See docs/config.xhtml for
6608         details.
6610         * buildbot/process/base.py (Builder.__init__): change constructor
6611         to accept a dictionary of config data, rather than discrete
6612         name/slave/builddir/factory arguments
6614         * docs/examples/twisted_master.cfg: update to new syntax
6615         * docs/examples/glib_master.cfg: same
6616         * buildbot/test/test_config.py (ConfigTest.testBuilders): some
6617         rough tests of the new syntax
6619         
6620         * buildbot/master.py (BuildMaster.loadConfig): allow webPathname
6621         to be an int, which means "run a web.distrib sub-server on a TCP
6622         port". This lets you publish the buildbot status page to a remote
6623         twisted.web server (using distrib.ResourceSubscription). Also
6624         rename the local attributes used to hold these web things so
6625         they're more in touch with reality.
6626         * buildbot/test/test_web.py: test webPortnum and webPathname
6627         * docs/config.xhtml: document this new use of webPathname
6629         * docs/config.xhtml: new document, slightly ahead of reality
6630         
6631         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred.notify): fix
6632         'prefix' handling: treat it as a simple string to check with
6633         .startswith, instead of treating it as a directory. This allows
6634         sub-directories to be used. If you use prefix=, you should give it
6635         a string that starts just below the CVSROOT and ends with a slash.
6636         This prefix will be stripped from all filenames, and filenames
6637         which do not start with it will be ignored.
6639 2004-07-20  Cory Dodt  <corydodt@twistedmatrix.com>
6641         * contrib/svn_buildbot.py: Add --include (synonym for --filter)
6642         and --exclude (inverse of --include).  SVN post-commit hooks
6643         now have total control over which changes get sent to buildbot and which
6644         do not.
6646 2004-07-10  Brian Warner  <warner@lothar.com>
6648         * buildbot/test/test_twisted.py (Case1.testCountFailedTests): fix
6649         test case to match new API
6651         * buildbot/status/event.py (Logfile.getEntries): fix silly bug
6652         which crashed HTML display when self.entries=[] (needed to
6653         distinguish between [], which means "no entries yet", and None,
6654         which means "the entries have been swapped out to disk, go fetch
6655         them").
6657 2004-07-04  Brian Warner  <warner@lothar.com>
6659         * buildbot/process/step_twisted.py (countFailedTests): Count
6660         skips, expectedFailures, and unexpectedSuccesses. Start scanning
6661         10kb from the end because any import errors are wedged there and
6662         they would make us think the test log was unparseable.
6663         (RunUnitTests.finishStatus): add skip/todo counts to the event box
6665 2004-06-26  Brian Warner  <warner@lothar.com>
6667         * buildbot/process/step_twisted.py (RemovePYCs): turn the
6668         delete-*.pyc command into an actual BuildStep, so we can label it
6669         nicely
6670         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
6671         (FullTwistedBuildFactory): same
6673 2004-06-25  Cory Dodt  <corydodt@twistedmatrix.com>
6675         * contrib/fakechange.py: Add an errback when sending the fake 
6676         change, so we know it didn't work.
6678 2004-06-25  Christopher Armstrong  <radix@twistedmatrix.com>
6680         * buildbot/process/step_twisted.py: Delete *.pyc files before
6681         calling trial, so it doesn't catch any old .pyc files whose .py
6682         files have been moved or deleted.
6684         * buildbot/process/step_twisted.py (RunUnitTests): 1) Add a new
6685         parameter, 'recurse', that passes -R to trial. 2) have 'runAll'
6686         imply 'recurse'. 3) Make the default 'allTests' be ["twisted"]
6687         instead of ["twisted.test"], so that the end result is "trial -R
6688         twisted".
6690         * contrib/svn_buildbot.py: Add a --filter parameter that accepts a
6691         regular expression to match filenames that should be ignored when
6692         changed. Also add a --revision parameter that specifies the
6693         revision to examine, which is useful for debugging.
6695 2004-06-25  Brian Warner  <warner@lothar.com>
6697         * buildbot/process/step_twisted.py (trialTextSummarizer): create a
6698         summary of warnings (like DeprecationWarnings), next to the
6699         "summary" file
6701 2004-05-13  Brian Warner  <warner@lothar.com>
6703         * docs/examples/twisted_master.cfg: enable the win32 builder, as
6704         we now have a w32 build slave courtesy of Mike Taylor.
6706         * buildbot/process/base.py (Build.checkInterlocks): OMG this was
6707         so broken. Fixed a race condition that tripped up interlocked
6708         builds and caused the status to be stuck at "Interlocked" forever.
6709         The twisted buildbot's one interlocked build just so happened to
6710         never hit this case until recently (the feeding builds both pass
6711         before the interlocked build is attempted.. usually it has to wait
6712         a while).
6713         (Builder._pong_failed): fix method signature
6715         * setup.py: bump to 0.4.3+ while between releases
6717 2004-04-30  Brian Warner  <warner@lothar.com>
6719         * setup.py (version): Releasing buildbot-0.4.3
6721 2004-04-30  Brian Warner  <warner@lothar.com>
6723         * MANIFEST.in: add the doc fragments in  docs/*.xhtml
6725         * README: update for 0.4.3 release
6727         * NEWS: update for 0.4.3 release
6729         * buildbot/master.py (BuildMaster.__getstate__): make sure
6730         Versioned.__getstate__ is invoked, for upgrade from 0.4.2
6732         * buildbot/process/step_twisted.py (RunUnitTests.trial): add
6733         .trial as a class attribute, for upgrade from 0.4.2
6735         * buildbot/changes/changes.py (Change.links): add .links for
6736         upgrade from 0.4.2
6738         * buildbot/status/event.py (Logfile.__getstate__): get rid of both
6739         .textWatchers and .htmlWatchers at save time, since they are both
6740         volatile, should allow smooth 0.4.2 upgrade
6742         * buildbot/process/step.py (CVS.finishStatus): catch failed
6743         CVS/SVN commands so we can make the status box red
6745 2004-04-29  Brian Warner  <warner@lothar.com>
6747         * buildbot/changes/freshcvs.py
6748         (FreshCVSConnectionFactory.gotPerspective): add (commented-out)
6749         code to do setFilter(), which tells the freshcvs daemon to not
6750         send us stuff that we're not interested in. I will uncomment it
6751         when a new version of CVSToys is available in which setFilter()
6752         actually works, and I get a chance to test it better.
6754         * docs/examples/twisted_master.cfg: start using a PBChangeSource
6756         * buildbot/master.py (Dispatcher): use a registration scheme
6757         instead of hardwired service names
6758         (BuildMaster): keep track of the Dispatcher to support
6759         registration
6761         * buildbot/changes/changes.py (ChangeMaster): create a distinct
6762         PBChangeSource class instead of having it be an undocumented
6763         internal feature of the ChangeMaster. Split out the code into a
6764         new file.
6765         * buildbot/changes/pb.py (PBChangeSource): same
6766         * buildbot/test/test_changes.py: a few tests for PBChangeSource
6768         * docs/{factories|sources|steps}.xhtml: document some pieces
6770         * docs/examples/twisted_master.cfg: use SVN instead of CVS, stop
6771         using FCMaildirSource
6772         (f23osx): update OS-X builder to use python2.3, since the slave
6773         was updated to Panther (10.3.3)
6775 2004-03-21  Brian Warner  <warner@lothar.com>
6777         * buildbot/process/process_twisted.py: factor out doCheckout, change
6778         to use SVN instead of CVS
6780         * buildbot/process/base.py (BasicBuildFactory): refactor to make
6781         an SVN subclass easier
6782         (BasicSVN): subclass which uses Subversion instead of CVS
6784 2004-03-15  Christopher Armstrong  <radix@twistedmatrix.com>
6786         * buildbot/slavecommand.py (ShellCommand.start): use COMSPEC instead
6787         of /bin/sh on win32
6788         (CVSCommand.cvsComplete): don't assume chdir worked on win32
6790 2004-02-25  Brian Warner  <warner@lothar.com>
6792         * buildbot/slavecommand.py (ShellCommand): ['commands'] argument
6793         is now either a list (which is passed to spawnProcess directly) or
6794         a string (which gets passed to /bin/sh -c). This removes the useSH
6795         flag and the ArgslistCommand class. Also send status header at the
6796         start and end of each command, instead of having the master-side
6797         code do that.
6798         (CVSCommand): fix the doUpdate command, it failed to do the 'cp
6799         -r'. Update to use list-based arguments.
6800         (SVNFetch): use list-based arguments, use ['dir'] argument to
6801         simplify code.
6802         * buildbot/test/test_steps.py (Commands): match changes
6804         * buildbot/process/step.py (InternalShellCommand.words): handle
6805         command lists
6806         (SVN): inherit from CVS, cleanup
6808         * buildbot/status/event.py (Logfile.content): render in HTML, with
6809         stderr in red and headers (like the name of the command we're
6810         about to run) in blue. Add link to a second URL (url + "?text=1")
6811         to get just stdout/stderr in text/plain without markup. There is
6812         still a problem with .entries=None causing a crash, it seems to occur
6813         when the logfile is read before it is finished.
6815         * buildbot/bot.py (BotFactory.doKeepalive): add a 30-second
6816         timeout to the keepalives, and use it to explicitly do a
6817         loseConnection instead of waiting for TCP to notice the loss. This
6818         ought to clear up the silent-lossage problem.
6819         (unsafeTracebacks): pass exception tracebacks back to the master,
6820         makes it much easier to debug problems
6822 2004-02-23  Brian Warner  <warner@lothar.com>
6824         * buildbot/slavecommand.py (ShellCommand): add useSH flag to pass
6825         the whole command to /bin/sh instead of execve [Johan Dahlin]
6826         (CVSCommand): drop '-r BRANCH' if BRANCH==None instead of usiing
6827         '-r HEAD' [Johan Dahlin]
6828         (CVSCommand.start2): fix cvsdir calculation [Johan Dahlin]
6830         * buildbot/changes/changes.py (Change): add links= argument, add
6831         asHTML method [Johan Dahlin]. Modified to make a bit more
6832         XHTMLish. Still not sure how to best use links= .
6834         * buildbot/status/html.py (StatusResourceCommits.getChild): use 
6835         Change.asHTML to display the change, not asText
6837         * buildbot/status/html.py (StatusResourceBuilder): web button to
6838         ping slave
6840         * buildbot/test/test_run.py: test to actually start a buildmaster
6841         and poke at it
6843         * MANIFEST.in: bring back accidentally-dropped test helper files
6845         * buildbot/test/test_config.py (ConfigTest.testSources): skip tests
6846         that require cvstoys if it is not installed
6848         * buildbot/process/step_twisted.py (RunUnitTests): allow other
6849         values of "bin/trial" [Dave Peticolas]
6850         (RunUnitTests.finishStatus): say "no tests run" instead of "0
6851         tests passed" when we didn't happen to run any tests
6853         * buildbot/process/step.py (Compile): use haltOnFailure instead of
6854         flunkOnFailure [Johan Dahlin]
6856         * buildbot/process/base.py (ConfigurableBuild.setSteps): allow
6857         multiple instances of the same Step class by suffixing "_2", etc,
6858         to the name until it is unique. This name needs to be unique
6859         because it is used as a key in the dictionary that tracks build
6860         progress.
6861         * buildbot/test/test_steps.py (Steps.testMultipleStepInstances):
6862         add test for it
6864         * buildbot/process/base.py (Builder.ping): add "ping slave" command
6866 2004-01-14  Brian Warner  <warner@lothar.com>
6868         * buildbot/status/words.py (IrcStatusBot): when we leave or get
6869         kicked from a channel, log it
6871         * buildbot/master.py (Dispatcher): add "poke IRC" command to say
6872         something over whatever IRC channels the buildmaster is currently
6873         connected to. Added to try and track down a problem in which the
6874         master thinks it is still connected but the IRCd doesn't see it. I
6875         used a styles.Versioned this time, so hopefully users won't have
6876         to rebuild their .tap files this time.
6877         * contrib/debug.glade: add a "Poke IRC" button
6878         * contrib/debugclient.py: same
6880         * setup.py: bump to 0.4.2+ while between releases
6882 2004-01-08  Brian Warner  <warner@lothar.com>
6884         * setup.py (version): Releasing buildbot-0.4.2
6886 2004-01-08  Brian Warner  <warner@lothar.com>
6888         * NEWS: update for 0.4.2 release
6890         * README: document how to run the tests, now that they all pass
6892         * buildbot/changes/maildir.py (Maildir.poll): minor comment
6894         * buildbot/process/step.py (CVS): add a global_options= argument,
6895         which lets you set CVS global options for the command like "-r"
6896         for read-only checkout, or "-R" to avoid writing in the
6897         repository.
6898         * buildbot/slavecommand.py (CVSCommand): same
6900         * buildbot/status/event.py (Logfile): add a .doSwap switch to make
6901         testing easier (it is turned off when testing, to avoid the
6902         leftover timer)
6904         * buildbot/process/step.py (InternalBuildStep): shuffle code a bit
6905         to make it easier to test: break generateStepID() out to a
6906         separate function, only update statusbag if it exists.
6907         (ShellCommands): create useful text for dict-based commands too.
6909         * test/*, buildbot/test/*: move unit tests under the buildbot/
6910         directory
6911         * setup.py (packages): install buildbot.test too
6913         * buildbot/test/test_slavecommand.py: fix it, tests pass now
6914         * buildbot/test/test_steps.py: fix it, tests pass now
6916 2004-01-06  Brian Warner  <warner@lothar.com>
6918         * buildbot/changes/mail.py (parseFreshCVSMail): looks like new
6919         freshcvs mail uses a slightly different syntax for new
6920         directories. Update parser to handle either.
6921         * test/test_mailparse.py (Test1.testMsg9): test for same
6923 2003-12-21  Brian Warner  <warner@lothar.com>
6925         * buildbot/process/process_twisted.py (TwistedDebsBuildFactory): set
6926         'warnOnWarnings' so that lintian errors mark the build orange
6928 2003-12-17  Brian Warner  <warner@lothar.com>
6930         * buildbot/changes/mail.py (parseBonsaiMail): parser for commit
6931         messages emitted by Bonsai, contributed by Stephen Davis.
6933         * test/*: moved all tests to use trial instead of unittest. Some
6934         still fail (test_steps, test_slavecommand, and test_process).
6936         * setup.py (version): bump to 0.4.1+ while between releases
6938 2003-12-09  Brian Warner  <warner@lothar.com>
6940         * setup.py (version): Releasing buildbot-0.4.1
6942 2003-12-09  Brian Warner  <warner@lothar.com>
6944         * NEWS: update for 0.4.1 release
6946         * docs/examples/twisted_master.cfg: add netbsd builder, shuffle
6947         freebsd builder code a little bit
6949         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred.__cmp__):
6950         don't try to compare attributes of different classes
6951         * buildbot/changes/mail.py (MaildirSource.__cmp__): same
6952         (MaildirSource.messageReceived): fix Change delivery
6954         * buildbot/master.py (BuildMaster.loadConfig): insert 'basedir'
6955         into the config file's namespace before loading it, like the
6956         documentation claims it does
6957         * docs/examples/twisted_master.cfg: remove explicit 'basedir'
6958         (useFreshCVS): switch to using a maildir until Twisted's freshcvs
6959         daemon comes back online
6961 2003-12-08  Brian Warner  <warner@lothar.com>
6963         * docs/examples/twisted_master.cfg: provide an explicit 'basedir'
6964         so the example will work with online=0 as well
6966         * buildbot/changes/mail.py (FCMaildirSource, SyncmailMaildirSource):
6967         fix the __implements__ line
6969         * buildbot/changes/maildirtwisted.py (MaildirTwisted): make this
6970         class a twisted.application.service.Service, use startService to
6971         get it moving.
6973         * buildbot/changes/dnotify.py (DNotify): use os.open to get the
6974         directory fd instead of simple open(). I'm sure this used to work,
6975         but the current version of python refuses to open directories with
6976         open().
6978 2003-12-05  Brian Warner  <warner@lothar.com>
6980         * setup.py (version): bump to 0.4.0+ while between releases
6982 2003-12-05  Brian Warner  <warner@lothar.com>
6984         * setup.py (version): Releasing buildbot-0.4.0
6986 2003-12-05  Brian Warner  <warner@lothar.com>
6988         * docs/examples/glib_master.cfg: replace old sample scripts with
6989         new-style config files
6990         * MANIFEST.in: include .cfg files in distribution tarball
6992         * buildbot/changes/freshcvs.py (FreshCVSListener.remote_goodbye):
6993         implement a dummy method to avoid the exception that occurs when
6994         freshcvs sends this to us.
6996         * buildbot/pbutil.py (ReconnectingPBClientFactory.stopFactory):
6997         removed the method, as it broke reconnection. Apparently
6998         stopFactory is called each time the connection attempt fails. Must
6999         rethink this.
7000         (ReconnectingPBClientFactory.__getstate__): squash the _callID
7001         attribute before serialization, since without stopFactory the
7002         reconnect timer may still be active and they aren't serializable.
7004         * test/test_mailparse.py (ParseTest): test with 'self' argument
7006         * buildbot/changes/mail.py (parseFreshCVSMail): add (silly) 'self'
7007         argument, as these "functions" are invoked like methods from class
7008         attributes and therefore always get an instance as the first
7009         argument.
7011         * buildbot/changes/maildir.py (Maildir.start): fix error in error
7012         message: thanks to Stephen Davis for the catch
7014 2003-12-04  Brian Warner  <warner@lothar.com>
7016         * buildbot/pbutil.py: complete rewrite using PBClientFactory and
7017         twisted's standard ReconnectingClientFactory. Handles both oldcred
7018         and newcred connections. Also has a bug-workaround for
7019         ReconnectingClientFactory serializing its connector when it
7020         shouldn't.
7022         * buildbot/bot.py (BotFactory): rewrite connection layer with new
7023         pbutil. Replace makeApp stuff with proper newcred/mktap
7024         makeService(). Don't serialize Ephemerals on shutdown.
7026         * buildbot/changes/changes.py (ChangeMaster): make it a
7027         MultiService and add the sources as children, to get startService
7028         and stopService for free. This also gets rid of the .running flag.
7030         * buildbot/changes/freshcvs.py (FreshCVSSource): rewrite to use
7031         new pbutil, turn into a TCPClient at the same time (to get
7032         startService for free). Two variants exist: FreshCVSSourceOldcred
7033         and FreshCVSSourceNewcred (CVSToys doesn't actualy support newcred
7034         yet, but when it does, we'll be ready).
7035         (FreshCVSSource.notify): handle paths which are empty after the
7036         prefix is stripped. This only happens when the top-level (prefix)
7037         directory is added, at the very beginning of a Repository's life.
7039         * buildbot/clients/base.py: use new pbutil, clean up startup code.
7040         Now the only reconnecting code is in the factory where it belongs.
7041         (Builder.unsubscribe): unregister the disconnect callback when we
7042         delete the builder on command from the master (i.e. when the
7043         buildmaster is reconfigured and that builder goes away). This
7044         fixes a multiple-delete exception when the status client is shut
7045         down afterwards.
7046         * buildbot/clients/gtkPanes.py (GtkClient): cleanup, match the
7047         base Client. 
7049         * buildbot/status/words.py (IrcStatusBot): add some more sillyness
7050         (IrcStatusBot.getBuilderStatus): fix minor exception in error message
7052 2003-10-20  Christopher Armstrong  <radix@twistedmatrix.com>
7054         * contrib/run_maxq.py: Accept a testdir as an argument rather than
7055         a list of globs (ugh). The testdir will be searched for files
7056         named *.tests and run the tests in the order specified in each of
7057         those files. This allows for "dependancies" between tests to be
7058         codified.
7060         * buildbot/process/maxq.py (MaxQ.__init__): Accept a testdir
7061         argument to pass to run_maxq.py, instead of a glob.
7063 2003-10-17  Brian Warner  <warner@lothar.com>
7065         * buildbot/process/step_twisted.py (HLint.start): ignore .xhtml
7066         files that live in the sandbox
7068 2003-10-15  Brian Warner  <warner@lothar.com>
7070         * buildbot/process/step_twisted.py (ProcessDocs.finished): fix
7071         spelling error in "docs" count-warnings output
7072         (HLint.start): stupid thinko meant .xhtml files were ignored
7074         * docs/examples/twisted_master.cfg (reactors): disable cReactor
7075         tests now that cReactor is banished to the sandbox
7077 2003-10-10  Brian Warner  <warner@lothar.com>
7079         * buildbot/process/step_twisted.py (ProcessDocs, HLint): new Twisted
7080         scheme: now .xhtml are sources and .html are generated
7082 2003-10-08  Brian Warner  <warner@lothar.com>
7084         * buildbot/process/step_twisted.py (RunUnitTests.__init__): oops,
7085         we were ignoring the 'randomly' parameter.
7087 2003-10-01  Brian Warner  <warner@lothar.com>
7089         * buildbot/slavecommand.py (ShellCommand.start): set usePTY=1 on
7090         posix, to kill sub-children of aborted slavecommands.
7092         * buildbot/status/builder.py: rename Builder to BuilderStatus.
7093         Clean up initialization: lastBuildStatus remains None until the
7094         first build has been completed.
7096         * buildbot/status/html.py (WaterfallStatusResource.body): handle
7097         None as a lastBuildStatus
7098         * buildbot/clients/gtkPanes.py: same
7100         * buildbot/status/client.py (StatusClientService): keep
7101         BuilderStatus objects in self.statusbags . These objects now live
7102         here in the StatusClientService and are referenced by the Builder
7103         object, rather than the other way around.
7104         * buildbot/status/words.py (IrcStatusBot.getBuilderStatus): same
7105         * buildbot/process/base.py (Builder): same
7106         * test/test_config.py (ConfigTest.testBuilders): same
7108         * buildbot/master.py (BuildMaster.loadConfig_Builders): when modifying
7109         an existing builder, leave the statusbag alone. This will preserve the
7110         event history.
7112         * buildbot/pbutil.py (ReconnectingPB.connect): add initial newcred
7113         hook. This will probably go away in favor of a class in upcoming
7114         Twisted versions.
7116         * buildbot/changes/freshcvs.py (FreshCVSSource.start): Remove old
7117         serviceName from newcred FreshCVSNotifiee setup
7119 2003-09-29  Brian Warner  <warner@lothar.com>
7121         * buildbot/process/process_twisted.py: switch to new reactor
7122         abbreviations
7123         * docs/examples/twisted_master.cfg: same
7125         * README (REQUIREMENTS): mention twisted-1.0.8a3 requirement
7127         * buildbot/status/words.py (IrcStatusBot.getBuilder): use the
7128         botmaster reference instead of the oldapp service lookup
7130         * buildbot/master.py (BuildMaster.__init__): give the
7131         StatusClientService a reference to the botmaster to make it easier to
7132         force builds
7134 2003-09-24  Christopher Armstrong  <radix@twistedmatrix.com>
7136         * buildbot/status/html.py (Box.td): escape hreffy things so you
7137         can have spaces in things like builder names
7138         (StatusResourceBuilder.body)
7139         (WaterfallStatusResource.body)
7140         (WaterfallStatusResource.body0): same
7142 2003-09-25  Brian Warner  <warner@lothar.com>
7144         * buildbot/master.py (BuildMaster.loadConfig_Builders): don't
7145         rearrange the builder list when adding or removing builders: keep
7146         them in the order the user requested.
7147         * test/test_config.py (ConfigTest.testBuilders): verify it
7149         * contrib/debug.glade: give the debug window a name
7151         * buildbot/process/base.py (Builder.buildTimerFired): builders can
7152         now wait on multiple interlocks. Fix code relating to that.
7153         (Builder.checkInterlocks): same
7154         * buildbot/status/builder.py (Builder.currentlyInterlocked): same
7156         * buildbot/master.py (BuildMaster.loadConfig): move from
7157         deprecated pb.BrokerFactory to new pb.PBServerFactory
7158         * test/test_config.py (ConfigTest.testWebPathname): same
7160         * docs/examples/twisted_master.cfg: fix interlock declaration
7162         * buildbot/master.py (BotMaster.addInterlock): move code to attach
7163         Interlocks to their Builders into interlock.py .
7164         (BuildMaster.loadConfig_Interlocks): fix interlock handling
7166         * test/test_config.py (ConfigTest.testInterlocks): validate
7167         interlock handling
7169         * buildbot/process/base.py (Builder.__init__): better comments
7170         * buildbot/process/interlock.py (Interlock.__repr__): same
7171         (Interlock.deactivate): add .active flag, move the code that
7172         attaches/detaches builders into the Interlock
7174 2003-09-24  Christopher Armstrong  <radix@twistedmatrix.com>
7176         * buildbot/process/maxq.py (MaxQ): support for running a set of MaxQ
7177         tests using the new run_maxq.py script, and reporting failures by
7178         parsing its output.
7180         * contrib/run_maxq.py: Hacky little script for running a set of maxq
7181         tests, reporting their success or failure in a buildbot-friendly 
7182         manner.
7184 2003-09-24  Brian Warner  <warner@lothar.com>
7186         * docs/examples/twisted_master.cfg: example of a new-style config
7187         file. This lives in the buildmaster base directory as
7188         "master.cfg".
7190         * contrib/debugclient.py (DebugWidget.do_rebuild): add 'reload'
7191         button to make the master re-read its config file
7193         * buildbot/master.py (BuildMaster.loadConfig): new code to load
7194         buildmaster configuration from a file. This file can be re-read
7195         later, and the buildmaster will update itself to match the new
7196         desired configuration. Also use new Twisted Application class.
7197         * test/Makefile, test/test_config.py: unit tests for same
7199         * buildbot/changes/freshcvs.py (FreshCVSSource.__cmp__): make
7200         FreshCVSSources comparable, to support reload.
7201         * buildbot/changes/mail.py (MaildirSource.__cmp__): same
7203         * buildbot/process/base.py (Builder): make them comparable, make
7204         Interlocks easier to attach, to support reload. Handle
7205         re-attachment of remote slaves.
7206         * buildbot/process/interlock.py (Interlock): same
7208         * buildbot/bot.py, bb_tap.py, changes/changes.py: move to
7209         Twisted's new Application class. Requires Twisted >= 1.0.8 .
7210         buildmaster taps are now constructed with mktap.
7211         * buildbot/status/client.py (StatusClientService): same
7213         * buildbot/status/words.py: move to new Services, add support to
7214         connect to multiple networks, add reload support, allow nickname
7215         to be configured on a per-network basis
7217 2003-09-20  Brian Warner  <warner@lothar.com>
7219         * docs/examples/twisted_master.py (twisted_app): use python2.3 for
7220         the freebsd builder, now that the machine has been upgraded and no
7221         longer has python2.2
7223         * setup.py (version): bump to 0.3.5+ while between releases
7225 2003-09-19  Brian Warner  <warner@lothar.com>
7227         * setup.py (version): Releasing buildbot-0.3.5
7229 2003-09-19  Brian Warner  <warner@lothar.com>
7231         * NEWS: add post-0.3.4 notes
7233         * README (REQUIREMENTS): note twisted-1.0.7 requirement
7235         * MANIFEST.in: add contrib/*
7237         * docs/examples/twisted_master.py (twisted_app): all build slaves must
7238         use a remote root now: cvs.twistedmatrix.com
7240         * buildbot/changes/freshcvs.py (FreshCVSNotifiee.connect): update
7241         to newcred
7242         (FreshCVSNotifieeOldcred): but retain a class that uses oldcred for
7243         compatibility with old servers
7244         (FreshCVSSource.start): and provide a way to use it
7245         (FreshCVSNotifiee.disconnect): handle unconnected notifiee
7247         * docs/examples/twisted_master.py (twisted_app): update to new
7248         makeApp interface.
7249         (twisted_app): listen on new ~buildbot socket
7250         (twisted_app): Twisted CVS has moved to cvs.twistedmatrix.com
7252         * buildbot/process/process_twisted.py: Use 'copydir' on CVS steps
7253         to reduce cvs bandwidth (update instead of full checkout)
7255 2003-09-11  Brian Warner  <warner@lothar.com>
7257         * contrib/fakechange.py: demo how to connect to the changemaster
7258         port. You can use this technique to submit changes to the
7259         buildmaster from source control systems that offer a hook to run a
7260         script when changes are committed.
7262         * contrib/debugclient.py: tool to connect to the debug port. You
7263         can use it to force builds, submit fake changes, and wiggle the
7264         builder state
7266         * buildbot/master.py: the Big NewCred Reorganization. Use a single
7267         'Dispatcher' realm to handle all the different kinds of
7268         connections and Perspectives: buildslaves, the changemaster port,
7269         the debug port, and the status client port. NewCredPerspectives
7270         now have .attached/.detached methods called with the remote 'mind'
7271         reference, much like old perspectives did. All the pb.Services
7272         turned into ordinary app.ApplicationServices .
7273         (DebugService): went away, DebugPerspectives are now created
7274         directly by the Dispatcher.
7275         (makeApp): changed interface a little bit
7277         * buildbot/changes/changes.py: newcred
7278         * buildbot/status/client.py: newcred
7280         * buildbot/clients/base.py: newcred client side changes
7281         * buildbot/bot.py: ditto
7283         * docs/examples/glib_master.py: handle new makeApp() interface
7284         * docs/examples/twisted_master.py: ditto
7286         * buildbot/pbutil.py (NewCredPerspective): add a helper class to
7287         base newcred Perspectives on. This should go away once Twisted
7288         itself provides something sensible.
7291 2003-09-11  Christopher Armstrong  <radix@twistedmatrix.com>
7293         * contrib/svn_buildbot.py: A program that you can call from your
7294         SVNREPO/hooks/post-commit file that will notify a BuildBot master
7295         when a change in an SVN repository has happened. See the top of
7296         the file for some minimal usage info.
7298 2003-09-10  Christopher Armstrong  <radix@twistedmatrix.com>
7300         * buildbot/slavecommand.py (ArglistCommand): Add new
7301         ArglistCommand that takes an argument list rather than a string as
7302         a parameter. Using a st.split() for argv is very bad.
7304         * buildbot/slavecommand.py (SVNFetch): Now has the ability to
7305         update to a particular revision rather than always checking out
7306         (still not very smart about it, there may be cases where the
7307         checkout becomes inconsistent).
7309 2003-09-10  Christopher Armstrong  <radix@twistedmatrix.com>
7311         * buildbot/{bot.py,slavecommand.py,process/step.py}: Rudimentary
7312         SVN fetch support. It can checkout (not update!) a specified
7313         revision from a specified repository to a specified directory.
7315         * buildbot/status/progress.py (Expectations.update): Fix an
7316         obvious bug (apparently created by the change described in the
7317         previous ChangeLog message) by moving a check to *after* the
7318         variable it checks is defined.
7321 2003-09-08  Brian Warner  <warner@lothar.com>
7323         * buildbot/status/progress.py (Expectations.update): hack to catch
7324         an exception TTimo sees: sometimes the update() method seems to
7325         get called before the step has actually finished, so the .stopTime
7326         is not set, so no totalTime() is available and we average None
7327         with the previous value. Catch this and just don't update the
7328         metrics, and emit a log message.
7330 2003-08-24  Brian Warner  <warner@lothar.com>
7332         * buildbot/process/base.py (BasicBuildFactory): accept 'cvsCopy'
7333         parameter to set copydir='original' in CVS commands.
7335         * buildbot/process/step.py (CVS): accept 'copydir' parameter.
7337         * buildbot/slavecommand.py (CVSCommand): add 'copydir' parameter,
7338         which tells the command to maintain a separate original-source CVS
7339         workspace. For each build, this workspace will be updated, then
7340         the tree copied into a new workdir. This reduces CVS bandwidth
7341         (from a full checkout to a mere update) while doubling the local
7342         disk usage (to keep two copies of the tree).
7344 2003-08-21  Brian Warner  <warner@lothar.com>
7346         * buildbot/status/event.py (Logfile.addEntry): if the master web
7347         server dies while we're serving a page, request.write raises
7348         pb.DeadReferenceError . Catch this and treat it like a
7349         notifyFinish event by dropping the request.
7351 2003-08-18  Brian Warner  <warner@lothar.com>
7353         * buildbot/status/words.py (IrcStatusBot.command_FORCE): complain
7354         (instead of blowing up) if a force-build command is given without
7355         a reason field
7357         * buildbot/changes/changes.py (ChangeMaster.getChangeNumbered):
7358         don't blow up if there aren't yet any Changes in the list
7360 2003-08-02  Brian Warner  <warner@lothar.com>
7362         * buildbot/bot.py (updateApplication): don't set the .tap name,
7363         since we shouldn't assume we own the whole .tap file
7365         * buildbot/bb_tap.py (updateApplication): clean up code, detect
7366         'mktap buildbot' (without a subcommand) better
7368 2003-07-29  Brian Warner  <warner@lothar.com>
7370         * buildbot/status/words.py
7371         (IrcStatusFactory.clientConnectionLost): when we lose the
7372         connection to the IRC server, schedule a reconnection attempt.
7374         * buildbot/slavecommand.py (CVSCommand.doClobber): on non-posix,
7375         use shutil.rmtree instead of forking off an "rm -rf" command.
7376         rmtree may take a while and will block until it finishes, so we
7377         use "rm -rf" if available.
7379         * docs/examples/twisted_master.py: turn off kqreactor, it hangs
7380         freebsd buildslave badly
7382         * setup.py (version): bump to 0.3.4+ while between releases
7384 2003-07-28  Brian Warner  <warner@lothar.com>
7386         * setup.py (version): Releasing buildbot-0.3.4
7388 2003-07-28  Brian Warner  <warner@lothar.com>
7390         * NEWS: update in preparation for release
7392         * buildbot/slavecommand.py (ShellCommand.doTimeout): use
7393         process.signalProcess instead of os.kill, to improve w32
7394         portability
7396         * docs/examples/twisted_master.py (twisted_app): turn off
7397         win32eventreactor: the tests hang the buildslave badly
7399         * buildbot/process/base.py (Build.buildFinished): update ETA even on
7400         failed builds, since usually the failures are consistent
7402         * buildbot/process/process_twisted.py (TwistedReactorsBuildFactory):
7403         add compileOpts/compileOpts2 to reactors build
7405         * docs/examples/twisted_master.py (twisted_app): add "-c mingw32"
7406         (twisted_app): use both default and win32eventreactor on w32 build.
7407         Use both default and kqreactor on freebsd build.
7409         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
7410         add compileOpts2, which is put after the build_ext argument. w32
7411         needs "-c mingw32" here.
7413         * buildbot/status/html.py (StatusResourceBuilder.getChild): don't
7414         touch .acqpath, it goes away in recent Twisted releases
7416         * docs/examples/twisted_master.py (twisted_app): use "python" for
7417         the w32 buildslave, not "python2.2"
7419         * buildbot/bot.py (Bot.remote_getSlaveInfo): only look in info/ if
7420         the directory exists.. should hush an exception under w32
7422         * buildbot/slavecommand.py (ShellCommandPP.processEnded): use
7423         ProcessTerminated -provided values for signal and exitCode rather
7424         than parsing the unix status code directly. This should remove one
7425         more roadblock for a w32-hosted buildslave.
7427         * test/test_mailparse.py: add test cases for Syncmail parser
7429         * Buildbot/changes/freshcvsmail.py: remove leftover code, leave a
7430         temporary compatibility import. Note! Start importing
7431         FCMaildirSource from changes.mail instead of changes.freshcvsmail
7433         * buildbot/changes/mail.py (parseSyncmail): finish Syncmail parser
7435 2003-07-27  Brian Warner  <warner@lothar.com>
7437         * NEWS: started adding new features
7439         * buildbot/changes/mail.py: start work on Syncmail parser, move
7440         mail sources into their own file
7442         * buildbot/changes/freshcvs.py (FreshCVSNotifiee): mark the class
7443         as implementing IChangeSource
7444         * buildbot/changes/freshcvsmail.py (FCMaildirSource): ditto
7446         * buildbot/interfaces.py: define the IChangeSource interface
7448 2003-07-26  Brian Warner  <warner@lothar.com>
7450         * buildbot/master.py (makeApp): docstring (thanks to Kevin Turner)
7452 2003-06-25  Brian Warner  <warner@lothar.com>
7454         * buildbot/status/words.py (IrcStatusBot.emit_last): round off
7455         seconds display
7457 2003-06-17  Brian Warner  <warner@lothar.com>
7459         * buildbot/status/words.py: clean up method usage to avoid error
7460         in silly IRC command
7461         (IrcStatusBot.emit_status): round off seconds display
7463         * buildbot/process/base.py (Build): delete the timer when saving
7464         to the .tap file, and restore it (if it should still be running)
7465         upon restore. This should fix the "next build in -34 seconds"
7466         messages that result when the master is restarted while builds are
7467         sitting in the .waiting slot. If the time for the build has
7468         already passed, start it very soon (in 1 second).
7470         * buildbot/status/words.py: more silly commands
7472         * README (REQUIREMENTS): add URLs to all required software
7474         * buildbot/status/words.py ('last'): mention results of, and time
7475         since last build
7477 2003-05-28  Brian Warner  <warner@lothar.com>
7479         * buildbot/status/words.py: add 'last' command
7480         (IrcStatusBot.emit_status): add current-small text to 'status' output
7482         * docs/examples/twisted_master.py (twisted_app): turn on IRC bot
7483         (twisted_app): remove spaces from OS-X builder name
7485         * buildbot/master.py (makeApp): add knob to turn on IRC bot
7486         * buildbot/status/words.py: IRC bot should actually be useful now
7488 2003-05-23  Brian Warner  <warner@lothar.com>
7490         * buildbot/bot.py (Bot.remote_getSlaveInfo): add routines to get
7491         "slave information" from $(slavedir)/info/* . These files are
7492         maintained by the slave administrator, and describe the
7493         machine/environment that is hosting the slave. Information from
7494         them is put into the "Builder" HTML page. Still need to establish
7495         a set of well-known filenames and meanings for this data: at the
7496         moment, *all* info/* files are sent to the master, but only
7497         'admin' and 'host' are used on that end.
7498         * buildbot/status/html.py (StatusResourceBuilder.body): ditto
7499         * buildbot/process/base.py (Builder.setRemoteInfo):  ditto
7500         * buildbot/master.py (BotPerspective.got_info):  ditto
7502 2003-05-22  Brian Warner  <warner@lothar.com>
7504         * setup.py (version): bump version to 0.3.3+ while between releases
7506 2003-05-21  Brian Warner  <warner@lothar.com>
7508         * setup.py: Releasing buildbot-0.3.3
7510 2003-05-21  Brian Warner  <warner@lothar.com>
7512         * NEWS: 0.3.3 news items
7514         * README: describe --keepalive and life behind a NAT box
7516         * buildbot/bot.py (Bot.connected): implement application-level
7517         keepalives to deal with NAT timeouts, turn them on with
7518         --keepalive option or when SO_KEEPALIVE doesn't work.
7520         * buildbot/master.py (BotPerspective): accept keepalives silently
7522         * buildbot/process/base.py (Build.buildException): CopiedFailures
7523         don't carry as much information as local ones, so don't try to
7524         create a big HTMLized version of them.
7526         * buildbot/process/step.py (InternalShellCommand.stepFailed): close
7527         log file when step fails due to an exception, such as when the slave
7528         becomes unreachable
7530         * buildbot/process/step_twisted.py (RunUnitTests): use trial's new
7531         --testmodule argument instead of grepping for test-case-name tags
7532         ourselves. Remove FindUnitTests code.
7533         * buildbot/slavecommand.py, buildbot/bot.py: remove old code
7535         * MANIFEST.in: Add docs/examples, files under test/ . Oops!
7537 2003-05-16  Brian Warner  <warner@lothar.com>
7539         * buildbot/process/base.py (BasicBuildFactory): add 'configureEnv'
7540         argument to allow things like CFLAGS=-O0 to be passed without relying
7541         upon /bin/sh processing on the slave.
7543         * buildbot/process/step.py (InternalShellCommand.start): send
7544         'env' dict to slave
7545         * buildbot/slavecommand.py (ShellCommand.start): create argv with
7546         'split' instead of letting /bin/sh do it. This should also remove
7547         the need for /bin/sh on the buildslave, making it more likely to
7548         work with win32.
7550         * buildbot/status/html.py: html-escape text in blamelist.
7551         Add "force build" button to the Builder page.
7553         * buildbot/process/step_twisted.py (countFailedTests): look at
7554         last 1000 characters for status line, as import errors can put it
7555         before the -200 point.
7557 2003-05-15  Brian Warner  <warner@lothar.com>
7559         * docs/examples/twisted_master.py: use clobber=0 for remote builds
7561         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
7562         make 'clobber' a parameter, so it is possible to have builds which
7563         do full tests but do a cvs update instead of hammering the CVS
7564         server with a full checkout each build
7566         * buildbot/process/step.py (InternalShellCommand): bump default
7567         timeout to 20 minutes
7569         * buildbot/bot.py (Bot.debug_forceBuild): utility method to ask
7570         the master to trigger a build. Run it via manhole.
7572         * buildbot/master.py (BotPerspective.perspective_forceBuild):
7573         allow slaves to trigger any build that they host, to make life
7574         easier for slave admins who are testing out new build processes
7576         * buildbot/process/process_twisted.py (TwistedReactorsBuildFactory):
7577         don't flunk cReactor or qtreactor on failure, since they fail alot
7578         these days. Do warnOnFailure instead.
7580         * buildbot/process/base.py: change Builder.buildable from a list
7581         into a single slot. When we don't have a slave, new builds (once
7582         they make it past the timeout) are now merged into an existing
7583         buildable one instead of being queued. With this change, a slave
7584         which has been away for a while doesn't get pounded with all the
7585         builds it missed, but instead just does a single build.
7587 2003-05-07  Brian Warner  <warner@lothar.com>
7589         * setup.py (version): bump version to 0.3.2+ while between releases
7591 2003-05-07  Brian Warner  <warner@lothar.com>
7593         * setup.py: Releasing buildbot-0.3.2
7595 2003-05-07  Brian Warner  <warner@lothar.com>
7597         * setup.py: fix major packaging error: include subdirectories!
7598         
7599         * NEWS: add changes since last release
7601         * README (REQUIREMENTS): update twisted/python dependencies
7603         * buildbot/status/builder.py (Builder.startBuild): change
7604         BuildProcess API: now they should call startBuild/finishBuild
7605         instead of pushing firstEvent / setLastBuildStatus. Moving towards
7606         keeping a list of builds in the statusbag, to support other kinds of
7607         status delivery.
7608         (Builder.addClient): send current-activity-small to new clients
7609         * buildbot/process/base.py (Build.startBuild, .buildFinished): use
7610         new API
7612         * buildbot/status/client.py: drop RemoteReferences at shutdown
7614         * buildbot/status/event.py (Event.stoppedObserving): oops, add it
7616         * buildbot/status/progress.py (BuildProgress.remote_subscribe):
7617         more debug messages for remote status client
7619         * buildbot/process/step.py (InternalBuildStep.stepComplete)
7620         (.stepFailed): only fire the Deferred once, even if both
7621         stepComplete and stepFailed are called. I think this can happen if
7622         an exception occurs at a weird time.
7624         * buildbot/status/words.py: work-in-progress: IRC status delivery
7626 2003-05-05  Brian Warner  <warner@lothar.com>
7628         * docs/examples/twisted_master.py (twisted_app): hush internal
7629         python2.3 distutils deprecation warnings
7630         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
7631         add compileOpts= argument which inserts extra args before the
7632         "setup.py build_ext" command. This can be used to give -Wignore
7633         warnings, to hush some internal python-2.3 deprecation messages.
7635         * buildbot/process/step_twisted.py (RunUnitTests): parameterize
7636         the ['twisted.test'] default test case to make it easier to change
7637         in subclasses
7639         * buildbot/clients/base.py: switch to pb.Cacheable-style Events
7640         * buildbot/clients/gtkPanes.py: ditto
7642         * buildbot/process/step_twisted.py (RunUnitTests): use randomly=
7643         arg to collapse RunUnitTestsRandomly into RunUnitTests
7644         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
7645         use RunUnitTests(randomly=1) instead of RunUnitTestsRandomly
7647         * buildbot/status/html.py (StatusResource): shuffle Resources
7648         around to fix a bug: both 'http://foo:8080' and 'http://foo:8080/'
7649         would serve the waterfall display, but the internal links were
7650         only valid on the trailing-slash version. The correct behavior is
7651         for the non-slashed one to serve a Redirect to the slashed one.
7652         This only shows up when the buildbot page is hanging off another
7653         server, like a Twisted-Web distributed server.
7655         * buildbot/status/event.py (Event, RemoteEvent): make Events
7656         pb.Cacheable, with RemoteEvent as the cached version. This removes
7657         a lot of explicit send-an-update code.
7658         * buildbot/status/builder.py (Builder): remove send-update code
7659         * buildbot/status/client.py (ClientBuilder): remove send-update
7660         code, and log errors that occur during callRemote (mostly to catch
7661         InsecureJelly exceptions)
7663         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
7664         run Lore with the same python used in the rest of the build
7666         * buildbot/process/step_twisted2.py (RunUnitTestsJelly): moved
7668         * buildbot/process/step_twisted.py (HLint): accept 'python'
7669         argument. Catch rc!=0 and mark the step as failed. This marks the
7670         build orange ("has warnings").
7671         (RunUnitTestsJelly): move out to step_twisted2.py
7673         * buildbot/util.py (ignoreStaleRefs): add utility function
7675         * buildbot/master.py (DebugPerspective.perspective_setCurrentState):
7676         don't fake ETA object, it's too hard to get right
7678 2003-05-02  Brian Warner  <warner@lothar.com>
7680         * docs/examples/twisted_master.py (twisted_app): add FreeBSD builder
7682 2003-05-01  Brian Warner  <warner@lothar.com>
7684         * buildbot/status/html.py (StatusResource.body): oops, I was
7685         missing a <tr>, causing the waterfall page to be misrendered in
7686         everything except Galeon.
7688 2003-04-29  Brian Warner  <warner@lothar.com>
7690         * docs/examples/twisted_master.py: make debuild use python-2.2
7691         explicitly, now that Twisted stopped supporting 2.1
7693         * buildbot/process/step_twisted.py (BuildDebs.finishStatus): oops,
7694         handle tuple results too. I keep forgetting this, which suggests
7695         it needs to be rethought.
7697         * setup.py (setup): bump version to 0.3.1+ while between releases
7698         
7699 2003-04-29  Brian Warner  <warner@lothar.com>
7701         * setup.py: Releasing buildbot-0.3.1
7703 2003-04-29  Brian Warner  <warner@lothar.com>
7705         * README (SUPPORT): add plea to send questions to the mailing list
7707         * NEWS, MANIFEST.in: add description of recent changes
7709         * docs/examples/twisted_master.py: add the code used to create the
7710         Twisted buildmaster, with passwords and such removed out to a
7711         separate file.
7713         * buildbot/changes/changes.py, freshcvs.py, freshcvsmail.py: split
7714         out cvstoys-using bits from generic changes.py, to allow non-cvstoys
7715         buildmasters to not require CVSToys be installed.
7716         * README, docs/examples/glib_master: update to match the change
7718         * buildbot/clients/base.py, buildbot/bot.py,
7719         buildbot/changes/changes.py, buildbot/pbutil.py: copy
7720         ReconnectingPB from CVSToys distribution to remove CVSToys
7721         dependency for build slaves and status clients. Buildmasters which
7722         use FreshCVSSources still require cvstoys be installed, of course.
7724 2003-04-25  Brian Warner  <warner@lothar.com>
7726         * buildbot/process/process_twisted.py (FullTwistedBuildFactory): add
7727         runTestsRandomly arg to turn on trial -z
7729         * buildbot/process/step_twisted.py (TwistedJellyTestResults):
7730         experimental code to use trial's machine-parseable output to get
7731         more detailed test results. Still has some major issues.
7732         (RunUnitTestsRandomly): subclass to add "-z 0" option, runs tests
7733         in random sequence
7735         * buildbot/status/builder.py (Builder.setCurrentBuild):
7736         anticipating moving build history into statusbag, not used yet
7738         * buildbot/status/tests.py: code to centralize test results,
7739         doesn't work quite yet
7741         * buildbot/status/event.py (Event): use hasattr("setName") instead
7742         of isinstance for now.. need better long-term solution
7744         * buildbot/status/html.py: Remove old imports
7746 2003-04-24  Brian Warner  <warner@lothar.com>
7748         * buildbot/process/process_twisted.py (TwistedBuild.isFileImportant):
7749         ignore changes under doc/fun/ and sandbox/
7751         * buildbot/process/step_twisted.py: update pushEvent and friends.
7753         * buildbot/status/html.py (Box.td): replace event.buildername with
7754         event.parent.getSwappableName(). Needs more thought.
7756         * buildbot/status/builder.py (Builder): Replace pushEvent and
7757         getLastEvent with {set|update|addFileTo|finish}CurrentActivity.
7758         Tell events they are being pruned with event.delete().
7760         * buildbot/process/base.py (Build): Remove Builder status-handling
7761         methods. s/pushEvent/setCurrentActivity/.
7763         * buildbot/process/step.py (BuildStep): clean up status delivery.
7764         Gouse builder.statusbag methods instead of intermediate builder
7765         methods. s/updateLastEvent/updateCurrentActivity/.
7766         s/finalizeLastEvent/finishCurrentActivity/. Use
7767         addFileToCurrentActivity for summaryFunction.
7769         * buildbot/status/event.py (Logfile): put data in a Swappable when
7770         .finish is called.
7771         (Event): add more setter methods. Remove .buildername, use .parent
7772         and getSwappableName instead (needs more thought).
7774         * buildbot/util.py (Swappable):
7775         * test/test_swap.py: don't bother setting filename at __init__
7776         time, do it later. Change setFilename args to take parent first,
7777         since it provides the most significant part of the filename.
7779 2003-04-23  Brian Warner  <warner@lothar.com>
7781         * buildbot/status/event.py (Logfile.addEntry): append to previous
7782         entry, if possible
7784         * buildbot/process/step.py (BuildStep.finalizeLastEvent):
7785         anticipating Swappable
7786         (InternalShellCommand.remoteUpdate): split out various log-adding
7787         methods so subclasses can snarf stdout separately
7789         * buildbot/process/base.py (Builder.finalizeLastEvent): more code
7790         in anticipation of Swappable build logs
7791         (Builder.testsFinished): anticipating TestResults, still disabled
7793         * buildbot/status/builder.py (Builder.pruneEvents): only keep the
7794         last 100 events
7796         * buildbot/status/event.py (Logfile): add (disabled) support for
7797         Swappable, not ready for use yet
7799         * buildbot/util.py (Swappable): object which is swapped out to
7800         disk after some period of no use.
7801         * test/test_swap.py: test buildbot.utils.Swappable
7803 2003-04-14  Brian Warner  <warner@lothar.com>
7805         * buildbot/process/base.py (Builder.doPeriodicBuild): add simple
7806         periodic-build timer. Set the .periodicBuildTime on a builder
7807         instance to some number of seconds to activate it.
7809         * buildbot/master.py (BotMaster.forceBuild): change forceBuild API
7811         * buildbot/process/step.py (ShellCommand.finishStatus): use log.msg in
7812         a way that survives result tuples
7814 2003-04-12  Brian Warner  <warner@lothar.com>
7816         * buildbot/process/step.py (ShellCommand.finishStatusSummary):
7817         return a dict instead of a tuple: allow summarizers to provide
7818         multiple summaries if they want
7819         * buildbot/process/step_twisted.py (trialTextSummarizer): return dict
7820         (debuildSummarizer): summarize lintian warnings/errors
7822 2003-04-10  Brian Warner  <warner@lothar.com>
7824         * README (REQUIREMENTS): slave requires twisted-1.0.4a2
7826 2003-04-09  Brian Warner  <warner@lothar.com>
7828         * buildbot/process/step_twisted.py (trialTextSummarizer): Don't create
7829         empty summaries: happens when the tests fail so hard they don't emit
7830         a parseable summary line.
7832         * buildbot/process/step.py (ShellCommand.finishStatusSummary):
7833         Allow summaryFunction to return None to indicate no summary should
7834         be added.
7836         * buildbot/status/event.py (Logfile.removeHtmlWatcher): avoid
7837         writing to stale HTTP requests: notice when they disconnect and
7838         remove the request from the list. Also add CacheToFile from
7839         moshez, will be used later.
7841 2003-04-08  Brian Warner  <warner@lothar.com>
7843         * buildbot/process/step_twisted.py (ProcessDocs.finished): warnings
7844         should be an int, not a list of strings
7846         * buildbot/changes/changes.py (FreshCVSSource.stop): don't disconnect
7847         if we weren't actually connected
7849         * buildbot/process/step_twisted.py (trialTextSummarizer): function
7850         to show the tail end of the trial text output
7852         * buildbot/process/step.py (ShellCommand.finishStatusSummary): add
7853         hook to summarize the results of a ShellCommand
7855 2003-04-07  Brian Warner  <warner@lothar.com>
7857         * buildbot/process/step_twisted.py (RunUnitTests): consolidate all
7858         twisted test suite code into a single class.
7859         * buildbot/process/process_twisted.py: same
7861 2003-04-04  Brian Warner  <warner@lothar.com>
7863         * setup.py, MANIFEST.in: hack to make sure plugins.tml gets installed
7865         * README (SLAVE): document use of mktap to create slave .tap file
7866         (REQUIREMENTS): describe dependencies
7868         * buildbot/bb_tap.py, buildbot/plugins.tml:
7869         * buildbot/bot.py (updateApplication): Add mktap support for creating
7870         buildslave .tap files
7872 2003-03-28  Brian Warner  <warner@lothar.com>
7874         * buildbot/process/step.py (InternalShellCommand.finished): handle
7875         new tuple result values (fix embarrasing bug that appeared during
7876         PyCon demo)
7878 2003-03-27  Brian Warner  <warner@lothar.com>
7880         * docs/examples/glib_master.py, README: add sample buildmaster.tap
7881         -making program
7883 2003-03-25  Brian Warner  <warner@lothar.com>
7885         * buildbot/process/step.py (CVS, ShellCommand): add reason for failure
7886         to overall build status
7887         * buildbot/clients/base.py (Builder): improve event printing
7888         * buildbot/process/base.py (BasicBuildFactory): use specific steps
7889         instead of generic ShellCommand
7890         (Build): Add .stopBuild, use it when slave is detached
7892         * buildbot/process/step.py (Configure,Test): give the steps their
7893         own names and status strings
7895         * buildbot/status/html.py (StatusResource): add "show" argument,
7896         lets you limit the set of Builders being displayed.
7898 2003-03-20  Brian Warner  <warner@lothar.com>
7900         * buildbot/process/basic.py: removed
7902 2003-03-19  Brian Warner  <warner@lothar.com>
7904         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
7905         turn off process-docs by default
7907         * buildbot/process/base.py (Builder.getBuildNumbered): Don't blow up
7908         when displaying build information without anything in allBuilds[]
7910         * buildbot/bot.py (makeApp): really take password from sys.argv
7912 2003-03-18  Brian Warner  <warner@lothar.com>
7914         * buildbot/bot.py (buildApp): take password from sys.argv
7916         * README: replace with more useful text
7918         * setup.py: add a real one
7919         * MANIFEST.in, .cvsignore: more distutils packaging stuff
7920         
7921         * docs/PyCon-2003/: added sources for PyCon paper.
7923         * buildbot/process/base.py, step.py: revamp. BuildProcess is gone,
7924         now Build objects control the process and Builder only handles
7925         slave stuff and distribution of changes/status. A new BuildFactory
7926         class creates Build objects on demand.
7928         Created ConfigurableBuild which takes a list of steps to run. This
7929         makes it a lot easier to set up a new kind of build and moves us
7930         closer to being able to configure a build from a web page.
7932         * buildbot/process/step_twisted.py, process_twisted.py: move to
7933         new model. A lot of code went away.
7934         
7935         * buildbot/status/progress.py (BuildProgress.newProgress): Don't
7936         send lots of empty progress messages to the client.
7938         * buildbot/master.py (makeApp): enforce builder-name uniqueness
7940 2003-02-20  Brian Warner  <warner@lothar.com>
7942         * buildbot/process/step_twisted.py (BuildDebs): count lintian hits
7944         * buildbot/slavecommand.py (ShellCommand): back to usePTY=0. The
7945         Twisted bug that prevented non-pty processes from working just got
7946         fixed, and the bug that leaks ptys is still being investigated.
7948         * buildbot/process/step.py (CVS): send timeout arg to slave
7950         * buildbot/clients/gtkPanes.py: add connection-status row, handle
7951         builders coming and going
7952         * buildbot/clients/base.py: clean up protocol, move to ReconnectingPB
7953         from CVSToys, handle lost-buildmaster
7955         * buildbot/status/client.py (StatusClientService.removeBuilder):
7956         Clean up status client protocol: send builders (with references)
7957         as they are created, rather than sending a list and requiring the
7958         client to figure out which ones are new.
7959         * buildbot/master.py (BotMaster.forceBuild): Log debugclient
7960         attempts to force a build on an unknown builder
7962 2003-02-19  Brian Warner  <warner@lothar.com>
7964         * buildbot/slavecommand.py (CVSCommand): add timeout to sub-commands
7965         * buildbot/slavecommand.py (ShellCommand.start): stop using PTYs until
7966         Twisted stops leaking them.
7967         * buildbot/clients/gtkPanes.py (CompactBuilder): forget ETA when the
7968         builder goes to an idle state.
7970         * buildbot/slavecommand.py (ShellCommand.start): bring back PTYs until
7971         I figure out why CVS commands hang without them, and/or I fix the
7972         hung-command timeout
7974 2003-02-16  Brian Warner  <warner@lothar.com>
7976         * buildbot/process/step_twisted.py: bin/hlint went away, replace
7977         with 'bin/lore --output lint'. Use 'bin/trial -o' to remove
7978         ansi-color markup. Remove GenerateLore step. Count hlint warnings in
7979         GenerateDocs now that they are prefixed with WARNING:.
7981         * buildbot/status/html.py (StatusResource.body): Fix Builder link,
7982         use manual href target instead of request.childLink
7984         * buildbot/clients/gtkPanes.py: Fix progress countdown: update the
7985         display every second, but update the ETA every 5 seconds (or
7986         whenever) as remote_progress messages arrive.
7989 2003-02-12  Brian Warner  <warner@lothar.com>
7991         * *: import current sources from home CVS repository
7992         
7994 # Local Variables:
7995 # add-log-time-format: add-log-iso8601-time-string
7996 # End: