webstatus: fix title of one-line-per-build pages
[buildbot.git] / ChangeLog
bloba9bd4506d11e640203a76a9686deeb735c674b57
1 2007-08-12  Brian Warner  <warner@lothar.com>
3         * buildbot/status/web/baseweb.py: fix title of one-line-per-build
4         pages
6         * buildbot/interfaces.py (IStatus.getSlaveNames): new method to
7         list all buildslaves
9         * buildbot/buildslave.py (BuildSlave.messageReceivedFromSlave):
10         use the BuildSlave to keep track of the last time we've heard from
11         the buildslave. This is updated upon receipt of any message from
12         any SlaveBuilder (which generally means when RemoteCommands are
13         giving us status updates, as BuildSteps run). In the future this
14         will include slave pings too.
15         * buildbot/process/base.py
16         (Build.setupBuild): give each BuildStep a reference to the BuildSlave
17         * buildbot/process/buildstep.py:
18         (BuildStep.setBuildSlave): accept that reference
19         (BuildStep.runCommand): pass the reference on to the RemoteCommand
20         (RemoteCommand.remote_update): update the timestamp
21         (RemoteCommand.remote_complete): same
22         * buildbot/test/runutils.py (StepTester.makeStep): match the change
23         * buildbot/test/test_steps.py (BuildStep.testShellCommand1): same
24         * buildbot/interfaces.py (ISlaveStatus.lastMessageReceived): new
25         interface to retrieve this timestamp
26         * buildbot/status/builder.py (SlaveStatus): track a copy of the
27         timestamp
30         * buildbot/status/web/baseweb.py (OneLineMixin.make_line): tighten
31         up the format a bit
32         (OneLinePerBuild.body): use a <ul> instead of <div>s
33         (OneLinePerBuildOneBuilder.body): same
35         * contrib/darcs_buildbot.py (makeChange): handle moved files too,
36         by adding the file's new name to the list of changed files. This
37         ought to be sufficient for things like isFileImportant and trial
38         tests that only exercise tests for files that have been modified.
39         Closes #31.
41         * buildbot/status/web/xmlrpc.py (XMLRPCServer): add preliminary
42         XMLRPC server to the WebStatus page. This only has two methods
43         right now (getAllBuildsInInterval and getBuild), but we'll be
44         adding more in the future. This server is extracted from the
45         trac-plugin branch.
47         * buildbot/status/web/baseweb.py (OneLinePerBuild): refactor using
48         generateFinishedBuilds, and improve the data displayed.
49         * buildbot/status/web/build.py (StatusResourceBuild): rearrange
50         the per-Build page, add some information like ETA and got_revision
51         * buildbot/status/web/builder.py (StatusResourceBuilder): same,
52         adding a list of recently completed builds
53         * buildbot/status/web/base.py (css_classes): factor this out
55         * buildbot/interfaces.py (IStatus.generateFinishedBuilds): define
56         new method, to make status display classes easier to write,
57         especially the WebStatus 'one_line_per_build' page.
58         (IBuilderStatus.generateFinishedBuilds): same
59         * buildbot/status/builder.py (BuilderStatus.generateFinishedBuilds):
60         (Status.generateFinishedBuilds): implement it
62         * buildbot/process/factory.py (GNUAutoconf.__init__): allow
63         'source' to be a BuildStep instance, since BuildFactory accepts
64         them now.
65         (CPAN.__init__): same
66         (Distutils.__init__): same
67         (Trial.__init__): same
69         * buildbot/interfaces.py (IBuildStatus.getProperty): note that
70         this might raise KeyError
72 2007-08-07  Brian Warner  <warner@lothar.com>
74         * buildbot/slave/commands.py (P4): use 'p4user' to construct the
75         'Owner:' field of the view, rather than 'p4logname', since
76         p4logname comes from the buildslave's environment and seems
77         unlikely to ever do the right thing. Thanks to Wade Brainerd for
78         the patch. Closes #40.
80         * buildbot/buildslave.py (BuildSlave.__init__): add max_builds=,
81         which imposes a per-slave limit on how many builds are allowed to
82         run simultaneously. This has a the same scope than the SlaveLock,
83         but is different because max_builds= gives the buildmaster the
84         freedom to assign the build to a different slave, whereas the
85         SlaveLock doesn't get tested until after the build is irrevocably
86         assigned to a slave. Therefore using max_builds= will improve
87         utilization in the presence of multiple buildslaves that are
88         attached to the same Builder. This completes the incorporation of
89         Dustin Mitchell's patches, and closes ticket #48. Thanks Dustin!
90         * buildbot/process/builder.py (SlaveBuilder.buildFinished): when
91         any Builder finishes, potentially trigger *all* Builders, since
92         max_builds= may have stalled someone else while waiting for the
93         slave.
94         * buildbot/scripts/sample.cfg: mention max_builds=
95         * buildbot/test/test_run.py (ConcurrencyLimit): test it
96         * docs/buildbot.texinfo (Buildslave Specifiers): document it
98         * buildbot/test/test_run.py (CanStartBuild._do_test2): tests which
99         inherit from RunMixin do not need to call master.stopService()
100         themselves, since RunMixin.tearDown does that. The double call
101         fails on Twisted-2.0.x, which didn't happen to protect against it.
102         * buildbot/test/test_slaves.py (BuildSlave.test_track_builders): same
104         * buildbot/buildslave.py (BuildSlave.addSlaveBuilder): third patch
105         from #48, this one to have the BuildSlave objects track
106         SlaveBuilders, so they'll be able to use that knowledge to
107         influence their canStartBuild() response.
108         * buildbot/process/builder.py (SlaveBuilder.attached): call it
109         (SlaveBuilder.detached): same
110         * buildbot/test/test_slaves.py (BuildSlave): test it
112         * buildbot/buildslave.py (BuildSlave.canStartBuild): incorporate
113         the second of Dustin's #48 patches, this one adding a method to
114         the BuildSlave that allows it to decide whether it is willing to
115         participate in a build or not.
116         (SlaveBuilder.isAvailable): use canStartBuild() to decide
118         * buildbot/test/test_run.py (CanStartBuild): test for it
120         * all: incorporate the first of four patches by Dustin Mitchell
121         from ticket #48, working towards improving control over slave
122         concurrency. The first patch is to use a long-lived BuildSlave
123         object per slave, on which other behavior can be added later. I've
124         modified his patch considerably.
125         * buildbot/buildslave.py (BuildSlave): move class out of
126         slave/__init__.py (where it would get loaded by the slave as well
127         as the master, making dependencies trickier), and merge it with
128         BotPerspective. Now these BuildSlave instances are created once in
129         the master.cfg file, and not destroyed until they are either
130         removed from the config file or changed so
131         much (name/password/class changes) that we cannot continue to use
132         the old one. This affects config files: they must use
133         'from buildbot.buildslave import BuildSlave' instead of using
134         'from buildbot.slave import BuildSlave'.
135         * buildbot/master.py: move BotPerspective out
136         (BuildMaster.loadConfig_Slaves): examine old and new slaves,
137         add or remove as necessary, update the rest using data from
138         the new config file.
139         * buildbot/slave/__init__.py: move BuildSlave out
140         * buildbot/test/test*.py: import BuildSlave from the new place
141         * buildbot/scripts/sample.cfg: update to match
142         * docs/buildbot.texinfo: update to match
143         * buildbot/process/builder.py: update comments to match
145 2007-08-02  Brian Warner  <warner@lothar.com>
147         * buildbot/status/web/baseweb.py (OneLinePerBuild): improve
148         one-line-per-build pages a bit, add a header, refactor slightly
150         * buildbot/test/test_maildir.py (MaildirTest.testMaildir): cleanup
151         the TimeOutError timer, patch by Dustin Mitchell.
153 2007-08-01  Brian Warner  <warner@lothar.com>
155         * buildbot/status/web/baseweb.py (OneLinePerBuild): make this
156         mostly work (branch= is still ignored, we need a useful header)
157         (OneLinePerBuildOneBuilder.body): this too
159         * buildbot/status/web/builder.py (StatusResourceBuilder.force):
160         bring this up-to-date w.r.t. recent refactorings, and fix
161         redirections to bounce the browser to the top page after hitting
162         the 'force' button. This needs to be improved, but at least it now
163         redirects to a valid page.
164         (StatusResourceBuilder.ping): same
165         (StatusResourceBuilder.getChild): same, although I think this code
166         might be dead anyways
168         * buildbot/status/web/waterfall.py (WaterfallStatusResource): add
169         a branch= query argument, to filter the display down to builds and
170         changes that involve the given branch. You can add multiple
171         branch= arguments to see multiple branches (using a logical OR).
172         Note that there is no way to include the default branch (i.e.
173         None, i.e. trunk) yet, there is still work to be done to allow for
174         simple+uniform names of branches (i.e. removing the VC-specific
175         details of how branches are implemented, so calling the branch
176         'beta4' even though the SVN checkout step requires
177         'branches/beta4').
178         * buildbot/status/builder.py (BuilderStatus.eventGenerator): same
179         * buildbot/changes/changes.py (ChangeMaster.eventGenerator): same
180         * buildbot/interfaces.py (IEventSource.eventGenerator): same
181         * docs/buildbot.texinfo (Buildbot Web Resources): document it
183         * all: bring import statements up-to-date: don't import
184         __future__, assume cPickle and cStringIO are always available.
185         Also remove #!/usr/bin/python lines from non-scripts, my editor
186         has been a bit over-enthusiastic about stuffing them into new .py
187         files.
189         * buildbot/status/web/index.html: put a link to the waterfall page
190         on the index, otherwise first-time users of WebStatus aren't going
191         to see anything very interesting.
193         * buildbot/interfaces.py (IEventSource): document this interface.
194         Thanks to Dustin Mitchell for the patch. Closes #60.
195         * buildbot/status/builder.py (BuilderStatus): same
196         * buildbot/changes/changes.py (ChangeMaster): same
198         * buildbot/status/web/waterfall.py (WaterfallStatusResource.buildGrid):
199         add a query arg of 'show_events=true' to display non-build events,
200         like slaves attaching/detaching and reconfig events, or
201         'show_events=false' to hide them. The default is 'true'.
202         * docs/buildbot.texinfo (Buildbot Web Resources): document it
204         * web-parts: merge in web-parts branch. Lots of changes. The new
205         functionality is to add buildbot.status.html.WebStatus, which is a
206         superset of the Waterfall that adds new status pages and serves
207         regular files from BASEDIR/public_html/ , which is now the preferred
208         place to put robots.txt, buildbot.css, and index.html .
209         * buildbot/scripts/runner.py: the 'create-master' command now
210         creates public_html/ too, and populates it with a couple of
211         static files.
212         * buildbot/status/web: split waterfall code into smaller pieces
214 2007-07-31  Brian Warner  <warner@lothar.com>
216         * buildbot/scripts/startup.py (launch): import twistd.run in a
217         different way to hush pyflakes
218         * buildbot/process/builder.py: remove unused import
220 2007-07-30  Brian Warner  <warner@lothar.com>
222         * buildbot/interfaces.py (ISourceStamp): cleanup patch by Dustin
223         Mitchell: pass SourceStamps around rather than branch/version/etc
224         tuples. Thanks Dustin! Closes #70.
225         * buildbot/sourcestamp.py (SourceStamp): insist that .changes is a
226         tuple rather than a list, to avoid surprising mutations
227         * buildbot/process/builder.py (BuilderControl.resubmitBuild): same
228         * buildbot/status/mail.py (MailNotifier.buildMessage): same
229         * buildbot/status/builder.py (BuildStatus.getSourceStamp): same
230         * buildbot/test/test_status.py (Subscription): same
231         * buildbot/test/test_control.py (Force): same
232         * buildbot/test/test_buildreq.py (Request.testMerge): same
234 2007-07-29  Brian Warner  <warner@lothar.com>
236         * buildbot/scripts/sample.cfg: remove the spurious 'builders'
237         variable, since it wasn't used and is confusing in the presence of
238         c['builders'] (which *is* used). Thanks to Thomas Vander Stichele
239         for the suggestion.
241         * buildbot/status/web/waterfall.py (WaterfallStatusResource): update
242         the Buildbot home-page link to point at buildbot.net instead of 
243         sourceforge, and add a current-version query parameter so we can
244         get some statistics on which versions are in use out there.
246 2007-07-28  Brian Warner  <warner@lothar.com>
248         * buildbot/master.py (BuildMaster.loadConfig): replace c['sources']
249         with c['change_source'], leaving c['sources'] for backwards
250         compatibility (but deprecated), scheduled for removal in 0.8.0
251         * docs/buildbot.texinfo: same
252         * buildbot/test/test_config.py: verify that c['sources'] still works
253         * buildbot/test/test_*.py: replace c['sources'] with c['change_source']
254         * buildbot/scripts/sample.cfg: update to match
256         * buildbot/changes/mail.py (MaildirSource): parse with python's
257         stdlib 'email' module, which has been available since python2.2,
258         and drop use of the 'rfc822' module, which has been depreceated
259         since python2.3 .
260         * buildbot/test/test_maildir.py: same: use parse_file() not parse
262         * buildbot/test/test_maildir.py (MaildirTest.testMaildir): oops,
263         this needs to match the renaming in test/mail/msg*
265         * README (SETTING UP A BUILD MASTER): fix capitalization-typo.
266         Closes SF#1752648.
268         * buildbot/test/test_mailparse.py: rename sample emails a bit
269         * buildbot/test/mail/msg*: same
271         * buildbot/changes/mail.py (SVNCommitEmailMaildirSource): add a
272         parser for the "commit-email.pl" script that is shipped with SVN,
273         written by Justin Mason. Thanks! Closes SF#1072845.
274         * buildbot/test/mail/svn-commit.*: sample messages
275         * buildbot/test/test_mailparse.py (TestSVNCommitEmail): test it
276         * docs/buildbot.texinfo (SVNCommitEmailMaildirSource): docs
278 2007-07-27  Brian Warner  <warner@lothar.com>
280         * buildbot/changes/mail.py: refactor: move parsing into a method
281         named 'parse', each parser type gets a separate subclass. Remove
282         the old 'sep' argument (hardcode it to '/'), fix usage of prefix=
283         to be a simple leading-substring match. Add a warning to the logs
284         if prefix= does not end in a slash, since that's probably a
285         mistake. Fix both places where a prefix= mismatch would skip all
286         subsequent files in the same email, instead of just skipping the
287         one that didn't match.
288         * buildbot/test/test_mailparse.py: match changes
290         * docs/buildbot.texinfo (Getting Source Code Changes): refactor
291         docs on email-based ChangeSources
293         * docs/buildbot.texinfo (Getting Source Code Changes): move all
294         the changesource types up a level, removing the one-entry menu in
295         the process
297         * buildbot/master.py (BuildMaster.loadConfig_Slaves): rename
298         c['bots'] to c['slaves'], and use buildbot.slave.BuildSlave
299         instances instead of tuples. Closes #63.
300         * buildbot/slave/__init__.py (BuildSlave): define marker class
301         * buildbot/scripts/sample.cfg: use c['slaves'] in sample config
302         * docs/buildbot.texinfo (Buildslave Specifiers): document c['slaves']
303         * buildbot/test/test_*.py: update tests to match
304         * buildbot/test/test_config.py (ConfigTest.testBots): verify that
305         the c['bots'] backwards-compatibility handler works
307 2007-07-26  Brian Warner  <warner@lothar.com>
309         * buildbot/changes/hgbuildbot.py (hook): add an in-process
310         Mercurial change-sending hook, contributed by Frederic Leroy.
311         Thanks! Addresses #50.
312         * docs/buildbot.texinfo (MercurialHook): document it
314         * buildbot/changes/hgbuildbot.py: change the way imports are done,
315         to make it compatible with at least hg-0.9.1 and the current 0.9.4
317 2007-07-17  Brian Warner  <warner@lothar.com>
319         * buildbot/process/buildstep.py (BuildStep.getLog): add a
320         convenience method to retrieve a log added with
321         addLog()/addCompleteLog()/etc or logfiles= . I should have added
322         this two years ago..
324 2007-07-03  Brian Warner  <warner@lothar.com>
326         * buildbot/slave/commands.py (ShellCommand._startCommand): when
327         logging the environment variables, put one variable on each line,
328         rather than having one really long line with all of them. This
329         should make them a bit more readable and not trigger the
330         horizontal scrollbar (when viewing it in a web browser) quite so
331         much. Thanks to Albert Hofkamp for the patch.
333         * buildbot/steps/shell.py (ShellCommand): allow workdir= to be a
334         WithProperties instance. Thanks to Axel Hecht for the patch.
335         Closes #43.
336         * buildbot/test/test_properties.py (Interpolate.testWorkdir): test it
337         * docs/buildbot.texinfo (Build Properties): document it
338         * buildbot/slave/commands.py (ShellCommand._startCommand): create the
339         workdir if it didn't already exist.
341         * docs/buildbot.texinfo (Scheduler Types): correct the description
342         of Dependent schedulers. Thanks to Greg Ward for the patch.
344         * buildbot/steps/source.py (SVN.startVC): when applying a patch,
345         add "[patch]" to the step's display. Thanks to Dustin Mitchell for
346         the patch. Closes #49.
348         * buildbot/slave/commands.py (rmdirRecursive): chmod everything to
349         0700 before removing it, to deal with situations where a build will
350         leave files around without write permissions and the 'copy' or
351         'clobber' VC checkout modes need to blow away the tree first.
352         Thanks to Steve Milner for the suggestion and the patch (which I
353         mangled horribly). Closes #29.
354         * buildbot/test/test_slavecommand.py (Utilities.test_rmdirRecursive):
355         test for it
357         * buildbot/test/runutils.py (RunMixin.disappearSlave): oops, add
358         an allowReconnect= argument to let callers control whether they
359         want this don't-let-it-reconnect behavior, since some tests care.
360         Factor out the .continueTrying=False lines from those callers.
361         * buildbot/test/test_slaves.py: same
362         * buildbot/test/test_run.py: same
364 2007-07-02  Brian Warner  <warner@lothar.com>
366         * buildbot/test/runutils.py (RunMixin.disappearSlave): once a
367         slave has been disappeared, don't let it reconnect. This was
368         causing an intermittent failure in test_slaves.py, when the slave
369         that was supposed to be gone managed to come back by the end of
370         the test and affect the count.
371         * buildbot/test/test_slaves.py (Slave.testFallback2): minor
372         refactorings
373         * buildbot/process/builder.py (SlaveBuilder.__repr__): added some
374         diagnostic messages to track down this problem
375         (Builder.startBuild): same
377         * buildbot/process/builder.py (Builder.maybeStartBuild): choose
378         the slave randomly rather than always taking the first one. Thanks
379         to Pike for the patch. Closes #36.
380         * buildbot/test/test_slaves.py: match the change. to avoid huge
381         changes to the tests, I added a CHOOSE_SLAVES_RANDOMLY flag which
382         enables/disables the round-robin-ness (enabled by default), and
383         some unit tests disable it.
384         * docs/buildbot.texinfo (Buildmaster Architecture): document it
386         * buildbot/slave/bot.py (BuildSlave.__init__): rename the 'host'
387         argument to 'buildmaster_host', to make it more obvious that this
388         points to the buildmaster. Thanks to Bob Proulx for the
389         suggestion.
390         * buildbot/scripts/runner.py (slaveTAC): same
391         * buildbot/test/test_runner.py (Create.testSlave): match the change
393         * contrib/hg_buildbot.py: patch from Frederic Leroy to make this
394         work better.
396 2007-06-17  Brian Warner  <warner@lothar.com>
398         * buildbot/test/test_config.py (Factories.testAllSteps): make sure
399         we can round-trip all of our current step classes by calling
400         getStepFactory() and using the results to make a clone of the
401         original step.
403         * buildbot/steps/maxq.py: fix import errors. Guess this hasn't been
404         used in a while..
406         * buildbot/process/factory.py (BuildFactory.addStep): To simplify
407         the config file, we're moving to using actual instances instead of
408         the (class, kwargs) 'step specification' tuples. BuildFactory
409         still keeps a list of tuples internally, but when real instances
410         are passed in to addStep(), they are asked for their class and
411         kwargs using the new BuildStep.getStepFactory method. BuildFactory
412         accepts both instances and the tuple form, and converts instances
413         to the tuple form, but the instance form is preferred because it
414         gives the Steps a chance to do argument validation. Closes: #11.
416         * buildbot/process/buildstep.py (BuildStep.__init__): record the
417         factory information necessary to implement getStepFactory. The
418         addFactoryArguments() method can be used to include arguments that
419         aren't passed to the BuildStep base class constructor.
420         (BuildStep.setBuild):
421         (BuildStep.setDefaultWorkdir): new methods to take parameters that
422         are needed for live BuildSteps but not to construct the specification
423         tuples that are stashed in the factory.
425         * buildbot/process/base.py (Build.setupBuild): pass 'build' and
426         'workdir' into new BuildSteps by using methods instead of
427         arguments. This makes the constructor for BuildSteps a lot
428         simpler.
430         * buildbot/steps/*.py: update to match this change. Basically this
431         means adding calls to addFactoryArguments() in the __init__
432         methods to capture the arguments that aren't passed through to the
433         base class.
434         * buildbot/steps/shell.py (ShellCommand.setDefaultWorkdir): copy
435         the new workdir (if any) into the RemoteShellCommands arguments.
436         * buildbot/steps/source.py: allow workdir= to be optional,
437         implement setDefaultWorkdir() since we don't inherit from
438         (CVS): finally remove old clobber=/export=/copydir= arguments,
439         in favor of the mode= argument that's been around forever now.
440         * buildbot/steps/transfer.py: remove build= argument
442         * buildbot/test/*.py: update to match, generally by turning all
443         build= arguments into subsequent calls to s.setBuild()
444         * buildbot/test/test_config.py (Factories): verify that we can
445         use either BuildStep instances or class/kwarg tuples in both
446         BuildFactory.addStep and BuildFactory.__init__
448         * docs/buildbot.texinfo (Build Steps): document the new approach,
449         mention compatibility with the old approach, update all examples
450         to use the new style.
452 2007-06-16  Brian Warner  <warner@lothar.com>
454         * buildbot/changes/svnpoller.py: when the poll fails, don't kill
455         the LoopingCall, just eat the failure so that we'll poll again
456         next time. This should allow us to tolerate (e.g.) sf.net SVN
457         failures more gracefully. Many thanks to Dustin Mitchell for the
458         patch. Closes #34.
460 2007-05-17  Brian Warner  <warner@lothar.com>
462         * buildbot/status/words.py: refactor the IRC status bot into
463         separate 'Contact' and 'Channel' classes. The base Contact class
464         contains the interaction code: commands and responses. The
465         IRCContact subclass (and IrcStatusBot 'Channel') handle the
466         IRC-specific aspects. The plan is to write other subclasses for
467         other IM protocols like AIM and Jabber.
469 2007-04-16  Brian Warner  <warner@lothar.com>
471         * CREDITS: update list of contributors. Thank you all!
473 2007-04-13  Brian Warner  <warner@lothar.com>
475         * buildbot/status/mail.py (MailNotifier): add the project name to
476         the subject line and message body, to make it easier to
477         distinguish email coming from different buildmasters. Thanks to
478         Benoit Sigoure for the patch.
479         * buildbot/test/test_status.py (Mail): update to match
481 2007-03-24  Brian Warner  <warner@lothar.com>
483         * buildbot/steps/transfer.py: open all files in 'b' binary mode to
484         avoid text-conversion problems between DOS/windows and unix.
485         Thanks to Phil Thompson for the patch. Fixes SF#1674927.
487 2007-03-03  Brian Warner  <warner@lothar.com>
489         * buildbot/status/html.py (_hush_pyflakes): hush a pyflakes
490         warning about the use of Waterfall here
492 2007-03-01  Brian Warner  <warner@lothar.com>
494         * buildbot/interfaces.py (IStatus.getBuilder): mention exceptions
496 2007-02-28  Brian Warner  <warner@lothar.com>
498         * buildbot/changes/p4poller.py (P4Source): apply change from Scott
499         Lamb to use a more optimal form of 'p4 changes', to reduce server
500         load. He reports that this optimization was added to p4d release
501         2005.2, but it should work in all versions. Closes #27.
502         * buildbot/test/test_p4poller.py: match it
504 2007-02-27  Brian Warner  <warner@lothar.com>
506         * buildbot/status/web/*.py: move all web status stuff into a
507         separate directory, in anticipation of splitting it into smaller
508         pieces and adding more files. html.py was getting way too big.
509         * buildbot/status/classic.css: move it too
510         * setup.py: add the new sub-package
511         * buildbot/test/test_web.py: match the changes
512         * MANIFEST.in: handle the move of classic.css
514 2007-02-07  Brian Warner  <warner@lothar.com>
516         * contrib/OS-X/*: add some launchd .plist files for automatically
517         starting a buildmaster or buildslave under OS-X (10.4 or later).
518         Thanks to Mark Pauley for these.
520 2007-02-06  Brian Warner  <warner@lothar.com>
522         * docs/buildbot.texinfo (Requirements): update requirements to
523         stop claiming compatibility with python-2.2 or twisted-1.3.x .
524         Closes #13.
525         * README: mention python-2.5 and twisted-2.5 compatibility
527         * buildbot/clients/debug.py: hush pyflakes warnings by removing a
528         redundant import
529         * buildbot/scripts/startup.py: same, by removing twisted-1.3.0
530         compatibility
531         * buildbot/status/builder.py: same, by requiring cStringIO
532         * buildbot/status/words.py: same, remove twisted-1.3.0 compat
533         * buildbot/test/test_vc.py: same
534         * buildbot/test/test_web.py:
535         * buildbot/test/test_steps.py: same, remove unused import
537         * buildbot/status/html.py (StatusResourceBuild.body): oops, close
538         the FORM tag
540         * buildbot/master.py (BuildMaster.loadConfig): warn the user if we
541         see any Builders that don't have Schedulers to drive them
543         * buildbot/master.py (BotPerspective.__repr__): fit bitrot, the
544         attributes this uses went away
546         * contrib/bb_applet.py (MyApplet.filled): add a small prefs
547         dialog, to allow you to reset the buildmaster and force
548         connect/disconnect. Correctly handle losing the buildmaster
549         connection (by switching the display to the hexnut, at which point
550         you can use the 'Connect' menu item to reconnect).
552         * buildbot/steps/source.py (Source.start): if we're using a patch,
553         add it as a LogFile to the checkout/update step. This will turn
554         into a link on the waterfall page.
556         * buildbot/scripts/tryclient.py (Try.createJob): implement --diff
557         option, to take the patch from a pre-made file rather than
558         generating it from the local tree. Thanks to Robert Helmer for the
559         idea. Closes #15 (the Trac ticket on the new http://buildbot.net/).
560         * buildbot/scripts/runner.py (TryOptions): add --diff,
561         --patchlevel, and --baserev options
562         * buildbot/scheduler.py (Try_Jobdir.parseJob): treat a baserev of ""
563         as None, meaning HEAD.
564         * buildbot/sourcestamp.py (SourceStamp): update docstring to
565         indicate that baserev=None means HEAD
566         * docs/buildbot.texinfo (try --diff): document it
568         * buildbot/test/test_steps.py (BuildStep): remove use of
569         reactor.iterate(), although the technique I replaced it with is a
570         gross polling hack that must be cleaned up properly some day. This
571         was the last use of reactor.iterate in the entire tree, yay.
573 2007-02-05  Brian Warner  <warner@lothar.com>
575         * buildbot/status/mail.py (MailNotifier.__init__): assert that 'mode'
576         is one of the three known values, otherwise we emit some confusing
577         messages later on. Thanks to Grig Gheorghiu for the catch.
579 2007-01-30  Brian Warner  <warner@lothar.com>
581         * buildbot/changes/bonsaipoller.py (BonsaiParser.__init__): Ben
582         Hearsum contributed a patch to let BonsaiPoller work with results
583         that contain non-ascii characters. Closes SF#1632641.
585 2007-01-27  Brian Warner  <warner@lothar.com>
587         * Makefile (release): produce both .tar.gz and .zip source bundles.
588         Closes SF#1222216.
590 2007-01-23  Brian Warner  <warner@lothar.com>
592         * buildbot/changes/freshcvsmail.py: hush a pyflakes warning
593         * buildbot/changes/monotone.py: same
595         * buildbot/changes/maildir.py: combine several files into one,
596         clean up maildir.py to use Services properly.
597         * buildbot/changes/maildirtwisted.py: remove
598         * buildbot/changes/maildirgtk.py: remove, it wasn't used by
599         buildbot anyways.
600         * buildbot/changes/mail.py: match the change
601         * buildbot/scheduler.py: same, since Try_Jobdir uses a maildir
602         * buildbot/test/test_maildir.py: remove use of reactor.iterate()
604         * buildbot/slave/commands.py (command_version): bump to "2.3" to
605         indicate that the buildslave knows about the 'bzr' command
607 2007-01-22  Brian Warner  <warner@lothar.com>
609         * buildbot/process/builder.py (Builder.fireTestEvent): don't use
610         'with', it will become a reserved work in python2.6 .
612         * contrib/bb_applet.py: add a simple gnome-panel applet, to
613         display a terse summary of buildbot status.
614         * docs/hexnut32.png, docs/hexnut48.png, docs/hexnut64.png: add
615         some icons, small versions of the Blender object that lives in
616         docs/images/icon.blend
618         * buildbot/steps/source.py (Bzr): add Bazaar-ng support
619         * buildbot/slave/commands.py (Bzr): same
620         * buildbot/scripts/tryclient.py (BzrExtractor): same
621         (SourceStampExtractor.dovc): modify this to allow non-zero exit
622         status, since 'bzr diff' does that
623         * buildbot/test/test_vc.py (Bzr): same
624         * docs/buildbot.texinfo (How Different VC Systems Specify Sources):
625         add notes on bzr
626         (Bzr): document it
628 2007-01-20  Brian Warner  <warner@lothar.com>
630         * contrib/darcs_buildbot.py: tidy up the progress messages
632 2007-01-17  Brian Warner  <warner@lothar.com>
634         * contrib/darcs_buildbot.py: enhance to handle multiple patches
635         being pushed at a time. This keeps state in the repository in a
636         small file named .darcs_buildbot-lastchange, but that shouldn't
637         interfere with normal repository operations. Fixes SF#1534049.
638         * buildbot/clients/sendchange.py (Sender): make a single Sender
639         capable of sending Changes with different usernames.
641 2006-12-11  Brian Warner  <warner@lothar.com>
643         * buildbot/changes/freshcvsmail.py: mark this file as deprecated,
644         scheduled for removal in 0.7.7 . The FCMaildirSource was moved to
645         buildbot.changes.mail a long time ago, but I forgot to add the
646         DeprecationWarning until now.
648         * buildbot/process/maxq.py: remove this, the functionality now
649         lives in buildbot.steps.maxq
651         * buildbot/clients/debug.py: remove an unnecessary gnome.ui import
652         * buildbot/clients/gtkPanes.py: remove unused import
654         * buildbot/slave/trial.py: remove an unused/incomplete/buggy file,
655         that was meant to provide a special Reporter to run inside trial
656         and give the buildslave lots of machine-readable status. We never
657         finished this project.
659         * buildbot/changes/bonsaipoller.py: remove unused imports
660         * buildbot/changes/svnpoller.py: same
661         * buildbot/process/builder.py: same
662         * buildbot/process/buildstep.py: same
663         * buildbot/slave/bot.py: hush pyflakes warning
664         * buildbot/status/tests.py: remove unused imports
665         * buildbot/status/tinderbox.py: same
666         * buildbot/steps/python_twisted.py: same
668         * buildbot/process/step.py: remove this file, these names were
669         deprecated in 0.7.5 and are now being removed.
670         * buildbot/process/step_twisted.py: same
671         * buildbot/test/test_steps.py (ReorgCompatibility): remove test
673         * buildbot/twcompat.py: remove the empty file, yay it is gone
675         * buildbot/twcompat.py (waitForDeferred): remove the monkeypatch,
676         tw-2.0.0 and newer have the method we need.
677         (getProcessOutputAndValue): same
678         (which): remove this method, tw-2.0.0 t.p.procutils has it
680         * buildbot/twcompat.py (implements): remove this method
681         * buildbot/*: import implements() from zope.interface directly
683         * buildbot/status/mail.py: stop falling back to importing
684         twisted.protocols.smtp.sendmail, now that we don't need tw-1.3.0
685         support
687         * buildbot/twcompat.py (Interface): remove this import
688         * buildbot/*: import Interface from zope.interface directly
690         * buildbot/twcompat.py (providedBy): remove this method
691         * buildbot/*: turn all uses of providedBy(obj, iface) into
692         iface.providedBy(obj)
694         * buildbot/twcompat.py (maybeWait): remove this method, now that
695         we no longer maintain compatibility with Twisted<=1.3.0 .
696         Twisted-2.0.0 and later allow trial methods to return Deferreds
697         directly.
698         * buildbot/test/*: remove all uses of maybeWait
700         * buildbot/__init__.py (version): bump to 0.7.5+ while between
701         releases
702         * docs/buildbot.texinfo: same
704 2006-12-10  Brian Warner  <warner@lothar.com>
706         * buildbot/__init__.py (version): Releasing buildbot-0.7.5
707         * docs/buildbot.texinfo: set version to match
709 2006-12-10  Brian Warner  <warner@lothar.com>
711         * README (REQUIREMENTS): update for release
712         * NEWS: update for release
713         * buildbot/slave/commands.py (command_version): mention that this
714         version (2.2) was released with buildbot-0.7.5
716         * buildbot/test/test_config.py (StartService.testStartService):
717         inhibit the usual read-config-on-startup behavior, since otherwise
718         the log.err that gets recorded causes the test to fail
720         * buildbot/status/builder.py (LogFile.finish): forget about all
721         subscribers once the log has finished, since after that point
722         we're never going to use them again. This might help free up some
723         memory somewhere.
725         * buildbot/clients/debug.py: update to use gtk.main_quit() rather
726         than the old/deprecated gtk.mainquit()
728 2006-12-09  Brian Warner  <warner@lothar.com>
730         * buildbot/steps/transfer.py (_FileWriter.__del__): handle errors
731         better when we can't open the masterdst file
733         * buildbot/scripts/startup.py (Follower._failure): add missing
734         import statement for BuildSlaveDetectedError
736         * buildbot/steps/transfer.py (FileUpload): cleanup
737         (FileDownload): same. Add tests for slave version, add mode=.
738         * buildbot/slave/commands.py (SlaveFileUploadCommand): same
739         (SlaveFileDownloadCommand): same
740         * buildbot/test/test_transfer.py: enhance tests
741         * buildbot/test/runutils.py (makeBuildStep): create a fake form of
742         step.slaveVersion
744 2006-12-08  Brian Warner  <warner@lothar.com>
746         * buildbot/scripts/runner.py (sendchange): halt the reactor on
747         both success *and* failure. Without this, the 'buildbot
748         sendchange' command would hang if it could not contact the
749         buildmaster or deliver the Change, which would generally cause the
750         user's commit/record/checkin command to hang too. Thanks to
751         Christian Unger for the catch.
753 2006-12-06  Brian Warner  <warner@lothar.com>
755         * NEWS: update with items for the next release
757         * docs/buildbot.texinfo (Adding LogObservers): add a somewhat
758         whimsical example pulled from a punch-drunk email I sent out late
759         one night.
760         (Transferring Files): document some of the other parameters
761         (Adding LogObservers): update to 0.7.5 buildbot.steps.*
762         (SVNPoller): rename svnpoller.SvnSource to SVNPoller
763         * buildbot/test/test_svnpoller.py: same
764         * buildbot/changes/svnpoller.py (SVNPoller): same
766 2006-11-26  Brian Warner  <warner@lothar.com>
768         * docs/buildbot.texinfo (Build Properties): remind users that
769         WithProperties must appear in a command= list, not as a top-level
770         instance.
771         * buildbot/steps/shell.py (ShellCommand.start): and assert that
772         we're sending a list or a single string to the RemoteShellCommand
774         * buildbot/scheduler.py (Nightly): Improve docs slightly.
776         * buildbot/scripts/startup.py (start): skip the whole
777         watch-the-logfile thing under windows, since it needs os.fork()
779         * buildbot/scripts/runner.py (restart): remove the old message
780         that got printed after the buildbot was restarted.. it most cases
781         it didn't get printed at the right time anyways
783 2006-11-25  Brian Warner  <warner@lothar.com>
785         * buildbot/scripts/runner.py: enhance 'start' and 'restart' to
786         follow twistd.log and print lines until the process has started
787         started properly. For the buildmaster, this means until the config
788         file has been parsed and accepted. For the buildslave, this means
789         until we've connected to the master. We give up after 5 seconds in
790         any case. Helpful error messages and troubleshooting suggestions
791         are printed when we don't see a successful startup. This closes the
792         remainder of SF#1517975.
793         * buildbot/scripts/startup.py: moved app startup code to here
794         * buildbot/scripts/logwatcher.py: utility class to follow log
795         * buildbot/scripts/reconfig.py: rewrite to use LogWatcher
796         * buildbot/slave/bot.py: announce our BuildSlaveness to the log
797         so the LogWatcher can tell the difference between a buildmaster
798         and a buildslave
800 2006-11-24  Brian Warner  <warner@lothar.com>
802         * docs/examples/twisted_master.cfg: update to match the version
803         in use on twistedmatrix.com
804         (IRC): re-enable IRC bot. The 'irc.us.freenode.net' hostname I
805         was using before stopped working, but 'irc.freenode.net' works
806         just fine.
808         * buildbot/scripts/runner.py (run): oops, forgot to enable the new
809         'reconfig' command
811         * buildbot/clients/base.py (TextClient.not_connected): upon
812         UnauthorizedLogin failures, remind the user to connect to the
813         PBListener port instead of the slaveport.
814         (TextClient.disconnected): shut down more quietly
815         * docs/buildbot.texinfo (statuslog): add another reminder
817         * buildbot/scripts/runner.py (Options.subCommands): rename
818         'buildbot sighup DIR' to 'buildbot reconfig DIR', but keep
819         'sighup' as an alias.
820         * buildbot/scripts/reconfig.py (Reconfigurator): enhance the
821         reconfig command to follow twistd.log and print all of the lines
822         from the start of the config-file reload to its completion. This
823         should make it a lot easier to discover bugs in the config file.
824         Use --quiet to disable this behavior. This addresses half of
825         SF#1517975, the other half will be to add this same utility to
826         'buildbot start' and 'buildbot restart'.
827         * docs/buildbot.texinfo (Loading the Config File): same
828         (Shutdown): same
830         * buildbot/interfaces.py (IBuilderControl.forceBuild): remove this
831         method, it has been deprecated for a long time. Use
832         IBuilderControl.requestBuild instead.
833         * buildbot/process/builder.py (BuilderControl.forceBuild): remove
834         * buildbot/master.py (BotPerspective.perspective_forceBuild): same
835         * buildbot/slave/bot.py (Bot.debug_forceBuild): same
836         * buildbot/test/test_control.py (Force.testForce): same
837         * buildbot/test/test_run.py: use requestBuild instead
839         * buildbot/clients/debug.py: replace 'Force Build' button with
840         'Request Build' (which just adds one to the queue), add Ping
841         Builder, add branch/revision fields to Request Build.
842         * buildbot/clients/debug.glade: same
843         * buildbot/master.py: update interface to match. This creates an
844         incompatibility between new debugclients and old buildmasters.
846         * buildbot/process/builder.py (Builder._attached): delay the call
847         to maybeStartBuild for a reactor turn, to avoid starting a build
848         in the middle of a reconfig (say, if the new Builder uses a new
849         slave which is already connected).
851 2006-11-23  Brian Warner  <warner@lothar.com>
853         * buildbot/test/test_transfer.py: appease pyflakes
854         * buildbot/test/test_steps.py: same
856         * buildbot/test/test_bonsaipoller.py: remove the 'import *' that
857         keeps pyflakes from finding undefined names
859         * buildbot/master.py (BuildMaster.loadConfig_Builders): changing a
860         Builder no longer induces a disconnect/reconnect cycle. This means
861         that any builds currently in progress will not be interrupted, and
862         any builds which are queued in the Builder will not be lost. This
863         is implemented by having the new Builder extract the state (i.e.
864         all pending Builds and any desired SlaveBuilders) from the old
865         Builder.
866         (BotPerspective): refactor. The BotPerspective no longer keeps
867         track of all the Builders that want to use this slave; instead, it
868         asks the BotMaster each time it needs this list. This removes
869         addBuilder and removeBuilder. Clean up attached() to acquire all
870         the slave's information in a more atomic fashion. updateSlave() is
871         now the way to make sure the slave is using the right set of
872         Builders: just call it after everything else has been
873         reconfigured.
874         (BotMaster): refactor, removing addBuilder/removeBuilder and
875         replacing them with an all-at-once setBuilders() call.
877         * buildbot/test/test_slaves.py (Reconfig): new test case to
878         exercise this functionality
879         * buildbot/steps/dummy.py (Wait): new dummy BuildStep for the test
880         * buildbot/slave/commands.py (WaitCommand): same
882         * docs/buildbot.texinfo (Loading the Config File): document the
883         changes
885         * buildbot/process/builder.py (SlaveBuilder): refactor. Allow the
886         SlaveBuilder to have its parent Builder changed.
887         (SlaveBuilder.isAvailable): new method to give access to state,
888         which is now a private attribute
889         (SlaveBuilder.buildStarted,buildFinished): new methods to inform
890         the SlaveBuilder about how it is being used. These methods update
891         its internal state. buildFinished() is now the place that invokes
892         maybeStartBuild() on its parent Builder.
893         (Builder.consumeTheSoulOfYourPredecessor): new method to allow a
894         new Builder to take over for an old one, transferring state from
895         the old one.
896         (Buider): refactor the way that SlaveBuilders are used to match,
897         giving them a bit more autonomy.
898         (Builder.buildFinished): this no longer calls maybeStartBuild():
899         instead the SlaveBuilder calls it on whoever its parent Builder is
900         at the time. This way, when an old Builder is replaced by a new
901         one, and there was a build in progress during the transition, when
902         that build finishes, it will be the new Builder that is told about
903         the newly available slave so it can start a new build.
905         * buildbot/process/base.py (Build.startBuild._release_slave): when
906         the Build finishes, tell the SlaveBuilder that they've been
907         released.
909         * buildbot/status/builder.py (SlaveStatus): add some new setter
910         methods for use by BotPerspective, to keep some attributes more
911         private
913         * buildbot/slave/bot.py (Bot.remote_getDirs): this is no longer
914         called by the buildmaster.
915         (Bot.setBuilderList): instead, we locally announce any leftover
916         directories based upon which Builders we were told about. The
917         master doesn't really care; it's the local admin who may or may not
918         wish to delete them.
921         * contrib/svn_buildbot.py: use /usr/bin/python, not /usr/bin/env,
922         to allow use of python2.4 or whatever. This tool still requires
923         python2.3 or newer.
925 2006-11-19  Brian Warner  <warner@lothar.com>
927         * NEWS (IStatusLog.readlines): more news items
929 2006-11-18  Brian Warner  <warner@lothar.com>
931         * NEWS: start collecting items for the next release.
933 2006-11-04  Brian Warner  <warner@lothar.com>
935         * buildbot/changes/bonsaipoller.py: apply updates from Ben
936         Hearsum. Closes SF#1590310.
937         * buildbot/test/test_bonsaipoller.py: and tests
939         * buildbot/status/tinderbox.py
940         (TinderboxMailNotifier.buildMessage): send out a "testfailed"
941         status when the build results in WARNINGS. Patch from Dave
942         Liebreich. Closes SF#1587352.
944         * buildbot/slave/commands.py (LogFileWatcher.poll): overcome a
945         linux-vs-osx behavior difference w.r.t. reading from files that
946         have reached EOF. This should fix LogFileWatcher on OS-X. Thanks
947         to Mark Rowe for the patch.
949 2006-10-15  Brian Warner  <warner@lothar.com>
951         * buildbot/interfaces.py (IStatus.getURLForThing): oops, the
952         method name was misspelled in the interface definition. Thanks to
953         Roy Rapoport for the catch.
955 2006-10-13  Brian Warner  <warner@lothar.com>
957         * docs/buildbot.texinfo (Adding LogObservers): update sample code
958         to match the great Steps renaming
960         * buildbot/steps/transfer.py (FileUpload.start): Fix stupid error.
961         Maybe I should run my own unit tests before recording a big
962         change. Good thing I've got a buildbot to remind me.
964 2006-10-12  Brian Warner  <warner@lothar.com>
966         * buildbot/steps/transfer.py: rework __init__ and args setup
967         * buildbot/slave/commands.py (SlaveFileDownloadCommand): minor
968         docs improvements
969         * buildbot/slave/commands.py (SlaveFileDownloadCommand.setup):
970         when opening the target file, only catch IOError (to report via
971         stderr/rc!=0), let the others be reported as normal exceptions
973 2006-10-08  Brian Warner  <warner@lothar.com>
975         * contrib/svn_watcher.py: fix security holes by using proper argv
976         arrays and subprocess.Popen() rather than commands.getoutput().
977         Thanks to Nick Mathewson for the patch. Note that svn_watcher.py
978         is deprecated in favor of buildbot/changes/svnpoller.py, and will
979         probably be removed by the next release.
980         * CREDITS: add Nick
982 2006-10-04  Brian Warner  <warner@lothar.com>
984         * buildbot/steps/python.py (PyFlakes.createSummary): skip any
985         initial lines that weren't emitted by pyflakes. When the pyflakes
986         command is run under a Makefile, 'make' will echo the command it
987         runs to stdio, and that was getting logged as a "misc" warning.
988         * buildbot/test/test_steps.py (Python.testPyFlakes2): test it
989         * buildbot/test/test_steps.py (testPyFlakes3): another test
991 2006-10-01  Brian Warner  <warner@lothar.com>
993         * buildbot/status/html.py (HtmlResource.render): if we get a
994         unicode object from our content() method, encode it into utf-8
995         like we've been claiming to all along. This allows the comments
996         and author names from svnpoller.py to be delivered properly.
998         * buildbot/changes/svnpoller.py (SvnSource.create_changes):
999         de-unicodify filenames before creating the Change, because the
1000         rest of buildbot is unlikely to handle them well. Leave the 'who'
1001         field as a unicode object.. I don't think there's anything that
1002         will break very soon, and it will probably nudge us towards
1003         accepting unicode everywhere sooner or later. Stop using the
1004         "date" field that comes out of SVN, since it is using the
1005         repository's clock (and timezone) and what we care about is the
1006         buildmaster's (otherwise Changes from the future show up later
1007         than the builds they triggered).
1008         * buildbot/test/test_svnpoller.py (Everything.test1): match the
1009         change to .when
1011         * buildbot/changes/svnpoller.py (SvnSource): added Niklaus Giger's
1012         Suvbersion repository polling ChangeSource. I've hacked it up
1013         considerably: any bugs are entirely my own fault. Thank you
1014         Niklaus!
1015         * buildbot/test/test_svnpoller.py: tests for it
1016         * docs/buildbot.texinfo (SvnSource): document it
1018 2006-09-30  Brian Warner  <warner@lothar.com>
1020         * buildbot/scheduler.py (Periodic): submit a reason= to the
1021         BuildSet to indicate which Scheduler triggered the build. Thanks
1022         to Mateusz Loskot for the suggestion.
1023         (Nightly): same
1024         * buildbot/test/test_scheduler.py (Scheduling.testPeriodic1): test it
1026         * buildbot/changes/p4poller.py (P4Source): some minor stylistic
1027         changes: set self.loop in __init__, remove unused volatile=
1029         * docs/buildbot.texinfo (.buildbot config directory): add more
1030         docs on the .buildbot/options keys used by "buildbot try"
1031         * buildbot/scripts/tryclient.py (Try.createJob): remove dead code
1032         (Try.deliverJob): same
1034         * buildbot/changes/bonsaipoller.py (BonsaiParser): more updates
1035         from Robert Helmer
1036         (BonsaiPoller): same
1038         * buildbot/slave/commands.py (LogFileWatcher.stop): explicitly
1039         close the filehandle when we stop watching the file. Before, the
1040         filehandle was only closed when the LogFileWatcher was
1041         garbage-collected, which could be quite a while in the future. If
1042         it was still open by the time the next build started, windows will
1043         refuse to let the new build delete the old build/ directory. Fixes
1044         SF#1568415, thanks to <scmikes>, <FireMoth>, and <radix> on
1045         #twisted for the catch.
1047 2006-09-29  Brian Warner  <warner@lothar.com>
1049         * buildbot/status/tinderbox.py (TinderboxMailNotifier): updates
1050         from Robert Helmer
1052 2006-09-25  Brian Warner  <warner@lothar.com>
1054         * setup.py: the new buildbot.steps module wasn't being installed.
1055         Thanks to Jose Dapena Paz for the catch, fixes SF#1560631.
1056         (testmsgs): add the extra stuff from buildbot/test/* so you can
1057         run unit tests on an installed copy of buildbot, not just from
1058         the source tree.
1060         * contrib/svn_buildbot.py (ChangeSender.getChanges): the first *4*
1061         columns of 'svnlook changed' output contain status information, so
1062         strip [:4] instead of [:6]. Depending upon what the status flags
1063         were, this would sometimes lead to mangled filenames. Thanks to
1064         Riccardo Magliocchetti for the patch. Closes SF#1545146.
1066         * buildbot/steps/source.py (Monotone): initial Monotone support,
1067         contributed by Nathaniel Smith. Still needs docs and tests, but
1068         this code has been in use on the Monotone buildbot for a long
1069         time now.
1070         * buildbot/slave/commands.py (Monotone): slave-side support
1071         * buildbot/changes/monotone.py (MonotoneSource): polling change
1072         source
1074         * buildbot/changes/bonsaipoller.py (BonsaiPoller): Ben also
1075         contributed a Change Source that polls a Bonsai server (a
1076         kind of web-based viewcvs CGI script).
1078         * buildbot/status/tinderbox.py (TinderboxMailNotifier): Ben
1079         Hearsum contributed a status plugin which sends email in the same
1080         format that Tinderbox does: this allows a number of tinderbox
1081         tools to be driven by Buildbot instead. Thanks Ben!
1083 2006-09-24  Brian Warner  <warner@lothar.com>
1085         * buildbot/changes/mail.py (parseBonsaiMail): fix the parser.
1086         Thanks to Robert Helmer for the patch.
1088         * buildbot/process/base.py (Build.setupSlaveBuilder): tell our
1089         BuildStatus about the buildslave name at the *beginning* of the
1090         build, rather than at the end. Thanks to Alexander Lorenz for the
1091         patch.
1092         * buildbot/status/html.py (StatusResourceBuild.body): always
1093         include the slavename in the build page, not just when the build
1094         has finished.
1095         * buildbot/status/mail.py (MailNotifier.buildMessage): include the
1096         slavename in the email message
1098 2006-09-21  Brian Warner  <warner@lothar.com>
1100         * buildbot/scripts/sample.cfg: update to use new BuildStep classes
1101         from buildbot.steps
1102         * docs/examples/glib_master.cfg: same
1103         * docs/examples/hello.cfg: same
1104         * docs/examples/twisted_master.cfg: same, update to current usage
1106 2006-09-19  Brian Warner  <warner@lothar.com>
1108         * buildbot/steps/python.py (PyFlakes): refactor, add summary logs
1109         (PyFlakes.createSummary): make it compatible with python-2.2
1111         * buildbot/test/test_steps.py (Python.testPyFlakes): add a test
1112         for at least the output-parsing parts of PyFlakes
1114 2006-09-18  Brian Warner  <warner@lothar.com>
1116         * buildbot/steps/python.py: oops, fix import of StringIO
1118 2006-09-17  Brian Warner  <warner@lothar.com>
1120         * buildbot/test/test_vc.py (VCBase._do_vctest_update_retry_1): it
1121         turns out that SVN-1.4.0 doesn't fail to update once you've
1122         replaced a file with a directory, unlike older versions of SVN and
1123         pretty much every other VC tool we support. Since what we really
1124         care about is that the update succeeds anyway, stop checking that
1125         the tree got clobbered and just assert that the build succeeded.
1126         (VCBase.printLogs): add a utility function for debugging
1128         * buildbot/process/step.py: oops, added extra imports by mistake
1130         * buildbot/changes/p4poller.py (P4Source._process_describe): do an
1131         rstrip() on the first line coming out of the 'p4 describe'
1132         process, to remove the stray ^M that Wade Brainerd reports seeing
1133         in the 'when' field. Fixes SF#1555985.
1135         * buildbot/master.py (BuildMaster.loadConfig): improve the error
1136         message logged when c['schedulers'] is not right
1137         * buildbot/scheduler.py (Scheduler.__init__): improve error
1138         message when a Scheduler() is created with the wrong arguments
1139         * buildbot/test/test_config.py (ConfigTest.testSchedulerErrors):
1140         verify that these error messages are emitted
1142         * buildbot/process/buildstep.py: rename step.py to buildstep.py .
1143         The idea is that all the base classes (like BuildStep and
1144         RemoteCommand and LogObserver) live in b.p.buildstep, and b.p.step
1145         will be a leftover backwards-compatibility file that only contains
1146         aliases for the steps that were moved out to buildbot.steps.*
1147         * lots: change imports to match
1148         * buildbot/process/step.py: add a DeprecationWarning if it ever
1149         gets imported
1151 2006-09-12  Brian Warner  <warner@lothar.com>
1153         * buildbot/scheduler.py (Scheduler.__init__): make sure that
1154         builderNames= is actually a sequence, since if you happen to give
1155         it a single builder-specification dictionary instead, it won't get
1156         caught by the existing assert. Thanks to Brett Neely for the
1157         catch.
1159         * buildbot/steps/python.py (BuildEPYDoc, PyFlakes): add new steps. No
1160         tests yet, alas.
1161         * docs/buildbot.texinfo (Python BuildSteps): document them
1162         (sendchange): include a link to PBChangeSource, since you need one
1164         * buildbot/steps/shell.py: clean up test-case-name line, remove some
1165         unnecessary imports
1166         * buildbot/steps/dummy.py: same
1168 2006-09-08  Brian Warner  <warner@lothar.com>
1170         * buildbot/steps/transfer.py (FileUpload,FileDownload): new
1171         BuildStep which lets you transfer files from the master to the
1172         slave or vice versa. Thanks to Albert Hofkamp for the original
1173         patch. Fixes SF#1504631.
1174         * buildbot/slave/commands.py (SlaveFileUploadCommand): slave-side
1175         support for it
1176         (SlaveFileDownloadCommand): same
1177         * docs/buildbot.texinfo (Transferring Files): document it
1178         * buildbot/test/test_transfer.py: test it
1179         * buildbot/test/runutils.py (StepTester): new utility class for
1180         testing BuildSteps and RemoteCommands without Builds or Bots or PB
1181         * buildbot/test/test_steps.py (CheckStepTester): validate that the
1182         utility class works
1184         * buildbot/interfaces.py (IStatusLog.readlines): make it easier to
1185         walk through StatusLogs one line at a time, mostly for the benefit
1186         of ShellCommand.createSummary methods. You can either walk through
1187         STDOUT or STDERR, but the default is STDOUT.
1189         * buildbot/status/builder.py (LogFile.readlines): implement it.
1190         Note that this is not yet memory-efficient, it just pulls the
1191         whole file into RAM and then splits it up with a StringIO.
1192         Eventually this should be a generator that only pulls chunks from
1193         disk as necessary.
1194         * buildbot/test/test_status.py (Log.testReadlines): test it
1196         * docs/buildbot.texinfo: update to match changes
1197         * buildbot/process/factory.py: stop using old definitions
1198         * buildbot/process/process_twisted.py: same
1199         * buildbot/test/test_*.py: same
1201         * buildbot/process/step_twisted.py: move definition to..
1202         * buildbot/steps/python_twisted.py: .. here, unfortunately python's
1203         relative-import mechanisms prevent this from being named 'twisted'
1204         or 'python/twisted' as I would have preferred.
1206         * buildbot/process/maxq.py: move definition to..
1207         * buildbot/steps/maxq.py: .. here, leave a compatibility import
1209         * buildbot/process/step.py: split the user-visible BuildSteps into
1210         separate files, all under buildbot/steps/
1211         * buildbot/steps/source.py: this holds VC-checkout steps like SVN
1212         * buildbot/steps/shell.py: this holds ShellCommand and friends
1213         * buildbot/steps/dummy.py: this holds the testing steps like Dummy
1215 2006-09-05  Brian Warner  <warner@lothar.com>
1217         * lots: run pyflakes, removed a lot of unused imports, changed the
1218         form of some conditional imports to remove false pyflakes
1219         warnings. There are still a number of warnings left, mostly from
1220         imports that are done for their side-effects.
1221         * buildbot/test/test_vc.py: import twisted.python.failure, since it
1222         was missing
1224 2006-08-26  Brian Warner  <warner@lothar.com>
1226         * buildbot/test/test_locks.py (Unit.testLater): make the tests
1227         compatible with twisted-1.3.0, for some reason I just can't seem
1228         to let go of the past.
1230 2006-08-25  Brian Warner  <warner@lothar.com>
1232         * buildbot/status/mail.py (MailNotifier.__init__): fix typo in docs
1234         * buildbot/process/step.py (LoggingBuildStep.startCommand): set up
1235         all logfiles= in startCommand(), rather than in start() . This
1236         makes it easier to have the 'stdio' log come before any secondary
1237         logfiles, which I feel makes the waterfall display more
1238         understandable.
1239         (LoggingBuildStep.setupLogfiles): move the addLog/cmd.useLog code
1240         from ShellCommand up into LoggingBuildStep
1241         (LoggingBuildStep.__init__): move the handling of logfiles= from
1242         ShellCommand up to LoggingBuildStep, because startCommand is
1243         provided by LoggingBuildStep, whereas start() was specific to
1244         subclasses like ShellCommand and Source. This removes code
1245         duplication in those subclasses.
1246         (ShellCommand.__init__): same
1247         (ShellCommand.checkForOldSlaveAndLogfiles): split out the check
1248         for a slave that's too old to understand logfiles= into a separate
1249         method, so it can live in ShellCommand. The rest of
1250         setupLogfiles() can live in LoggingBuildStep.
1252 2006-08-24  Brian Warner  <warner@lothar.com>
1254         * buildbot/locks.py (BaseLock): you can now configure Locks to
1255         allow multiple simultaneous owners. They still default to
1256         maxCount=1. Fixes SF#1434997. Thanks to James Knight (foom) for
1257         the patch.
1258         * docs/buildbot.texinfo (Interlocks): document the new options
1259         * buildbot/test/test_locks.py: add a bunch of new unit tests
1260         * buildbot/process/base.py (Build.acquireLocks): locks now offer
1261         waitUntilMaybeAvailable, not waitUntilAvailable
1262         * buildbot/process/step.py (BuildStep.acquireLocks): same
1263         * buildbot/master.py (BotMaster.getLockByID): real locks now use
1264         the whole lockid in their constructor, not just the name. Also,
1265         keep track of which real locks we've handed out by the full
1266         lockid, not just class+name, otherwise changing just the maxCount=
1267         in the master.cfg file would not actually cause a behavioral
1268         change
1270 2006-08-23  Brian Warner  <warner@lothar.com>
1272         * buildbot/__init__.py (version): bump to 0.7.4+ while between
1273         releases
1274         * docs/buildbot.texinfo: same
1276 2006-08-23  Brian Warner  <warner@lothar.com>
1278         * buildbot/__init__.py (version): Releasing buildbot-0.7.4
1279         * docs/buildbot.texinfo: set version to match
1280         * NEWS: update for 0.7.4
1281         * buildbot/slave/commands.py (command_version): mention that this
1282         version (2.1) was released with buildbot-0.7.4
1284 2006-08-22  Brian Warner  <warner@lothar.com>
1286         * README: update
1288         * CREDITS: new file, list of people who have helped. Thanks!
1289         * MANIFEST.in: ship it
1291         * MANIFEST.in: stop shipping the old PyCon-2003 paper.. with the
1292         new diagrams, the user's manual is more informative than it was.
1293         Start shipping the .html user's manual (and generated .png
1294         images).
1295         * Makefile: update 'release' target to match
1297         * buildbot/test/test_web.py (GetURL.testBrokenStuff): delete this
1298         test.. I think the web-parts effort will render it pointless well
1299         before it ever actually starts to work.
1301 2006-08-20  Brian Warner  <warner@lothar.com>
1303         * buildbot/changes/pb.py (PBChangeSource): fix and simplify
1304         meaning of the prefix= argument. It is now just a string which is
1305         stripped from the beginning of the filename. If prefix= is set but
1306         not found on any given filename, that filename is ignored. If all
1307         filenames in a Change are ignored, the Change is dropped. This is
1308         much simpler than the previous sep= nonsense, and I should have
1309         implemented it this way from the beginning. Effectively resolves
1310         SF#1217699 and SF#1381867. Thanks to Gary Granger and Marius
1311         Gedminas for the catch and suggested fixes.
1312         (ChangePerspective.perspective_addChange): implement the actual
1313         prefix comparison
1314         * buildbot/test/test_changes.py (TestChangePerspective): test it
1315         * docs/buildbot.texinfo (PBChangeSource): document it, explain
1316         how to properly use prefix=
1317         * docs/examples/twisted_master.cfg (source): update prefix= by
1318         adding the trailing slash
1321         * docs/examples/twisted_master.cfg: update to actual practice
1323         * buildbot/test/test_web.py (WaterfallSteps.test_urls): oops,
1324         update test case to match new link text.. the HREF has both a
1325         class= setting and an enclosing [] pair that I didn't match in the
1326         test.
1328         * docs/buildbot.texinfo (ShellCommand.command=): explain why a
1329         list of strings is preferred over a single string with embedded
1330         spaces
1331         (ShellCommand.description=): explain that either single strings or
1332         a list of strings is acceptable, and why you might prefer one over
1333         the other. Add an example. Fixes SF#1524659, thanks to Paul
1334         Winkler for the catch.
1335         (Build Steps): update to use f.addStep() rather than using s()
1336         and the constructor list
1338         * buildbot/process/step.py (ShellCommand): accept either a single
1339         string or a list of strings in both description= and
1340         descriptionDone=
1341         * buildbot/test/test_steps.py (Steps.test_description): test it
1342         * buildbot/test/runutils.py (makeBuildStep): support for that test
1344         * contrib/CSS/*.css: add some contributed CSS stylesheets, to make
1345         the Waterfall display a bit less ugly. Thanks to John O'Duinn for
1346         collecting the files and creating the patch.
1348         * docs/buildbot.texinfo (BuildStep URLs): document new feature:
1349         per-step URLs that will be displayed on the waterfall display,
1350         for things like the HTML output of code-coverage tools, when
1351         the results are hosted elsewhere.
1352         * buildbot/interfaces.py (IBuildStepStatus.getURLs): document the
1353         way to retrieve these URLs
1354         * buildbot/status/builder.py (BuildStepStatus.getURLs): implement
1355         the method to retrieve these URLs. Also provide backwards
1356         compatibility for saved BuildStepStatus instances that didn't have
1357         the .urls attribute
1358         * buildbot/process/step.py (BuildStep.addURL): method to set these
1359         URLs from within a BuildStep
1360         * buildbot/status/html.py (StepBox.getBox): emit links to the URLs
1361         (StepBox.getBox): give these external links a distinct CSS class
1362         named "BuildStep external" so a .css file can display them
1363         differently
1365         * buildbot/test/test_web.py (WaterfallSteps): test that we really
1366         do emit those links
1367         * buildbot/test/test_steps.py (Steps): test that we can all the
1368         URLs. Also add a bunch of other tests on methods that can be
1369         called from within BuildSteps
1370         * buildbot/test/runutils.py (makeBuildStep): add utility function
1372 2006-08-13  Brian Warner  <warner@lothar.com>
1374         * docs/buildbot.texinfo (BuildStep LogFiles): document them
1376 2006-08-10  Brian Warner  <warner@lothar.com>
1378         * docs/buildbot.texinfo (Index of master.cfg keys): add another
1379         index, this one of things like c['sources'] and c['schedulers']
1380         (indices): it looks like my clever idea of putting the @fooindex
1381         commands in between the @node and the @subsection (to make the
1382         HREF anchor jump to slightly above the section title, which works
1383         much better in html) confused texinfo horribly, so I'm moving the
1384         index tags back to be just after the @subsection marker. I also
1385         added extra lines between the @node/@section paragraph and the
1386         index tags, since I think maybe texinfo wants to see these be
1387         separate paragraphs.
1389         * docs/Makefile (images): make sure images get built when
1390         rendering the manual
1391         * docs/images/Makefile: same
1393         * buildbot/scripts/runner.py: rename 'buildbot master' to
1394         'buildbot create-master', and 'buildbot slave' to 'buildbot
1395         create-slave'
1396         * docs/buildbot.texinfo: same
1397         * README: same
1399         * docs/buildbot.texinfo: reimplement the "useful classes" index
1400         with actual texinfo indices. The .info rendering is a bit
1401         weird-looking but it works well, and the HTML rendering is quite
1402         nice. This also puts the index targets in the regular flow of the
1403         text, which is easier to maintain.
1405 2006-08-06  Brian Warner  <warner@lothar.com>
1407         * buildbot/slave/commands.py (ShellCommand.__init__): patch from
1408         Kevin Turner to prefer the environ= argument be a list rather than
1409         a string. If it is a list, it will be joined with a platform-local
1410         os.pathsep delimiter, and then prepended to any existing
1411         $PYTHONPATH value. This works better in cross-platform (i.e.
1412         windows buildslaves) environments when you need to push multiple
1413         directories onto the front of the path.
1414         (SlaveShellCommand): documented the new magic
1415         * docs/buildbot.texinfo (ShellCommand): documented the new magic
1416         in a user-visible form
1418         * buildbot/test/test_vc.py (BaseHelper.dovc): patch from Kevin
1419         Turner to prefer lists over strings when creating/running VC
1420         commands during unit tests. This is clearly necessary to survive
1421         vcexe containing spaces, like "C:\Program Files\darcs.exe". I
1422         renamed the wq() function to qw() though, since that's how it's
1423         spelled in perl. Eventually I'd prefer all commands to be
1424         specified with lists.
1426         * buildbot/slave/commands.py (LogFileWatcher): handle logfiles
1427         which are deleted (or not yet created) correctly. Also add
1428         failsafe code to not explode if the file-watching poller doesn't
1429         get started. Thanks to JP Calderone for the catch and the poller
1430         patch.
1431         * buildbot/test/test_shell.py (SlaveSide._testLogFiles): add test
1432         for that case
1433         * buildbot/test/emitlogs.py: same
1435         * NEWS: summarize recent changes
1437         * docs/buildbot.texinfo (Debug options): suggest an .ssh/options
1438         clause to avoid the "host key mismatch" warning
1440         * buildbot/process/step_twisted.py (Trial.start): if the
1441         buildslave is too old to understand logfiles=, fall back to
1442         running 'cat _trial_temp/test.log' like before.
1443         (Trial.commandComplete): same. this takes advantage of the
1444         LoggingBuildStep refactoring to stall commandComplete long enough
1445         to run a second RemoteShellCommand.
1447         * buildbot/process/step.py (LoggingBuildStep.startCommand):
1448         refactor command-completion handling, to allow methods like
1449         commandComplete/createSummary/evaluateCommand to return Deferreds.
1450         (LoggingBuildStep._commandComplete): delete the refactored method
1451         (ShellCommand.setupLogfiles): if the buildslave is too old to
1452         understand logfiles=, put a warning message both into twistd.log
1453         and into the otherwise empty user-visible LogFiles.
1455         * buildbot/process/step.py (LoggedRemoteCommand.useLog): allow
1456         callers to provide the slave-side logfile name, rather than
1457         forcing it to come from the local name of the LogFile.
1458         (BuildStep.getSlaveName): new method
1460         * buildbot/process/base.py (Build.getSlaveName): new method, so
1461         steps can find out which buildslave they're running on
1463         * buildbot/test/test_steps.py (Version.checkCompare): oops, update
1464         to match the s/cvs_ver/command_version/ change
1466 2006-08-05  Brian Warner  <warner@lothar.com>
1468         * buildbot/slave/commands.py (command_version): replace the CVS
1469         auto-updated cvs_ver keyword with a manually-updated variable,
1470         since CVS is no longer the master repository. Add a description of
1471         the remote API change starting in this version (2.1), specifically
1472         the fact that SlaveShellCommand now accepts 'initial_stdin',
1473         'keep_stdin_open', and 'logfiles'.
1475 2006-07-31  Brian Warner  <warner@lothar.com>
1477         * docs/buildbot.texinfo (System Architecture): Finally add lots of
1478         diagrams to describe how the whole system fits together. The
1479         images themselves are kept in SVG files, with ascii-art versions
1480         in corresponding .txt files. Texinfo knows how to interpolate the
1481         text version into .info files, reference the .png versions from
1482         .html files, and include .eps versions in the .ps format.
1483         * docs/images/Makefile: tools to create .png and .eps
1484         * docs/images/*.svg: created pictures with Inkscape.
1485         * .darcs-boring: ignore the generated .eps and .png files
1487 2006-07-24  Brian Warner  <warner@lothar.com>
1489         * buildbot/master.py (BuildMaster.loadConfig): check for duplicate
1490         Scheduler names, since they cause setServiceParent to explode
1491         later.
1492         * buildbot/test/test_config.py (ConfigTest._testSchedulers_7): test it
1494 2006-07-20  Brian Warner  <warner@lothar.com>
1496         * buildbot/scripts/sample.cfg: simplify the sample BuildFactory,
1497         which runs the buildbot unit tests
1499         * docs/buildbot.texinfo (Index of Useful Classes): add a table of
1500         classes that are useful in master.cfg
1502 2006-07-15  Brian Warner  <warner@lothar.com>
1504         * Makefile (some-apidocs): new target to build only some epydocs
1506         * setup.py: minor comment.. does the classifiers= argument prevent
1507         the setup.py script from working on python2.2/2.3?
1509         * buildbot/scripts/sample.cfg: update manhole example, arrange into
1510         major sections
1512         * buildbot/twcompat.py: fix minor typo in comments
1514         * buildbot/manhole.py: move all Manhole-related code out to this
1515         module. Implement SSH-based manholes (with TwistedConch), and move
1516         to conch's nifty line-editing syntax-coloring REPL shell instead
1517         of the boring non-editing monochromatic (and deprecated) old
1518         'telnet' protocol.
1519         * buildbot/master.py: remove all Manhole-related code
1520         (BuildMaster.loadConfig._add): make sure the old manhole is
1521         removed before we add the new one
1522         * docs/buildbot.texinfo (Debug options): document new Manhole options
1524         * buildbot/twcompat.py (_which): fix some epydoc issues
1525         * buildbot/status/html.py (Waterfall.__init__): same
1527 2006-06-29  Brian Warner  <warner@lothar.com>
1529         * buildbot/interfaces.py: get Interface from b.twcompat to hush
1530         deprecation warnings under newer Twisteds (by using
1531         zope.interface.Interface instead of old twisted.python.components
1532         stuff)
1533         * buildbot/slave/interfaces.py: same
1535 2006-06-28  Brian Warner  <warner@lothar.com>
1537         * buildbot/slave/commands.py (SVN): add --non-interactive to all
1538         svn commands, so it will fail immediately instead of hanging while
1539         it waits for a username/password to be typed in.
1541         * buildbot/slave/bot.py (SlaveBuilder.commandComplete): add minor
1542         log message if the step was shut down
1544         * buildbot/scripts/runner.py (SlaveOptions.longdesc): remove
1545         obsolete reference to mktap.
1547 2006-06-20  Brian Warner  <warner@lothar.com>
1549         * buildbot/test/test_steps.py (BuildStep.testShellCommand1): update
1550         test to include new 'logfiles' argument sent from master to slave
1552 2006-06-19  Brian Warner  <warner@lothar.com>
1554         * buildbot/process/step_twisted.py (Trial): track Progress from
1555         _trial_temp/test.log too
1557         * buildbot/process/step.py (OutputProgressObserver): generalize
1558         the earlier StdioProgressObserver into an OutputProgressObserver
1559         that can track LogFiles other than stdio.
1560         (LoggingBuildStep.__init__): same
1562         * buildbot/process/step_twisted.py (Trial): use logfiles= to track
1563         _trial_temp/test.log, not a separate 'cat' command. TODO: this
1564         will fail under windows because of os.sep issues. It might have
1565         worked before if 'cat' was doing cygwin path conversion.
1567         * buildbot/slave/commands.py (LogFileWatcher.__init__): note the
1568         creation of LogFileWatchers
1569         (ShellCommand._startCommand): and record the files that were
1570         watched in the 'headers' section of the ShellCommand output
1572         * buildbot/process/step.py (RemoteShellCommand.__init__): duh, you
1573         need to actually pass it to the slave if you want it to work.
1574         (ShellCommand): document it a bit
1576         * buildbot/test/test_shell.py: new test to validate LogFiles
1577         * buildbot/test/runutils.py (SlaveCommandTestBase): updates to
1578         test LogFiles
1579         * buildbot/test/emitlogs.py: enhance to wait for a line on stdin
1580         before printing the last batch of lines, to test that the polling
1581         logic is working properly
1583         * buildbot/process/step.py (LoggedRemoteCommand): improve LogFile
1584         handling, making it possible to track multiple logs for a single
1585         RemoteCommand. The previous single logfile is now known as the
1586         'stdio' log.
1587         (LoggedRemoteCommand.remoteUpdate): accept key='log' updates
1588         (RemoteShellCommand.__init__): accept logfiles=
1589         (LoggingBuildStep.startCommand): stdio_log is now one of many
1590         (ShellCommand): added logfiles= argument, as well as a class-level
1591         .logfiles attribute, which will be merged together to figure out
1592         which logfiles should be tracked. The latter maybe be useful for
1593         subclasses of ShellCommand which know they will aways produce
1594         secondary logfiles in the same location.
1596         * buildbot/slave/commands.py (ShellCommandPP): add writeStdin()
1597         and closeStdin() methods, preparing to make it possible to write
1598         to a ShellCommand's stdin at any time, not just at startup. These
1599         writes are buffered if the child process hasn't started yet.
1600         (LogFileWatcher): new helper class to watch arbitrary logfiles
1601         while a ShellCommand runs. This class polls the file every two
1602         seconds, and sends back 10k chunks to the buildmaster.
1603         (ShellCommand): rename stdin= to initialStdin=, and add
1604         keepStdinOpen= and logfiles= to arguments. Set up LogFileWatchers
1605         at startup.
1606         (ShellCommand.addLogfile): LogFile text is sent in updates with a
1607         key of "log" and a value of (logname, data).
1608         (SlaveShellCommand): add 'initial_stdin', 'keep_stdin_open', and
1609         'logfiles' to the master-visible args dictionary.
1610         (SourceBase.doPatch): match s/stdin/initialStdin/ change
1611         (CVS.start): same
1612         (P4.doVCFull): same
1613         * buildbot/test/test_vc.py (Patch.testPatch): same
1616         * buildbot/test/emit.py: write to a logfile in the current
1617         directory. We use this to figure out what was used as a basedir
1618         rather than looking to see which copy of emit.py gets run, so that
1619         we can run the commands from inside _trial_temp rather than inside
1620         buildbot/test
1621         * buildbot/test/subdir/emit.py: same
1622         * buildbot/test/runutils.py (FakeSlaveBuilder): take a 'basedir'
1623         argument rather than running from buildbot/test/
1624         (SlaveCommandTestBase.setUpBuilder): explicitly set up the Builder
1625         rather than using an implicit setUp()
1626         * buildbot/test/test_slavecommand.py (ShellBase.setUp): same
1627         (ShellBase.testShell1, etc): use explicit path to emit.py instead
1628         of assuming that we're running in buildbot/test/ (and that '.' is
1629         on our $PATH)
1631         * buildbot/slave/commands.py (Command.doStart): refactor Command
1632         startup/completion a bit: now the SlaveBuilder calls doStart(),
1633         which is not meant for overridding by subclasses, and doStart()
1634         calls start(), which is. Likewise the SlaveBuilder calls
1635         doInterrupt(), and subclasses override interrupt(). This also puts
1636         responsibility for maintaining .running in Command rather than in
1637         SlaveBuilder.
1638         (Command.doInterrupt): same
1639         (Command.commandComplete): same, this is called when the deferred
1640         returned by start() completes.
1641         * buildbot/slave/bot.py (SlaveBuilder.remote_startCommand): same
1642         (SlaveBuilder.remote_interruptCommand): same
1643         (SlaveBuilder.stopCommand): same
1645 2006-06-16  Brian Warner  <warner@lothar.com>
1647         * buildbot/test/test_shell.py: new test file to contain everything
1648         relating to ShellCommand
1649         (SlaveSide.testLogFiles): (todo) test for the upcoming "watch
1650         multiple logfiles in realtime" feature, not yet implemented
1651         * buildbot/test/emitlogs.py: support file for testLogFiles
1652         * docs/buildbot.texinfo (ShellCommand): document the feature
1654         * buildbot/test/test_steps.py (BuildStep.setUp): rmtree refactoring
1656         * buildbot/test/runutils.py (SlaveCommandTestBase): utility class
1657         for tests which exercise SlaveCommands in isolation.
1659         * buildbot/test/test_slavecommand.py: Move some utilities like
1660         SignalMixin and FakeSlaveBuilder from here ..
1661         * buildbot/test/runutils.py: .. to here, so they can be used by
1662         other test classes too
1663         * buildbot/test/test_vc.py: more SignalMixin refactoring
1664         * buildbot/test/test_control.py: same
1665         * buildbot/test/test_run.py: and some rmtree refactoring
1667 2006-06-15  Brian Warner  <warner@lothar.com>
1669         * buildbot/test/test_vc.py (P4.testCheckoutBranch): rename from
1670         'testBranch' to match other VC tests and have the tests run in
1671         roughly increasing order of dependency
1673         * buildbot/test/test_steps.py (LogObserver): new test to verify
1674         LogObservers can be created at various times and still get
1675         connected up properly
1677         * buildbot/test/runutils.py (setupBuildStepStatus): utility method
1678         to create BuildStepStatus instances that actually work.
1680         * buildbot/process/step.py (LogObserver): add outReceived and
1681         errReceived base methods, to be overridden
1683         * buildbot/status/builder.py (BuildStatus.addStepWithName): change
1684         API to take a name instead of a step, reducing the coupling
1685         somewhat. This returns the BuildStepStatus object so it can be
1686         passed to the new Step, instead of jamming it directly into the
1687         Step.
1688         * buildbot/process/step.py (BuildStep.setStepStatus): add a setter
1689         method
1690         * buildbot/process/base.py (Build.setupBuild): use both methods
1691         * buildbot/test/test_web.py (Logfile.setUp): rearrange the setup
1692         process a bit to match
1694 2006-06-14  Brian Warner  <warner@lothar.com>
1696         * docs/buildbot.texinfo (Adding LogObservers): add some limited
1697         docs on writing new LogObserver classes
1698         (Writing New Status Plugins): brief docs on how Status Plugins fit
1699         together
1701         * buildbot/process/step_twisted.py (TrialTestCaseCounter):
1702         implement a LogObserver that counts how many unit tests have been
1703         run so far
1704         (Trial.__init__): wire it in
1705         * buildbot/test/test_twisted.py (Counter): unit test for it
1707         * buildbot/process/step_twisted.py (HLint.commandComplete): update
1708         to new cmd.logs['stdio'] scheme
1709         (Trial.commandComplete): same
1710         (BuildDebs.commandComplete): same
1712         * buildbot/process/step.py (LoggedRemoteCommand): use a dict of
1713         LogFiles, instead of just a single one. The old single logfile is
1714         now called "stdio". LoggedRemoteCommand no longer creates a
1715         LogFile for you (the code to do that was broken anyway). If you
1716         don't create a "stdio" LogFile, then stdout/stderr will be
1717         discarded.
1718         (LogObserver): implement "LogObservers", which a BuildStep can add
1719         to parse the output of a command in real-time. The primary use is
1720         to provide more useful information to the Progress code, allowing
1721         better ETA estimates.
1722         (LogLineObserver): utility subclass which feeds complete lines to
1723         the parser instead of bytes.
1724         (BuildStep.progressMetrics): this is safer as a tuple
1725         (BuildStep.setProgress): utility method, meant to be called by
1726         LogObservers
1727         (BuildStep.addLogObserver): new method, to be called at any time
1728         during the BuildStep (even before any LogFiles have been created),
1729         to attach (or schedule for eventual attachment) a LogObserver to a
1730         LogFile.
1731         (StdioProgressObserver): new LogObserver which replaces the old
1732         "output" progress gatherer
1733         (LoggingBuildStep.__init__): same
1734         (LoggingBuildStep.startCommand): set up the "stdio" LogFile
1735         (LoggingBuildStep._commandComplete): must use logs['stdio']
1736         instead of the old single ".log" attribute.
1737         * buildbot/status/builder.py (LogFile): remove old logProgressTo
1738         functionality, now subsumed into StdioProgressObserver
1739         * buildbot/test/test_status.py (Subscription._testSlave_2): the
1740         log name changed from "output" to "stdio".
1743         * buildbot/interfaces.py (ILogFile): add the Interface used from
1744         the BuildStep towards the LogFile
1745         (ILogObserver): and the one provided by a LogObserver
1746         * buildbot/status/builder.py (LogFile): implement it
1748         * buildbot/interfaces.py (LOG_CHANNEL_*): move STDOUT / STDERR /
1749         HEADER constants here ..
1750         * buildbot/status/builder.py (STDOUT): .. from here
1752 2006-06-13  Brian Warner  <warner@lothar.com>
1754         * buildbot/test/test_p4poller.py (TestP4Poller.failUnlessIn): fix
1755         compatibility with python2.2, which doesn't have the 'substr in
1756         str' feature.
1757         (TestP4Poller.makeTime): utility function to construct the
1758         timestamp using the same strptime() approach as p4poller does. It
1759         turns out that time.mktime() behaves slightly differently under
1760         python2.2, probably something to do with the DST flag, and that
1761         causes the test to fail under python2.2. (changing the mktime()
1762         arguments to have dst=0 instead of -1 caused it to fail under
1763         python2.3. Go figure.)
1764         (TestP4Poller._testCheck3): use our makeTime() instead of mktime()
1766 2006-06-12  Brian Warner  <warner@lothar.com>
1768         * buildbot/process/step.py (P4): merge in patch SF#1473939, adding
1769         proper Perforce (P4) support. Many many thanks to Scott Lamb for
1770         contributing such an excellent patch, including docs and unit
1771         tests! This makes it *so* much easier to apply. I had to update
1772         test_vc.py to handle some recent refactorings, but everything else
1773         applied smoothly. The only remaining thing I'd like to fix would
1774         be to remove the hard-wired port 1666 used by p4d, and allow it to
1775         claim any unused port. This would allow two copies of the test
1776         suite to run on the same host at the same time, as well as
1777         allowing the test suite to run while a real (production) p4d was
1778         running on the same host. Oh, and maybe we should add a warning to
1779         step.P4 that gets emitted if the slave is too old to provide the
1780         'p4' SlaveCommand. Otherwise it looks great. (closes: SF#1473939).
1781         * buildbot/slave/commands.py (P4): same
1782         (P4Sync): same, some minor updates
1783         * buildbot/changes/p4poller.py: same
1784         * docs/buildbot.texinfo: same
1785         * buildbot/test/test_p4poller.py: same
1786         * buildbot/test/test_vc.py (P4): same
1788         * setup.py: add Trove classifiers for PyPI
1790 2006-06-08  Brian Warner  <warner@allmydata.com>
1792         * buildbot/status/client.py
1793         (RemoteBuilder.remote_getCurrentBuilds): oops, I screwed up when
1794         changing this from getCurrentBuild() to getCurrentBuilds(). Each
1795         build needs to be IRemote'd separately, rather than IRemote'ing
1796         the whole list at once. I can't wait until newpb's serialization
1797         adapters make this unnecessary.
1799 2006-06-06  Brian Warner  <warner@lothar.com>
1801         * buildbot/process/step.py (WithProperties): make this inherit
1802         from ComparableMixin, so that reloading an unchanged config file
1803         doesn't cause us to spuriously reload any Builders which use them.
1804         * buildbot/test/test_config.py (ConfigTest.testWithProperties):
1805         add a test for it
1807 2006-06-03  Brian Warner  <warner@lothar.com>
1809         * contrib/windows/{setup.py, buildbot_service.py}: add support for
1810         running py2exe on windows, contributed by Mark Hammond. Addresses
1811         SF#1401121, but I think we still need to include
1812         buildbot/scripts/sample.cfg
1813         * setup.py: include buildbot_service.py as a script under windows
1814         * buildbot/status/html.py: when sys.frozen (i.e. we're running in
1815         a py2exe application), get the icon/css datafiles from a different
1816         place than usual.
1818         * buildbot/status/mail.py (MailNotifier.buildMessage): don't
1819         double-escape the build URL. Thanks to Olivier Bonnet for the
1820         patch. Fixes SF#1452801.
1822 2006-06-02  Brian Warner  <warner@lothar.com>
1824         * contrib/svn_buildbot.py (ChangeSender.getChanges): ignore the
1825         first six columns of 'svnlook' output, not just the first column,
1826         since property changes appear in the other five. Thanks to Olivier
1827         Bonnet for the patch. Fixes SF#1398174.
1829 2006-06-01  Brian Warner  <warner@lothar.com>
1831         * buildbot/test/test_web.py (Logfile.setUp): set the .reason on
1832         the fake build, so that title= has something to be set to
1834         * buildbot/status/html.py (BuildBox.getBox): set the 'title='
1835         attribute of the "Build #NN" link in the yellow start-the-build
1836         box to the build's reason. This means that you get a little
1837         tooltip explaining why the build was done when you hover over the
1838         yellow box. Thanks to Zandr Milewski for the suggestion.
1840         * buildbot/clients/gtkPanes.py (Box.setColor): ignore color=None
1841         (Box.setETA): handle ETA=None (by stopping the timer)
1842         (Box.update): make the [soon] text less different than the usual
1843         text, so the rest of the text doesn't flop around so much. It
1844         would be awfully nice to figure out how to center this stuff.
1845         (ThreeRowBuilder.stepETAUpdate): more debugging printouts
1847         * buildbot/process/step.py (ShellCommand): set flunkOnFailure=True
1848         by default, so that any ShellCommand which fails marks the overall
1849         build as a failure. I should have done this from the beginning.
1850         Add flunkOnFailure=False to the arguments if you want to turn off
1851         this behavior.
1853 2006-05-30  Brian Warner  <warner@lothar.com>
1855         * buildbot/clients/gtkPanes.py: add a third row: now it shows
1856         last-build/current-build/current-step. Show what step is currently
1857         running. Show ETA for both the overall build and the current step.
1858         Update GTK calls to modern non-deprecated forms. There's still a
1859         lot of dead code and debug noise to remove.
1861         * buildbot/process/step_twisted.py (Trial): set the step name, so it
1862         shows up properly in status displays
1864 2006-05-28  Brian Warner  <warner@lothar.com>
1866         * buildbot/test/test_properties.py (Run.testInterpolate): on the
1867         build we use to verify that WithProperties works:
1869         ** set flunkOnFailure=True so that build failures get noticed
1870         ** set workdir='.' so that the build succeeds, otherwise it is trying
1871             to touch 'build/something', and 'build/' doesn't exist because
1872             usually that's created by a Source step
1873         ** set timeout=10, because Twisted-1.3.0 has a race condition that
1874             this test somehow triggers, in which the 'touch' process becomes
1875             a zombie and we wait for th etimeout before giving up on it.
1877         * buildbot/test/runutils.py (RunMixin.logBuildResults): utility method
1878         to log the Build results and step logs to the twisted log.
1879         (RunMixin.failUnlessBuildSucceeded): use logBuildResults to record
1880         what went wrong if a build was expected to succeed but didn't.
1882         * buildbot/process/step_twisted.py (Trial): set the default
1883         trialMode to '--reporter=bwverbose', which specifies verbose
1884         black-and-white text. Back in twisted-1.3/2.0 days we had to use
1885         '-to', but those are completely missing in modern Twisteds.
1887         * buildbot/scripts/sample.cfg: make the sample Manhole config use
1888         a localhost-only port, to encourage better security
1890         * docs/buildbot.texinfo (Change Sources): mention
1891         darcs_buildbot.py
1893         * .darcs-boring: add a Darcs boringfile
1895         * README (REQUIREMENTS): stop claiming compatibility with
1896         Twisted-1.3.0
1898         * contrib/darcs_buildbot.py: write a darcs-commit-hook change
1899         sender
1901 2006-05-27  Brian Warner  <warner@lothar.com>
1903         * buildbot/__init__.py: bump to 0.7.3+ while between releases
1904         * docs/buildbot.texinfo: same
1906 2006-05-23  Brian Warner  <warner@lothar.com>
1908         * buildbot/__init__.py (version): Releasing buildbot-0.7.3
1909         * docs/buildbot.texinfo: set version to match
1910         * NEWS: update for 0.7.3
1912         * docs/buildbot.texinfo (Change Sources): mention hg_buildbot.py,
1913         give a quick mapping from VC system to possible ChangeSources
1914         (Build Properties): add 'buildername'
1916         * buildbot/process/base.py (Build.setupStatus): oops, set
1917         'buildername' and 'buildnumber' properties
1918         * buildbot/test/test_properties.py (Interpolate.testBuildNumber):
1919         test them
1921 2006-05-22  Brian Warner  <warner@lothar.com>
1923         * docs/buildbot.texinfo (Build Properties): explain the syntax of
1924         property interpolation better
1926         * README (INSTALLATION): remove old '-v' argument from recommended
1927         trial command line
1929         * docs/buildbot.texinfo (ShellCommand): add docs for description=
1930         and descriptionDone= arguments. Thanks to Niklaus Giger for the
1931         patch. SF#1475494.
1933         * buildbot/slave/commands.py (SVN.parseGotRevision._parse): use
1934         'svnversion' instead of grepping the output of 'svn info', much
1935         simpler and avoids CR/LF problems on windows. Thanks to Olivier
1936         Bonnet for the suggestion.
1937         (SVN.parseGotRevision): oops, older verisons of 'svnversion'
1938         require the WC_PATH argument, so run 'svnversion .' instead.
1940         * buildbot/interfaces.py (IChangeSource): methods in Interfaces
1941         aren't supposed to have 'self' in their argument list
1943 2006-05-21  Brian Warner  <warner@lothar.com>
1945         * buildbot/process/step.py (ShellCommand.start): make
1946         testInterpolate pass. I was passing the uninterpolated command to
1947         the RemoteShellCommand constructor
1948         (ShellCommand._interpolateProperties): oops, handle non-list
1949         commands (i.e. strings with multiple words separated by spaces in
1950         them) properly, instead of forgetting about them.
1952         * buildbot/test/test_properties.py (Run.testInterpolate): new test
1953         to actually try to use build properties in a real build. This test
1954         fails.
1955         * buildbot/test/runutils.py (RunMixin.requestBuild): utility methods
1956         to start and evaluate builds
1958         * buildbot/test/test__versions.py: add a pseudo-test to record
1959         what version of Twisted/Python/Buildbot are running. This should
1960         show up at the beginning of _trial_tmp/test.log, and exists to help
1961         debug other problems.
1963         * buildbot/status/html.py (Waterfall): add 'robots_txt=' argument,
1964         a filename to be served as 'robots.txt' to discourage web spiders.
1965         Adapted from a patch by Tobi Vollebregt, thanks!
1966         * buildbot/test/test_web.py (Waterfall._test_waterfall_5): test it
1967         (Waterfall.test_waterfall): tweak the way that filenames are put
1968         into the config file, to accomodate windows pathnames better.
1970         * docs/buildbot.texinfo (HTML Waterfall): document it
1972         * buildbot/process/process_twisted.py
1973         (QuickTwistedBuildFactory.__init__): recent versions of Twisted
1974         changed the build process. The new setup.py no longer takes the
1975         'all' argument.
1976         (FullTwistedBuildFactory.__init__): same
1977         (TwistedReactorsBuildFactory.__init__): same
1979         * contrib/hg_buildbot.py: wrote a commit script for mercurial, to
1980         be placed in the [hooks] section of the central repository (the
1981         one that everybody pushes changes to).
1983 2006-05-20  Brian Warner  <warner@lothar.com>
1985         * buildbot/slave/commands.py (Darcs.doVCFull): when writing the
1986         .darcs-context file, use binary mode. I think this was causing a
1987         Darcs failure under windows.
1989 2006-05-19  Brian Warner  <warner@lothar.com>
1991         * buildbot/scripts/tryclient.py (CVSExtractor.getBaseRevision):
1992         use a timezone string of +0000 and gmtime, since this timestamp is
1993         sent to a buildmaster and %z is broken.
1995         * buildbot/test/test_vc.py (CVSHelper.getdate): use no timezone
1996         string and localtime, since this timestamp will only be consumed
1997         locally, and %z is broken.
1999         * buildbot/slave/commands.py (CVS.parseGotRevision): use +0000 and
2000         gmtime, since this timestamp is returned to the buildmaster, and
2001         %z is broken.
2003 2006-05-18  Brian Warner  <warner@lothar.com>
2005         * NEWS: update in preparation for next release
2007         * buildbot/test/test_vc.py (VCS_Helper): factor out all the
2008         setup-repository and do-we-have-the-vc-tools code into a separate
2009         "helper" class, which sticks around in a single module-level
2010         object. This seems more likely to continue to work in the future
2011         than having it hide in the TestCase and hope that TestCases stick
2012         around for a long time.
2014         * buildbot/test/test_vc.py (MercurialSupport.vc_create): 'hg
2015         addremove' has been deprecated in recent versions of mercurial, so
2016         use 'hg add' instead
2018 2006-05-07  Brian Warner  <warner@lothar.com>
2020         * buildbot/scheduler.py (Try_Jobdir.messageReceived): when
2021         operating under windows, move the file before opening it, since
2022         you can't rename a file that somebody has open.
2024         * buildbot/process/base.py (Build.setupBuild): if something goes
2025         wrong while creating a Step, log the name and arguments, since the
2026         error message when you get the number of arguments wrong is really
2027         opaque.
2029 2006-05-06  Brian Warner  <warner@lothar.com>
2031         * buildbot/process/step_twisted.py (Trial.setupEnvironment): more
2032         bugs in twisted-specific code not covered by my unit tests, this
2033         time use 'cmd' argument instead of self.cmd
2035         * buildbot/process/process_twisted.py (TwistedBuild.isFileImportant):
2036         fix stupid braino: either use startwith or find()==0, not both.
2037         (TwistedReactorsBuildFactory.__init__): another dumb typo
2039         * buildbot/test/test_slavecommand.py (ShellBase.testInterrupt1): 
2040         mark this test as TODO under windows, since process-killing seems
2041         dodgy there. We'll come back to this later and try to fix it
2042         properly.
2044         * buildbot/test/test_vc.py (CVSSupport.getdate): use localtime,
2045         and don't include a timezone
2046         (CVSSupport.vc_try_checkout): stop trying to strip the timezone.
2047         This should avoid the windows-with-verbose-timezone-name problem
2048         altogether.
2049         (Patch.testPatch): add a test which runs 'patch' with less
2050         overhead than the full VCBase.do_patch sequence, to try to isolate
2051         a windows test failure. This one uses slave.commands.ShellCommand
2052         and 'patch', but none of the VC code.
2054         * buildbot/slave/commands.py (getCommand): use which() to find the
2055         executables for 'cvs', 'svn', etc. This ought to help under
2056         windows.
2058         * buildbot/test/test_vc.py (VCBase.do_getpatch): Delete the
2059         working directory before starting. If an earlier test failed, the
2060         leftover directory would mistakenly flunk a later test.
2061         (ArchCommon.registerRepository): fix some tla-vs-baz problems.
2062         Make sure that we use the right commandlines if which("tla") picks
2063         up "tla.exe" (as it does under windows).
2064         (TlaSupport.do_get): factor out this tla-vs-baz difference
2065         (TlaSupport.vc_create): more tla-vs-baz differences
2067         * buildbot/test/test_slavecommand.py
2068         (ShellBase.testShellMissingCommand): stop trying to assert
2069         anything about the error message: different shells on different
2070         OSes with different languages makes it hard, and it really isn't
2071         that interesting of a thing to test anyway.
2073         * buildbot/test/test_vc.py (CVSSupport.capable): skip CVS tests if
2074         we detect cvs-1.10 (which is the version shipped with OS-X 10.3
2075         "Panther"), because it has a bug which flunks a couple tests in
2076         weird ways. I've checked that cvs-1.12.9 (as shipped with debian)
2077         is ok. OS-X 10.4 "Tiger" ships with cvs-1.11, but I haven't been
2078         able to test that yet.
2080 2006-04-30  Brian Warner  <warner@lothar.com>
2082         * buildbot/test/test_vc.py (VCBase.runCommand): set $LC_ALL="C" to
2083         make sure child commands emit messages in english, so our regexps
2084         will match. Thanks to Nikaus Giger for identifying the problems.
2085         (VCBase._do_vctest_export_1): mode="export" is not responsible
2086         for setting the "got_revision" property, since in many cases it is
2087         not convenient to determine.
2088         (SVNSupport.capable): when running 'svn --version' to check for
2089         ra_local, we want error messages in english
2090         * buildbot/test/test_slavecommand.py 
2091         (ShellBase.testShellMissingCommand): set $LC_ALL="C" to get bash
2092         to emit the error message in english
2094         * buildbot/slave/commands.py (SourceBase.setup): stash a copy of
2095         the environment with $LC_ALL="C" so that Commands which need to
2096         parse the output of their child processes can obtain it in
2097         english.
2098         (SVN.parseGotRevision): call "svn info" afterwards instead of
2099         watching the output of the "svn update" or "svn checkout".
2100         (Darcs.parseGotRevision): use $LC_ALL="C" when running the command
2101         (Arch.parseGotRevision): same
2102         (Bazaar.parseGotRevision): same
2103         (Mercurial.parseGotRevision): same
2105         * buildbot/scripts/tryclient.py (SourceStampExtractor.dovc): set
2106         $LC_ALL="C" when running commands under 'buildbot try', too
2108         * buildbot/test/__init__.py: remove the global os.environ()
2109         setting, instead we do it just for the tests that run commands and
2110         need to parse their output.
2112         * buildbot/test/test_scheduler.py (Scheduling.testTryJobdir):
2113         remove the overly-short .timeout on this test, because non-DNotify
2114         platforms must fall back to polling which happens at 10 second
2115         intervals, so a 5 second timeout would never succeed.
2117 2006-04-24  Brian Warner  <warner@lothar.com>
2119         * docs/buildbot.texinfo (Installing the code): update trial
2120         invocation, SF#1469116 by Niklaus Giger.
2121         (Attributes of Changes): updated branch-name examples to be
2122         a bit more realistic, SF#1475240 by Stephen Davis.
2124         * contrib/windows/buildbot2.bat: utility wrapper for windows
2125         developers, contributed by Nick Trout (after a year of neglect..
2126         sorry!). SF#1194231.
2128         * buildbot/test/test_vc.py (*.capable): store the actual VC
2129         binary's pathname in VCS[vcname], so it can be retrieved later
2130         (CVSSupport.vc_try_checkout): incorporate Niklaus Giger's patch to
2131         strip out non-numeric timezone information, specifically the funky
2132         German string that his system produced that confuses CVS.
2133         (DarcsSupport.vc_create): use dovc() instead of vc(), this should
2134         allow Darcs tests to work on windows
2135         * buildbot/scripts/tryclient.py (SourceStampExtractor): use
2136         procutils.which() everywhere, to allow tryclient to work under
2137         windows. Also from Niklaus Giger, SF#1463394.
2139         * buildbot/twcompat.py (which): move the replacement for a missing
2140         twisted.python.procutils.which from test_vc.py to here, so it can
2141         be used in other places too (specifically tryclient.py)
2143 2006-04-23  Brian Warner  <warner@lothar.com>
2145         * buildbot/status/html.py (StatusResourceBuild.body): replace the
2146         bare buildbotURL/projectName line with a proper DIV, along with a
2147         CSS class of "title", from Stefan Seefeld (SF#1461675).
2148         (WaterfallStatusResource.body0): remove the redundant 'table'
2149         class from the table
2150         (WaterfallStatusResource.body): same. Also add class="LastBuild"
2151         to the top-row TR, and class="Activity" to the second-row TR,
2152         rather than putting them in the individual TD nodes.
2154         * buildbot/test/test_vc.py (VCBase.checkGotRevision): test
2155         'got_revision' build property for all VC systems that implement
2156         accurate ones: SVN, Darcs, Arch, Bazaar, Mercurial.
2158         * buildbot/slave/commands.py (SourceBase._handleGotRevision): try
2159         to determine which revision we actually obtained
2160         (CVS.parseGotRevision): implement this for CVS, which just means
2161         to grab a timestamp. Not ideal, and it depends upon the buildslave
2162         having a clock that is reasonably well syncronized with the server,
2163         but it's better than nothing.
2164         (SVN.parseGotRevision): implement it for SVN, which is accurate
2165         (Darcs.parseGotRevision): same
2166         (Arch.parseGotRevision): same
2167         (Bazaar.parseGotRevision): same
2168         (Mercurial.parseGotRevision): same
2170         * buildbot/process/step.py (LoggedRemoteCommand.remoteUpdate):
2171         keep a record of all non-stdout/stderr/header/rc status updates,
2172         for the benefit of RemoteCommands that send other useful things,
2173         like got_revision
2174         (Source.commandComplete): put any 'got_revision' status values
2175         into a build property of the same name
2178         * buildbot/process/step_twisted.py (Trial): update to deal with
2179         new ShellCommand refactoring
2181         * docs/buildbot.texinfo (Build Properties): document new feature
2182         that allows BuildSteps to get/set Build-wide properties like which
2183         revision was requested and/or checked out.
2185         * buildbot/interfaces.py (IBuildStatus.getProperty): new method
2186         * buildbot/status/builder.py (BuildStatus.getProperty): implement
2187         it. Note that this bumps the persistenceVersion of the saved Build
2188         object, so add the necessary upgrade-old-version logic to include
2189         an empty properties dict.
2191         * buildbot/process/base.py (Build.setProperty): implement it
2192         (Build.getProperty): same
2193         (Build.startBuild): change build startup to set 'branch',
2194         'revision', and 'slavename' properties at the right time
2196         * buildbot/process/step.py (BuildStep.__init__): change setup to
2197         require 'build' argument in a better way
2198         (LoggingBuildStep): split ShellCommand into two pieces, for better
2199         subclassing elsewhere. LoggingBuildStep is a BuildStep which runs
2200         a single RemoteCommand that sends stdout/stderr status text. It
2201         also provides the usual commandComplete / createSummary /
2202         evaluateCommand / getText methods to be overridden...
2203         (ShellCommand): .. whereas ShellCommand is specifically for
2204         running RemoteShellCommands. Other shell-like BuildSteps (like
2205         Source) can inherit from LoggingBuildStep instead of ShellCommand
2206         (WithProperties): marker class to do build-property interpolation
2207         (Source): inherit from LoggingBuildStep instead of ShellCommand
2208         (RemoteDummy): same
2210         * buildbot/test/test_properties.py: test new functionality
2212 2006-04-21  Brian Warner  <warner@lothar.com>
2214         * buildbot/test/test_vc.py: rename testBranch to
2215         testCheckoutBranch to keep the tests in about the right
2216         alphabetical order
2218 2006-04-18  Brian Warner  <warner@lothar.com>
2220         * docs/buildbot.texinfo (PBListener): improve cross-references
2221         between PBListener and 'buildbot statusgui', thanks to John Pye
2222         for the suggestion.
2224 2006-04-17  Brian Warner  <warner@lothar.com>
2226         * buildbot/twcompat.py (maybeWait): handle SkipTest properly when
2227         running under Twisted-1.3.0, otherwise skipped tests are reported
2228         as errors.
2230         * all: use isinstance() instead of 'type(x) is foo', suggested by
2231         Neal Norwitz
2233         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
2234         oops, fix a brain-fade from the other week, when making the
2235         addStep changes. I changed all the __init__ upcalls to use the
2236         wrong superclass name.
2237         (FullTwistedBuildFactory.__init__): same
2238         (TwistedDebsBuildFactory.__init__): same
2239         (TwistedReactorsBuildFactory.__init__): same
2240         (TwistedBuild.isFileImportant): use .startswith for clarity,
2241         thanks to Neal Norwitz for the suggestions.
2243         * contrib/viewcvspoll.py: script to poll a viewcvs database for
2244         changes, then deliver them over PB to a remote buildmaster.
2246         * contrib/svnpoller.py: added script by John Pye to poll a remote
2247         SVN repository (by running 'svn log') from a cronjob, and run
2248         'buildbot sendchange' to deliver the changes to a remote
2249         buildmaster.
2250         * contrib/svn_watcher.py: added script by Niklaus Giger (a
2251         modification of svnpoller.py), same purpose, but this one loops
2252         internally (rather than expecting to run from a cronjob) and works
2253         under windows.
2254         * contrib/README.txt: same
2256 2006-04-11  Brian Warner  <warner@lothar.com>
2258         * all: fix a number of incorrect names and missing imports, thanks
2259         to Anthony Baxter for the patch.
2260         * buildbot/status/html.py (WaterfallStatusResource.statusToHTML): 
2261         remove unused buggy method.
2262         * buildbot/status/builder.py (BuildStatus.saveYourself): rmtree
2263         comes from shutil, not "shutils"
2264         * buildbot/process/step.py (TreeSize.evaluateCommand): fix bad name
2265         (Arch.checkSlaveVersion): same
2266         * buildbot/process/step_twisted.py (Trial.commandComplete): same, in
2267         some disabled code
2268         * buildbot/process/step_twisted2.py: add some missing imports
2269         * buildbot/twcompat.py (_deferGenerator): fix cut-and-paste error,
2270         this code used to live in twisted.internet.defer
2272 2006-04-10  Brian Warner  <warner@lothar.com>
2274         * buildbot/process/step.py (Mercurial): add Mercurial support
2275         * buildbot/slave/commands.py (Mercurial): same
2276         * buildbot/scripts/tryclient.py (MercurialExtractor): same
2277         * buildbot/test/test_vc.py (Mercurial): same, checkout over HTTP is
2278         not yet tested, but 'try' support *is* covered
2279         * docs/buildbot.texinfo (Mercurial): document it
2281         * buildbot/process/step.py (LoggedRemoteCommand.remoteUpdate): add
2282         some debugging messages (turned off)
2283         * buildbot/test/test_vc.py: improve debug messages
2285 2006-04-07  Brian Warner  <warner@lothar.com>
2287         * buildbot/test/test_vc.py (which): define our own which() in case
2288         we can't import twisted.python.procutils, because procutils doesn't
2289         exist in Twisted-1.3
2291         * docs/buildbot.texinfo (Interlocks): fix some typos, mention use
2292         of SlaveLocks for performance tests
2294         * docs/examples/twisted_master.cfg: update to match current usage
2296         * buildbot/changes/p4poller.py (P4Source): add new arguments:
2297         password, p4 binary, pollinterval, maximum history to check.
2298         Patch from an anonymous sf.net contributor, SF#1219384.
2299         * buildbot/process/step.py (P4Sync.__init__): add username,
2300         password, and client arguments.
2301         * buildbot/slave/commands.py (P4Sync): same
2303 2006-04-05  Brian Warner  <warner@lothar.com>
2305         * buildbot/process/factory.py (BuildFactory.addStep): new method
2306         to add steps to a BuildFactory. Use it instead of f.steps.append,
2307         and you can probably avoid using the s() convenience function.
2308         Patch from Neal Norwitz, sf.net #1412605.
2309         (other): update all factories to use addStep
2310         * buildbot/process/process_twisted.py: update all factories to use
2311         addStep.
2313 2006-04-03  Brian Warner  <warner@lothar.com>
2315         * buildbot/test/test_vc.py: modified find-the-VC-command logic to
2316         work under windows too. Adapted from a patch by Niklaus Giger,
2317         addresses SF#1463399.
2319         * buildbot/test/__init__.py: set $LANG to 'C', to insure that
2320         spawned commands emit parseable results in english and not some
2321         other language. Patch from Niklaus Giger, SF#1463395.
2323         * README (INSTALLATION): discourage users from running unit tests on
2324         a "network drive", patch from Niklaus Giger, SF#1463394.
2326 2006-03-22  Brian Warner  <warner@lothar.com>
2328         * contrib/svn_buildbot.py: rearrange, add an easy-to-change
2329         function to turn a repository-relative pathname into a (branch,
2330         branch-relative-filename) tuple. Change this function to handle
2331         the branch naming policy used by your Subversion repository.
2332         Thanks to AllMyData.com for sponsoring this work.
2334 2006-03-16  Brian Warner  <warner@lothar.com>
2336         * buildbot/scripts/sample.cfg: add python-mode declaration for
2337         vim. Thanks to John Pye for the patch.
2339         * docs/buildbot.texinfo (Launching the daemons): fix @reboot job
2340         command line, mention the importance of running 'crontab' as the
2341         buildmaster/buildslave user. Thanks to John Pye for the catch.
2343 2006-03-13  Brian Warner  <warner@lothar.com>
2345         * buildbot/status/words.py (IRC): add an optional password=
2346         argument, which will be sent to Nickserv in an IDENTIFY message at
2347         login, to claim the nickname. freenode requires this before the
2348         bot can sent (or reply to) private messages. Thanks to Clement
2349         Stenac for the patch.
2350         * docs/buildbot.texinfo (IRC Bot): document it
2352         * buildbot/status/builder.py (LogFile.merge): don't write chunks
2353         larger than chunkSize. Fixes SF#1349253.
2354         * buildbot/test/test_status.py (Log.testLargeSummary): test it
2355         (Log.testConsumer): update to match new internal chunking behavior
2357 2006-03-12  Brian Warner  <warner@lothar.com>
2359         * buildbot/test/test_vc.py: remove the last use of waitForDeferred
2361         * buildbot/test/test_maildir.py (MaildirTest): rename the
2362         'timeout' method, as it collides with trial's internals
2364         * buildbot/scripts/runner.py: add 'buildbot restart' command
2365         (stop): don't sys.exit() out of here, otherwise restart can't work
2366         * docs/buildbot.texinfo (Shutdown): document it
2368         * buildbot/buildset.py (BuildSet.__init__): clean up docstring
2369         * buildbot/status/html.py (Waterfall.__init__): same
2370         * buildbot/process/builder.py (Builder.startBuild): same
2371         * buildbot/process/base.py (BuildRequest): same
2372         * buildbot/sourcestamp.py (SourceStamp): same
2373         * buildbot/scheduler.py (Nightly): same
2375         * buildbot/__init__.py (version): bump to 0.7.2+ while between
2376         releases
2377         * docs/buildbot.texinfo: same
2379 2006-02-17  Brian Warner  <warner@lothar.com>
2381         * buildbot/__init__.py (version): Releasing buildbot-0.7.2
2382         * docs/buildbot.texinfo: set version number to match
2383         * NEWS: update for 0.7.2
2385 2006-02-16  Brian Warner  <warner@lothar.com>
2387         * docs/buildbot.texinfo (Build Dependencies): add cindex tag
2389 2006-02-09  Brian Warner  <warner@lothar.com>
2391         * docs/buildbot.texinfo (How Different VC Systems Specify Sources):
2392         add text to explain per-build branch parameters
2393         * NEWS: mention --umask
2395 2006-02-08  Brian Warner  <warner@lothar.com>
2397         * buildbot/scripts/runner.py (Maker.makeSlaveTAC): remove unused
2398         method
2399         (SlaveOptions.optParameters): add --umask, to make it possible to
2400         make buildslave-generated files (including build products) be
2401         world-readable
2402         (slaveTAC): same
2403         * buildbot/slave/bot.py (BuildSlave.startService): same
2405 2006-01-23  Brian Warner  <warner@lothar.com>
2407         * buildbot/status/builder.py: urllib.quote() all URLs that include
2408         Builder names, so that builders can include characters like '/'
2409         and ' ' without completely breaking the resulting HTML. Thanks to
2410         Kevin Turner for the patch.
2411         * buildbot/status/html.py: same
2412         * buildbot/test/test_web.py (GetURL.testBuild): match changes
2414         * NEWS: update in preparation for upcoming release
2416 2006-01-18  Brian Warner  <warner@lothar.com>
2418         * docs/examples/twisted_master.cfg: update to match the Twisted
2419         buildbot: remove python2.2, switch to exarkun's buildslaves,
2420         disable the .deb builder until we figure out how to build twisted
2421         .debs from SVN, add some ktrace debugging to the OS-X build
2422         process and remove the qt build, remove threadless builders,
2423         change freebsd builder to use landonf's buildslave.
2425 2006-01-12  Brian Warner  <warner@lothar.com>
2427         * buildbot/master.py (Manhole.__init__): let port= be a strports
2428         specification string, but handle a regular int for backwards
2429         compatibility. This allows "tcp:12345:interface=127.0.0.1" to be
2430         used in master.cfg to limit connections to just the local host.
2431         (BuildMaster.loadConfig): same for c['slavePortnum']
2432         * buildbot/scheduler.py (Try_Userpass.__init__): same
2433         * buildbot/status/client.py (PBListener.__init__): same
2434         * buildbot/status/html.py (Waterfall.__init__): same, for both
2435         http_port and distrib_port. Include backwards-compatibility checks
2436         so distrib_port can be a filename string and still mean unix:/foo
2437         * docs/buildbot.texinfo (Setting the slaveport): document it
2438         (Debug options): same
2439         (HTML Waterfall): same
2440         (PBListener): same
2441         (try): same
2442         * buildbot/test/test_config.py (ConfigTest): test it
2444         * buildbot/master.py (BuildMaster.loadConfig): wait for the
2445         slaveport's disownServiceParent deferred to fire before opening
2446         the new one. Fixes an annoying bug in the unit tests.
2448 2006-01-03  Brian Warner  <warner@lothar.com>
2450         * buildbot/master.py (BuildMaster): remove the .schedulers
2451         attribute, replacing it with an allSchedulers() method that looks
2452         for all IService children that implement IScheduler. Having only
2453         one parent/child relationship means fewer opportunities for bugs.
2454         (BuildMaster.allSchedulers): new method
2455         (BuildMaster.loadConfig_Schedulers): update to use allSchedulers,
2456         also fix ugly bug that caused any config-file reload to
2457         half-forget about the earlier Schedulers, causing an exception
2458         when a Change arrived and was handed to a half-connected
2459         Scheduler. The exception was in scheduler.py line 54ish:
2460           self.parent.submitBuildSet(bs)
2461           exceptions.AttributeError: 'NoneType' object has no attribute
2462           'submitBuildSet'
2463         (BuildMaster.addChange): update to use allSchedulers()
2465         * buildbot/scheduler.py (BaseScheduler.__implements__): fix this
2466         to work properly with twisted-1.3.0, where you must explicitly
2467         include the __implements__ from parent classes
2468         (BaseScheduler.__repr__): make it easier to distinguish distinct
2469         instances
2470         (BaseUpstreamScheduler.__implements__): same
2472         * buildbot/status/builder.py (Status.getSchedulers): update to
2473         use allSchedulers()
2474         * buildbot/test/test_run.py (Run.testMaster): same
2475         * buildbot/test/test_dependencies.py (Dependencies.findScheduler): same
2476         * buildbot/test/test_config.py (ConfigTest.testSchedulers): same,
2477         make sure Scheduler instances are left alone when an identical
2478         config file is reloaded
2479         (ConfigElements.testSchedulers): make sure Schedulers are properly
2480         comparable
2482         * Makefile (TRIALARGS): my local default Twisted version is now
2483         2.1.0, update the trial arguments accordingly
2485 2005-12-22  Brian Warner  <warner@lothar.com>
2487         * docs/examples/twisted_master.cfg: merge changes from pyr: add
2488         new win32 builders
2490         * buildbot/scheduler.py (BaseScheduler.addChange): include a dummy
2491         addChange in the parent class, although I suspect this should be
2492         fixed better in the future.
2494 2005-11-26  Brian Warner  <warner@lothar.com>
2496         * buildbot/scheduler.py (AnyBranchScheduler.addChange): don't
2497         explode when branch==None, thanks to Kevin Turner for the catch
2498         * buildbot/test/test_scheduler.py (Scheduling.testAnyBranch): test
2499         it
2501         * buildbot/__init__.py (version): bump to 0.7.1+ while between
2502         releases
2503         * docs/buildbot.texinfo: same
2505 2005-11-26  Brian Warner  <warner@lothar.com>
2507         * buildbot/__init__.py (version): Releasing buildbot-0.7.1
2508         * docs/buildbot.texinfo: set version number to match
2510 2005-11-26  Brian Warner  <warner@lothar.com>
2512         * NEWS: update for 0.7.1
2514         * buildbot/status/builder.py (BuildStepStatus.unsubscribe): make
2515         sure that unsubscribe works even if we never sent an ETA update.
2516         Also, don't explode on duplicate unsubscribe.
2517         (BuildStepStatus.addLog): make the convenience "return self"-added
2518         watcher automatically unsubscribe when the Step finishes.
2519         (BuildStatus.unsubscribe): same handle-duplicate-unsubscribe
2520         (BuildStatus.stepStarted): same auto-unsubscribe
2521         (BuilderStatus.buildStarted): same auto-unsubscribe
2523         * buildbot/interfaces.py (IStatusReceiver.buildStarted): document
2524         auto-unsubscribe
2525         (IStatusReceiver.stepStarted): same
2526         (IStatusReceiver.logStarted): same
2528         * buildbot/test/test_run.py (Status): move the Status test..
2529         * buildbot/test/test_status.py (Subscription): .. to here
2531 2005-11-25  Brian Warner  <warner@lothar.com>
2533         * NEWS: more updates
2535         * buildbot/locks.py: fix the problem in which loading a master.cfg
2536         file that changes some Builders (but not all of them) can result
2537         in having multiple copies of the same Lock. Now, the real Locks
2538         are kept in a table inside the BotMaster, and the Builders/Steps
2539         use "LockIDs", which are still instances of MasterLock and
2540         SlaveLock. The real Locks are instances of the new RealMasterLock
2541         and RealSlaveLock classes.
2542         * buildbot/master.py (BotMaster.getLockByID): new method to
2543         convert LockIDs into real Locks.
2544         * buildbot/process/base.py (Build.startBuild): convert LockIDs
2545         into real Locks before building
2546         * buildbot/process/step.py (BuildStep.startStep): same
2547         * buildbot/test/test_locks.py (Locks.testLock1a): add a test which
2548         exercises the problem
2551         * docs/buildbot.texinfo (Scheduler Types): give a few hints about
2552         what Schedulers are available
2554         * buildbot/scheduler.py (Nightly): add new Scheduler based upon
2555         work by Dobes Vandermeer and hacked mercilessly by me. This offers
2556         'cron'-style build scheduling at certain times of day, week,
2557         month, or year.
2558         * buildbot/test/test_scheduler.py (Scheduling.testNightly): test it
2560         * buildbot/scheduler.py (Scheduler): change fileIsImportant
2561         handling: treat self.fileIsImportant more as an attribute that
2562         contains a callable than as a method. If the attribute is None,
2563         don't call it and assume all filenames are important. It is still
2564         possible to provide a fileIsImportant method in a subclass,
2565         however.
2566         (AnyBranchScheduler): handle fileIsImportant=None, previously it
2567         was broken
2568         * buildbot/test/test_scheduler.py (Scheduling.testAnyBranch2):
2569         test using AnyBranchScheduler with fileIsImportant=None
2571 2005-11-24  Brian Warner  <warner@lothar.com>
2573         * buildbot/test/test_config.py (StartService): don't claim a fixed
2574         port number, instead set slavePort=0 on the first pass, figure out
2575         what port was allocated, then switch to a config file that uses
2576         the allocated port.
2578         * buildbot/master.py (BuildMaster.loadConfig): close the old
2579         slaveport before opening the new one, because unit tests might
2580         replace slavePort=0 with the same allocated portnumber, and if we
2581         don't wait for the old port to close first, we get a "port already
2582         in use" error. There is a tiny race condition here, but the only
2583         threat is from other programs that bind (statically) to the same
2584         port number we happened to be allocated, and only if those
2585         programs use SO_REUSEADDR, and only if they get control in between
2586         reactor turns.
2588         * Makefile (TRIALARGS): update to handle Twisted > 2.1.0
2590         * buildbot/master.py (BuildMaster.loadConfig_Sources): remove all
2591         deleted ChangeSources before adding any new ones
2592         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): fix
2593         compare_attrs, to make sure that a config-file reload does not
2594         unnecessarily replace an unmodified ChangeSource instance
2595         * buildbot/test/test_config.py (ConfigTest.testSources): update
2597         * buildbot/scheduler.py (AnyBranchScheduler): fix branches=[] to
2598         mean "don't build anything", and add a warning if it gets used
2599         because it isn't actually useful.
2601         * contrib/svn_buildbot.py: update example usage to match the port
2602         number that gets used by the PBChangeSource
2603         * buildbot/scripts/sample.cfg: add example of PBChangeSource
2605 2005-11-22  Brian Warner  <warner@lothar.com>
2607         * NEWS: start collecting items for next release
2609         * buildbot/process/step.py (SVN.computeSourceRevision): assume
2610         revisions are strings
2611         (P4Sync.computeSourceRevision): same
2613         * buildbot/status/html.py (StatusResourceBuild.body): add a link
2614         to the Buildbot's overall status page
2615         (StatusResourceBuilder.body): same
2617 2005-11-15  Brian Warner  <warner@lothar.com>
2619         * buildbot/master.py (BuildMaster.loadConfig): serialize the
2620         config-file loading, specifically to make sure old StatusTargets
2621         are finished shutting down before new ones start up (thus
2622         resolving a bug in which changing the Waterfall object would fail
2623         because both new and old instances were claiming the same
2624         listening port). Also load new Schedulers after all the new
2625         Builders are set up, in case they fire off a new build right away.
2626         * buildbot/test/test_config.py (StartService): test it
2628         * buildbot/status/mail.py (MailNotifier.buildMessage): oops, add
2629         the branch name to the mail body
2631         * buildbot/changes/pb.py (PBChangeSource.compare_attrs): add this.
2632         Without it, a config-file reload fails to update an existing
2633         PBChangeSource.
2634         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): add
2635         username/passwd to compare_attrs, for the same reason
2636         * buildbot/status/html.py (Waterfall): add favicon to
2637         compare_attrs, same reason
2639 2005-11-05  Brian Warner  <warner@lothar.com>
2641         * buildbot/scripts/tryclient.py (createJobfile): stringify the
2642         baserev before stuffing it in the jobfile. This resolves problems
2643         under SVN (and probably Arch) where revisions are expressed as
2644         numbers. I'm inclined to use string-based revisions everywhere in
2645         the future, but this fix should be safe for now. Thanks to Steven
2646         Walter for the patch.
2648         * buildbot/changes/changes.py (ChangeMaster.saveYourself): use
2649         binary mode when opening pickle files, to make windows work
2650         better. Thanks to Dobes Vandermeer for the catch.
2651         * buildbot/status/builder.py (BuildStatus.saveYourself): same
2652         (BuilderStatus.getBuildByNumber): same
2653         (Status.builderAdded): same
2654         * buildbot/master.py (BuildMaster.loadChanges): same
2656         * buildbot/util.py (Swappable): delete unused leftover code
2658         * buildbot/process/step.py (SVN): when building on a non-default
2659         branch, add the word "[branch]" to the VC step's description, so
2660         it is obvious that we're not building the usual stuff. Likewise,
2661         when we are building a specific revision, add the text "rNNN" to
2662         indicate what that revision number is. Thanks to Brad Hards and
2663         Nathaniel Smith for the suggestion.
2664         (Darcs.startVC): same
2665         (Arch.startVC): same
2666         (Bazaar.startVC): same
2668         * buildbot/process/factory.py (GNUAutoconf.__init__): fix a silly
2669         typo, caught by Mark Dillavou, closes SF#1216636.
2671         * buildbot/test/test_status.py (Log.TODO_testDuplicate): add notes
2672         about a test to add some day
2674         * docs/examples/twisted_master.cfg: update: bot1 can now handle
2675         the 'full-2.3' build, and the 'reactors' build is now run under
2676         python-2.4 because the buildslave no longer has gtk/etc bindings
2677         for earlier versions.
2679 2005-11-03  Brian Warner  <warner@lothar.com>
2681         * buildbot/interfaces.py (IBuilderControl.resubmitBuild): new
2682         method, takes an IBuildStatus and rebuilds it. It might make more
2683         sense to add this to IBuildControl instead, but that instance goes
2684         away completely once the build has finished, and resubmitting
2685         builds can take place weeks later.
2686         * buildbot/process/builder.py (BuilderControl.resubmitBuild): same
2687         * buildbot/status/html.py (StatusResourceBuild): also stash an
2688         IBuilderControl so we can use resubmitBuild.
2689         (StatusResourceBuild.body): render "resubmit" button if we can.
2690         Also add hrefs for each BuildStep
2691         (StatusResourceBuild.rebuild): add action for "resubmit" button
2692         (StatusResourceBuilder.getChild): give it an IBuilderControl
2694         * buildbot/status/builder.py (Status.getURLForThing): change the
2695         URL for BuildSteps to have a "step-" prefix, so the magic URLs
2696         that live as targets of buttons like "stop" and "rebuild" can't
2697         collide with them.
2698         * buildbot/status/builder.py (Status.getURLForThing): same
2699         * buildbot/status/html.py (StatusResourceBuild.getChild): same
2700         (StepBox.getBox): same
2701         * buildbot/test/test_web.py (GetURL): same
2702         (Logfile): same
2704         * buildbot/process/step.py (SVN.__init__): put svnurl/baseURL
2705         exclusivity checks after Source.__init__ upcall, so misspelled
2706         arguments will be reported more usefully
2707         (Darcs.__init__): same
2709 2005-10-29  Brian Warner  <warner@lothar.com>
2711         * docs/examples/twisted_master.cfg: don't double-fire the 'quick'
2712         builder. Move the Try scheduler off to a separate port.
2714 2005-10-27  Brian Warner  <warner@lothar.com>
2716         * buildbot/clients/gtkPanes.py
2717         (TwoRowClient.remote_builderRemoved): disappearing Builders used
2718         to cause the app to crash, now they don't.
2720         * buildbot/clients/debug.py: display the buildmaster's location
2721         in the window's title bar
2723 2005-10-26  Brian Warner  <warner@lothar.com>
2725         * buildbot/status/mail.py (MailNotifier): urllib.escape the URLs
2726         in case they have spaces or whatnot. Patch from Dobes Vandermeer.
2727         * buildbot/test/test_status.py (MyStatus.getURLForThing): fix it
2729         * buildbot/status/html.py (td): put a single non-breaking space
2730         inside otherwise empty <td> elements, as a workaround for buggy
2731         browsers which would optimize them away (along with any associated
2732         styles, like the kind that create the waterfall grid borders).
2733         Patch from Frerich Raabe.
2735         * buildbot/process/step_twisted.py (Trial): expose the trialMode=
2736         argv-list as an argument, defaulting to ["-to"], which is
2737         appropriate for the Trial that comes with Twisted-2.1.0 and
2738         earlier. The Trial in current Twisted SVN wants
2739         ["--reporter=bwverbose"] instead. Also expose trialArgs=, which
2740         defaults to an empty list.
2741         * buildbot/process/process_twisted.py (TwistedTrial.trialMode):
2742         match it, now that trialMode= is a list instead of a single string
2744         * buildbot/__init__.py (version): bump to 0.7.0+ while between
2745         releases
2746         * docs/buildbot.texinfo: same
2748 2005-10-24  Brian Warner  <warner@lothar.com>
2750         * buildbot/__init__.py (version): Releasing buildbot-0.7.0
2751         * docs/buildbot.texinfo: set version number to match
2753 2005-10-24  Brian Warner  <warner@lothar.com>
2755         * README: update for 0.7.0
2756         * NEWS: same
2757         * docs/buildbot.texinfo: move the freshcvs stuff out of the README
2759         * buildbot/clients/debug.glade: add 'branch' box to fake-commit
2760         * buildbot/clients/debug.py (DebugWidget.do_commit): same. Don't
2761         send the branch= argument unless the user really provided one, to
2762         retain compatibility with older buildmasters that don't accept
2763         that argument.
2764         * buildbot/master.py (DebugPerspective.perspective_fakeChange):
2765         same
2767         * docs/buildbot.texinfo: update lots of stuff
2769         * buildbot/scripts/runner.py (sendchange): add a --branch argument
2770         to the 'buildbot sendchange' command
2771         * buildbot/clients/sendchange.py (Sender.send): same
2772         * buildbot/changes/pb.py (ChangePerspective): same
2773         * buildbot/test/test_changes.py (Sender.testSender): test it
2775         * buildbot/process/step.py (SVN.__init__): change 'base_url' and
2776         'default_branch' argument names to 'baseURL' and 'defaultBranch',
2777         for consistency with other BuildStep arguments that use camelCase.
2778         Well, at least more of them use camelCase (like flunkOnWarnings)
2779         than don't.. I wish I'd picked one style and stuck with it
2780         earlier. Annoying, but it's best done before the release, since
2781         these arguments didn't exist at all in 0.6.6 .
2782         (Darcs): same
2783         * buildbot/test/test_vc.py (SVN.testCheckout): same
2784         (Darcs.testPatch): same
2785         * docs/buildbot.texinfo (SVN): document the change
2786         (Darcs): same, add some build-on-branch docs
2787         * docs/examples/twisted_master.cfg: match change
2789         * buildbot/process/step.py (BuildStep): rename
2790         slaveVersionNewEnough to slaveVersionIsOlderThan, because that's
2791         how it is normally used.
2792         * buildbot/test/test_steps.py (Version.checkCompare): same
2794         * buildbot/process/step.py (CVS.startVC): refuse to build
2795         update/copy -style builds on a non-default branch with an old
2796         buildslave (<=0.6.6) that doesn't know how to do it properly. The
2797         concern is that it will do a VC 'update' in an existing tree when
2798         it is supposed to be switching branches (and therefore clobbering
2799         the tree to do a full checkout), thus building the wrong source.
2800         This used to be a warning, but I think the confusion it is likely
2801         to cause warrants making it an error.
2802         (SVN.startVC): same, also make mode=export on old slaves an error
2803         (Darcs.startVC): same
2804         (Git.startVC): improve error message for non-Git-enabled slaves
2805         (Arch.checkSlaveVersion): same. continue to emit a warning when a
2806         specific revision is built on a slave that doesn't pay attention
2807         to args['revision'], because for slowly-changing trees it will
2808         probably do the right thing, and because we have no way to tell
2809         whether we're asking it to build the most recent version or not.
2810         * buildbot/interfaces.py (BuildSlaveTooOldError): new exception
2812         * buildbot/scripts/runner.py (SlaveOptions.postOptions): assert
2813         that 'master' is in host:portnum format, to catch errors sooner
2815 2005-10-23  Brian Warner  <warner@lothar.com>
2817         * buildbot/process/step_twisted.py (ProcessDocs.createSummary):
2818         when creating the list of warning messages, include the line
2819         immediately after each WARNING: line, since that's usually where
2820         the file and line number wind up.
2822         * docs/examples/twisted_master.cfg: OS-X slave now does QT, add a
2823         TryScheduler
2825         * NEWS: update
2827 2005-10-22  Brian Warner  <warner@lothar.com>
2829         * buildbot/status/html.py (HtmlResource): incorporate valid-HTML
2830         patch from Brad Hards
2831         * buildbot/status/classic.css: same
2832         * buildbot/test/test_web.py (Waterfall): match changes
2834         * buildbot/test/test_steps.py (BuildStep.setUp): set
2835         nextBuildNumber so the test passes
2836         * buildbot/test/test_status.py (MyBuilder): same
2838         * buildbot/status/html.py (StatusResourceBuild.body): revision
2839         might be numeric, so stringify it before html-escapifying it
2840         (CurrentBox.getBox): add a "waiting" state, and show a countdown
2841         timer for the upcoming build
2842         * buildbot/status/classic.css: add background-color attributes for
2843         offline/waiting/building classes
2845         * buildbot/status/builder.py (BuildStatus): derive from
2846         styles.Versioned, fix upgrade of .sourceStamp attribute. Also set
2847         the default (i.e. unknown) .slavename to "???" instead of None,
2848         since even unknown slavenames need to be printed eventually.
2849         (BuilderStatus): also derive from styles.Versioned . More
2850         importantly, determine .nextBuildNumber at creation/unpickling
2851         time by scanning the directory of saved BuildStatus instances and
2852         choosing one larger than the highest-numbered one found. This
2853         should fix the problem where random errors during upgrades cause
2854         the buildbot to forget about earlier builds. .nextBuildNumber is
2855         no longer stored in the pickle.
2856         (Status.builderAdded): if we can't unpickle the BuilderStatus,
2857         at least log the error. Also call Builder.determineNextBuildNumber
2858         once the basedir is set.
2860         * buildbot/master.py (BuildMaster.loadChanges): do
2861         styles.doUpgrade afterwards, in case I decide to make Changes
2862         derived from styles.Versioned some day and forget to make this
2863         change later.
2866         * buildbot/test/test_runner.py (Options.testForceOptions): skip
2867         when running under older pythons (<2.3) in which the shlex module
2868         doesn't have a 'split' function.
2870         * buildbot/process/step.py (ShellCommand.start): make
2871         errorMessages= be a list of strings to stuff in the log before the
2872         command actually starts. This makes it easier to flag multiple
2873         warning messages, e.g. when the Source steps have to deal with an
2874         old buildslave.
2875         (CVS.startVC): handle slaves that don't handle multiple branches
2876         by switching into 'clobber' mode
2877         (SVN.startVC): same. Also reject branches without base_url
2878         (Darcs.startVC): same. Also reject revision= in older slaves
2879         (Arch.checkSlaveVersion): same (just the multiple-branches stuff)
2880         (Bazaar.startVC): same, and test for baz separately than for arch
2882         * buildbot/slave/commands.py (cvs_ver): document new features
2884         * buildbot/process/step.py (BuildStep.slaveVersion): document it
2885         (BuildStep.slaveVersionNewEnough): more useful utility method
2886         * buildbot/test/test_steps.py (Version): start testing it
2888         * buildbot/status/words.py (IrcStatusBot.command_FORCE): note that
2889         the 'force' command requires python2.3, for the shlex.split method
2891         * docs/examples/twisted_master.cfg: remove old freshcvs stuff,
2892         since we don't use it anymore. The Twisted buildbot uses a
2893         PBChangeSource now.
2895 2005-10-21  Brian Warner  <warner@lothar.com>
2897         * buildbot/process/process_twisted.py: rework all BuildFactory
2898         classes to take a 'source' step as an argument, instead of
2899         building up the SVN instance in the factory.
2900         * docs/examples/twisted_master.cfg: enable build-on-branch by
2901         providing a base_url and default_branch
2903         * buildbot/status/words.py (IrcStatusBot.command_FORCE): add
2904         control over --branch and --revision, not that they are always
2905         legal to provide
2906         * buildbot/status/html.py (StatusResourceBuilder.force): same
2907         (StatusResourceBuild.body): display SourceStamp components
2909         * buildbot/scripts/runner.py (ForceOptions): option parser for the
2910         IRC 'force' command, so it can be shared with an eventual
2911         command-line-tool 'buildbot force' mode.
2912         * buildbot/test/test_runner.py (Options.testForceOptions): test it
2914 2005-10-20  Brian Warner  <warner@lothar.com>
2916         * buildbot/status/mail.py (MailNotifier.buildMessage): reformat
2918         * docs/examples/twisted_master.cfg: update to use Schedulers
2920         * buildbot/scripts/sample.cfg: update with Schedulers
2922         * buildbot/interfaces.py (IBuilderControl.requestBuildSoon): new
2923         method specifically for use by HTML "force build" button and the
2924         IRC "force" command. Raises an immediate error if there are no
2925         slaves available.
2926         (IBuilderControl.requestBuild): make this just submit a build, not
2927         try to check for existing slaves or set up any when-finished
2928         Deferreds or anything.
2929         * buildbot/process/builder.py (BuilderControl): same
2930         * buildbot/status/html.py (StatusResourceBuilder.force): same
2931         * buildbot/status/words.py (IrcStatusBot.command_FORCE): same
2932         * buildbot/test/test_slaves.py: same
2933         * buildbot/test/test_web.py: same
2935 2005-10-19  Brian Warner  <warner@lothar.com>
2937         * docs/examples/twisted_master.cfg: re-sync with reality: bring
2938         back python2.2 tests, turn off OS-X threadedselect-reactor tests
2940 2005-10-18  Brian Warner  <warner@lothar.com>
2942         * buildbot/status/html.py: provide 'status' argument to most
2943         StatusResourceFOO objects
2944         (StatusResourceBuild.body): href-ify the Builder name, add "Steps
2945         and Logfiles" section to make the Build page into a more-or-less
2946         comprehensive source of status information about the build
2948         * buildbot/status/mail.py (MailNotifier): include the Build's URL
2949         * buildbot/status/words.py (IrcStatusBot.buildFinished): same
2951 2005-10-17  Brian Warner  <warner@lothar.com>
2953         * buildbot/process/process_twisted.py (TwistedTrial): update Trial
2954         arguments to accomodate Twisted >=2.1.0 . I will have to figure
2955         out what to do about other projects: the correct options for
2956         recent Twisteds will not work for older ones.
2958 2005-10-15  Brian Warner  <warner@lothar.com>
2960         * buildbot/status/builder.py (Status.getURLForThing): add method
2961         to provide a URL for arbitrary IStatusFoo objects. The idea is to
2962         use this in email/IRC status clients to make them more useful, by
2963         providing the end user with hints on where to learn more about the
2964         object being reported on.
2965         * buildbot/test/test_web.py (GetURL): tests for it
2967 2005-10-14  Brian Warner  <warner@lothar.com>
2969         * buildbot/test/test_config.py (ConfigTest._testSources_1): oops,
2970         fix bug resulting from deferredResult changes
2972 2005-10-13  Brian Warner  <warner@lothar.com>
2974         * buildbot/test/test_changes.py: remove use of deferredResult
2975         * buildbot/test/test_config.py: same
2976         * buildbot/test/test_control.py: same
2977         * buildbot/test/test_status.py: same
2978         * buildbot/test/test_vc.py: this is the only remaining use, since
2979         it gets used at module level. This needs to be replaced by some
2980         sort of class-level run-once routine.
2982         * buildbot/status/words.py (IrcStatusBot.command_WATCH): fix typo
2984         * lots: implement multiple slaves per Builder, which means multiple
2985         current builds per Builder. Some highlights:
2986         * buildbot/interfaces.py (IBuilderStatus.getState): return a tuple
2987         of (state,currentBuilds) instead of (state,currentBuild)
2988         (IBuilderStatus.getCurrentBuilds): replace getCurrentBuild()
2989         (IBuildStatus.getSlavename): new method, so you can tell which
2990         slave got used. This only gets set when the build completes.
2991         (IBuildRequestStatus.getBuilds): new method
2993         * buildbot/process/builder.py (SlaveBuilder): add a .state
2994         attribute to track things like ATTACHING and IDLE and BUILDING,
2995         instead of..
2996         (Builder): .. the .slaves attribute here, which has been turned
2997         into a simple list of available slaves. Added a separate
2998         attaching_slaves list to track ones that are not yet ready for
2999         builds.
3000         (Builder.fireTestEvent): put off the test-event callback for a
3001         reactor turn, to make tests a bit more consistent.
3002         (Ping): cleaned up the slaveping a bit, now it disconnects if the
3003         ping fails due to an exception. This needs work, I'm worried that
3004         a code error could lead to a constantly re-connecting slave.
3005         Especially since I'm trying to move to a distinct remote_ping
3006         method, separate from the remote_print that we currently use.
3007         (BuilderControl.requestBuild): return a convenience Deferred that
3008         provides an IBuildStatus when the build finishes.
3009         (BuilderControl.ping): ping all connected slaves, only return True
3010         if they all respond.
3012         * buildbot/slave/bot.py (BuildSlave.stopService): stop trying to
3013         reconnect when we shut down.
3015         * buildbot/status/builder.py: implement new methods, convert
3016         one-build-at-a-time methods to handle multiple builds
3017         * buildbot/status/*.py: do the same in all default status targets
3018         * buildbot/status/html.py: report the build's slavename in the
3019         per-Build page, report all buildslaves on the per-Builder page
3021         * buildbot/test/test_run.py: update/create tests
3022         * buildbot/test/test_slaves.py: same
3023         * buildbot/test/test_scheduler.py: remove stale test
3025         * docs/buildbot.texinfo: document the new builder-specification
3026         'slavenames' parameter
3028 2005-10-12  Brian Warner  <warner@lothar.com>
3030         * buildbot/buildset.py (BuildSet): fix bug where BuildSet did not
3031         report failure correctly, causing Dependent builds to run when
3032         they shouldn't have.
3033         * buildbot/status/builder.py (BuildSetStatus): same
3034         * buildbot/test/test_buildreq.py (Set.testBuildSet): verify it
3035         (Set.testSuccess): test the both-pass case too
3036         * buildbot/test/test_dependencies.py (Dependencies.testRun_Fail):
3037         fix this test: it was ending too early, masking the failure before
3038         (Logger): specialized StatusReceiver to make sure the dependent
3039         builds aren't even started, much less completed.
3041 2005-10-07  Brian Warner  <warner@lothar.com>
3043         * buildbot/slave/bot.py (SlaveBuilder.activity): survive
3044         bot.SlaveBuilder being disowned in the middle of a build
3046         * buildbot/status/base.py (StatusReceiverMultiService): oops, make
3047         this inherit from StatusReceiver. Also upcall in __init__. This
3048         fixes the embarrasing crash when the new buildSetSubmitted method
3049         is invoked and Waterfall/etc don't implement their own.
3050         * buildbot/test/test_run.py: add a TODO note about a test to catch
3051         just this sort of thing.
3053         * buildbot/process/builder.py (Builder.attached): remove the
3054         already-attached warning, this situation is normal. Add some
3055         comments explaining it.
3057 2005-10-02  Brian Warner  <warner@lothar.com>
3059         * buildbot/changes/maildir.py (Maildir.start): Tolerate
3060         OverflowError when setting up dnotify, because some 64-bit systems
3061         have problems with signed-vs-unsigned constants and trip up on the
3062         DN_MULTISHOT flag. Patch from Brad Hards.
3064 2005-09-06  Fred Drake  <fdrake@users.sourceforge.net>
3066         * buildbot/process/step.py (BuildStep, ShellCommand): Add
3067         progressMetrics, description, descriptionDone to the 'parms' list,
3068         and make use the 'parms' list from the implementation class
3069         instead of only BuildStep to initialize the parameters.  This
3070         allows buildbot.process.factory.s() to initialize all the parms,
3071         not just those defined in directly by BuildStep.
3073 2005-09-03  Brian Warner  <warner@lothar.com>
3075         * NEWS: start adding items for the next release
3077         * docs/examples/twisted_master.cfg: (sync with reality) turn off
3078         python2.2 tests, change 'Quick' builder to only use python2.3
3080 2005-09-02  Fred Drake  <fdrake@users.sourceforge.net>
3082         * buildbot/status/html.py (StatusResourceBuilder.body): only show
3083         the "Ping Builder" button if the build control is available; the
3084         user sees an exception otherwise
3086         * docs/buildbot.texinfo (PBChangeSource): fix a typo
3088 2005-09-01  Brian Warner  <warner@lothar.com>
3090         * buildbot/interfaces.py (IBuilderStatus.getState): update
3091         signature, point out that 'build' can be None
3092         (IBuildStatus.getETA): point out ETA can be none
3094         * buildbot/status/html.py (CurrentBox.getBox): tolerate build/ETA
3095         being None
3096         * buildbot/status/words.py (IrcStatusBot.emit_status): same
3098 2005-08-31  Brian Warner  <warner@lothar.com>
3100         * buildbot/status/base.py (StatusReceiver.builderChangedState):
3101         update to match correct signature: removed 'eta' argument
3102         * buildbot/status/mail.py (MailNotifier.builderChangedState): same
3104 2005-08-30  Brian Warner  <warner@lothar.com>
3106         * buildbot/status/builder.py (LogFile): remove the assertion that
3107         blows up when you try to overwrite an existing logfile, instead
3108         just emit a warning. This case gets hit when the buildmaster is
3109         killed and doesn't get a chance to write out the serialized
3110         BuilderStatus object, so the .nextBuildNumber attribute gets out
3111         of date.
3113         * buildbot/scripts/runner.py (sendchange): add --revision_file to
3114         the 'buildbot sendchange' arguments, for the Darcs context file
3115         * docs/buildbot.texinfo (sendchange): document it
3117         * buildbot/status/html.py: add pending/upcoming builds to CurrentBox
3118         * buildbot/interfaces.py (IScheduler.getPendingBuildTimes): new method
3119         (IStatus.getSchedulers): new method
3120         * buildbot/status/builder.py (BuilderStatus): track pendingBuilds
3121         (Status.getSchedulers): implement
3122         * buildbot/process/builder.py (Builder): maintain
3123         BuilderStatus.pendingBuilds
3124         * buildbot/scheduler.py (Scheduler.getPendingBuildTimes): new method
3125         (TryBase.addChange): Try schedulers should ignore Changes
3127         * buildbot/scripts/tryclient.py (getTopdir): implement getTopdir
3128         for 'try' on CVS/SVN
3129         * buildbot/test/test_runner.py (Try.testGetTopdir): test case
3131         * buildbot/scripts/tryclient.py (Try): make jobdir-style 'try'
3132         report status properly.
3133         (Try.createJob): implement unique buildset IDs
3135         * buildbot/status/client.py (StatusClientPerspective): add a
3136         perspective_getBuildSets method for the benefit of jobdir-style
3137         'try'.
3138         * docs/buildbot.texinfo (try): more docs
3139         * buildbot/test/test_scheduler.py (Scheduling.testGetBuildSets):
3140         new test case
3142 2005-08-18  Brian Warner  <warner@lothar.com>
3144         * buildbot/scripts/tryclient.py (Try): make 'try' status reporting
3145         actually work. It's functional but still kind of clunky. Also, it
3146         only works with the pb-style.. needs to be made to work with the
3147         jobdir-style too.
3149         * buildbot/status/client.py (RemoteBuildSet): new class
3150         (RemoteBuildRequest): same
3151         (RemoteBuild.remote_waitUntilFinished): return the RemoteBuild
3152         object, not the internal BuildStatus object.
3153         (RemoteBuild.remote_subscribe): new method to subscribe to builds
3154         outside of the usual buildStarted() return value.
3155         (BuildSubscriber): support class for RemoteBuild.remote_subscribe
3157         * buildbot/scheduler.py (Try_Jobdir): convey buildsetID properly
3158         (Try_Userpass_Perspective.perspective_try): return a remotely
3159         usable BuildSetStatus object
3161         * buildbot/interfaces.py (IBuildStatus): remove obsolete
3162         isStarted()/waitUntilStarted()
3164 2005-08-16  Brian Warner  <warner@lothar.com>
3166         * buildbot/status/builder.py: implement IBuildSetStatus and
3167         IBuildRequestStatus, wire them into place.
3168         * buildbot/buildset.py: same. Add ID, move wait-until-finished
3169         methods into the BuildSetStatus object.
3170         * buildbot/interfaces.py: same
3171         (IStatus.getBuildSets): new method to get pending BuildSets
3172         (IStatusReceiver.buildsetSubmitted): new method which hears about
3173         new BuildSets
3174         * buildbot/master.py (BuildMaster.submitBuildSet): same
3175         * buildbot/process/base.py (BuildRequest): same, replace
3176         waitUntilStarted with subscribe/unsubscribe
3177         * buildbot/process/builder.py (BuilderControl.forceBuild): use
3178         subscribe instead of waitUntilStarted
3179         * buildbot/status/base.py (StatusReceiver.buildsetSubmitted): stub
3180         for new method
3181         * buildbot/status/client.py (StatusClientPerspective.builderRemoved): 
3182         same
3183         * buildbot/test/test_buildreq.py: update for new code
3184         * buildbot/test/test_control.py (Force.testRequest): same
3187         * buildbot/slave/commands.py (Darcs.doVCFull): fix get-revision
3188         for Darcs to not use the tempfile module, so it works under
3189         python-2.2 too. We really didn't need the full cleverness of that
3190         module, since the slave has exclusive control of its own builddir.
3192 2005-08-15  Brian Warner  <warner@lothar.com>
3194         * buildbot/scripts/tryclient.py (CVSExtractor): implement 'try'
3195         for CVS trees. It doesn't work for non-trunk branches,
3196         unfortunately.
3197         * buildbot/test/test_vc.py (CVS.testTry): test it, but skip the
3198         branch test
3200         * Makefile: make it easier to test against python2.2
3202         * buildbot/test/test_vc.py (VCBase.tearDown): provide for
3203         tearDown2, so things like Arch can unregister archives as they're
3204         shutting down. The previous subclass-override-tearDown technique
3205         resulted in a nested maybeWait() and test failures under
3206         Twisted-1.3.0
3208         * buildbot/scripts/tryclient.py (getSourceStamp): extract branches
3209         where we can (Arch), add a branch= argument to set the branch used
3210         when we can't
3211         (BazExtractor): extract the branch too
3212         (TlaExtractor): same
3213         * buildbot/scripts/runner.py (TryOptions): add --branch
3214         * docs/buildbot.texinfo (try): document --branch/try_branch
3216         * buildbot/slave/commands.py (Darcs): implement get-revision for
3217         Darcs, so that 'try' will work. This requires the tempfile module
3218         from python-2.3 .
3220         * buildbot/test/test_vc.py: rewrite tests, getting better coverage
3221         of revisions, branches, and 'try' in the process.
3223 2005-08-11  Brian Warner  <warner@lothar.com>
3225         * buildbot/master.py (DebugPerspective.perspective_pokeIRC): fix
3226         this, it got broken at some point in the last few releases
3227         * buildbot/status/words.py (IrcBuildRequest): reply was broken
3228         (IrcStatusBot.emit_status): handle new IBuilderStatus.getState,
3229         specifically the removal of ETA information from the tuple
3231         * buildbot/locks.py: use %d for id() instead of %x, avoid a silly
3232         warning message
3234         * docs/buildbot.texinfo (try): document both --builder and
3235         'try_builders' in .buildbot/options
3236         * buildbot/scripts/runner.py (TryOptions): add --builder,
3237         accumulate the values into opts['builders']
3238         * buildbot/scripts/tryclient.py (Try.__init__): set builders
3239         * buildbot/test/test_runner.py (Try): add some quick tests to make
3240         sure 'buildbot try --options' and .buildbot/options get parsed
3241         * buildbot/test/test_scheduler.py (Scheduling.testTryUserpass):
3242         use --builder control
3244         * docs/buildbot.texinfo (try): add --port argument to PB style
3246         * buildbot/scripts/tryclient.py (SourceStampExtractor): return an
3247         actual SourceStamp. Still need to extract a branch name, somehow.
3248         (Try): finish implementing the try client side, still need a UI
3249         for specifying which builders to use
3250         (Try.getopt): factor our options/config-file reading
3251         * buildbot/test/test_scheduler.py (Scheduling.testTryUserpass):
3252         test it
3253         * buildbot/test/test_vc.py: match SourceStampExtractor change
3255         * buildbot/scripts/runner.py (Options.opt_verbose): --verbose
3256         causes the twisted log to be sent to stderr
3258         * buildbot/scheduler.py (Try_Userpass): implement the PB style
3260 2005-08-10  Brian Warner  <warner@lothar.com>
3262         * buildbot/scripts/runner.py: Add 'buildbot try' command, jobdir
3263         style is 90% done, still missing status reporting or waiting for
3264         the buildsets to finish, and it is completely untested.
3266         * buildbot/trybuild.py: delete file, move contents to ..
3267         * buildbot/scripts/tryclient.py (getSourceStamp): .. here
3268         * buildbot/test/test_vc.py: match the move
3270         * buildbot/scheduler.py (Try_Jobdir): implement the jobdir style
3271         of the TryScheduler, no buildsetID or status-tracking support yet
3272         * buildbot/test/test_scheduler.py (Scheduling.testTryJobdir): test it
3274         * buildbot/changes/maildir.py (Maildir.setBasedir): make it
3275         possible to set the basedir after __init__ time, so it is easier
3276         to use as a Service-child of the BuildMaster instance
3278         * buildbot/changes/maildirtwisted.py (MaildirService): make a form
3279         that delivers messages to its Service parent instead of requiring
3280         a subclass to be useful. This turns out to be much easier to build
3281         unit tests around.
3283         * buildbot/scripts/tryclient.py (createJob): utility code to
3284         create jobfiles, will eventually be used by 'buildbot try'
3286 2005-08-08  Brian Warner  <warner@lothar.com>
3288         * docs/buildbot.texinfo (try): add docs on the
3289         as-yet-unimplemented Try scheduler
3291         * buildbot/test/test_buildreq.py: move Scheduling tests out to ..
3292         * buildbot/test/test_scheduler.py: .. here
3293         (Scheduling.testTryJobdir): add placeholder test for 'try'
3295         * buildbot/test/test_status.py (Log.testMerge3): update to match new
3296         addEntry merging (>=chunkSize) behavior
3297         (Log.testConsumer): update to handle new callLater(0) behavior
3299         * buildbot/test/test_web.py: rearrange tests a bit, add test for
3300         both the MAX_LENGTH bugfix and the resumeProducing hang.
3302         * buildbot/status/builder.py (LogFileProducer.resumeProducing):
3303         put off the actual resumeProducing for a moment with
3304         reactor.callLater(0). This works around a twisted-1.3.0 bug which
3305         causes large logfiles to hang midway through.
3307         * buildbot/process/step.py (BuildStep.addCompleteLog): break the
3308         logfile up into chunks, both to avoid NetstringReceiver.MAX_LENGTH
3309         and to improve memory usage when streaming the file out to a web
3310         browser.
3311         * buildbot/status/builder.py (LogFile.addEntry): change > to >= to
3312         make this work cleanly
3314 2005-08-03  Brian Warner  <warner@lothar.com>
3316         * buildbot/trybuild.py: new file for 'try' utilities
3317         (getSourceStamp): run in a tree, find out the baserev+patch
3318         * buildbot/test/test_vc.py (VCBase.do_getpatch): test it,
3319         implemented for SVN and Darcs, still working on Arch. I don't know
3320         how to make CVS work yet.
3322         * docs/buildbot.texinfo: document the 'buildbot' command-line
3323         tool, including the not-yet-implemented 'try' feature, and the
3324         in-flux .buildbot/ options directory.
3326 2005-07-20  Brian Warner  <warner@lothar.com>
3328         * buildbot/locks.py: added temporary id() numbers to Lock
3329         descriptions, to track down a not-really-sharing-the-Lock bug
3331         * buildbot/test/runutils.py: must import errno, cut-and-paste bug
3333         * buildbot/test/test_slavecommand.py (ShellBase.failUnlessIn):
3334         needed for python2.2 compatibility
3335         * buildbot/test/test_vc.py: python2.2 compatibility: generators
3336         are from the __future__
3338 2005-07-19  Brian Warner  <warner@lothar.com>
3340         * buildbot/master.py (BuildMaster.loadConfig): give a better error
3341         message when schedulers use unknown builders
3343         * buildbot/process/builder.py (Builder.compareToSetup): make sure
3344         SlaveLock('name') and MasterLock('name') are distinct
3346         * buildbot/master.py (BuildMaster.loadConfig): oops, sanity-check
3347         c['schedulers'] in such a way that we can actually accept
3348         Dependent instances
3349         * buildbot/test/test_config.py: check it
3351         * buildbot/scheduler.py (Dependent.listBuilderNames): oops, add
3352         utility method to *all* the Schedulers
3353         (Periodic.listBuilderNames): same
3355         * docs/buildbot.texinfo (Interlocks): update chapter to match
3356         reality
3358         * buildbot/master.py (BuildMaster.loadConfig): Add sanity checks
3359         to make sure that c['sources'], c['schedulers'], and c['status']
3360         are all lists of the appropriate objects, and that the Schedulers
3361         all point to real Builders
3362         * buildbot/interfaces.py (IScheduler, IUpstreamScheduler): add
3363         'listBuilderNames' utility method to support this
3364         * buildbot/scheduler.py: implement the utility method
3365         * buildbot/test/test_config.py (ConfigTest.testSchedulers): test it
3367         * docs/buildbot.texinfo: add some @cindex entries
3369         * buildbot/test/test_vc.py (Arch.createRepository): set the tla ID
3370         if it wasn't already set: most tla commands will fail unless one
3371         has been set.
3372         (Arch.createRepository): and disable bazaar's revision cache, since
3373         they cause test failures (the multiple repositories we create all
3374         interfere with each other through the cache)
3376         * buildbot/test/test_web.py (WebTest): remove use of deferredResult,
3377         bring it properly up to date with twisted-2.0 test guidelines
3379         * buildbot/master.py (BuildMaster): remove references to old
3380         'interlock' module, this caused a bunch of post-merge test
3381         failures
3382         * buildbot/test/test_config.py: same
3383         * buildbot/process/base.py (Build): same
3385         * buildbot/test/test_slaves.py: stubs for new test case
3387         * buildbot/scheduler.py: add test-case-name tag
3388         * buildbot/test/test_buildreq.py: same
3390         * buildbot/slave/bot.py (SlaveBuilder.__init__): remove some
3391         unnecessary init code
3392         (Bot.remote_setBuilderList): match it
3394         * docs/buildbot.texinfo (@settitle): don't claim version 1.0
3396         * buildbot/changes/mail.py (parseSyncmail): update comment
3398         * buildbot/test/test_slavecommand.py: disable Shell tests on
3399         platforms that don't suport IReactorProcess
3401         * buildbot/status/builder.py (LogFile): remove the 't' mode from
3402         all places where we open logfiles. It causes OS-X to open the file
3403         in some weird mode that that prevents us from mixing reads and
3404         writes to the same filehandle, which we depend upon to implement
3405         _generateChunks properly. This change doesn't appear to break
3406         win32, on which "b" and "t" are treated differently but a missing
3407         flag seems to be interpreted as "t".
3409 2005-07-18  Brian Warner  <warner@lothar.com>
3411         * buildbot/slave/commands.py (ShellCommand): overhaul
3412         error-handling code, to try and make timeout/interrupt work
3413         properly, and make win32 happier
3414         * buildbot/test/test_slavecommand.py: clean up, stop using
3415         reactor.iterate, add tests for timeout and interrupt
3416         * buildbot/test/sleep.py: utility for a new timeout test
3418         * buildbot/twcompat.py: copy over twisted 1.3/2.0 compatibility
3419         code from the local-usebranches branch
3421 2005-07-17  Brian Warner  <warner@lothar.com>
3423         * buildbot/process/process_twisted.py
3424         (TwistedReactorsBuildFactory): change the treeStableTimer to 5
3425         minutes, to match the other twisted BuildFactories, and don't
3426         excuse failures in c/qt/win32 reactors any more.
3428         * docs/examples/twisted_master.cfg: turn off the 'threadless' and
3429         'freebsd' builders, since the buildslaves have been unavailable
3430         for quite a while
3432 2005-07-13  Brian Warner  <warner@lothar.com>
3434         * buildbot/test/test_vc.py (VCBase.do_branch): test the new
3435         build-on-branch feature
3437         * buildbot/process/step.py (Darcs.__init__): add base_url and
3438         default_branch arguments, just like SVN
3439         (Arch.__init__): note that the version= argument is really the
3440         default branch name
3442         * buildbot/slave/commands.py (SourceBase): keep track of the
3443         repository+branch that was used for the last checkout in
3444         SRCDIR/.buildbot-sourcedata . If the contents of this file do not
3445         match, we clobber the directory and perform a fresh checkout
3446         rather than trying to do an in-place update. This should protect
3447         us against trying to get to branch B by doing an update in a tree
3448         obtained from branch A.
3449         (CVS.setup): add CVS-specific sourcedata: root, module, and branch
3450         (SVN.setup): same, just the svnurl
3451         (Darcs.setup): same, just the repourl
3452         (Arch.setup): same, arch coordinates (url), version, and
3453         buildconfig. Also pull the buildconfig from the args dictionary,
3454         which we weren't doing before, so the build-config was effectively
3455         disabled.
3456         (Arch.sourcedirIsUpdateable): don't try to update when we're
3457         moving to a specific revision: arch can't go backwards, so it is
3458         safer to just clobber the tree and checkout a new one at the
3459         desired revision.
3460         (Bazaar.setup): same sourcedata as Arch
3462         * buildbot/test/test_dependencies.py (Dependencies.testRun_Fail):
3463         use maybeWait, to work with twisted-1.3.0 and twcompat
3464         (Dependencies.testRun_Pass): same
3466         * buildbot/test/test_vc.py: rearrange, cleanup
3468         * buildbot/twcompat.py: add defer.waitForDeferred and
3469         utils.getProcessOutputAndValue, so test_vc.py (which uses them)
3470         can work under twisted-1.3.0 .
3472         * buildbot/test/test_vc.py: rewrite. The sample repositories are
3473         now created at setUp time. This increases the runtime of the test
3474         suite considerably (from 91 seconds to 151), but it removes the
3475         need for an offline tarball, which should solve a problem I've
3476         seen where the test host has a different version of svn than the
3477         tarball build host. The new code also validates that mode=update
3478         really picks up recent commits. This approach will also make it
3479         easier to test out branches, because the code which creates the VC
3480         branches is next to the code which uses them. It will also make it
3481         possible to test some change-notification hooks, by actually
3482         performing a VC commit and watching to see the ChangeSource get
3483         notified.
3485 2005-07-12  Brian Warner  <warner@lothar.com>
3487         * docs/buildbot.texinfo (SVN): add branches example
3488         * docs/Makefile (buildbot.ps): add target for postscript manual
3490         * buildbot/test/test_dependencies.py: s/test_interlocks/test_locks/ 
3491         * buildbot/test/test_locks.py: same
3493         * buildbot/process/step.py (Darcs): comment about default branches
3495         * buildbot/master.py (BuildMaster.loadConfig): don't look for
3496         c['interlocks'] in the config file, complain if it is present.
3497         Scan all locks in c['builders'] to make sure the Locks they use
3498         are uniquely named.
3499         * buildbot/test/test_config.py: remove old c['interlocks'] test,
3500         add some tests to check for non-uniquely-named Locks
3501         * buildbot/test/test_vc.py (Patch.doPatch): fix factory.steps,
3502         since the unique-Lock validation code requires it now
3504         * buildbot/locks.py: fix test-case-name
3506         * buildbot/interlock.py: remove old file
3508 2005-07-11  Brian Warner  <warner@lothar.com>
3510         * buildbot/test/test_interlock.py: rename to..
3511         * buildbot/test/test_locks.py: .. something shorter
3513         * buildbot/slave/bot.py (BuildSlave.stopService): newer Twisted
3514         versions (after 2.0.1) changed internet.TCPClient to shut down the
3515         connection in stopService. Change the code to handle this
3516         gracefully.
3518         * buildbot/process/base.py (Build): handle whole-Build locks
3519         * buildbot/process/builder.py (Builder.compareToSetup): same
3520         * buildbot/test/test_interlock.py: make tests work
3522         * buildbot/process/step.py (BuildStep.startStep): complain if a
3523         Step tries to claim a lock that's owned by its own Build
3524         (BuildStep.releaseLocks): typo
3526         * buildbot/locks.py (MasterLock): use ComparableMixin so config
3527         file reloads don't replace unchanged Builders
3528         (SlaveLock): same
3529         * buildbot/test/test_config.py (ConfigTest.testInterlocks):
3530         rewrite to cover new Locks instead of old c['interlocks']
3531         * buildbot/test/runutils.py (RunMixin.connectSlaves): remember
3532         slave2 too
3535         * buildbot/test/test_dependencies.py (Dependencies.setUp): always
3536         start the master and connect the buildslave
3538         * buildbot/process/step.py (FailingDummy.done): finish with a
3539         FAILURE status rather than raising an exception
3541         * buildbot/process/base.py (BuildRequest.mergeReasons): don't try to
3542         stringify a BuildRequest.reason that is None
3544         * buildbot/scheduler.py (BaseUpstreamScheduler.buildSetFinished):
3545         minor fix
3546         * buildbot/status/builder.py (BuildSetStatus): implement enough to
3547         allow scheduler.Dependent to work
3548         * buildbot/buildset.py (BuildSet): set .reason and .results
3550         * buildbot/test/test_interlock.py (Locks.setUp): connect both
3551         slaves, to make the test stop hanging. It still fails, of course,
3552         because I haven't even started to implement Locks.
3554         * buildbot/test/runutils.py (RunMixin.connectSlaves): new utility
3556         * docs/buildbot.texinfo (Build-Dependencies): redesign the feature
3557         * buildbot/interfaces.py (IUpstreamScheduler): new Interface
3558         * buildbot/scheduler.py (BaseScheduler): factor out common stuff
3559         (Dependent): new class for downstream build dependencies
3560         * buildbot/test/test_dependencies.py: tests (still failing)
3562         * buildbot/buildset.py (BuildSet.waitUntilSuccess): minor notes
3564 2005-07-07  Brian Warner  <warner@lothar.com>
3566         * buildbot/test/runutils.py (RunMixin): factored this class out..
3567         * buildbot/test/test_run.py: .. from here
3568         * buildbot/test/test_interlock.py: removed old c['interlock'] tests,
3569         added new buildbot.locks tests (which all hang right now)
3570         * buildbot/locks.py (SlaveLock, MasterLock): implement Locks
3571         * buildbot/process/step.py: claim/release per-BuildStep locks
3573         * docs/Makefile: add 'buildbot.html' target
3575         * buildbot/process/step.py (CVS.__init__): allow branch=None to be
3576         interpreted as "HEAD", so that all VC steps can accept branch=None
3577         and have it mean the "default branch".
3579         * docs/buildbot.texinfo: add Schedulers, Dependencies, and Locks
3581 2005-07-07  Brian Warner  <warner@lothar.com>
3583         * docs/examples/twisted_master.cfg: update to match current usage
3585         * docs/buildbot.texinfo (System Architecture): comment out the
3586         image, it doesn't exist yet and just screws up the HTML manual.
3588 2005-07-05  Brian Warner  <warner@lothar.com>
3590         * debian/.cvsignore: oops, missed one. Removing leftover file.
3592 2005-06-17  Brian Warner  <warner@lothar.com>
3594         * buildbot/test/test_vc.py (VCSupport.__init__): svn --version
3595         changed its output in 1.2.0, don't mistakenly think that the
3596         subversion we find isn't capable of supporting our tests.
3598         * debian/*: remove the debian/ directory and its contents, to make
3599         life easier for the proper Debian maintainer
3600         * MANIFEST.in: same
3601         * Makefile (release): same
3603 2005-06-07  Brian Warner  <warner@lothar.com>
3605         * everything: create a distinct SourceStamp class to replace the
3606         ungainly 4-tuple, let it handle merging instead of BuildRequest.
3607         Changed the signature of Source.startVC to include the revision
3608         information (instead of passing it through self.args). Implement
3609         branches for SVN (now only Darcs/Git is missing support). Add more
3610         Scheduler tests.
3612 2005-06-06  Brian Warner  <warner@lothar.com>
3614         * everything: rearrange build scheduling. Create a new Scheduler
3615         object (configured in c['schedulers'], which submit BuildSets to a
3616         set of Builders. Builders can now use multiple slaves. Builds can
3617         be run on alternate branches, either requested manually or driven
3618         by changes. This changed some of the Status classes. Interlocks
3619         are out of service until they've been properly split into Locks
3620         and Dependencies. treeStableTimer, isFileImportant, and
3621         periodicBuild have all been moved from the Builder to the
3622         Scheduler.
3623         (BuilderStatus.currentBigState): removed the 'waiting' and
3624         'interlocked' states, removed the 'ETA' argument.
3626 2005-05-24  Brian Warner  <warner@lothar.com>
3628         * buildbot/pbutil.py (ReconnectingPBClientFactory): Twisted-1.3
3629         erroneously abandons the connection (in clientConnectionFailed)
3630         for non-UserErrors, which means that if we lose the connection due
3631         to a network problem or a timeout, we'll never try to reconnect.
3632         Fix this by not upcalling to the buggy parent method. Note:
3633         twisted-2.0 fixes this, but the function only has 3 lines so it
3634         makes more sense to copy it than to try and detect the buggyness
3635         of the parent class. Fixes SF#1207588.
3637         * buildbot/changes/changes.py (Change.branch): doh! Add a
3638         class-level attribute to accomodate old Change instances that were
3639         pickled before 0.6.5 (where .branch was added for new Changes).
3640         This fixes the exception that occurs when you try to look at an
3641         old Change (through asHTML).
3643         * buildbot/__init__.py (version): bump to 0.6.6+ while between
3644         releases
3646 2005-05-23  Brian Warner  <warner@lothar.com>
3648         * buildbot/__init__.py (version): release 0.6.6
3650 2005-05-23  Brian Warner  <warner@lothar.com>
3652         * NEWS: update for 0.6.6 release
3653         * debian/changelog: same
3655         * buildbot/scripts/runner.py (start): put the basedir in sys.path
3656         before starting: this was done by twistd back when we spawned it,
3657         now that we're importing the pieces and running them in the
3658         current process, we have to do it ourselves. This allows
3659         master.cfg to import files from the same directory without
3660         explicitly manipulating PYTHONPATH. Thanks to Thomas Vander
3661         Stichele for the catch.
3662         (Options.opt_version): Add a --version command (actually, just make
3663         the existing --version command emit Buildbot's version too)
3665         * buildbot/status/builder.py (HTMLLogFile.upgrade): oops! second
3666         fix to make this behave like other LogFiles, this time to handle
3667         existing LogFiles on disk. (add the missing .upgrade method)
3668         * buildbot/test/test_status.py (Log.testHTMLUpgrade): test it
3670 2005-05-21  Brian Warner  <warner@lothar.com>
3672         * buildbot/test/test_runner.py (Create.testMaster): match the
3673         rawstring change in runner.py:masterTAC
3675         * buildbot/test/test_config.py (ConfigTest.testIRC): skip unless
3676         TwistedWords is installed
3677         * buildbot/test/test_status.py: same, with TwistedMail
3679         * buildbot/master.py: remove old IRC/Waterfall imports (used by
3680         some old, deprecated, and removed config keys). This should enable
3681         you to use the base buildbot functionality with Twisted-2.0.0 when
3682         you don't also have TwistedWeb and TwistedWords installed
3684 2005-05-20  Brian Warner  <warner@lothar.com>
3686         * buildbot/scripts/runner.py (run): call sendchange(), not
3687         do_sendchange(): thus 'buildbot sendchange' was broken in 0.6.5
3688         (run): call stop("HUP"), not "-HUP", 'buildbot stop' was broken.
3689         (stop): don't wait for process to die when sending SIGHUP
3690         (masterTAC): use a rawstring for basedir=, otherwise '\' in the
3691         directory name gets interpreted, which you don't want
3692         (slaveTAC): same
3694         * buildbot/__init__.py (version): bump to 0.6.5+ while between
3695         releases
3697 2005-05-18  Brian Warner  <warner@lothar.com>
3699         * buildbot/__init__.py (version): Releasing buildbot-0.6.5
3701 2005-05-18  Brian Warner  <warner@lothar.com>
3703         * README: update for 0.6.5
3704         * debian/changelog: same
3706         * buildbot/changes/changes.py: rename tag= to branch=, since
3707         that's how we're using it, and my design for the upcoming "build a
3708         specific branch" feature wants it. also, tag= was too CVS-centric
3709         * buildbot/changes/mail.py (parseSyncmail): same
3710         * buildbot/process/base.py (Build.isBranchImportant): same
3711         * buildbot/test/test_mailparse.py (Test3.testMsgS4): same
3712         * docs/buildbot.texinfo (Attributes of Changes): same
3714         * NEWS: update tag=, update for upcoming release
3716 2005-05-17  Brian Warner  <warner@lothar.com>
3718         * buildbot/scripts/runner.py (stop): actually poll once per
3719         second, instead of re-killing the poor daemon once per second.
3720         Sleep briefly (0.1s) before the first poll, since there's a good
3721         chance we can avoid waiting the full second if the daemon shuts
3722         down quickly. Also remove the sys.exit() at the end.
3723         (start): remove the unneighborly sys.exit()
3725         * Makefile: improve permission-setting to not kick Arch so badly
3727         * buildbot/scripts/runner.py (SlaveOptions.optParameters): set a
3728         default --keepalive=600, since it doesn't hurt very much, and it's
3729         a hassle to discover that you need it.
3730         * buildbot/test/test_runner.py (Create.testSlave): test it
3732         * buildbot/status/words.py (IrcStatusBot.buildFinished): Teach the
3733         IRC bot about EXCEPTION
3735         * buildbot/status/client.py (PBListener): upcall more correctly
3737         * buildbot/process/base.py (Build.allStepsDone): if a step caused
3738         an exception mark the overall build with EXCEPTION, not SUCCESS
3740         * buildbot/scripts/runner.py (makefile_sample): remove the leading
3741         newline
3742         * buildbot/status/mail.py (MailNotifier): oops, forgot to upcall
3743         * Makefile: update some release-related stuff
3745         * buildbot/slave/commands.py (ShellCommand.kill): if somehow this
3746         gets called when there isn't actually an active process, just end
3747         the Command instead of blowing up. I don't know how it gets into
3748         this state, but the twisted win32 buildslave will sometimes hang,
3749         and when it shakes its head and comes back, it thinks it's still
3750         running a Command. The next build causes this command to be
3751         interrupted, but the lack of self.process.pid breaks the interrupt
3752         attempt.
3754         * NEWS: document changes since the last release
3756         * buildbot/scripts/runner.py (start): change 'buildbot start' to
3757         look for Makefile.buildbot instead of a bare Makefile . The
3758         'buildbot start' does not install this file, so you have to
3759         manually copy it if you want to customize startup behavior.
3760         (createMaster): change 'buildbot master' command to create
3761         Makefile.sample instead of Makefile, to create master.cfg.sample
3762         instead of master.cfg (requiring you to copy it before the
3763         buildmaster can be started). Both sample files are kept up to
3764         date, i.e. they are overwritten if they have been changed. The
3765         'buildbot.tac' file is *not* overwritten, but if the new contents
3766         don't match the old, a 'buildbot.tac.new' file is created and the
3767         user is warned. This seems to be a much more sane way to handle
3768         startup files. Also, don't sys.exit(0) when done, so we can run
3769         unit tests against it.
3770         (createSlave): same. Don't overwrite the sample info/ files.
3771         * buildbot/scripts/sample.mk: remove. the contents were pulled
3772         into runner.py, since they need to match the behavior of start()
3773         * setup.py: same
3774         * MANIFEST.in: same
3776         * docs/buildbot.texinfo (Launching the daemons): document it
3777         * buildbot/test/test_runner.py (Create): test it
3779         * buildbot/test/test_vc.py (SetupMixin.failUnlessIn): Add a
3780         version that can handle string-in-string tests, because otherwise
3781         python-2.2 fails the tests. It'd be tremendous if Trial's test
3782         took two strings under 2.2 too.
3784         * everything: fixed all deprecation warnings when running against
3785         Twisted-2.0 . (at least all the ones in buildbot code, there are a
3786         few that come from Twisted itself). This involved putting most of
3787         the Twisted-version specific code in the new buildbot.twcompat
3788         module, and creating some abstract base classes in
3789         buildbot.changes.base and buildbot.status.base (which might be
3790         useful anyway). __implements__ is a nuisance and requires an ugly
3791         'if' clause everywhere.
3793         * buildbot/test/test_status.py (Mail.testMail): add a 0.1 second
3794         delay before finishing the test: it seems that smtp.sendmail
3795         doesn't hang up on the server, so we must wait a moment so it can
3796         hang up on us. This removes the trial warning about an unclean
3797         reactor.
3799 2005-05-16  Brian Warner  <warner@lothar.com>
3801         * buildbot/process/step.py (Source): add 'retry' argument. It is a
3802         tuple of (delay, repeats).
3803         * buildbot/test/test_vc.py (Retry): test it
3804         * docs/buildbot.texinfo (Source Checkout): document it
3805         * buildbot/slave/commands.py (SourceBase): add 'retry' parameter.
3806         (SourceBase.maybeDoVCRetry): If 'retry' is set, failures in
3807         doVCFull() are handled by re-trying the checkout (after a delay)
3808         some number of times.
3809         (ShellCommand._startCommand): make header lines easier to read
3811         * buildbot/test/test_web.py (WebTest.tearDown): factor out master
3812         shutdown
3813         (WebTest.test_logfile): make sure master gets shut down, silences
3814         some "unclean reactor" test errors
3816         * buildbot/test/test_changes.py (Sender.tearDown): spin the
3817         reactor once after shutdown, something in certain versions of
3818         Twisted trigger a test failure. 1.3.0 is ok, 2.0.0 fails, 2.0.1pre
3819         fails, svn-trunk is ok.
3821         * buildbot/test/test_slavecommand.py (Shell.testShellZ): add a
3822         second win32 error message
3824         * buildbot/test/test_run.py (Status.testSlave): be smarter about
3825         validating the ETA, so the tests don't fail on slow systems
3827 2005-05-15  Brian Warner  <warner@lothar.com>
3829         * buildbot/status/builder.py (HTMLLogFile): make this behave like
3830         the new LogFile class, so upgrading works properly
3831         (LogFileProducer.resumeProducing): survive resumeProducing after
3832         we've exhausted the chunkGenerator
3834         * buildbot/test/test_web.py (WebTest.test_logfile): validate HTML
3835         logs too
3836         * buildbot/test/test_status.py (Log.testAdd): validate hasContents
3837         (Log.testUpgrade): same
3839         * docs/buildbot.texinfo (Maintenance): describe how to delete old
3840         Builds and logs with a cron job.
3842         * buildbot/status/builder.py (LogFile): revamp LogFiles. Got rid
3843         of the old non-offline LogFile, added code to upgrade these to
3844         new-style contents-live-on-disk instances at load time (in a way
3845         that doesn't invalidate the old Build pickles, so upgrading to
3846         0.6.5 is not a one-way operation). Got rid of everything related
3847         to 'stub' builds.
3848         (LogFile.__init__): create LogFiles with the parent step status,
3849         the log's name, and a builder-relative filename where it can keep
3850         the contents on disk.
3851         (LogFile.hasContents): new method, clients are advised to call it
3852         before getText or getChunks and friends. If it returns False, the
3853         log's contents have been deleted and getText() will raise an
3854         error.
3855         (LogFile.getChunks): made it a generator
3856         (LogFile.subscribeConsumer): new method, takes a Twisted-style
3857         Consumer (except one that takes chunks instead of strings). This
3858         enables streaming of very large logfiles without storing the whole
3859         thing in memory.
3860         (BuildStatus.generateLogfileName): create names like
3861         12-log-compile-output, with a _0 suffix if required to be unique
3862         (BuildStatus.upgradeLogfiles): transform any old-style (from 0.6.4
3863         or earlier) logfiles into new-style ones
3864         (BuilderStatus): remove everything related to 'stub' builds. There
3865         is now only one build cache, and we don't strip logs from old
3866         builds anymore.
3867         (BuilderStatus.getBuildByNumber): check self.currentBuild too,
3868         since we no longer fight to keep it in the cache
3870         * buildbot/status/html.py (TextLog.render_GET): use a
3871         ChunkConsumer to stream the log entries efficiently.
3872         (ChunkConsumer): wrapper which consumes chunks and writes
3873         formatted HTML.
3875         * buildbot/test/test_twisted.py (Parse.testParse): use a
3876         LogFile-like object instead of a real one
3878         * buildbot/test/test_status.py (MyLog): handle new LogFile code
3879         (Log.testMerge3): validate more merge behavior
3880         (Log.testChunks): validate LogFile.getChunks
3881         (Log.testUpgrade): validate old-style LogFile upgrading
3882         (Log.testSubscribe): validate LogFile.subscribe
3883         (Log.testConsumer): validate LogFile.subscribeConsumer
3885         * buildbot/interfaces.py (IStatusLogStub): remove
3886         (IStatusLog.subscribeConsumer): new method
3887         (IStatusLog.hasContents): new method
3888         (IStatusLogConsumer): describes things passed to subscribeConsumer
3890         * buildbot/status/html.py (StepBox.getBox): Don't offer an href to
3891         the log contents if it does not have any contents.
3892         (StatusResourceBuildStep.body): same
3893         (StatusResourceBuildStep.getChild): give a 404 for empty logs
3895 2005-05-14  Brian Warner  <warner@lothar.com>
3897         * buildbot/test/test_web.py (WebTest.test_logfile): add 5-second
3898         timeouts to try and make the windows metabuildslave not hang
3900 2005-05-13  Mike Taylor  <bear@code-bear.com>
3902         * buildbot/slave/commands.py (rmdirRecursive): added a check
3903         to ensure the path passed into rmdirRecursive actually exists.
3904         On win32 a non-existant path would generate an exception.
3906 2005-05-13  Brian Warner  <warner@lothar.com>
3908         * buildbot/slave/commands.py (rmdirRecursive): replacement for
3909         shutil.rmtree which behaves correctly on windows in the face of
3910         files that you have to chmod before deleting. Thanks to Bear at
3911         the OSAF for the routine.
3912         (SourceBase.doClobber): use rmdirRecursive
3914 2005-05-12  Brian Warner  <warner@lothar.com>
3916         * buildbot/status/builder.py (OfflineLogFile.getChunks): have this
3917         method generate chunks instead of returning a big list. This
3918         allows the same method to be used for both old LogFile and new
3919         OfflineLogFile.
3920         (OfflineLogFile.getText): use the generator
3921         (OfflineLogFile.subscribe): same
3922         * buildbot/status/html.py (TextLog.resumeProducing): same
3923         * buildbot/interfaces.py (IStatusLog.getChunks): document it
3925         * buildbot/test/test_web.py (WebTest.test_logfile): Add a test to
3926         point out that OfflineLogFile does not currently work with
3927         html.Waterfall . Fixing this is high-priority.
3929         * buildbot/scripts/runner.py (start): add --logfile=twistd.log, since
3930         apparently windows defaults to using stdout
3932         * buildbot/test/test_slavecommand.py (Shell.testShellZ): log a
3933         better message on failure so I can figure out the win32 problem
3935         * buildbot/slave/commands.py (ShellCommand._startCommand): update
3936         log messages to include more useful copies of the command being
3937         run, the argv array, and the child command's environment.
3938         (Git.doVCFull): update cg-close usage, patch from Brandon Philips.
3940 2005-05-11  Brian Warner  <warner@lothar.com>
3942         * setup.py: oops, install debug.glade so 'buildbot debugclient'
3943         will actually work
3944         * Makefile: update the deb-snapshot version
3946         * docs/buildbot.texinfo: move all .xhtml docs into a new
3947         .texinfo-format document, adding a lot of material in the process.
3948         This is starting to look like a real user's manual. Removed all
3949         the Lore-related files: *.xhtml, *.css, template.tpl .
3950         * docs/Makefile: simple makefile to run 'makeinfo'
3951         * buildbot/scripts/sample.cfg: rearrange slightly
3952         * MANIFEST.in: include .info and .textinfo, don't include *.xhtml
3954 2005-05-10  Brian Warner  <warner@lothar.com>
3956         * buildbot/scripts/runner.py (start): Twisted-1.3.0 used a
3957         different name for the internal twistw module, handle it.
3959         * MANIFEST.in: we deleted plugins.tml, so stop shipping it
3960         * setup.py: .. and stop trying to install it
3962         * buildbot/process/step.py (Git): added support for 'cogito' (aka
3963         'git'), the new linux kernel VC system (http://kernel.org/git/).
3964         Thanks to Brandon Philips for the patch.
3965         * buildbot/slave/commands.py (Git): same
3967 2005-05-06  Brian Warner  <warner@lothar.com>
3969         * buildbot/status/builder.py (OfflineLogFile): replace the default
3970         LogFile with a form that appends its new contents to a disk file
3971         as they arrive. The complete log data is never kept in RAM. This
3972         is the first step towards handling very large (100MB+) logfiles
3973         without choking quite so badly. (The other half is
3974         producer/consumer on the HTML pages).
3975         (BuildStepStatus.addLog): use OfflineLogFile by default
3976         (BuildStatus.getLogfileName): helper code to give the
3977         OfflineLogFile a filename to work with
3979         * buildbot/test/test_status.py (Results.testAddResults): update
3980         tests to handle new asserts
3981         * buildbot/test/test_vc.py (Patch.doPatch): same
3982         * buildbot/test/test_steps.py (BuildStep.setUp): same
3984 2005-05-05  Brian Warner  <warner@lothar.com>
3986         * buildbot/scripts/runner.py (start): if there is no Makefile,
3987         launch the app by importing twistd's internals and calling run(),
3988         rather than spawning a new twistd process. This stands a much
3989         better chance of working under windows.
3990         (stop): kill the process with os.kill instead of spawning
3991         /bin/kill, again to reduce the number of external programs which
3992         windows might not have in the PATH. Also wait up to 5 seconds for
3993         the process to go away, allowing things like 'buildbot stop;
3994         buildbot start' to be reliable in the face of slow shutdowns.
3996         * buildbot/master.py (Dispatcher.__getstate__): remove old
3997         .tap-related methods
3998         (BuildMaster.__getstate__): same
3999         (makeService): same
4000         * buildbot/slave/bot.py (makeService): same
4001         (Options.longdesc): same
4002         * buildbot/scripts/runner.py: copy over some old mktap option text
4004         * buildbot/scripts/runner.py (masterTAC): stop using mktap.
4005         'buildbot master' now creates a buildbot.tac file, so there is no
4006         longer a create-instance/save/reload sequence. mktap is dead, long
4007         live twistd -y.
4008         * buildbot/scripts/sample.mk: use twistd -y, not -f
4009         * buildbot/test/test_config.py: remove mktap-based test
4010         * buildbot/bb_tap.py, buildbot/plugins.tml: delete old files
4011         * README: don't reference mktap
4013         * docs/source.xhtml: document some of the attributes that Changes
4014         might have
4016         * docs/steps.xhtml (Bazaar): document the Bazaar checkout step
4018         * general: merge in Change(tag=) patch from Thomas Vander Stichele.
4019         [org.apestaart@thomas--buildbot/buildbot--cvstag--0-dev--patch-2]
4020         * buildbot/changes/changes.py (Change)
4021         * buildbot/changes/mail.py (parseSyncmail)
4022         * buildbot/test/test_mailparse.py (Test3.getNoPrefix)
4023         (Test3.testMsgS5)
4024         * buildbot/process/base.py (Build.isTagImportant)
4025         (Build.addChange)
4028 2005-05-04  Brian Warner  <warner@lothar.com>
4030         * buildbot/clients/sendchange.py (Sender.send): tear down the PB
4031         connection after sending the change, so that unit tests don't
4032         complain about sockets being left around
4034         * buildbot/status/html.py (WaterfallStatusResource.body): fix
4035         exception in phase=0 rendering
4036         * buildbot/test/test_web.py (WebTest.test_waterfall): test it
4038         * buildbot/changes/dnotify.py (DNotify.__init__): remove debug msg
4040         * buildbot/master.py (BuildMaster.loadConfig): finally remove
4041         deprecated config keys: webPortnum, webPathname, irc, manholePort,
4042         and configuring builders with tuples.
4043         * buildbot/test/test_config.py: stop testing compatibility with
4044         deprecated config keys
4045         * buildbot/test/test_run.py: same
4047 2005-05-03  Brian Warner  <warner@lothar.com>
4049         * contrib/arch_buildbot.py: survive if there are no logfiles
4050         (username): just use a string, os.getlogin isn't reliable
4052         * buildbot/scripts/runner.py (sendchange): oops, fix the command
4053         so 'buildbot sendchange' actually works. The earlier test only
4054         covered the internal (non-reactor-running) form.
4056         * contrib/arch_buildbot.py: utility that can run as an Arch hook
4057         script to notify the buildmaster about changes
4059         * buildbot/scripts/runner.py (sendchange): new command to send a
4060         change to a buildbot.changes.pb.PBChangeSource receiver.
4061         * buildbot/test/test_changes.py (Sender): test it
4063         * buildbot/master.py (BuildMaster.startService): mark .readConfig
4064         after any reading of the config file, not just when we do it in
4065         startService. This makes some tests a bit cleaner.
4067         * buildbot/changes/pb.py: add some log messages
4069         * buildbot/process/base.py (Build.startBuild): fix a bug that
4070         caused an exception when the build terminated in the very first
4071         step.
4072         (Build.stepDone): let steps return a status of EXCEPTION. This
4073         terminates the build right away, and sets the build's overall
4074         status to EXCEPTION too.
4075         * buildbot/process/step.py (BuildStep.failed): return a status of
4076         EXCEPTION when that is what has happened.
4078         * buildbot/process/step.py (Arch.computeSourceRevision): finally
4079         implement this, allowing Arch-based projects to get precise
4080         checkouts instead of always using the latest code
4081         (Bazaar): create variant of Arch to let folks use baz instead of
4082         tla. Requires a new buildslave too.
4083         * buildbot/slave/commands.py (Arch): add 'revision' argument
4084         (Bazaar): create variant of Arch that uses baz instead of tla.
4085         Remove the code that extracts the archive name from the
4086         register-archive output, since baz doesn't provide it, and require
4087         the user provide both the archive name and its location.
4088         * buildbot/test/test_vc.py (VC.testBazaar): added tests
4090 2005-05-02  Brian Warner  <warner@lothar.com>
4092         * buildbot/scripts/sample.cfg: improve docs for c['buildbotURL'],
4093         thanks to Nick Trout.
4095         * buildbot/scripts/runner.py (Maker.makefile): chmod before edit,
4096         deals better with source Makefile coming from a read-only CVS
4097         checkout. Thanks to Nick Trout for the catch.
4099         * buildbot/__init__.py (version): bump to 0.6.4+ while between
4100         releases
4102 2005-04-28  Brian Warner  <warner@lothar.com>
4104         * buildbot/__init__.py (version): Releasing buildbot-0.6.4
4106         * debian/changelog: update for 0.6.4
4108 2005-04-28  Brian Warner  <warner@lothar.com>
4110         * README.w32: add a checklist of steps for getting buildbot
4111         running on windows.
4112         * MANIFEST.in: include it in the tarball
4114         * NEWS: update
4116         * buildbot/master.py (BuildMaster.upgradeToVersion3): deal with
4117         broken .tap files from 0.6.3 by getting rid of .services,
4118         .namedServices, and .change_svc at load time.
4120 2005-04-27  Brian Warner  <warner@lothar.com>
4122         * NEWS: update in preparation for new release
4124         * buildbot/test/test_config.py (Save.testSave): don't pull in
4125         twisted.scripts.twistd, we don't need it and it isn't for windows
4126         anyway.
4128         * buildbot/changes/changes.py (ChangeMaster.saveYourself):
4129         accomodate win32 which can't do atomic-rename
4131 2005-04-27  Brian Warner  <warner@lothar.com>
4133         * buildbot/test/test_run.py (Disconnect.testBuild2): crank up some
4134         timeouts to help the slow metabuildbot not flunk them so much
4135         (Disconnect.testBuild3): same
4136         (Disconnect.testBuild4): same
4137         (Disconnect.testInterrupt): same
4139         * buildbot/master.py (BuildMaster.loadChanges): fix change_svc
4140         setup, it was completely broken for new buildmasters (those which
4141         did not have a 'change.pck' already saved. Thanks to Paul Warren
4142         for catching this (embarrassing!) bug.
4143         (Dispatcher.__getstate__): don't save our registered avatar
4144         factories, since they'll be re-populated when the config file is
4145         re-read.
4146         (BuildMaster.__init__): add a dummy ChangeMaster, used only by
4147         tests (since the real mktap-generated BuildMaster doesn't save
4148         this attribute).
4149         (BuildMaster.__getstate__): don't save any service children,
4150         they'll all be re-populated when the config file is re-read.
4151         * buildbot/test/test_config.py (Save.testSave): test for this
4153 2005-04-26  Brian Warner  <warner@lothar.com>
4155         * buildbot/buildbot.png: use a new, smaller (16x16) icon image,
4156         rendered with Blender.. looks a bit nicer.
4157         * buildbot/docs/images/icon.blend: add the Blender file for it
4159         * buildbot/slave/commands.py (ShellCommand._startCommand): prepend
4160         'cmd.exe' (or rather os.environ['COMSPEC']) to the argv list when
4161         running under windows. This appears to be the best way to allow
4162         BuildSteps to do something normal like 'trial -v buildbot.test' or
4163         'make foo' and still expect it to work. The idea is to make the
4164         BuildSteps look as much like what a developer would type when
4165         compiling or testing the tree by hand. This approach probably has
4166         problems when there are spaces in the arguments, so if you've got
4167         windows buildslaves, you'll need to pay close attention to your
4168         commands.
4170         * buildbot/status/html.py (WaterfallStatusResource.body): add the
4171         timezone to the timestamp column.
4172         * buildbot/test/test_web.py (WebTest.test_waterfall): test it
4174         * buildbot/scripts/runner.py (loadOptions): do something sane for
4175         windows, I think. We use %APPDATA%/buildbot instead of
4176         ~/.buildbot, but we still search everywhere from the current
4177         directory up to the root for a .buildbot/ subdir. The "is it under
4178         $HOME" security test was replaced with "is it owned by the current
4179         user", which is only performed under posix.
4180         * buildbot/test/test_runner.py (Options.testFindOptions): update
4181         tests to match. The "is it owned by the current user" check is
4182         untested. The test has been re-enabled for windows.
4184         * buildbot/test/test_slavecommand.py (Shell.checkOutput): replace
4185         any "\n" in the expected output with the platform-specific line
4186         separator. Make this separator "\r\n" on PTYs under unix, they
4187         seem to do that and I don't know why
4189         * buildbot/test/test_runner.py (Options.optionsFile): disable on
4190         windows for now, I don't know what ~/.buildbot/ should mean there.
4192         * buildbot/test/test_run.py (BuilderNames.testGetBuilderNames):
4193         win32 compatibility, don't use "/tmp"
4194         (Basedir.testChangeBuilddir): remove more unixisms
4196 2005-04-26  Brian Warner  <warner@lothar.com>
4198         * buildbot/test/test_control.py (Force.rmtree): python2.2
4199         compatibility, apparently its shutil.rmtree ignore_errors=
4200         argument is ignored.
4201         * buildbot/test/test_run.py (Run.rmtree): same
4202         (RunMixin.setUp): same
4204         * buildbot/test/test_runner.py (make): python2.2 has os.sep but
4205         not os.path.sep
4207         * buildbot/test/test_twisted.py (Parse.failUnlessIn): 2.2 has no
4208         'substring in string' operator, must use string.find(substr)!=-1
4209         * buildbot/test/test_vc.py (Patch.failUnlessIn): same
4210         * buildbot/test/test_web.py (WebTest.failUnlessIn): same
4212         * buildbot/scripts/runner.py (loadOptions): add code to search for
4213         ~/.buildbot/, a directory with things like 'options', containing
4214         defaults for various 'buildbot' subcommands. .buildbot/ can be in
4215         the current directory, your $HOME directory, or anywhere
4216         inbetween, as long as you're somewhere inside your home directory.
4217         (debugclient): look in ~/.buildbot/options for master and passwd
4218         (statuslog): look in ~/.buildbot/options for 'masterstatus'
4219         * buildbot/test/test_runner.py (Options.testFindOptions): test it
4221         * buildbot/status/client.py (makeRemote): new approach to making
4222         IRemote(None) be None, which works under Twisted-2.0
4223         * buildbot/test/test_status.py (Client.testAdaptation): test it
4225         * buildbot/status/builder.py (Status.builderAdded): when loading a
4226         pickled BuilderStatus in from disk, set its name after loading.
4227         The config file might have changed its name (but not its
4228         directory) while it wasn't looking.
4229         
4230         * buildbot/process/builder.py (Builder.attached): always return a
4231         Deferred, even if the builder was already attached
4232         * buildbot/test/test_run.py (Basedir.testChangeBuilddir): test it
4234 2005-04-25  Brian Warner  <warner@lothar.com>
4236         * buildbot/status/words.py (IrcStatusBot.buildFinished): fix a
4237         category-related exception when announcing a build has finished
4239         * buildbot/status/html.py (StatusResourceChanges.body): oops, don't
4240         reference no-longer-existent changemaster.sources
4241         * buildbot/test/test_web.py (WebTest.test_waterfall): test for it
4243         * buildbot/__init__.py (version): bump to 0.6.3+ while between
4244         releases
4246 2005-04-25  Brian Warner  <warner@lothar.com>
4248         * buildbot/__init__.py (version): Releasing buildbot-0.6.3
4250         * debian/changelog: update for 0.6.3
4252 2005-04-25  Brian Warner  <warner@lothar.com>
4254         * MANIFEST.in: make sure debug.glade is in the tarball
4256         * README (REQUIREMENTS): list necessary Twisted-2.0 packages
4258         * NEWS: update for the imminent 0.6.3 release
4260         * buildbot/status/html.py (HtmlResource.content): make the
4261         stylesheet <link> always point at "buildbot.css".
4262         (StatusResource.getChild): map "buildbot.css" to a static.File
4263         containing whatever css= argument was provided to Waterfall()
4264         (Waterfall): provide the "classic" css as the default.
4265         * docs/waterfall.classic.css: move default CSS from here ..
4266         * buildbot/status/classic.css: .. to here
4268         * MANIFEST.in: make sure classic.css is included in the tarball
4269         * setup.py: and that it is installed too, under buildbot/status/
4271         * buildbot/master.py (BuildMaster): oops, set .change_svc=None at
4272         the module level, because buildbot.tap files from 0.6.2 don't have
4273         it in their attribute dictionary.
4275         * buildbot/slave/bot.py (Bot.startService): make sure the basedir
4276         really exists at startup, might save some confusion somewhere.
4278 2005-04-24  Thomas Vander Stichele  <thomas at apestaart dot org>
4280         * docs/waterfall.classic.css:
4281           add a stylesheet that's almost the same as the "classic"
4282           buildbot style
4284         * buildbot/status/builder.py:
4285           add EXCEPTION as a result - this is a problem for the bot
4286           maintainer, not a build problem for the changers
4287         * buildbot/process/step.py:
4288           use EXCEPTION instead of FAILURE for exceptions
4289         * buildbot/status/html.py:
4290           add build_get_class to get a class out of a build/buildstep
4291           finish naming the classes
4292           split out sourceNames to changeNames and builderNames so we
4293           can style them separately
4294         * docs/config.xhtml:
4295           finish documenting classes as they are right now
4297         * buildbot/status/html.py:
4298           name the classes as we agreed on IRC
4299         * docs/config.xhtml:
4300           and document them
4302         * buildbot/status/html.py:
4303           same for cssclass->class_
4305         * buildbot/status/html.py:
4306           as decided on IRC, use class_ for the "class" attribute to not
4307           conflict with the class keyword, and clean up the messy **{} stuff.
4309         * buildbot/status/mail.py:
4310           put back "builders" argument, and fix docstring, because the
4311           code *ignores* builders listed in this argument
4313         * buildbot/process/builder.py:
4314           remove FIXME notes - category is now indeed a cvar of BuilderStatus
4316         * docs/config.xhtml:
4317           describe the category argument for builders
4319         * buildbot/status/builder.py:
4320           Fix a silly bug due to merging
4322         * buildbot/process/builder.py:
4323           remove category from the process Builder ...
4324         * buildbot/status/builder.py:
4325           ... and add it to BuilderStatus instead.
4326           Set category on unpickled builder statuses, they might not have it.
4327         * buildbot/master.py:
4328           include category when doing builderAdded
4329         * buildbot/status/mail.py:
4330           return None instead of self for builders we are not interested in.
4331         * buildbot/test/test_run.py:
4332           fix a bug due to only doing deferredResult on "dummy" waiting
4333         * buildbot/test/test_status.py:
4334           add checks for the Mail IStatusReceiver returning None or self
4336         * buildbot/status/html.py:
4337           fix testsuite by prefixing page title with BuildBot
4339         * buildbot/status/builder.py:
4340           have .category in builder status ...
4341         * buildbot/process/builder.py:
4342           ... and set it from Builder
4343         * buildbot/status/html.py:
4344           make .css a class variable 
4345         * buildbot/test/test_status.py:
4346           write more tests to cover our categories stuff ...
4347         * buildbot/status/mail.py:
4348           ... and fix the bug that this uncovered
4350         * buildbot/changes/mail.py:
4351         * buildbot/changes/pb.py:
4352         * buildbot/master.py:
4353         * buildbot/process/base.py:
4354         * buildbot/process/factory.py:
4355         * buildbot/process/interlock.py:
4356         * buildbot/process/step.py:
4357         * buildbot/process/step_twisted.py:
4358         * buildbot/slave/commands.py:
4359         * buildbot/status/builder.py:
4360         * buildbot/status/client.py:
4361         * buildbot/status/html.py:
4362         * buildbot/status/mail.py:
4363         * buildbot/status/progress.py:
4364         * buildbot/test/test_changes.py:
4365         * buildbot/test/test_config.py:
4366         * buildbot/test/test_control.py:
4367         * buildbot/test/test_interlock.py:
4368         * buildbot/test/test_maildir.py:
4369         * buildbot/test/test_mailparse.py:
4370         * buildbot/test/test_run.py:
4371         * buildbot/test/test_slavecommand.py:
4372         * buildbot/test/test_status.py:
4373         * buildbot/test/test_steps.py:
4374         * buildbot/test/test_twisted.py:
4375         * buildbot/test/test_util.py:
4376         * buildbot/test/test_vc.py:
4377         * buildbot/test/test_web.py:
4378         * buildbot/util.py:
4379           add test-case-name at the top of a whole set of files
4381         * buildbot/status/builder.py:
4382           keep order of addition when getting builder names
4383         * buildbot/status/words.py:
4384         * buildbot/test/test_run.py:
4385           add test for getBuilderNames
4387         * buildbot/process/base.py:
4388         * buildbot/process/step.py:
4389         * buildbot/status/builder.py:
4390         * buildbot/status/html.py:
4391           make buildbot css-able
4392           replace the color code for purple with purple, don't understand
4393           why it wasn't purple to start with
4395         * buildbot/status/words.py:
4396           ok, so it doesn't look like BuilderStatus.remote is still valid.
4397           Use what waterfall uses instead.
4399         * buildbot/interfaces.py:
4400         * buildbot/status/builder.py:
4401         * buildbot/status/html.py:
4402         * buildbot/status/mail.py:
4403         * buildbot/status/words.py:
4404         * buildbot/test/test_run.py:
4405           use categories everywhere and make it be a list.  More sensible
4406           for the future.  Also make words actually respect this in
4407           buildFinished.
4409         * buildbot/interfaces.py:
4410           add category argument to getBuilderNames
4411         * buildbot/process/builder.py:
4412         * buildbot/status/builder.py:
4413         * buildbot/status/html.py:
4414         * buildbot/status/mail.py:
4415         * buildbot/status/words.py:
4416         * buildbot/test/test_run.py:
4417           move from specifying builders by name to specifying the category
4419         * buildbot/status/html.py:
4420         * buildbot/status/words.py:
4421           add "builders=" to __init__ of status clients so they can
4422           limit themselves to the given list of builders to report on
4424         * buildbot/status/html.py: set the title to the product name
4426 2005-04-23  Thomas Vander Stichele  <thomas at apestaart dot org>
4428         * buildbot/interfaces.py:
4429         * buildbot/status/builder.py:
4430           more documentation.  Hm, not sure if ChangeLog entries make sense
4431           here...
4433 2005-04-23  Brian Warner  <warner@lothar.com>
4435         * buildbot/test/test_vc.py (SetupMixin.do_vc): increase timeouts
4437         * buildbot/test/test_slavecommand.py (Shell): increase timeouts
4439         * buildbot/scripts/runner.py: make 'statuslog' and 'statusgui' be
4440         the sub-commands that log buildmaster status to stdout and to a
4441         GUI window, respectively.
4443         * buildbot/clients/gtkPanes.py: overhaul. basic two-row
4444         functionality is working again, but all the step-status and ETA
4445         stuff is missing. Commented out a lot of code pending more
4446         overhaul work.
4448         * buildbot/status/client.py: make sure that IRemote(None) is None
4450         * buildbot/changes/changes.py: import defer, oops
4451         (ChangeMaster): remove the .sources list, rely upon the fact that
4452         MultiServices can be treated as sequences of their children. This
4453         cleans up the add/remove ChangeSource routines a lot, as we keep
4454         exactly one list of the current sources instead of three.
4456         * buildbot/master.py (BuildMaster.__init__): remove .sources, set
4457         up an empty ChangeMaster at init time.
4458         (BuildMaster.loadChanges): if there are changes to be had from
4459         disk, replace self.change_svc with the new ones. If not, keep
4460         using the empty ChangeMaster set up in __init__.
4461         (BuildMaster.loadConfig_Sources): use list(self.change_svc)
4462         instead of a separate list, makes the code a bit cleaner.
4463         * buildbot/test/test_config.py (ConfigTest.testSimple): match it
4464         (ConfigTest.testSources): same, also wait for loadConfig to finish.
4465         Extend the test to make sure we can get rid of the sources when
4466         we're done.
4468 2005-04-22  Brian Warner  <warner@lothar.com>
4470         * buildbot/scripts/runner.py (Maker.mkinfo): create the info/admin
4471         and info/host files when making the slave directory
4473         * buildbot/test/test_run.py (RunMixin.shutdownSlave): remove the
4474         whendone= argument, just return the Deferred and let the caller do
4475         what they want with it.
4476         (Disconnect.testBuild1): wait for shutdownSlave
4477         (Basedir.testChangeBuilddir): new test to make sure changes to the
4478         builddir actually get propagated to the slave
4480         * buildbot/slave/bot.py (SlaveBuilder.setBuilddir): use an
4481         explicit method, rather than passing the builddir in __init__ .
4482         Make sure to update self.basedir too, this was broken before.
4483         (Bot.remote_setBuilderList): use b.setBuilddir for both new
4484         builders and for ones that have just had their builddir changed.
4485         (BotFactory): add a class-level .perspective attribute, so
4486         BuildSlave.waitUntilDisconnected won't get upset when the
4487         connection hasn't yet been established
4488         (BuildSlave.__init__): keep track of the bot.Bot instance, so
4489         tests can reach through it to inspect the SlaveBuilders
4491         * buildbot/process/base.py (Build.buildException): explain the
4492         log.err with a log.msg
4493         * buildbot/process/builder.py (Builder.startBuild): same
4494         (Builder._startBuildFailed): improve error message
4496         * buildbot/pbutil.py (RBCP.failedToGetPerspective): if the failure
4497         occurred because we lost the brand-new connection, retry instead
4498         of giving up. If not, it's probably an authorization failure, and
4499         it makes sense to stop trying. Make sure we log.msg the reason
4500         that we're log.err'ing the failure, otherwise test failures are
4501         really hard to figure out.
4503         * buildbot/master.py: change loadConfig() to return a Deferred
4504         that doesn't fire until the change has been fully implemented.
4505         This means any connected slaves have been updated with the new
4506         builddir. This change makes it easier to test the code which
4507         actually implements this builddir-updating.
4508         (BotPerspective.addBuilder): return Deferred
4509         (BotPerspective.removeBuilder): same
4510         (BotPerspective.attached): same
4511         (BotPerspective._attached): same. finish with remote_print before
4512         starting the getSlaveInfo, instead of doing them in parallel
4513         (BotPerspective.list_done): same
4514         (BotMaster.removeSlave): same. Fix the typo that meant we weren't
4515         actually calling slave.disconnect()
4516         (BotMaster.addBuilder): same
4517         (BotMaster.removeBuilder): same
4518         (BuildMaster.loadConfig): same
4519         (BuildMaster.loadConfig_Slaves): same
4520         (BuildMaster.loadConfig_Sources): same
4521         (BuildMaster.loadConfig_Builders): same
4522         (BuildMaster.loadConfig_status): same
4524         * buildbot/changes/changes.py (ChangeMaster.removeSource): return
4525         a Deferred that fires when the source is finally removed
4527         * buildbot/slave/commands.py (SourceBase.doClobber): when removing
4528         the previous tree on win32, where we have to do it synchronously,
4529         make sure we return a Deferred anyway.
4530         (SourceBase.doCopy): same
4532         * buildbot/scripts/runner.py (statusgui): use the text client for
4533         now, while I rewrite the Gtk one
4534         * buildbot/clients/base.py: strip out old code, leaving just the
4535         basic print-message-on-event functionality. I also remove the
4536         ReconnectingPBClientFactory, but it does at least quit when it
4537         loses the connection instead of going silent
4539 2005-04-21  Brian Warner  <warner@lothar.com>
4541         * Makefile: minor tweaks
4543         * NEWS: point out deprecation warnings, new features for
4544         /usr/bin/buildbot
4546         * buildbot/master.py (BuildMaster.loadConfig): emit
4547         DeprecationWarnings for Builders defined with tuples. Rearrange
4548         code to facility removal of deprecated configuration keys in the
4549         next release.
4551         * buildbot/scripts/runner.py (createMaster,createSlave): rewrite
4552         'buildbot' command to put a little Makefile in the target that
4553         helps you re-create the buildbot.tap file, start or stop the
4554         master/slave, and reconfigure (i.e. SIGHUP) the master. Also chmod
4555         all the files 0600, since they contain passwords.
4556         (start): if there is a Makefile, and /usr/bin/make exists, use
4557         'make start' in preference to a raw twistd command. This lets
4558         slave admins put things like PYTHONPATH variables in their
4559         Makefiles and have them still work when the slave is started with
4560         'buildbot start ~/slave/foo'. The test is a bit clunky, it would
4561         be nice to first try the 'make' command and only fall back to
4562         twistd if it fails. TODO: the Makefile's "start" command does not
4563         add the --reactor=win32 argument when running under windows.
4564         (Options.debugclient, Options.statusgui): add sub-commands to launch
4565         the debug client (formerly in contrib/debugclient.py) and the
4566         Gtk status application (currently broken)
4567         * buildbot/clients/debug.py: move from contrib/debugclient.py
4568         * buildbot/clients/debug.glade: same
4570         * buildbot/test/test_trial.py: remove it. This requires some
4571         functionality out of Twisted that isn't there yet, and until then
4572         having it around just confuses things.
4574         * buildbot/test/test_slavecommand.py (Shell): test both with and
4575         without PTYs, and make sure that command output is properly
4576         interleaved in the with-PTY case. I think the without-PTY test
4577         should pass on windows, where we never use PTYs anyway.
4579 2005-04-20  Brian Warner  <warner@lothar.com>
4581         * README (REQUIREMENTS): mention Twisted-2.0.0 compatibility
4583         * MANIFEST.in: add epyrun, gen-reference, buildbot.png
4585         * NEWS: start creating entries for the next release
4587         * buildbot/slave/commands.py (ShellCommand.__init__): use os.pathsep
4589         * buildbot/test/test_web.py (WebTest.test_webPortnum): add timeout
4590         (WebTest.test_webPathname): same
4591         (WebTest.test_webPathname_port): same
4592         (WebTest.test_waterfall): use the default favicon rather than
4593         rooting around the filesystem for it. Open the expected-icon file
4594         in binary mode, to make win32 tests happier (thanks to Nick Trout
4595         for the catch)
4596         * buildbot/status/html.py (buildbot_icon): win32 portability
4598         * buildbot/test/test_slavecommand.py (SlaveCommandTestCase.testShellZ):
4599         win32-compatibility fixes from Nick Trout, the "file not found" message
4600         is different under windows
4601         (FakeSlaveBuilder.__init__): clean up setup a bit
4602         * buildbot/test/test_vc.py (VCSupport.__init__): win32: use os.pathsep
4604 2005-04-19  Brian Warner  <warner@lothar.com>
4606         * buildbot/test/test_vc.py (SetupMixin.setUpClass): fix the
4607         skip-if-repositories-are-unavailable test to not kill the trial
4608         that comes with Twisted-1.3.0
4610         * setup.py: install buildbot.png icon file when installing code
4612         * buildbot/slave/commands.py (ShellCommand._startCommand): log the
4613         environment used by the command, at least on the child side.
4615         * buildbot/status/html.py (TextLog.pauseProducing): add a note,
4616         this method needs to be added and implemented because it gets
4617         called under heavy load. I don't quite understand the
4618         producer/consumer API enough to write it.
4619         (StatusResource.getChild): add a resource for /favicon.ico
4620         (Waterfall.__init__): add favicon= argument
4621         * buildbot/test/test_web.py (WebTest.test_waterfall): test it
4622         (WebTest.test_webPortnum): stop using deprecated 'webPortnum'
4623         (WebTest.test_webPathname): same
4624         (WebTest.test_webPathname_port): same
4625         * docs/config.xhtml: mention favicon=
4626         * buildbot/buildbot.png: add a default icon, dorky as it is
4628 2005-04-18  Thomas Vander Stichele  <thomas at apestaart dot org>
4630         * buildbot/master.py:
4631         * buildbot/process/base.py:
4632         * buildbot/process/builder.py:
4633         * buildbot/process/interlock.py:
4634         * buildbot/status/builder.py:
4635         * buildbot/status/html.py:
4636         * buildbot/status/mail.py:
4637         * buildbot/status/words.py:
4638           new documentation while digging through the code
4640 2005-04-17  Brian Warner  <warner@lothar.com>
4642         * general: try to fix file modes on all .py files: a+r, a-x,
4643         but let buildbot/clients/*.py be +x since they're tools
4645         * docs/epyrun (addMod): when an import fails, say why
4647         * Makefile: Add a 'docs' target, hack on the PYTHONPATH stuff
4649 2005-04-17  Thomas Vander Stichele  <thomas at apestaart dot org>
4651         * buildbot/process/base.py:
4652         * buildbot/process/builder.py:
4653         * buildbot/status/builder.py:
4654           new documentation while digging through the code
4656 2005-04-17  Thomas Vander Stichele  <thomas at apestaart dot org>
4658         * buildbot/changes/changes.py:
4659         * buildbot/changes/p4poller.py:
4660         * buildbot/interfaces.py:
4661         * buildbot/process/base.py:
4662         * buildbot/process/builder.py:
4663         * buildbot/process/step.py:
4664         * buildbot/process/step_twisted.py:
4665         * buildbot/slave/bot.py:
4666         * buildbot/slave/commands.py:
4667         * buildbot/status/builder.py:
4668           fix all docstrings to make epydoc happy.  In the process of fixing
4669           some, I also moved pieces of docs, and removed some deprecated
4670           documentation
4672 2005-04-17  Thomas Vander Stichele  <thomas at apestaart dot org>
4674         * buildbot/process/builder.py:
4675         * buildbot/process/interlock.py:
4676         * buildbot/process/process_twisted.py:
4677         * buildbot/process/step.py:
4678           BuildProcess -> Build, as it looks like that's what happened
4679         * buildbot/process/base.py:
4680         * buildbot/process/factory.py:
4681           update epydoc stuff
4683 2005-04-17  Brian Warner  <warner@lothar.com>
4685         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
4686         update compile command to accomodate the Twisted split.. now
4687         instead of './setup.py build_ext -i', you do './setup.py all
4688         build_ext -i', to run build_ext over all sub-projects.
4689         (FullTwistedBuildFactory): same
4690         (TwistedReactorsBuildFactory): same
4692         * buildbot/status/html.py (TextLog.finished): null out self.req
4693         when we're done, otherwise the reference cycle of TextLog to .req
4694         to .notifications to a Deferred to TextLog.stop keeps them from
4695         being collected, and consumes a huge (610MB on pyramid at last
4696         check) amount of memory.
4698 2005-04-11  Brian Warner  <warner@lothar.com>
4700         * buildbot/test/test_vc.py (VCSupport.__init__): use abspath() to
4701         normalize the VC-repository location.. makes SVN happier with
4702         certain test environments.
4704         * buildbot/process/step.py (RemoteShellCommand.__init__): let each
4705         RemoteShellCommand gets its own .env dictionary, so that code in
4706         start() doesn't mutate the original. I think this should fix the
4707         step_twisted.Trial problem where multiple identical components
4708         kept getting added to PYTHONPATH= over and over again.
4710         * general: merge org.apestaart@thomas/buildbot--doc--0--patch-3,
4711         adding epydoc-format docstrings to many classes. Thanks to Thomas
4712         Vander Stichele for the patches.
4713         * docs/epyrun, docs/gen-reference: add epydoc-generating tools
4714         * buildbot/status/mail.py, buildbot/process/step_twisted.py: same
4715         * buildbot/slave/bot.py, commands.py, registry.py: same
4717 2005-04-05  Brian Warner  <warner@lothar.com>
4719         * buildbot/slave/commands.py (SourceBase.doCopy): use cp -p to
4720         preserve timestamps, helps incremental builds of large trees.
4721         Patch from Rene Rivera.
4723         * buildbot/slave/bot.py (SlaveBuilder.commandComplete): oops, log
4724         'failure' and not the non-existent 'why'. Thanks to Rene Rivera
4725         for the catch.
4727 2005-04-03  Brian Warner  <warner@lothar.com>
4729         * buildbot/master.py (BuildMaster.loadConfig): only call exec()
4730         with one dict, apparently exec has some scoping bugs when used
4731         with both global/local dicts. Thanks to Nathaniel Smith for the
4732         catch.
4734 2005-04-02  Brian Warner  <warner@lothar.com>
4736         * buildbot/process/step_twisted.py (countFailedTests): the new
4737         trial in Twisted-2.0 emits a slightly different status line than
4738         old trial ("PASSED.." instead of "OK.."). Handle it so we don't
4739         mistakenly think the test count is unparseable.
4740         (Trial.start): note that for some reason each build causes another
4741         copy of self.testpath to be prepended to PYTHONPATH. This needs to
4742         be fixed but I'm not sure quite where the problem is.
4744 2005-04-01  Brian Warner  <warner@lothar.com>
4746         * buildbot/test/test_run.py (Run.testMaster): change some uses of
4747         deferredResult to avoid hangs/warnings under twisted-2.0
4748         (RunMixin.tearDown): same
4749         (RunMixin.shutdownSlave): same
4750         (Disconnect.testIdle1): same
4751         (Disconnect.testBuild2): same: wait one second after the build
4752         finishes for test to really be done.. this should be cleaned up to
4753         avoid wasting that second. Builder.detach uses a callLater(0),
4754         either that should be done in-line (something else needed that
4755         behavior), or it should return a Deferred that fires when the
4756         builder is really offline.
4757         (Disconnect.testBuild3): same
4758         (Disconnect.testDisappear): same
4760         * buildbot/test/test_web.py: rearrange server-setup and teardown
4761         code to remove unclean-reactor warnings from twisted-2.0
4763         * buildbot/test/test_vc.py: rearrange probe-for-VC-program routine
4764         so the tests don't hang under twisted-2.0
4766 2005-03-31  Brian Warner  <warner@lothar.com>
4768         * buildbot/slave/bot.py (Bot.remote_setBuilderList): fix typo that
4769         caused a warning each time the master changed our set of builders
4771         * buildbot/status/builder.py (BuildStatus.saveYourself): under
4772         w32, don't unlink the file unless it already exists. Thanks to
4773         Baptiste Lepilleur for the catch.
4774         (BuilderStatus.saveYourself): same
4776 2005-02-01  Brian Warner  <warner@lothar.com>
4778         * buildbot/status/html.py (TextLog.getChild): use a /text child
4779         URL, such as http://foo.com/svn-hello/builds/1/test/0/text instead
4780         of http://foo.com/svn-hello/builds/1/test/0 , to retrieve the
4781         logfile as text/plain (no markup, no headers). This replaces the
4782         previous scheme (which used an ?text=1 argument), and gets us back
4783         to a relative link (which works better when the buildbot lives
4784         behind another web server, such as Apache configured as a reverse
4785         proxy). Thanks to Gerald Combs for spotting the problem.
4787         * buildbot/__init__.py (version): bump to 0.6.2+ while between
4788         releases
4790 2004-12-13  Brian Warner  <warner@lothar.com>
4792         * buildbot/__init__.py (version): Releasing buildbot-0.6.2
4794         * debian/changelog: update for 0.6.2
4795         * NEWS: finalize for 0.6.2
4797 2004-12-11  Brian Warner  <warner@lothar.com>
4799         * NEWS: bring it up to date
4801         * buildbot/slave/bot.py (BotFactory): revamp keepalive/lost-master
4802         detection code. Require some sign of life from the buildmaster
4803         every BotFactory.keepaliveInterval seconds. Provoke this
4804         indication at BotFactory.keepaliveTimeout seconds before the
4805         deadline by sending a keepalive request. We don't actually care if
4806         that request is answered in a timely fashion, what we care about
4807         is that .activity() is called before the deadline. .activity() is
4808         triggered by any PB message from the master (including an ack to
4809         one of the slave's status-update messages). With this new scheme,
4810         large status messages over slow pipes are OK, as long as any given
4811         message can be sent (and thus acked) within .keepaliveTimeout
4812         seconds (which defaults to 30).
4813         (SlaveBuilder.remote_startCommand): record activity
4814         (SlaveBuilder.ackUpdate): same
4815         (SlaveBuilder.ackComplete): same
4816         (BotFactory.gotPerspective): same
4817         * buildbot/test/test_run.py (Disconnect.testSlaveTimeout): test it
4819 2004-12-09  Brian Warner  <warner@lothar.com>
4821         * buildbot/status/html.py (StatusResourceBuilder.getChild): remove
4822         debug message
4824         * buildbot/process/step_twisted.py (Trial._commandComplete):
4825         update self.cmd when we start the 'cat test.log' transfer. Without
4826         this, we cannot interrupt the correct RemoteCommand when we lose
4827         the connection.
4829         * buildbot/process/step.py (RemoteCommand.interrupt): don't bother
4830         trying to tell the slave to stop the command if we're already
4831         inactive, or if we no longer have a .remote
4833         * buildbot/process/builder.py (Builder._detached): don't let an
4834         exception in currentBuild.stopBuild() prevent the builder from
4835         being marked offline
4837 2004-12-07  Brian Warner  <warner@lothar.com>
4839         * buildbot/status/words.py (IrcStatusBot.getBuilder): catch the
4840         KeyError that happens when you ask for a non-existent Builder, and
4841         translate it into a UsageError.
4843         * buildbot/test/test_run.py (Disconnect.testBuild4): validate that
4844         losing the slave in the middle of a remote step is handled too
4846         * buildbot/process/step.py (ShellCommand.interrupt): 'reason' can
4847         be a Failure, so be sure to stringify it before using it as the
4848         contents of the 'interrupt' logfile
4849         (RemoteCommand.interrupt): use stringified 'why' in
4850         remote_interruptCommand too, just in case
4852 2004-12-06  Brian Warner  <warner@lothar.com>
4854         * buildbot/slave/commands.py (Arch.doVCUpdate): use 'tla replay'
4855         instead of 'tla update', which is more efficient in case we've
4856         missed a couple of patches since the last update.
4858         * debian/changelog: update for previous (0.6.1) release. Obviously
4859         this needs to be handled better.
4861 2004-12-05  Brian Warner  <warner@lothar.com>
4863         * NEWS: update for stuff since last release
4865         * buildbot/master.py (DebugPerspective.attached): return 'self', to
4866         match the maybeDeferred change in Dispatcher.requestAvatar
4867         * buildbot/changes/pb.py (ChangePerspective.attached): same
4868         * buildbot/status/client.py (StatusClientPerspective.attached): same
4869         * buildbot/process/builder.py (Builder._attached3): same
4870         * buildbot/pbutil.py (NewCredPerspective.attached): same
4872         * buildbot/status/html.py (WaterfallStatusResource.phase2): Add
4873         the date to the top-most box, if it is not the same as today's
4874         date.
4876         * docs/slave.xhtml: provide a buildslave setup checklist
4878         * docs/source.xhtml (Arch): correct terminology
4880 2004-12-04  Brian Warner  <warner@lothar.com>
4882         * buildbot/test/test_slavecommand.py: use sys.executable instead
4883         of hard-coding 'python' for child commands, might help portability
4885         * docs/examples/twisted_master.cfg: update to current usage
4887         * buildbot/status/words.py (IrcStatusBot.command_STOP): add a
4888         'stop build' command to the IRC bot
4890         * buildbot/master.py (Dispatcher.requestAvatar): remove debug
4891         message that broke PBChangeSource
4893         * buildbot/slave/bot.py: clean up shutdown/lose-master code
4894         (SlaveBuilder): make some attributes class-level, remove the old
4895         "update queue" which existed to support resuming a build after the
4896         master connection was lost. Try to reimplement that feature later.
4897         (SlaveBuilder.stopCommand): clear self.command when the
4898         SlaveCommand finishes, so that we don't try to kill a leftover one
4899         at shutdown time.
4900         (SlaveBuilder.commandComplete): same, merge with commandFailed and
4901         .finishCommand
4903         * buildbot/slave/commands.py (SourceBase): set self.command for
4904         all VC commands, so they can be interrupted.
4906 2004-12-03  Brian Warner  <warner@lothar.com>
4908         * buildbot/master.py: clean up slave-handling code, to handle
4909         slave-disconnect and multiple-connect better
4910         (BotPerspective): make these long-lasting, exactly one per bot
4911         listed in the config file.
4912         (BotPerspective.attached): if a slave connects while an existing
4913         one appears to still be connected, disconnect the old one first.
4914         (BotPerspective.disconnect): new method to forcibly disconnect a
4915         buildslave. Use some hacks to empty the transmit buffer quickly to
4916         avoid the long (20-min?) TCP timeout that could occur if the old
4917         slave has dropped off the net.
4918         (BotMaster): Keep persistent BotPerspectives in .slaves, let them
4919         own their own SlaveStatus objects. Remove .attached/.detached, add
4920         .addSlave/.removeSlave, treat slaves like Builders (config file
4921         parsing sends deltas to the BotMaster). Inform the slave
4922         instances, i.e. the BotPerspective, about addBuilder and
4923         removeBuilder.
4924         (BotMaster.getPerspective): turns into a single dict lookup
4925         (Dispatcher.requestAvatar): allow .attached to return a Deferred,
4926         which gives BotPerspective.attached a chance to disconnect the old
4927         slave first.
4928         (BuildMaster.loadConfig): add code (disabled) to validate that all
4929         builders use known slaves (listed in c['bots']). The check won't
4930         work with tuple-specified builders, which are deprecated but not
4931         yet invalid, so the check is disabled for now.
4932         (BuildMaster.loadConfig_Slaves): move slave-config into a separate
4933         routine, do the add/changed/removed dance with them like we do
4934         with builders.
4935         (BuildMaster.loadConfig_Sources): move source-config into a
4936         separate routine too
4938         * buildbot/status/builder.py (Status.getSlave): get the
4939         SlaveStatus object from the BotPerspective, not the BotMaster.
4941         * buildbot/test/test_run.py: bunch of new tests for losing the
4942         buildslave at various points in the build, handling a slave that
4943         connects multiple times, and making sure we can interrupt a
4944         running build
4946         * buildbot/slave/bot.py (BuildSlave): make it possible to use
4947         something other than 'Bot' for the Bot object, to make certain
4948         test cases easier to write.
4949         (BuildSlave.waitUntilDisconnected): utility method for testing
4951 2004-11-30  Brian Warner  <warner@lothar.com>
4953         * buildbot/test/test_run.py (RunMixin): refactor, remove debug msg
4955         * buildbot/interfaces.py (IBuilderControl.ping): add timeout=
4956         argument, return a Deferred that always fires with True or False.
4957         I don't use an errback to indicate 'ping failed' so that callers
4958         are free to ignore the deferred without causing spurious errors in
4959         the logs.
4960         * buildbot/process/builder.py (BuilderControl.ping): implement it
4962         * buildbot/test/test_run.py (Status.testDisappear): test ping
4963         (Status.disappearSlave): fix it
4965 2004-11-30  Brian Warner  <warner@lothar.com>
4967         * buildbot/interfaces.py (IBuildControl): add .stopBuild
4968         (IBuilderControl): add .getBuild(num), only works for the current
4969         build, of course, although it might be interesting to offer
4970         something for builds in the .waiting or .interlocked state.
4972         * buildbot/process/base.py (Build): have .stopBuild just do the
4973         interrupt, then let the build die by itself.
4974         (BuildControl): add .stopBuild, and add a point-event named
4975         'interrupt' just after the build so status viewers can tell that
4976         someone killed it.
4977         (BuilderControl): add .getBuild
4979         * buildbot/process/step.py (Dummy): use haltOnFailure so it really
4980         stops when you kill it, good for testing
4981         (ShellCommand.interrupt): add a logfile named 'interrupt' which
4982         contains the 'reason' text.
4984         * buildbot/status/html.py: Add Stop Build button, if the build can
4985         still be stopped. Send a Redirect (to the top page) one second
4986         later, hopefully long enough for the interrupt to have an effect.
4987         Move make_row() up to top-level to share it between Stop Build and
4988         Force Build.
4990         * buildbot/slave/commands.py: only kill the child process once
4992         * buildbot/test/test_run.py: add testInterrupt
4994 2004-11-29  Brian Warner  <warner@lothar.com>
4996         * buildbot/process/base.py: Refactor command interruption. The
4997         Build is now responsible for noticing that the slave has gone
4998         away: Build.lostRemote() interrupts the current step and makes
4999         sure that no further ones will be started.
5000         
5001         * buildbot/process/builder.py: When the initial remote_startBuild
5002         message fails, log it: this usually indicates that the slave has
5003         gone away, but we don't really start paying attention until they
5004         fail to respond to the first step's command.
5006         * buildbot/process/step.py (RemoteCommand): Does *not* watch for
5007         slave disconnect. Now sports a new interrupt() method. Error
5008         handling was simplified a lot by chaining deferreds, so
5009         remoteFailed/remoteComplete were merged into a single
5010         remoteComplete method (which can now get a Failure object).
5011         Likewise failed/finished were merged into just _finished.
5012         (BuildStep): Add interrupt(why) method, and if why is a
5013         ConnectionLost Failure then the step is failed with some useful
5014         error text.
5016         * buildbot/slave/bot.py: stop the current command when the remote
5017         Step reference is lost, and when the slave is shut down.
5018         (Bot): make it a MultiService, so it can have children. Use
5019         stopService to tell when the slave is shutting down.
5020         (SlaveBuilder): make it a Service, and a child of the Bot. Add
5021         remote_interruptCommand (which asks the current SlaveCommand to
5022         stop but allows it to keep emitting status messages), and
5023         stopCommand (which tells it to shut up and die).
5025         * buildbot/slave/commands.py: make commands interruptible
5026         (ShellCommand.kill): factor out os.kill logic
5027         (Command): factor out setup()
5028         (Command.sendStatus): don't send status if .running is false, this
5029         happens when the command has been halted.
5030         (Command.interrupt): new method, used to tell the command to die
5031         (SlaveShellCommand): implement .interrupt
5032         (DummyCommand): implement .interrupt
5033         (SourceBase, etc): factor out setup(), don't continue substeps if
5034         .interrupted is set
5036         * buildbot/status/builder.py: fix all waitUntilFinished() methods
5037         so they can be called after finishing
5039         * buildbot/test/test_run.py: new tests for disconnect behavior,
5040         refactor slave-shutdown routines, add different kinds of
5041         slave-shutdown
5043 2004-11-27  Brian Warner  <warner@lothar.com>
5045         * buildbot/status/words.py (IrcStatusBot.convertTime): utility
5046         method to express ETA time like "2m45s" instead of "165 seconds"
5048 2004-11-24  Brian Warner  <warner@lothar.com>
5050         * buildbot/test/test_vc.py (VC.testArch): unregister the test
5051         archive after the test completes, to avoid cluttering the user's
5052         'tla archives' listing with a bogus entry. Arch doesn't happen to
5053         provide any way to override the use of ~/.arch-params/, so there
5054         isn't a convenient way to avoid touching the setup of the user who
5055         runs the test.
5056         (VC_HTTP.testArchHTTP): same
5058 2004-11-23  Brian Warner  <warner@lothar.com>
5060         * buildbot/status/html.py (TextLog): split render() up into
5061         render_HEAD and render_GET. Use a Producer when sending log
5062         chunks, to reduce memory requirements and avoid sending huge
5063         non-Banana-able strings over web.distrib connections. Requires
5064         peeking under the covers of IStatusLog.
5065         (TextLog.resumeProducing): fix the "as text" link, handle client
5066         disconnects that occur while we're still sending old chunks.
5068         * buildbot/status/builder.py (HTMLLogFile.waitUntilFinished): oops,
5069         use defer.succeed, not the non-existent defer.success
5070         (LogFile.waitUntilFinished): same
5071         (LogFile.subscribe): don't add watchers to a finished logfile
5073         * buildbot/__init__.py (version): bump to 0.6.1+ while between
5074         releases
5076 2004-11-23  Brian Warner  <warner@lothar.com>
5078         * buildbot/__init__.py (version): Releasing buildbot-0.6.1
5080 2004-11-23  Brian Warner  <warner@lothar.com>
5082         * NEWS: update for the 0.6.1 release
5083         * MANIFEST.in: add new files
5085         * README (INSTALLATION): explain how to enable the extra VC tests
5087         * buildbot/status/builder.py (LogFile): add .runEntries at the class
5088         level to, so old pickled builds can be displayed ok
5090 2004-11-22  Brian Warner  <warner@lothar.com>
5092         * NEWS: summarize updates since last release
5094         * README (SLAVE): fix usage of 'buildbot slave' command. Thanks to
5095         Yoz Grahame. Closes SF#1050138.
5097         * docs/changes.xhtml (FreshCVSSourceNewcred): fix typo. Closes
5098         SF#1042563.
5100         * buildbot/process/step_twisted.py (Trial): update docs a bit
5102         * docs/factories.xhtml: fix Trial factory docs to match reality.
5103         Closes: SF#1049758.
5105         * buildbot/process/factory.py (Trial.__init__): add args for
5106         randomly= and recurse=, making them available to instantiators
5107         instead of only to subclassers. Closes: SF#1049759.
5109 2004-11-15  Brian Warner  <warner@lothar.com>
5111         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
5112         try to teach the Quick factory to use multiple versions of python
5114 2004-11-12  Brian Warner  <warner@lothar.com>
5116         * buildbot/status/builder.py (BuilderStatus.saveYourself): use a
5117         safer w32-compatible approach, and only use it on windows
5118         (BuildStatus.saveYourself): same
5120 2004-11-11  Brian Warner  <warner@lothar.com>
5122         * buildbot/status/builder.py (LogFile.addEntry): smarter way to do
5123         it: one string merge per chunk. There are now separate .entries
5124         and .runEntries lists: when enumerating over all chunks, make sure
5125         to look at both.
5126         * buildbot/test/test_status.py (Log): more tests
5128         * buildbot/status/builder.py (LogFile.addEntry): Merge string
5129         chunks together, up to 10kb per chunk. This ought to cut down on
5130         the CPU-burning overhead of large log files. Thanks to Alexander
5131         Staubo for spotting the problem.
5132         * buildbot/test/test_status.py (Log): tests for same
5134 2004-11-10  Brian Warner  <warner@lothar.com>
5136         * buildbot/status/mail.py (MailNotifier.buildMessage): add a Date
5137         header to outbound mail
5138         * buildbot/test/test_status.py (Mail.testBuild1): test for same
5140 2004-11-08  Brian Warner  <warner@lothar.com>
5142         * buildbot/status/builder.py (BuilderStatus.saveYourself): w32
5143         can't do os.rename() onto an existing file, so catch the exception
5144         and unlink the target file first. This introduces a slight window
5145         where the existing file could be lost, but the main failure case
5146         (disk full) should still be handled safely.
5147         (BuildStatus.saveYourself): same
5149         * buildbot/changes/pb.py (ChangePerspective): use a configurable
5150         separator character instead of os.sep, because the filenames being
5151         split here are coming from the VC system, which can have a
5152         different pathname convention than the local host. This should
5153         help a buildmaster running on windows that uses a CVS repository
5154         which runs under unix.
5155         * buildbot/changes/mail.py (MaildirSource): same, for all parsers
5157         * buildbot/process/step_twisted.py (Trial.createSummary): survive
5158         when there are no test failures to be parsed
5160         * buildbot/scripts/runner.py (createMaster): use shutil.copy()
5161         instead of the unix-specific os.system("cp"), thanks to Elliot
5162         Murphy for this and the other buildbot-vs-windows catches.
5163         * buildbot/test/test_maildir.py (MaildirTest.deliverMail): same
5165         * contrib/windows/buildbot.bat: prefix a '@', apparently to not
5166         echo the command as it is run
5168         * setup.py: install sample.mk too, not just sample.cfg
5169         (scripts): install contrib/windows/buildbot.bat on windows
5171 2004-11-07  Brian Warner  <warner@lothar.com>
5173         * buildbot/process/builder.py (Builder._detached): clear the
5174         self.currentBuild reference, otherwise the next build will be
5175         skipped because we think the Builder is already in use.
5177         * docs/examples/twisted_master.cfg: update to match current usage
5178         on the Twisted buildbot
5180 2004-10-29  Brian Warner  <warner@lothar.com>
5182         * buildbot/status/mail.py (MailNotifier): fix typo in docs
5184 2004-10-28  Brian Warner  <warner@lothar.com>
5186         * buildbot/slave/commands.py (SourceBase): refactor subclasses to
5187         have separate doVCUpdate/doVCFull methods. Catch an update failure
5188         and respond by clobbering the source directory and re-trying. This
5189         will handle local changes (like replacing a file with a directory)
5190         that will cause CVS and SVN updates to fail.
5191         * buildbot/test/test_vc.py (SetupMixin.do_vc): test the same
5193         * buildbot/process/step.py (LoggedRemoteCommand.__repr__): avoid a
5194         python-2.4 warning
5196 2004-10-19  Brian Warner  <warner@lothar.com>
5198         * buildbot/process/step_twisted.py (Trial.createSummary): bugfixes
5200         * buildbot/status/html.py (StatusResourceTestResults): display any
5201         TestResults that the Build might have
5202         (StatusResourceTestResult): and the logs for each TestResult
5203         (StatusResourceBuild): add link from the per-build page
5205 2004-10-15  Brian Warner  <warner@lothar.com>
5207         * buildbot/process/step_twisted.py (Trial.createSummary): parse
5208         the 'problems' portion of stdout, add TestResults to our build
5209         * buildbot/test/test_twisted.py (Parse.testParse): test it
5211         * buildbot/interfaces.py (IBuildStatus.getTestResults): new method
5212         to retrieve a dict of accumulated test results
5213         (ITestResult): define what a single test result can do
5214         * buildbot/status/builder.py (TestResult): implement ITestResult
5215         (BuildStatus.getTestResults): retrieve dict of TestResults
5216         (BuildStatus.addTestResult): add TestResults
5217         * buildbot/test/test_status.py (Results.testAddResults): test it
5219 2004-10-14  Brian Warner  <warner@lothar.com>
5221         * buildbot/test/test_maildir.py (MaildirTest): use shutil.rmtree
5222         instead of os.system("rm -rf") for win32 portability
5224         * buildbot/test/test_slavecommand.py (SlaveCommandTestCase): use
5225         SignalMixin instead of starting/stopping the reactor, which is
5226         likely to cause problems with other tests
5228         * buildbot/slave/commands.py (SourceBase.doCopy): remove leftover
5229         self.copyComplete() call. Yoz Grahame makes the catch.
5231         * contrib/windows/buildbot.bat: helper script to deal with path
5232         issues. Thanks to Yoz Grahame.
5234         * buildbot/master.py (BuildMaster.startService): don't register a
5235         SIGHUP handler if the signal module has no SIGHUP attribute.
5236         Apparently win32 does this.
5238         * buildbot/scripts/runner.py (start): add --reactor=win32 on win32
5240         * buildbot/test/test_web.py (WebTest.test_webPathname): skip the
5241         test if the reactor can't offer UNIX sockets
5243         * buildbot/status/html.py (StatusResourceBuild.body): fix syntax
5244         error introduced in the last commit. We really need that
5245         metabuildbot :).
5247 2004-10-12  Brian Warner  <warner@lothar.com>
5249         * buildbot/changes/mail.py (MaildirSource.describe): fix exception
5250         when describing a maildir source. Thanks to Stephen Davis.
5252         * buildbot/status/words.py (IrcStatusBot.command_WATCH): round off
5253         ETA seconds
5255         * buildbot/scripts/runner.py (createMaster): install Makefile too
5256         (start): add --no_save to 'start' command
5257         * buildbot/scripts/sample.mk: simple convenience Makefile with 
5258         start/stop/reload targets
5260         * buildbot/__init__.py (version): bump to 0.6.0+ while between
5261         releases
5263 2004-09-30  Brian Warner  <warner@lothar.com>
5265         * setup.py: Releasing buildbot-0.6.0
5267 2004-09-30  Brian Warner  <warner@lothar.com>
5269         * MANIFEST.in: add debian/*, sample.cfg, more docs files. Remove
5270         test_trial.py from the source tarball until support is complete.
5272         * NEWS: update for 0.6.0 release
5273         * buildbot/__init__.py (version): same
5274         * README: same
5276         * buildbot/status/words.py (IrcStatusBot.command_SOURCE): add
5277         'source' command to tell users where to get the Buildbot source
5279         * docs/examples/*.cfg: update to modern standards
5281         * NEWS: update for release
5283         * buildbot/scripts/runner.py (createMaster): remove the
5284         -shutdown.tap stuff now that it isn't necessary
5285         (createSlave): same
5286         (start): launch buildbot.tap, not buildbot-shutdown.tap
5289         * buildbot/status/mail.py (Domain): shorten class name
5290         (MailNotifier): if lookup= is a string, pass it to Domain()
5291         * buildbot/test/test_status.py (Mail.testBuild1): new class name
5292         (Mail.testBuild2): test the string-to-Domain shortcut
5293         (Mail.testMail): fix test
5296         * buildbot/scripts/sample.cfg: improve the build-the-buildbot
5297         example config file
5299         * buildbot/status/builder.py (BuildStatus.__setstate__): re-set
5300         more attributes on load
5301         (BuilderStatus.stubBuildCacheSize): bump to 30, this was too low
5302         to accomodate the whole waterfall page at once, and the thrashing
5303         results in a lot of unnecessary loads
5304         (BuildStatus.saveYourself): use binary pickles, not fluffy text
5305         (BuilderStatus.saveYourself): same
5306         (BuilderStatus.eventGenerator): stop generating on the first missing
5307         build. We assume that saved builds are deleted oldest-first.
5308         (BuildStepStatus.__getstate__): .progress might not exist
5310         * buildbot/changes/changes.py (ChangeMaster): make it
5311         serializable, in $masterdir/changes.pck
5312         (ChangeMaster.stopService): save on shutdown
5313         * buildbot/master.py (BuildMaster.loadChanges): load at startup
5314         * buildbot/test/test_config.py: load Changes before config file
5317         * buildbot/slave/commands.py (ShellCommand.doTimeout): put the
5318         "Oh my god, you killed the command" header on a separate line
5320         * buildbot/status/builder.py (BuilderStatus.getStubBuildByNumber):
5321         skip over corrupted build pickles
5322         (BuilderStatus.getFullBuildByNumber): same
5323         (BuilderStatus.eventGenerator): skip over unavailable builds
5324         (BuildStatus.saveYourself): save builds to a .tmp file first, then
5325         do an atomic rename. This prevents a corrupted pickle when some
5326         internal serialization error occurs.
5327         (BuilderStatus.saveYourself): same
5329         * buildbot/slave/commands.py (SlaveShellCommand): oops, restore
5330         the timeout for shell commands, it got lost somehow
5332         * buildbot/status/builder.py (BuilderStatus.eventGenerator): if we
5333         run out of build steps, return the rest of the builder events
5335         * buildbot/interfaces.py (IBuilderControl.ping): add method
5337         * buildbot/process/builder.py (BuilderControl.ping): move
5338         slave-ping to BuilderControl, and fix the failure case in the
5339         process (Event.finish() is the verb, Event.finished is the noun).
5341         * buildbot/status/html.py (StatusResourceBuilder.ping): ping
5342         through the BuilderControl instead of the BuilderStatus
5343         (EventBox): add adapter for builder.Event, allowing builder events to
5344         be displayed in the waterfall display
5346         * buildbot/master.py (BotMaster.stopService): add a 'master
5347         shutdown' event to the builder's log
5348         (BuildMaster.startService): and a 'master started' on startup
5350         * buildbot/status/builder.py (BuilderStatus.eventGenerator): merge
5351         builder events into the BuildStep event stream
5352         (Status.builderAdded): add a 'builder created' event
5355         * buildbot/status/words.py (IrcStatusBot.command_WATCH): new
5356         command to announce the completion of a running build
5357         (IrcStatusBot.command_FORCE): announce when the build finishes
5359         * buildbot/status/builder.py (BuilderStatus.addFullBuildToCache):
5360         don't evict unfinished builds from the cache: they must stay in
5361         the full-cache until their logfiles have stopped changing. Make
5362         sure the eviction loop terminates if an unfinished build was hit.
5363         (HTMLLogFile.getTextWithHeaders): return HTML as if it were text.
5364         This lets exceptions be dumped in an email status message. Really
5365         we need LogFiles which contain both text and HTML, instead of two
5366         separate classes.
5367         (BuildStatus.__getstate__): handle self.finished=False
5368         (Status.builderAdded): if the pickle is corrupted, abandon the
5369         history and create a new BuilderStatus object.
5371         * buildbot/process/base.py (Build.stopBuild): tolerate lack of a
5372         self.progress attribute, helped one test which doesn't fully set
5373         up the Build object.
5375         * buildbot/interfaces.py (IStatusLogStub): split out some of the
5376         IStatusLog methods into an Interface that is implemented by "stub"
5377         logs, for which all the actual text chunks are on disk (in the
5378         pickled Build instance). To show the log contents, you must first
5379         adapt the stub log to a full IStatusLog object.
5381         * buildbot/status/builder.py (LogFileStub): create separate stub
5382         log objects, which can be upgraded to a real one if necessary.
5383         (LogFile): make them persistable, and let them stubify themselves
5384         (HTMLLogFile): same
5385         (BuildStepStatus): same
5386         (BuildStatus): same
5387         (BuildStatus.saveYourself): save the whole build out to disk
5388         (BuilderStatus): make it persistable
5389         (BuilderStatus.saveYourself): save the builder to disk
5390         (BuilderStatus.addFullBuildToCache): implement two caches which
5391         hold Build objects: a small one which holds full Builds, and a
5392         larger one which holds "stubbed" Builds (ones with their LogFiles
5393         turned into LogFileStubs). This reduces memory usage by the
5394         buildmaster by not keeping more than a few (default is 2) whole
5395         build logs in RAM all the time.
5396         (BuilderStatus.getBuild): rewrite to pull from disk (through the
5397         cache)
5398         (BuilderStatus.eventGenerator): rewrite since .builds went away
5399         (BuilderStatus.buildStarted): remove the .builds array. Add the
5400         build to the "full" cache when it starts.
5401         (BuilderStatus._buildFinished): save the build to disk when it
5402         finishes
5403         (Status): give it a basedir (same as the BuildMaster's basedir)
5404         where the builder pickles can be saved
5405         (Status.builderAdded): create the BuilderStatus ourselves, by
5406         loading a pickle from disk (or creating a new instance if there
5407         was none on disk). Return the BuilderStatus so the master can glue
5408         it into the new Builder object.
5410         * buildbot/master.py (BotMaster.stopService): on shutdown, tell
5411         all BuilderStatuses to save themselves out to disk. This is in
5412         lieu of saving anything important in the main Application pickle
5413          (the -shutdown.tap file).
5414         (BuildMaster.__init__): give Status() a basedir for its files
5415         (BuildMaster.loadConfig_Builders): do status.builderAdded first,
5416         to get the BuilderStatus, then give it to the Builder (instead of
5417         doing it the other way around). It's ok if the status announces
5418         the new Builder before it's really ready, as the outside world can
5419         only see the BuilderStatus object anyway (and it is ready before
5420         builderAdded returns). Use the builder's "builddir" (which
5421         normally specifies where the slave will run the builder) as the
5422         master's basedir (for saving serialized builds).
5424         * buildbot/status/html.py (StatusResourceBuildStep.getChild):
5425         coerce the logfile to IStatusLog before trying to get the text
5426         chunks out of it. This will pull the full (non-stubified) Build in
5427         from disk if necessary.
5428         (TextLog): fix the adapter registration
5430         * buildbot/test/test_control.py (Force.setUp): create the basedir
5431         * buildbot/test/test_web.py: same
5432         * buildbot/test/test_vc.py (SetupMixin.setUp): same
5433         * buildbot/test/test_status.py (Mail.makeBuild): match new setup
5434         * buildbot/test/test_run.py (Run.testMaster): same
5435         (Status.setUp): same
5437 2004-09-29  Fred L. Drake, Jr.  <fdrake@acm.org>
5439         * buildbot/status/html.py (Waterfall.__init__): store actual
5440         allowForce flag passed in rather than using True for everyone;
5441         make sure setting it to False doesn't cause a NameError
5442         (Waterfall.setup).
5443         (StatusResourceBuilder.__init__) add the builder name to the page
5444         title.
5445         (StatusResourceBuilder.body) move HTML generation for a name/value
5446         row into a helper method (StatusResourceBuilder.make_row); only
5447         generate the "Force Build" form if allowForce was True and the
5448         slave is connected.  Use class attributes in the generated HTML to
5449         spread a little CSS-joy.
5451 2004-09-28  Brian Warner  <warner@lothar.com>
5453         * buildbot/process/step_twisted.py (Trial.createSummary): fix
5454         warning-scanner to not ignore things like
5455         'ComponentsDeprecationWarning' and 'exceptions.RuntimeWarning'
5457         * buildbot/status/html.py (StatusResource.control): add some
5458         class-level values for .control in an attempt to make upgrading
5459         smoother
5461         * buildbot/util.py (ComparableMixin): survive missing attributes,
5462         such as when a class is modified and we're comparing old instances
5463         against new ones
5465         * buildbot/status/words.py (IrcStatusBot.privmsg): clean up
5466         failure handling, remove a redundant try/except block. Don't
5467         return the full traceback to the IRC channel.
5468         (IrcStatusBot.command_FORCE): catch new exceptions, return useful
5469         error messages. Get ETA properly.
5471         * buildbot/status/html.py (StatusResourceBuild.body): html.escape
5472         the reason, since (at least) IRC message will have <> in them.
5473         (StatusResourceBuilder.__init__): take an IBuilderControl
5474         (StatusResourceBuilder.force): use the IBuilderControl we get in
5475         the constructor instead of trying to make our own. Catch the
5476         new exceptions and ignore them for now (until we make an
5477         intermediate web page where we could show the error message)
5478         (StatusResource): create with an IControl, use it to give an
5479         IBuilderControl to all children
5480         (Waterfall): take an allowForce= option, pass an IControl object
5481         to StatusResource if it is True
5483         * buildbot/test/test_web.py (ConfiguredMaster): handle IControl
5485         * buildbot/master.py (BotPerspective.perspective_forceBuild):
5486         catch new exceptions and return string forms
5488         * buildbot/interfaces.py: add NoSlaveError, BuilderInUseError
5489         * buildbot/process/builder.py (Builder.forceBuild): raise them
5490         * buildbot/test/test_control.py (Force.testNoSlave): new test
5491         (Force.testBuilderInUse): same
5494         * buildbot/status/words.py (IrcStatusBot): enable build-forcing
5496         * buildbot/test/test_run.py: use IControl
5497         * buildbot/test/test_vc.py: same
5499         * buildbot/status/html.py (StatusResourceBuilder.force): rewrite
5500         to use IControl. Still offline.
5501         * buildbot/status/words.py (IrcStatusBot.command_FORCE): same
5503         * buildbot/process/builder.py (Builder.doPeriodicBuild): set
5504         who=None so periodic builds don't send out status mail
5505         (Builder.forceBuild): include reason in the log message
5506         (BuilderControl.forceBuild): rename 'name' to 'who'
5508         * buildbot/master.py (BotPerspective.perspective_forceBuild): add
5509         'who' parameter, but make it None by default so builds forced by
5510         slave admins don't cause status mail to be sent to anybody
5511         (BotMaster.forceBuild): same. this method is deprecated.
5512         (DebugPerspective.perspective_forceBuild): same, use IControl.
5513         (DebugPerspective.perspective_fakeChange): use IControl..
5514         (Dispatcher.requestAvatar): .. so don't set .changemaster
5516         * buildbot/interfaces.py (IBuilderControl.forceBuild): rename 'who'
5517         parameter to avoid confusion with the name of the builder
5520         * buildbot/status/mail.py: refine comment about needing 2.3
5522         * buildbot/status/html.py: move all imports to the top
5524         * buildbot/test/test_control.py: test new interfaces
5525         * buildbot/test/test_run.py (Status): handle new interfaces
5526         * buildbot/test/test_vc.py (SetupMixin.doBuild): same
5528         * buildbot/process/base.py (BuildControl): implement IBuildControl
5529         and its lonely getStatus() method
5531         * buildbot/process/builder.py (BuilderControl): implement
5532         IBuilderControl, obtained by adapting the Builder instance
5533         (Builder.startBuild): return a BuilderControl instead of a
5534         Deferred. The caller can use bc.getStatus().waitUntilFinished() to
5535         accomplish the same thing.
5537         * buildbot/master.py: move all import statements to the top
5538         (Control): implement IControl, obtained by adapting the
5539         BuildMaster instance.
5541         * buildbot/interfaces.py: add IControl, IBuilderControl, and
5542         IBuildControl. These are used to force builds. Eventually they
5543         will provide ways to reconfigure the Builders, pause or abandon a
5544         Build, and perhaps control the BuildMaster itself.
5546 2004-09-26  Brian Warner  <warner@lothar.com>
5548         * buildbot/util.py (ComparableMixin): survive twisted>1.3.0 which
5549         ends up comparing us against something without a .__class__
5551 2004-09-24  Brian Warner  <warner@lothar.com>
5553         * buildbot/scripts/runner.py: rearrange option parsing a lot, to get
5554         usage text right.
5556         * Makefile: add 'deb-snapshot' target, to create a timestamped
5557         .deb package
5559         * debian/rules (binary-indep): skip CVS/ files in dh_installexamples
5561 2004-09-23  Brian Warner  <warner@lothar.com>
5563         * buildbot/__init__.py (version): move version string here
5564         * setup.py: get version string from buildbot.version
5565         * buildbot/status/html.py (WaterfallStatusResource.body): add
5566         buildbot version to the page footer
5567         * buildbot/status/words.py (IrcStatusBot.command_VERSION): provide
5568         version when asked
5570         * buildbot/master.py (BotMaster.getPerspective): detect duplicate
5571         slaves, let the second know where the first one is coming from
5572         (BuildMaster.__init__): turn on .unsafeTracebacks so the slave can
5573         see our exceptions. It would be nice if there were a way to just
5574         send them the exception type and value, not the full traceback.
5577         * buildbot/status/mail.py (MailNotifier): add a new argument
5578         sendToInterestedUsers=, which can be set to False to disable the
5579         usual send-to-blamelist behavior.
5580         (top): handle python-2.2 which has no email.MIMEMultipart
5581         (MailNotifier.buildMessage): don't send logs without MIMEMultipart
5582         (MailNotifier.disownServiceParent): unsubscribe on removal
5584         * buildbot/test/test_status.py (Mail.testBuild2): test it
5587         * buildbot/status/progress.py (Expectations.wavg): tolerate
5588         current=None, which happens when steps start failing badly
5589         * buildbot/test/test_status.py (Progress.testWavg): test for it
5591         * buildbot/process/step.py (SVN.startVC): when the (old) slave
5592         doesn't understand args['revision'], emit a warning instead of
5593         bailing completely. Updating to -rHEAD is probably close enough.
5595         * buildbot/process/step_twisted.py (Trial.start): fix sanity-check
5597         * buildbot/test/test_status.py: at least import bb.status.client
5598         even if we don't have any test coverage for it yet
5600         * contrib/svn_buildbot.py: don't require python2.3
5601         (main): wait, do require it (for sets.py), but explain how to
5602         make it work under python2.2
5604 2004-09-23  Brian Warner  <warner@lothar.com>
5606         * contrib/svn_buildbot.py: include the revision number in the Change
5608         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): use when=,
5609         using util.now() because FreshCVS is a realtime service
5611         * buildbot/status/event.py: delete dead code
5612         * buildbot/process/step.py: don't import dead Event class
5613         * buildbot/process/step_twisted.py: same
5614         * buildbot/status/builder.py: same
5615         * buildbot/status/client.py: same
5617         * buildbot/test/test_process.py: kill buggy out-of-date disabled test
5619         * buildbot/changes/changes.py (Change): set .when from an __init__
5620         argument (which defaults to now()), rather than having
5621         ChangeMaster.addChange set it later.
5622         (ChangeMaster.addChange): same
5624         * buildbot/changes/mail.py (parseFreshCVSMail): pass in when=
5625         (parseSyncmail): same. Just use util.now() for now.
5626         (parseBonsaiMail): parse the timestamp field for when=
5628         * buildbot/test/test_vc.py (SourceStamp.addChange): page in when=
5629         instead of setting .when after the fact
5631 2004-09-22  slyphon
5633         * buildbot/slave/trial.py: new SlaveCommand to machine-parse test
5634         results when the target project uses retrial. Still under
5635         development.
5636         * buildbot/test/test_trial.py: same
5638 2004-09-21  Brian Warner  <warner@lothar.com>
5640         * buildbot/status/mail.py (MailNotifier.__init__): include
5641         success/warnings/failure in the Subject line
5642         (MailNotifier.buildMessage): add the buildbot's URL to the body,
5643         use step.logname for the addLogs=True attachment filenames
5644         * buildbot/test/test_status.py (Mail): test Subject lines
5645         (Mail.testLogs): test attachment filenames
5647         * buildbot/master.py (DebugPerspective.perspective_fakeChange):
5648         accept a 'who' argument from the debug tool
5649         * contrib/debugclient.py (DebugWidget.do_commit): send 'who'
5650         * contrib/debug.glade: add text box to set 'who'
5652         * buildbot/interfaces.py (IBuildStatus.getBuilder): replace
5653         .getBuilderName with .getBuilder().getName(), more flexible
5654         (IStatusLog.getName): logs have short names, but you can prefix
5655         them with log.getStep().getName() to make them more useful
5656         * buildbot/status/builder.py: same
5657         * buildbot/status/client.py: same
5658         * buildbot/status/html.py: same
5659         * buildbot/test/test_run.py (Status.testSlave): same
5660         * buildbot/process/step.py: tweak logfile names
5662         * buildbot/status/mail.py (MailNotifier): add lookup, change
5663         argument to extraRecipients. The notifier is now aimed at sending
5664         mail to the people involved in a particular build, with additional
5665         constant recipients as a secondary function.
5667         * buildbot/test/test_status.py: add coverage for IEmailLookup,
5668         including slow-lookup and failing-lookup. Make sure the blamelist
5669         members are included.
5671         * buildbot/interfaces.py: new interfaces IEmailSender+IEmailLookup
5672         (IBuildStatus.getResponsibleUsers): rename from getBlamelist
5673         (IBuildStatus.getInterestedUsers): new method
5674         * buildbot/status/builder.py (BuildStatus.getResponsibleUsers): same
5675         * buildbot/status/client.py (remote_getResponsibleUsers): same
5676         * buildbot/status/html.py (StatusResourceBuild.body): same
5677         * buildbot/test/test_run.py (Status.testSlave): same
5679 2004-09-20  Brian Warner  <warner@lothar.com>
5681         * docs/users.xhtml: update concepts
5683         * Makefile: add a convenience makefile, for things like 'make
5684         test'. It is not included in the source tarball.
5686 2004-09-16  Brian Warner  <warner@lothar.com>
5688         * NEWS: mention /usr/bin/buildbot, debian/*
5690         * debian/*: add preliminary debian packaging. Many thanks to
5691         Kirill Lapshin (and Kevin Turner) for the hard work. I've mangled
5692         it considerably since it left their hands, I am responsible for
5693         all breakage that's resulted.
5695         * bin/buildbot: create a top-level 'buildbot' command, to be
5696         installed in /usr/bin/buildbot . For now it's just a simple
5697         frontend to mktap/twistd/kill, but eventually it will be the entry
5698         point to the 'try' command and also a status client. It is also
5699         intended to support the upcoming debian-packaging init.d scripts.
5700         * buildbot/scripts/runner.py: the real work is done here
5701         * buildbot/scripts/__init__.py: need this too
5702         * buildbot/scripts/sample.cfg: this is installed in new
5703         buildmaster directories
5704         * setup.py: install new stuff
5706 2004-09-15  Brian Warner  <warner@lothar.com>
5708         * buildbot/test/test_vc.py: skip SVN tests if svn can't handle the
5709         'file:' schema (the version shipped with OS-X was built without the
5710         ra_local plugin).
5711         (SetupMixin.tearDown): stop the goofy twisted.web timer which
5712         updates the log-timestamp, to make sure it isn't still running after
5713         the test finishes
5715         * docs/config.xhtml: Add projectName, projectURL, buildbotURL
5716         values to the config file.
5717         * docs/examples/hello.cfg: add examples
5718         * buildbot/interfaces.py (IStatus.getBuildbotURL): define accessors
5719         * buildbot/status/builder.py (Status.getProjectURL): implement them
5720         * buildbot/master.py (BuildMaster.loadConfig): set them from config
5721         * buildbot/test/test_config.py (ConfigTest.testSimple): test them
5722         * buildbot/status/html.py (WaterfallStatusResource): display them
5725         * buildbot/test/test_vc.py (FakeBuilder.name): add attribute so
5726         certain error cases don't suffer a secondary exception.
5727         (top): Skip tests if the corresponding VC tool is not installed.
5729         * buildbot/process/factory.py (Trial): introduce separate
5730         'buildpython' and 'trialpython' lists, since trialpython=[] is
5731         what you want to invoke /usr/bin/python, whereas ./setup.py is
5732         less likely to be executable. Add env= parameter to pass options
5733         to test cases (which is how I usually write tests, I don't know if
5734         anyone else does it this way).
5736         * buildbot/process/step_twisted.py (Trial): handle python=None.
5737         Require 'testpath' be a string, not a list. Fix tests= typo.
5738         (Trial.start): sanity-check any PYTHONPATH value for stringness.
5740         * buildbot/process/step.py (RemoteCommand._remoteFailed): goofy
5741         way to deal with the possibility of removing the disconnect notify
5742         twice.
5743         (CVS): add a 'login' parameter to give a password to 'cvs login',
5744         commonly used with pserver methods (where pw="" or pw="guest")
5746         * buildbot/slave/commands.py (SourceBase): move common args
5747         extraction and setup() to __init__, so everything is ready by the
5748         time setup() is called
5749         (CVS.start): call 'cvs login' if a password was supplied
5750         (ShellCommand): special-case PYTHONPATH: prepend the master's
5751         value to any existing slave-local value.
5753         * buildbot/process/builder.py (Builder.updateBigStatus): if we
5754         don't have a remote, mark the builder as Offline. This whole
5755         function should probably go away and be replaced by individual
5756         deltas.
5757         (Builder.buildFinished): return the results to the build-finished
5758         deferred callback, helps with testing
5760 2004-09-14  Brian Warner  <warner@lothar.com>
5762         * buildbot/test/test_vc.py: put all the repositories needed to run
5763         the complete tests into a single small (1.3MB) tarball, so I can
5764         make that tarball available on the buildbot web site. Test HTTP
5765         access (for Arch and Darcs) by spawning a temporary web server
5766         while the test runs.
5768         * docs/users.xhtml: new document, describe Buildbot's limited
5769         understanding of different human users
5771         * buildbot/test/test_vc.py: rearrange test cases a bit
5773         * buildbot/process/step_twisted.py (Trial): handle testpath=
5774         * buildbot/process/factory.py (Trial): update to use step.Trial
5776         * buildbot/slave/commands.py (ShellCommandPP): fix fatal typo
5778         * buildbot/status/builder.py (BuildStatus.getText): add text2 to
5779         the overall build text (which gives you 'failed 2 tests' rather
5780         than just 'failed')
5781         (BuildStepStatus.text2): default to [], not None
5783         * buildbot/process/step_twisted.py (Trial.commandComplete): text2
5784         must be a list
5786 2004-09-12  Brian Warner  <warner@lothar.com>
5788         * buildbot/master.py (BotPerspective._commandsUnavailable): don't
5789         log the whole exception if it's just an AttributeError (old slave)
5791         * buildbot/process/step.py (ShellCommand.__init__): stash .workdir
5792         so (e.g.) sub-commands can be run in the right directory.
5793         (ShellCommand.start): accept an optional errorMessage= argument
5794         to make life easier for SVN.start
5795         (SVN.startVC): put the "can't do mode=export" warning in the LogFile
5796         headers
5797         (ShellCommand.start): move ['dir'] compatibility hack..
5798         (RemoteShellCommand.start): .. to here so everyone can use it
5800         * buildbot/process/step_twisted.py (Trial): use .workdir
5802         * buildbot/process/step_twisted.py (BuildDebs.getText): fix the
5803         text displayed when debuild fails completely
5804         (Trial): snarf _trial_temp/test.log from the slave and display it
5806 2004-09-11  Brian Warner  <warner@lothar.com>
5808         * buildbot/process/step_twisted.py (ProcessDocs.getText): typo
5810         * buildbot/process/process_twisted.py (TwistedTrial.tests): oops,
5811         set to 'twisted', so --recurse can find twisted/web/test/*, etc
5813         * buildbot/process/step.py (ShellCommand): call .createSummary
5814         before .evaluateCommand instead of the other way around. This
5815         makes it slightly easier to count warnings and then use that to
5816         set results=WARNINGS
5817         * buildbot/process/step_twisted.py: cosmetic, swap the methods
5819         * buildbot/process/base.py (Build.buildFinished): update status
5820         before doing progress. It's embarrassing for the build to be stuck
5821         in the "building" state when an exceptions occurs elsewhere..
5823         * buildbot/status/progress.py (Expectations.expectedBuildTime):
5824         python2.2 doesn't have 'sum'
5826         * buildbot/status/builder.py (Status.getBuilderNames): return a copy,
5827         to prevent clients from accidentally sorting it
5829         * buildbot/master.py (Manhole): add username/password
5830         (BuildMaster.loadConfig): use c['manhole']=Manhole() rather than
5831         c['manholePort'], deprecate old usage
5832         * docs/config.xhtml: document c['manhole']
5833         * docs/examples/hello.cfg: show example of using a Manhole
5836         * buildbot/test/test_steps.py (FakeBuilder.getSlaveCommandVersion):
5837         pretend the slave is up to date
5839         * buildbot/status/builder.py (BuildStepStatus.stepFinished): 'log',
5840         the module, overlaps with 'log', the local variable
5842         * buildbot/status/html.py: oops, 2.2 needs __future__ for generators
5844         * buildbot/process/builder.py (Builder.getSlaveCommandVersion):
5845         new method to let Steps find out the version of their
5846         corresponding SlaveCommand.
5847         * buildbot/process/step.py (BuildStep.slaveVersion): utility method
5848         (ShellCommand.start): add 'dir' argument for <=0.5.0 slaves
5849         (CVS.startVC): backwards compatibility for <=0.5.0 slaves
5850         (SVN.startVC): same
5851         (Darcs.startVC): detect old slaves (missing the 'darcs' command)
5852         (Arch.startVC): same
5853         (P4Sync.startVC): same
5855         * buildbot/process/step.py (LoggedRemoteCommand.start): return the
5856         Deferred so we can catch errors in remote_startCommand
5857         (RemoteShellCommand.start): same
5859         * docs/examples/twisted_master.cfg: update sample config file
5861         * buildbot/slave/commands.py (ShellCommandPP): write to stdin
5862         after connectionMade() is called, not before. Close stdin at that
5863         point too.
5865         * buildbot/process/process_twisted.py: update to use Trial, clean
5866         up argument passing (move to argv arrays instead of string
5867         commands)
5869         * buildbot/process/step_twisted.py (Trial): new step to replace
5870         RunUnitTests, usable by any trial-using project (not just
5871         Twisted). Arguments have changed, see the docstring for details.
5873         * buildbot/process/base.py (Build.startBuild): this now returns a
5874         Deferred. Exceptions that occur during setupBuild are now
5875         caught better and lead to fewer build_status weirdnesses, like
5876         finishing a build that was never started.
5877         (Build.buildFinished): fire the Deferred instead of calling
5878         builder.buildFinished directly. The callback argument is this
5879         Build, everything else can be extracted from it, including the
5880         new build.results attribute.
5881         * buildbot/process/builder.py (Builder.startBuild): same
5882         (Builder.buildFinished): same, extract results from build
5884         * buildbot/process/step.py (ShellCommands): remove dead code
5886 2004-09-08  Brian Warner  <warner@lothar.com>
5888         * buildbot/test/test_vc.py (VC.doPatch): verify that a new build
5889         doesn't try to use the leftover patched workdir
5890         (SourceStamp): test source-stamp computation for CVS and SVN
5892         * buildbot/slave/commands.py (SourceBase.doPatch): mark the
5893         patched workdir ('touch .buildbot-patched') so we don't try to
5894         update it later
5895         (SourceBase.start): add ['revision'] for all Source steps
5896         (CVS): change args: use ['branch'] for -r, remove ['files']
5897         (CVS.buildVC): fix revision/branch stuff
5898         (SVN): add revision stuff
5900         * buildbot/process/step.py (BuildStep.__init__): reject unknown
5901         kwargs (except 'workdir') to avoid silent spelling errors
5902         (ShellCommand.__init__): same
5903         (Source): new base class for CVS/SVN/etc. Factor out everything
5904         common, add revision computation (perform the checkout with a -D
5905         DATE or -r REVISION that gets exactly the sources described by the
5906         last Change), overridable with step.alwaysUseLatest. Add patch
5907         handling (build.getSourceStamp can trigger the use of a base
5908         revision and a patch).
5909         (CVS, SVN, Darcs, Arch, P4Sync): refactor, remove leftover arguments
5910         * docs/steps.xhtml: update docs
5911         * docs/source.xhtml: mention .checkoutDelay
5912         * docs/examples/hello.cfg: show use of checkoutDelay, alwaysUseLatest
5914         * buildbot/process/base.py (Build.setSourceStamp): add a
5915         .sourceStamp attribute to each Build. If set, this indicates that
5916         the build should be done with something other than the most
5917         recent source tree. This will be used to implement "try" builds.
5918         (Build.allChanges): new support method
5919         (Build.lastChangeTime): remove, functionality moved to Source steps
5920         (Build.setupBuild): copy the Step args before adding ['workdir'],
5921         to avoid modifying the BuildFactory (and thus triggering spurious
5922         config changes)
5925         * buildbot/status/html.py: rename s/commits/changes/
5926         (StatusResourceChanges): same
5927         (CommitBox.getBox): same, update URL
5928         (WaterfallStatusResource): same
5929         (StatusResource.getChild): same
5931         * contrib/debugclient.py (DebugWidget.do_commit): send .revision
5932         * contrib/debug.glade: add optional 'revision' to the fakeChange
5934         * buildbot/changes/changes.py (html_tmpl): display .revision
5935         (ChangeMaster.addChange): note .revision in log
5936         * buildbot/changes/pb.py (ChangePerspective.perspective_addChange):
5937         accept a ['revision'] attribute
5939         * buildbot/process/factory.py (BuildFactory): use ComparableMixin
5941         * buildbot/master.py (BotMaster.getPerspective): update the
5942         .connected flag in SlaveStatus when it connects
5943         (BotMaster.detach): and when it disconnects
5944         (DebugPerspective.perspective_fakeChange): take a 'revision' attr
5945         (BuildMaster.loadConfig_Builders): walk old list correctly
5947         * buildbot/test/test_config.py: fix prefix= usage
5949 2004-09-06  Brian Warner  <warner@lothar.com>
5951         * NEWS: mention P4
5953         * buildbot/changes/p4poller.py (P4Source): New ChangeSource to
5954         poll a P4 depot looking for recent changes. Thanks to Dave
5955         Peticolas for the contribution. Probably needs some testing after
5956         I mangled it.
5958         * buildbot/process/step.py (P4Sync): simple P4 source-updater,
5959         requires manual client setup for each buildslave. Rather
5960         experimental. Thanks again to Dave Peticolas.
5961         * buildbot/slave/commands.py (P4Sync): slave-side source-updater
5963         * buildbot/changes/changes.py (Change): add a .revision attribute,
5964         which will eventually be used to generate source-stamp values.
5966         * buildbot/process/step.py (RemoteCommand.start): use
5967         notifyOnDisconnect to notice when we lose the slave, then treat it
5968         like an exception. This allows LogFiles to be closed and the build
5969         to be wrapped up normally. Be sure to remove the disconnect
5970         notification when the step completes so we don't accumulate a
5971         bazillion such notifications which will fire weeks later (when the
5972         slave finally disconnects normally). Fixes SF#915807, thanks to
5973         spiv (Andrew Bennetts) for the report.
5974         (LoggedRemoteCommand): move __init__ code to RemoteCommand, since it
5975         really isn't Logged- specific
5976         (LoggedRemoteCommand.remoteFailed): Add an extra newline to the
5977         header, since it's almost always going to be appended to an
5978         incomplete line
5979         * buildbot/test/test_steps.py (BuildStep.testShellCommand1):
5980         update test to handle use of notifyOnDisconnect
5982         * buildbot/status/builder.py (BuilderStatus.currentlyOffline):
5983         don't clear .ETA and .currentBuild when going offline, let the
5984         current build clean up after itself
5986         * buildbot/process/builder.py (Builder.detached): wait a moment
5987         before doing things like stopping the current build, because the
5988         current step will probably notice the disconnect and cleanup the
5989         build by itself
5990         * buildbot/test/test_run.py (Status.tearDown): update test to
5991         handle asynchronous build-detachment
5993         * buildbot/process/base.py (Build.stopBuild): minor shuffles
5995         * buildbot/status/html.py (WaterfallStatusResource.buildGrid):
5996         hush a debug message
5998 2004-09-05  Brian Warner  <warner@lothar.com>
6000         * buildbot/changes/maildir.py (Maildir.start): catch an IOError
6001         when the dnotify fcntl() fails and fall back to polling. Linux 2.2
6002         kernels do this: the fcntl module has the F_NOTIFY constant, but
6003         the kernel itself doesn't support the operation. Thanks to Olly
6004         Betts for spotting the problem.
6006         * buildbot/process/step.py (Darcs): new source-checkout command
6007         (Arch): new source-checkout command
6008         (todo_P4): fix constructor syntax, still just a placeholder
6009         * buildbot/test/test_vc.py (VC.testDarcs): test it
6010         (VC.testDarcsHTTP): same, via localhost HTTP
6011         (VC.testArch): same
6012         (VC.testArchHTTP): same
6013         * NEWS: mention new features
6015         * buildbot/slave/commands.py (ShellCommand): add .keepStdout,
6016         which tells the step to stash stdout text locally (in .stdout).
6017         Slave-side Commands can use this to make decisions based upon the
6018         output of the the ShellCommand (not just the exit code).
6019         (Darcs): New source-checkout command
6020         (Arch): New source-checkout command, uses .keepStdout in one place
6021         where it needs to discover the archive's default name.
6023         * docs/steps.xhtml: Document options taken by Darcs and Arch.
6024         * docs/source.xhtml: add brief descriptions of Darcs and Arch
6025         * docs/examples/hello.cfg: add examples of Darcs and Arch checkout
6027         * buildbot/process/step.py (ShellCommand.describe): add an
6028         alternate .descriptionDone attribute which provides descriptive
6029         text when the step is complete. .description can be ["compiling"],
6030         for use while the step is running, then .descriptionDone can be
6031         ["compile"], used alone when the step succeeds or with "failed" when
6032         it does not. Updated other steps to use the new text.
6033         * buildbot/process/step_twisted.py: same
6034         * buildbot/test/test_run.py: update tests to match
6036 2004-08-30  Brian Warner  <warner@lothar.com>
6038         * buildbot/process/step.py (ShellCommand.createSummary): fix docs
6039         (CVS.__init__): send 'patch' argument to slave
6040         (CVS.start): don't create the LoggedRemoteCommand until start(),
6041         so we can catch a .patch added after __init__
6042         (SVN.__init__): add 'patch' to SVN too
6043         (SVN.start): same
6045         * buildbot/slave/commands.py (ShellCommand): add a 'stdin'
6046         argument, to let commands push data into the process' stdin pipe.
6047         Move usePTY to a per-instance attribute, and clear it if 'stdin'
6048         is in use, since closing a PTY doesn't really affect the process
6049         in the right way (in particular, I couldn't run /usr/bin/patch
6050         under a pty).
6051         (SourceBase.doPatch): handle 'patch' argument
6053         * buildbot/test/test_vc.py (VC.doPatch): test 'patch' argument for
6054         both CVS and SVN
6056         * buildbot/slave/commands.py (cvs_ver): fix version-parsing goo
6057         * buildbot/slave/bot.py (Bot.remote_getCommands): send command
6058         versions to master
6059         * buildbot/master.py (BotPerspective.got_commands): get command
6060         versions from slave, give to each builder
6061         * buildbot/process/builder.py (Builder.attached): stash slave
6062         command versions in .remoteCommands
6064         * docs/steps.xhtml: bring docs in-line with reality
6066         * buildbot/process/step.py (CVS.__init__): more brutal
6067         compatibility code removal
6068         (SVN.__init__): same
6070         * buildbot/slave/commands.py (SlaveShellCommand): update docs
6071         (SlaveShellCommand.start): require ['workdir'] argument, remove
6072         the ['dir'] fallback (compatibility will come later)
6073         (SourceBase): update docs
6074         (SourceBase.start): remove ['directory'] fallback
6075         (CVS): update docs
6076         (SVN): update docs
6077         * buildbot/test/test_config.py (ConfigTest.testBuilders): update test
6078         * buildbot/test/test_steps.py (BuildStep.testShellCommand1): same
6079         * buildbot/test/test_slavecommand.py (SlaveCommandTestCase): same
6081         * buildbot/process/step.py (RemoteShellCommand.__init__): add
6082         want_stdout/want_stderr. remove old 'dir' keyword (to simplify the
6083         code.. I will figure out 0.5.0-compatibility hooks later)
6085 2004-08-30  Brian Warner  <warner@lothar.com>
6087         * buildbot/process/process_twisted.py: rewrite in terms of new
6088         BuildFactory base class. It got significantly shorter. Yay
6089         negative code days.
6091         * buildbot/process/step_twisted.py (HLint.start): fix to make it
6092         work with the new "self.build isn't nailed down until we call
6093         step.start()" scheme: specifically, __init__ is called before the
6094         build has decided on which Changes are going in, so we don't scan
6095         build.allFiles() for .xhtml files until start()
6096         (HLint.commandComplete): use getText(), not getStdout()
6097         (RunUnitTests.start): same: don't use .build until start()
6098         (RunUnitTests.describe): oops, don't report (None) when using
6099         the default reactor
6100         (RunUnitTests.commandComplete): use getText()
6101         (RunUnitTests.createSummary): same
6102         (BuildDebs.commandComplete): same
6104         * buildbot/process/step.py (RemoteShellCommand.__init__): don't
6105         set args['command'] until start(), since our BuildStep is allowed
6106         to change their mind up until that point
6107         (TreeSize.commandComplete): use getText(), not getStdout()
6109         * docs/examples/twisted_master.cfg: update to current standards
6111         * docs/factories.xhtml: update
6112         * buildbot/process/factory.py: implement all the common factories
6113         described in the docs. The Trial factory doesn't work yet, and
6114         I've probably broken all the process_twisted.py factories in the
6115         process. There are compatibility classes left in for things like
6116         the old BasicBuildFactory, but subclasses of them are unlikely to
6117         work.
6118         * docs/examples/glib_master.cfg: use new BuildFactories
6119         * docs/examples/hello.cfg: same
6121         * buildbot/test/test_config.py (ConfigTest.testBuilders): remove
6122         explicit 'workdir' args
6124         * buildbot/process/base.py (BuildFactory): move factories to ..
6125         * buildbot/process/factory.py (BuildFactory): .. here
6126         * buildbot/process/process_twisted.py: handle move
6127         * buildbot/test/test_config.py: same
6128         * buildbot/test/test_run.py: same
6129         * buildbot/test/test_steps.py: same
6130         * buildbot/test/test_vc.py: same
6131         * docs/factories.xhtml: same
6133         * NEWS: mention config changes that require updating master.cfg
6135         * buildbot/process/base.py (Build.setupBuild): add a 'workdir'
6136         argument to all steps that weren't given one already, pointing at
6137         the "build/" directory.
6139         * docs/examples/hello.cfg: remove explicit 'workdir' args
6141         * docs/factories.xhtml: document standard BuildFactory clases,
6142         including a bunch which are have not yet been written
6144 2004-08-29  Brian Warner  <warner@lothar.com>
6146         * buildbot/interfaces.py (IBuildStepStatus.getResults): move
6147         result constants (SUCCESS, WARNINGS, FAILURE, SKIPPED) to
6148         buildbot.status.builder so they aren't quite so internal
6149         * buildbot/process/base.py, buildbot/process/builder.py: same
6150         * buildbot/process/maxq.py, buildbot/process/step.py: same
6151         * buildbot/process/step_twisted.py, buildbot/status/builder.py: same
6152         * buildbot/status/mail.py, buildbot/test/test_run.py: same
6153         * buildbot/test/test_status.py, buildbot/test/test_vc.py: same
6155         * buildbot/status/html.py (StatusResourceBuildStep): oops, update
6156         to handle new getLogs()-returns-list behavior
6157         (StatusResourceBuildStep.getChild): same
6158         (StepBox.getBox): same
6159         (WaterfallStatusResource.phase0): same
6161         * docs/source.xhtml: document how Buildbot uses version-control
6162         systems (output side: how we get source trees)
6163         * docs/changes.xhtml: rename from sources.xhtml, documents VC
6164         systems (input side: how we learn about Changes)
6166         * buildbot/master.py (Manhole): use ComparableMixin
6167         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): same
6168         * buildbot/changes/mail.py (MaildirSource): same
6169         * buildbot/status/client.py (PBListener): same
6170         * buildbot/status/html.py (Waterfall): same
6171         * buildbot/status/words.py (IRC): same
6173         * NEWS: start describing new features
6175         * buildbot/status/mail.py (MailNotifier): finish implementation.
6176         The message body is still a bit sparse.
6177         * buildbot/test/test_status.py (Mail): test it
6179         * buildbot/util.py (ComparableMixin): class to provide the __cmp__
6180         and __hash__ methods I wind up adding everywhere. Specifically
6181         intended to support the buildbot config-file update scheme where
6182         we compare, say, the old list of IStatusTargets against the new
6183         one and don't touch something which shows up on both lists.
6184         * buildbot/test/test_util.py (Compare): test case for it
6186         * buildbot/interfaces.py (IBuildStatus): change .getLogs() to
6187         return a list instead of a dict
6188         (IBuildStepStatus.getLogs): same. The idea is that steps create
6189         logs with vaguely unique names (although their uniqueness is not
6190         guaranteed). Thus a compilation step should create its sole
6191         logfile with the name 'compile', and contribute it to the
6192         BuildStatus. If a step has two logfiles, try to create them with
6193         different names (like 'test.log' and 'test.summary'), and only
6194         contribute the important ones to the overall BuildStatus.
6195         * buildbot/status/builder.py (Event.getLogs): same
6196         (BuildStepStatus): fix default .text and .results
6197         (BuildStepStatus.addLog): switch to list-like .getLogs()
6198         (BuildStepStatus.stepFinished): same
6199         (BuildStatus.text): fix default .text
6200         (BuildStatus.getLogs): temporary hack to return all logs (from all
6201         child BuildStepStatus objects). Needs to be fixed to only report
6202         the significant ones (as contributed by the steps themselves)
6203         * buildbot/test/test_run.py: handle list-like .getLogs()
6204         * buildbot/test/test_steps.py (BuildStep.testShellCommand1): same
6206 2004-08-28  Brian Warner  <warner@lothar.com>
6208         * buildbot/process/builder.py (Builder.attached): serialize the
6209         attachment process, so the attach-watcher isn't called until the
6210         slave is really available. Add detached watchers too, which makes
6211         testing easier.
6213         * buildbot/test/test_vc.py: test VC modes (clobber/update/etc)
6215         * buildbot/test/test_swap.py: remove dead code
6217         * buildbot/slave/commands.py (ShellCommandPP): add debug messages
6218         (ShellCommand.start): treat errors in _startCommand/spawnProcess
6219         sort of as if the command being run exited with a -1. There may
6220         still be some holes in this scheme.
6221         (CVSCommand): add 'revision' tag to the VC commands, make sure the
6222         -r option appears before the module list
6223         * buildbot/process/step.py (CVS): add 'revision' argument
6225         * buildbot/slave/bot.py (SlaveBuilder._ackFailed): catch failures
6226         when sending updates or stepComplete messages to the master, since
6227         we don't currently care whether they arrive or not. When we revamp
6228         the master/slave protocol to really resume interrupted builds,
6229         this will need revisiting.
6230         (lostRemote): remove spurious print
6232         * buildbot/master.py (BotPerspective.attached): serialize the
6233         new-builder interrogation process, to make testing easier
6234         (BotMaster.waitUntilBuilderDetached): convenience function
6236         * buildbot/status/builder.py (BuilderStatus): prune old builds
6237         (BuildStatus.pruneSteps): .. and steps
6238         (BuildStepStatus.pruneLogs): .. and logs
6239         (BuilderStatus.getBuild): handle missing builds
6240         * buildbot/status/html.py (StatusResourceBuild.body): display build
6241         status in the per-build page
6242         (BuildBox.getBox): color finished builds in the per-build box
6244 2004-08-27  Brian Warner  <warner@lothar.com>
6246         * buildbot/status/mail.py (MailNotifier): new notification class,
6247         not yet finished
6249         * buildbot/slave/commands.py (SourceBase): refactor SVN and CVS into
6250         variants of a common base class which handles all the mode= logic
6252         * buildbot/interfaces.py (IBuildStatus.getPreviousBuild): add
6253         convenience method
6254         * buildbot/status/builder.py (BuildStatus.getPreviousBuild): same
6256 2004-08-26  Brian Warner  <warner@lothar.com>
6258         * buildbot/test/test_slavecommand.py: accomodate new slavecommand
6259         interfaces
6261         * buildbot/test/test_run.py: update to new Logfile interface, new
6262         buildbot.slave modules
6263         * buildbot/test/test_steps.py: same, remove Swappable, add timeouts
6265         * MANIFEST.in: new sample config file
6266         * docs/examples/hello.cfg: same
6268         * buildbot/process/step_twisted.py: remove dead import
6270         * buildbot/process/step.py (RemoteCommand.run): catch errors
6271         during .start
6272         (RemoteCommand.remote_update): ignore updates that arrive after
6273         we've shut down
6274         (RemoteCommand.remote_complete): ignore duplicate complete msgs
6275         (RemoteCommand._remoteComplete): cleanup failure handling, reduce
6276         the responsibilities of the subclass's methods
6277         (BuildStep.failed): catch errors during failure processing
6278         (BuildStep.addHTMLLog): provide all-HTML logfiles (from Failures)
6279         (CVS): move to a mode= argument (described in docstring), rather
6280         than the ungainly clobber=/export=/copydir= combination.
6281         (SVN): add mode= functionality to SVN too
6282         (todo_Darcs, todo_Arch, todo_P4): placeholders for future work
6284         * buildbot/process/base.py (Build.startNextStep): catch errors
6285         during s.startStep()
6287         * buildbot/clients/base.py: update to new PB client interface.
6288         gtkPanes is still broken
6290         * buildbot/bot.py, buildbot/slavecommand.py: move to..
6291         * buildbot/slave/bot.py, buildbot/slave/commands.py: .. new directory
6292         * setup.py: add buildbot.slave module
6293         * buildbot/bb_tap.py: handle move
6294         * buildbot/slave/registry.py: place to register commands, w/versions
6295         * buildbot/slave/bot.py: major simplifications
6296         (SlaveBuilder.remote_startCommand): use registry for slave commands,
6297         instead of a fixed table. Eventually this will make the slave more
6298         extensible. Use 'start' method on the command, not .startCommand.
6299         Fix unsafeTracebacks handling (I think).
6300         * buildbot/slave/commands.py: major cleanup. ShellCommand is now a
6301         helper class with a .start method that returns a Deferred.
6302         SlaveShellCommand is the form reached by the buildmaster. Commands
6303         which use multiple ShellCommands can just chain them as Deferreds,
6304         with some helper methods in Command (_abandonOnFailure and
6305         _checkAbandoned) to bail on rc!=0.
6306         (CVSCommand): prefer new mode= argument
6307         (SVNFetch): add mode= argument
6309         * buildbot/master.py (DebugPerspective.perspective_forceBuild):
6310         put a useful reason string on the build
6312         * buildbot/status/builder.py (LogFile): do LogFile right: move the
6313         core functionality into an IStatusLog object
6314         (BuildStatus.sendETAUpdate): don't send empty build-eta messages
6315         * buildbot/status/html.py (TextLog): HTML-rendering goes here
6316         (StatusResourceBuild.body): use proper accessor methods
6317         * buildbot/status/client.py (RemoteLog): PB-access goes here
6318         (StatusClientPerspective.perspective_subscribe): add "full" mode,
6319         which delivers log contents too
6320         (PBListener.__cmp__): make PBListeners comparable, thus removeable
6321         * buildbot/status/event.py: remove old Logfile completely
6323         * buildbot/interfaces.py (IStatusLog.subscribe): make the
6324         subscription interface for IStatusLog subscriptions just like all
6325         other the status subscriptions
6326         (IStatusReceiver.logChunk): method called on subscribers
6328 2004-08-24  Brian Warner  <warner@lothar.com>
6330         * buildbot/process/builder.py (Builder._pong): oops, ping response
6331         includes a result (the implicit None returned by remote_print).
6332         Accept it so the _pong method handles the response correctly.
6334 2004-08-06  Brian Warner  <warner@lothar.com>
6336         * buildbot/test/test_config.py: update IRC, PBListener tests
6338         * buildbot/status/client.py (StatusClientPerspective): total
6339         rewrite to match new IStatus interfaces. New subscription scheme.
6340         There are still a few optimizations to make (sending down extra
6341         information with event messages so the client doesn't have to do a
6342         round trip). The logfile-retrieval code is probably still broken.
6343         Moved the PB service into its own port, you can no longer share a
6344         TCP socket between a PBListener and, say, the slaveport (this
6345         should be fixed eventually).
6346         * buildbot/clients/base.py (Client): revamp to match. still needs
6347         a lot of work, but basic event reporting works fine. gtkPanes is
6348         completely broken.
6350         * buildbot/status/words.py (IRC): move to c['status']. Each IRC
6351         instance talks to a single irc server. Threw out all the old
6352         multi-server handling code. Still need to add back in
6353         builder-control (i.e. "force build")
6355         * buildbot/status/html.py (StatusResourceBuildStep.body): add some
6356         more random text to the as-yet-unreachable per-step page
6358         * buildbot/status/builder.py (BuildStepStatus.sendETAUpdate):
6359         rename to stepETAUpdate
6360         (BuildStatus.subscribe): add build-wide ETA updates
6361         (BuilderStatus.getState): remove more cruft
6362         (BuilderStatus.getCurrentBuild): remove more cruft
6363         (BuilderStatus.buildStarted): really handle tuple-subscription
6364         * buildbot/test/test_run.py (Status.testSlave): handle the
6365         stepETAUpdate rename
6367         * buildbot/master.py (BuildMaster): don't add a default
6368         StatusClientService. Don't add a default IrcStatusFactory. Both
6369         are now added through c['status'] in the config file. c['irc'] is
6370         accepted for backwards compatibility, the only quirk is you cannot
6371         use c['irc'] to specify IRC servers on ports other than 6667.
6373         * buildbot/interfaces.py (IBuildStatus.getCurrentStep): add method
6374         (IStatusReceiver.buildStarted): allow update-interval on subscribe
6375         (IStatusReceiver.buildETAUpdate): send build-wide ETA updates
6376         (IStatusReceiver.stepETAUpdate): rename since it's step-specific
6379         * buildbot/master.py (BuildMaster.startService): SIGHUP now causes
6380         the buildmaster to re-read its config file
6383         * buildbot/test/test_web.py (test_webPortnum): need a new hack to
6384         find out the port our server is running on
6385         (WebTest.test_webPathname_port): same
6387         * buildbot/test/test_config.py (testWebPortnum): test it
6388         (testWebPathname): ditto
6390         * docs/config.xhtml: document new c['status'] configuration option
6392         * buildbot/status/html.py (Waterfall): new top-level class which
6393         can be added to c['status']. This creates the Site as well as the
6394         necessary TCPServer/UNIXServer. It goes through the BuildMaster,
6395         reachable as .parent, for everything.
6397         * buildbot/master.py (Manhole): make it a normal service Child
6398         (BuildMaster.loadConfig_status): c['status'] replaces webPortnum and
6399         webPathname. It will eventually replace c['irc'] and the implicit
6400         PB listener as well. c['webPortnum'] and c['webPathname'] are left
6401         in as (deprecated) backward compatibility hooks for now.
6404         * buildbot/process/builder.py (Builder.buildFinished): don't
6405         inform out builder_status about a finished build, as it finds out
6406         through its child BuildStatus object
6408         * buildbot/status/html.py: extensive revamp. Use adapters to make
6409         Boxes out of BuildStepStatus and friends. Acknowledge that Steps
6410         have both starting and finishing times and adjust the waterfall
6411         display accordingly, using spacers if necessary. Use SlaveStatus
6412         to get buildslave info.
6413         (StatusResourceBuildStep): new just-one-step resource, used to get
6414         logfiles. No actual href to it yet.
6416         * buildbot/status/event.py (Logfile.doSwap): disable Swappable for
6417         the time being, until I get the file-naming scheme right
6419         * buildbot/status/builder.py (Event): clean started/finished names
6420         (BuildStatus.isFinished): .finished is not None is the right test
6421         (BuildStatus.buildStarted): track started/finished times ourselves
6422         (BuilderStatus.getSlave): provide access to SlaveStatus object
6423         (BuilderStatus.getLastFinishedBuild): all builds are now in
6424         .builds, even the currently-running one. Accomodate this change.
6425         (BuilderStatus.eventGenerator): new per-builder event generator.
6426         Returns BuildStepStatus and BuildStatus objects, since they can
6427         both be adapted as necessary.
6428         (BuilderStatus.addEvent): clean up started/finished attributes
6429         (BuilderStatus.startBuild,finishBuild): remove dead code
6430         (SlaveStatus): new object to provide ISlaveStatus
6432         * buildbot/process/step.py (ShellCommand.getColor): actually
6433         return the color instead of setting it ourselves
6434         (CVS.__init__): pull .timeout and .workdir options out of
6435         **kwargs, since BuildStep will ignore them. Without this neither
6436         will be sent to the slave correctly.
6437         (SVN.__init__): same
6439         * buildbot/process/builder.py (Builder): move flags to class-level
6440         attributes
6441         (Builder.attached): remove .remoteInfo, let the BotPerspective and
6442         SlaveStatus handle that
6444         * buildbot/process/base.py (Build.firstEvent): remove dead code
6445         (Build.stopBuild): bugfix
6447         * buildbot/changes/pb.py (PBChangeSource.describe): add method
6449         * buildbot/changes/changes.py (Change): add IStatusEvent methods
6450         (ChangeMaster.eventGenerator): yield Changes, since there are now
6451         Adapters to turn them into HTML boxes
6453         * buildbot/master.py (BotMaster): track SlaveStatus from BotMaster
6454         (BotPerspective.attached): feed a SlaveStatus object
6455         (BuildMaster.loadConfig): add a manhole port (debug over telnet)
6456         (BuildMaster.loadConfig_Builders): give BuilderStatus a parent
6458         * buildbot/interfaces.py: API additions
6459         (ISlaveStatus): place to get slave status
6461 2004-08-04  Brian Warner  <warner@lothar.com>
6463         * buildbot/slavecommand.py (DummyCommand.finished): send rc=0 when
6464         the delay finishes, so the step is marked as SUCCESS
6466         * buildbot/test/test_run.py (Status.testSlave): cover more of
6467         IBuildStatus and IBuildStepStatus
6469         * buildbot/status/progress.py (StepProgress): move some flags to
6470         class-level attributes
6471         (StepProgress.remaining): if there are no other progress metrics
6472         to go by, fall back to elapsed time
6473         (StepProgress.setExpectations): take a dict of metrics instead of
6474         a list
6475         (BuildProgress.setExpectationsFrom): pull expectations from the
6476         Expectations, instead of having it push them to the BuildProgress
6477         (Expectations): move some flags to class-level attributes
6478         (Expectations.__init__): copy per-step times from the
6479         BuildProgress too
6480         (Expectations.expectedBuildTime): new method for per-build ETA
6482         * buildbot/status/event.py (Logfile): move some flags to
6483         class-level attributes
6484         (Logfile.logProgressTo): better method name, let step set the
6485         progress axis name (instead of always being "output")
6487         * buildbot/status/builder.py (BuildStepStatus.getTimes): track the
6488         times directly, rather than depending upon the (possibly missing)
6489         .progress object. Use 'None' to indicate "not started/finished
6490         yet"
6491         (BuildStepStatus.getExpectations): oops, return the full list of
6492         expectations
6493         (BuilderStatus._buildFinished): append finished builds to .builds
6495         * buildbot/process/step.py (BuildStep): add separate .useProgress
6496         flag, since empty .progressMetrics[] still implies that time is a
6497         useful predictor
6498         (CVS): set up the cmd in __init__, instead of waiting for start()
6500         * buildbot/process/base.py (Build.startBuild): disable the 'when'
6501         calculation, this will eventually turn into a proper sourceStamp
6502         (Build.setupBuild): tell the Progress to load from the Expectations,
6503         instead of having the Expectations stuff things into the Progress
6504         (Build.buildException): add a build-level errback to make sure the
6505         build's Deferred fires even in case of exceptions
6507         * buildbot/master.py (BotMaster.forceBuild): convey the reason into
6508         the forced build
6509         * buildbot/process/builder.py (Builder.forceBuild): convey the
6510         reason instead of creating a fake Change
6512         * docs/examples/twisted_master.cfg: update to match reality
6514         * buildbot/test/test_config.py, buildbot/test/test_process.py:
6515         * buildbot/test/test_run.py, buildbot/test/test_steps.py:
6516         fix or remove broken/breaking tests
6518         * buildbot/status/event.py (Logfile.__len__): remove evil method
6520         * buildbot/status/builder.py (BuildStepStatus.stepStarted): tolerate
6521         missing .build, for test convenience
6523         * buildbot/process/step_twisted.py: import fixes
6525         * buildbot/process/step.py (BuildStep.failed): exception is FAILURE
6527         * buildbot/master.py (BuildMaster.loadConfig_Builders): leftover
6528         .statusbag reference
6530         * buildbot/bot.py (BuildSlave.stopService): tear down the TCP
6531         connection at shutdown, and stop it from reconnecting
6533         * buildbot/test/test_run.py (Run.testSlave): use a RemoteDummy to
6534         chase down remote-execution bugs
6536         * buildbot/process/step.py: more fixes, remove
6537         BuildStep.setStatus()
6538         * buildbot/status/builder.py: move setStatus() functionality into
6539         BuildStatus.addStep
6540         * buildbot/status/event.py: minor fixes
6542 2004-08-03  Brian Warner  <warner@lothar.com>
6544         * buildbot/process/base.py, buildbot/process/builder.py
6545         * buildbot/process/step.py, buildbot/status/builder.py
6546         * buildbot/status/event.py, buildbot/test/test_run.py:
6547         fix status delivery, get a basic test case working
6548         * buildbot/master.py: finish implementing basic status delivery,
6549         temporarily disable HTML/IRC/PB status sources
6551         * buildbot/bot.py (Bot.remote_setBuilderList): remove debug noise
6553         * buildbot/status/progress.py (BuildProgress): remove dead code
6555         * buildbot/interfaces.py
6556         * buildbot/process/base.py, buildbot/process/builder.py
6557         * buildbot/process/step.py, buildbot/process/step_twisted.py
6558         * buildbot/status/builder.py: Complete overhaul of the all
6559         status-delivery code, unifying all types of status clients (HTML,
6560         IRC, PB). See interfaces.IBuildStatus for an idea of what it will
6561         look like. This commit is a checkpointing of the work-in-progress:
6562         the input side is mostly done (Builders/Builds sending status
6563         to the BuilderStatus/BuildStatus objects), but the output side has
6564         not yet been started (HTML resources querying BuilderStatus
6565         objects). Things are probably very broken right now and may remain
6566         so for several weeks, I apologize for the disruption.
6568         * buildbot/status/event.py: add a setHTML method to use pre-rendered
6569         HTML as the log's contents. Currently used for exception tracebacks.
6570         * buildbot/status/progress.py: minor spelling changes
6572 2004-08-02  Brian Warner  <warner@lothar.com>
6574         * docs/config.xhtml: XHTML fixes, makes raw .xhtml files viewable
6575         in mozilla. Also added stylesheets copied from Twisted's docs.
6576         Remember that these files are meant to be run through Lore first.
6577         Thanks to Philipp Frauenfelder for the fixes.
6578         * docs/factories.xhtml, docs/sources.xhtml, docs/steps.xhtml: same
6579         * docs/stylesheet-unprocessed.css, docs/stylesheet.css: same
6580         * docs/template.tpl: added a Lore template
6582 2004-07-29  Brian Warner  <warner@lothar.com>
6584         * buildbot/interfaces.py: revamp status delivery. This is the
6585         preview: these are the Interfaces that will be provided by new
6586         Builder code, and to which the current HTML/IRC/PB status
6587         displayers will be adapted.
6589         * buildbot/slavecommand.py (ShellCommand.start): look for .usePTY
6590         on the SlaveBuilder, not the Bot.
6591         * buildbot/bot.py (Bot.remote_setBuilderList): copy Bot.usePTY to
6592         SlaveBuilder.usePTY
6593         * buildbot/test/test_slavecommand.py (FakeSlaveBuilder.usePTY):
6594         set .usePTY on the FakeSlaveBuilder
6596 2004-07-25  Brian Warner  <warner@lothar.com>
6598         * buildbot/changes/freshcvs.py: add some debug log messages
6599         (FreshCVSConnectionFactory.gotPerspective): pre-emptively fix the
6600         disabled 'setFilter' syntax
6601         (FreshCVSSourceNewcred.__init__): warn about prefix= values that
6602         don't end with a slash
6604         * buildbot/process/base.py (Builder._pong_failed): add TODO note
6606         * setup.py: bump to 0.5.0+ while between releases
6608 2004-07-23  Brian Warner  <warner@lothar.com>
6610         * setup.py (version): Releasing buildbot-0.5.0
6612 2004-07-23  Brian Warner  <warner@lothar.com>
6614         * README: update for 0.5.0 release
6616         * NEWS: update for 0.5.0 release
6618 2004-07-22  Brian Warner  <warner@lothar.com>
6620         * buildbot/slavecommand.py (ShellCommand): make usePTY a
6621         mktap-time configuration flag (--usepty=1, --usepty=0)
6622         * buildbot/bot.py: same
6624         * buildbot/master.py (BotPerspective.got_dirs): don't complain about
6625         an 'info' directory being unwanted
6627         * buildbot/changes/freshcvs.py (FreshCVSSource): flip the
6628         newcred/oldcred switch. Newcred (for CVSToys-1.0.10 and later) is now
6629         the default. To communicate with an oldcred daemond (CVSToys-1.0.9
6630         and earlier), use a FreshCVSSourceOldcred instead.
6631         (test): simple test routine: connect to server, print changes
6633         * buildbot/changes/changes.py (Change.getTime): make it possible
6634         to print un-timestamped changes
6636         * buildbot/master.py (makeApp): delete ancient dead code
6637         (BuildMaster.loadTheConfigFile): make "master.cfg" name configurable
6638         * buildbot/test/test_config.py (testFindConfigFile): test it
6640         * docs/examples/twisted_master.cfg (b22w32): use iocp reactor
6641         instead of win32 one
6644         * buildbot/master.py (BuildMaster.loadConfig_Builders): config file
6645         now takes a dictionary instead of a tuple. See docs/config.xhtml for
6646         details.
6648         * buildbot/process/base.py (Builder.__init__): change constructor
6649         to accept a dictionary of config data, rather than discrete
6650         name/slave/builddir/factory arguments
6652         * docs/examples/twisted_master.cfg: update to new syntax
6653         * docs/examples/glib_master.cfg: same
6654         * buildbot/test/test_config.py (ConfigTest.testBuilders): some
6655         rough tests of the new syntax
6657         
6658         * buildbot/master.py (BuildMaster.loadConfig): allow webPathname
6659         to be an int, which means "run a web.distrib sub-server on a TCP
6660         port". This lets you publish the buildbot status page to a remote
6661         twisted.web server (using distrib.ResourceSubscription). Also
6662         rename the local attributes used to hold these web things so
6663         they're more in touch with reality.
6664         * buildbot/test/test_web.py: test webPortnum and webPathname
6665         * docs/config.xhtml: document this new use of webPathname
6667         * docs/config.xhtml: new document, slightly ahead of reality
6668         
6669         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred.notify): fix
6670         'prefix' handling: treat it as a simple string to check with
6671         .startswith, instead of treating it as a directory. This allows
6672         sub-directories to be used. If you use prefix=, you should give it
6673         a string that starts just below the CVSROOT and ends with a slash.
6674         This prefix will be stripped from all filenames, and filenames
6675         which do not start with it will be ignored.
6677 2004-07-20  Cory Dodt  <corydodt@twistedmatrix.com>
6679         * contrib/svn_buildbot.py: Add --include (synonym for --filter)
6680         and --exclude (inverse of --include).  SVN post-commit hooks
6681         now have total control over which changes get sent to buildbot and which
6682         do not.
6684 2004-07-10  Brian Warner  <warner@lothar.com>
6686         * buildbot/test/test_twisted.py (Case1.testCountFailedTests): fix
6687         test case to match new API
6689         * buildbot/status/event.py (Logfile.getEntries): fix silly bug
6690         which crashed HTML display when self.entries=[] (needed to
6691         distinguish between [], which means "no entries yet", and None,
6692         which means "the entries have been swapped out to disk, go fetch
6693         them").
6695 2004-07-04  Brian Warner  <warner@lothar.com>
6697         * buildbot/process/step_twisted.py (countFailedTests): Count
6698         skips, expectedFailures, and unexpectedSuccesses. Start scanning
6699         10kb from the end because any import errors are wedged there and
6700         they would make us think the test log was unparseable.
6701         (RunUnitTests.finishStatus): add skip/todo counts to the event box
6703 2004-06-26  Brian Warner  <warner@lothar.com>
6705         * buildbot/process/step_twisted.py (RemovePYCs): turn the
6706         delete-*.pyc command into an actual BuildStep, so we can label it
6707         nicely
6708         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
6709         (FullTwistedBuildFactory): same
6711 2004-06-25  Cory Dodt  <corydodt@twistedmatrix.com>
6713         * contrib/fakechange.py: Add an errback when sending the fake 
6714         change, so we know it didn't work.
6716 2004-06-25  Christopher Armstrong  <radix@twistedmatrix.com>
6718         * buildbot/process/step_twisted.py: Delete *.pyc files before
6719         calling trial, so it doesn't catch any old .pyc files whose .py
6720         files have been moved or deleted.
6722         * buildbot/process/step_twisted.py (RunUnitTests): 1) Add a new
6723         parameter, 'recurse', that passes -R to trial. 2) have 'runAll'
6724         imply 'recurse'. 3) Make the default 'allTests' be ["twisted"]
6725         instead of ["twisted.test"], so that the end result is "trial -R
6726         twisted".
6728         * contrib/svn_buildbot.py: Add a --filter parameter that accepts a
6729         regular expression to match filenames that should be ignored when
6730         changed. Also add a --revision parameter that specifies the
6731         revision to examine, which is useful for debugging.
6733 2004-06-25  Brian Warner  <warner@lothar.com>
6735         * buildbot/process/step_twisted.py (trialTextSummarizer): create a
6736         summary of warnings (like DeprecationWarnings), next to the
6737         "summary" file
6739 2004-05-13  Brian Warner  <warner@lothar.com>
6741         * docs/examples/twisted_master.cfg: enable the win32 builder, as
6742         we now have a w32 build slave courtesy of Mike Taylor.
6744         * buildbot/process/base.py (Build.checkInterlocks): OMG this was
6745         so broken. Fixed a race condition that tripped up interlocked
6746         builds and caused the status to be stuck at "Interlocked" forever.
6747         The twisted buildbot's one interlocked build just so happened to
6748         never hit this case until recently (the feeding builds both pass
6749         before the interlocked build is attempted.. usually it has to wait
6750         a while).
6751         (Builder._pong_failed): fix method signature
6753         * setup.py: bump to 0.4.3+ while between releases
6755 2004-04-30  Brian Warner  <warner@lothar.com>
6757         * setup.py (version): Releasing buildbot-0.4.3
6759 2004-04-30  Brian Warner  <warner@lothar.com>
6761         * MANIFEST.in: add the doc fragments in  docs/*.xhtml
6763         * README: update for 0.4.3 release
6765         * NEWS: update for 0.4.3 release
6767         * buildbot/master.py (BuildMaster.__getstate__): make sure
6768         Versioned.__getstate__ is invoked, for upgrade from 0.4.2
6770         * buildbot/process/step_twisted.py (RunUnitTests.trial): add
6771         .trial as a class attribute, for upgrade from 0.4.2
6773         * buildbot/changes/changes.py (Change.links): add .links for
6774         upgrade from 0.4.2
6776         * buildbot/status/event.py (Logfile.__getstate__): get rid of both
6777         .textWatchers and .htmlWatchers at save time, since they are both
6778         volatile, should allow smooth 0.4.2 upgrade
6780         * buildbot/process/step.py (CVS.finishStatus): catch failed
6781         CVS/SVN commands so we can make the status box red
6783 2004-04-29  Brian Warner  <warner@lothar.com>
6785         * buildbot/changes/freshcvs.py
6786         (FreshCVSConnectionFactory.gotPerspective): add (commented-out)
6787         code to do setFilter(), which tells the freshcvs daemon to not
6788         send us stuff that we're not interested in. I will uncomment it
6789         when a new version of CVSToys is available in which setFilter()
6790         actually works, and I get a chance to test it better.
6792         * docs/examples/twisted_master.cfg: start using a PBChangeSource
6794         * buildbot/master.py (Dispatcher): use a registration scheme
6795         instead of hardwired service names
6796         (BuildMaster): keep track of the Dispatcher to support
6797         registration
6799         * buildbot/changes/changes.py (ChangeMaster): create a distinct
6800         PBChangeSource class instead of having it be an undocumented
6801         internal feature of the ChangeMaster. Split out the code into a
6802         new file.
6803         * buildbot/changes/pb.py (PBChangeSource): same
6804         * buildbot/test/test_changes.py: a few tests for PBChangeSource
6806         * docs/{factories|sources|steps}.xhtml: document some pieces
6808         * docs/examples/twisted_master.cfg: use SVN instead of CVS, stop
6809         using FCMaildirSource
6810         (f23osx): update OS-X builder to use python2.3, since the slave
6811         was updated to Panther (10.3.3)
6813 2004-03-21  Brian Warner  <warner@lothar.com>
6815         * buildbot/process/process_twisted.py: factor out doCheckout, change
6816         to use SVN instead of CVS
6818         * buildbot/process/base.py (BasicBuildFactory): refactor to make
6819         an SVN subclass easier
6820         (BasicSVN): subclass which uses Subversion instead of CVS
6822 2004-03-15  Christopher Armstrong  <radix@twistedmatrix.com>
6824         * buildbot/slavecommand.py (ShellCommand.start): use COMSPEC instead
6825         of /bin/sh on win32
6826         (CVSCommand.cvsComplete): don't assume chdir worked on win32
6828 2004-02-25  Brian Warner  <warner@lothar.com>
6830         * buildbot/slavecommand.py (ShellCommand): ['commands'] argument
6831         is now either a list (which is passed to spawnProcess directly) or
6832         a string (which gets passed to /bin/sh -c). This removes the useSH
6833         flag and the ArgslistCommand class. Also send status header at the
6834         start and end of each command, instead of having the master-side
6835         code do that.
6836         (CVSCommand): fix the doUpdate command, it failed to do the 'cp
6837         -r'. Update to use list-based arguments.
6838         (SVNFetch): use list-based arguments, use ['dir'] argument to
6839         simplify code.
6840         * buildbot/test/test_steps.py (Commands): match changes
6842         * buildbot/process/step.py (InternalShellCommand.words): handle
6843         command lists
6844         (SVN): inherit from CVS, cleanup
6846         * buildbot/status/event.py (Logfile.content): render in HTML, with
6847         stderr in red and headers (like the name of the command we're
6848         about to run) in blue. Add link to a second URL (url + "?text=1")
6849         to get just stdout/stderr in text/plain without markup. There is
6850         still a problem with .entries=None causing a crash, it seems to occur
6851         when the logfile is read before it is finished.
6853         * buildbot/bot.py (BotFactory.doKeepalive): add a 30-second
6854         timeout to the keepalives, and use it to explicitly do a
6855         loseConnection instead of waiting for TCP to notice the loss. This
6856         ought to clear up the silent-lossage problem.
6857         (unsafeTracebacks): pass exception tracebacks back to the master,
6858         makes it much easier to debug problems
6860 2004-02-23  Brian Warner  <warner@lothar.com>
6862         * buildbot/slavecommand.py (ShellCommand): add useSH flag to pass
6863         the whole command to /bin/sh instead of execve [Johan Dahlin]
6864         (CVSCommand): drop '-r BRANCH' if BRANCH==None instead of usiing
6865         '-r HEAD' [Johan Dahlin]
6866         (CVSCommand.start2): fix cvsdir calculation [Johan Dahlin]
6868         * buildbot/changes/changes.py (Change): add links= argument, add
6869         asHTML method [Johan Dahlin]. Modified to make a bit more
6870         XHTMLish. Still not sure how to best use links= .
6872         * buildbot/status/html.py (StatusResourceCommits.getChild): use 
6873         Change.asHTML to display the change, not asText
6875         * buildbot/status/html.py (StatusResourceBuilder): web button to
6876         ping slave
6878         * buildbot/test/test_run.py: test to actually start a buildmaster
6879         and poke at it
6881         * MANIFEST.in: bring back accidentally-dropped test helper files
6883         * buildbot/test/test_config.py (ConfigTest.testSources): skip tests
6884         that require cvstoys if it is not installed
6886         * buildbot/process/step_twisted.py (RunUnitTests): allow other
6887         values of "bin/trial" [Dave Peticolas]
6888         (RunUnitTests.finishStatus): say "no tests run" instead of "0
6889         tests passed" when we didn't happen to run any tests
6891         * buildbot/process/step.py (Compile): use haltOnFailure instead of
6892         flunkOnFailure [Johan Dahlin]
6894         * buildbot/process/base.py (ConfigurableBuild.setSteps): allow
6895         multiple instances of the same Step class by suffixing "_2", etc,
6896         to the name until it is unique. This name needs to be unique
6897         because it is used as a key in the dictionary that tracks build
6898         progress.
6899         * buildbot/test/test_steps.py (Steps.testMultipleStepInstances):
6900         add test for it
6902         * buildbot/process/base.py (Builder.ping): add "ping slave" command
6904 2004-01-14  Brian Warner  <warner@lothar.com>
6906         * buildbot/status/words.py (IrcStatusBot): when we leave or get
6907         kicked from a channel, log it
6909         * buildbot/master.py (Dispatcher): add "poke IRC" command to say
6910         something over whatever IRC channels the buildmaster is currently
6911         connected to. Added to try and track down a problem in which the
6912         master thinks it is still connected but the IRCd doesn't see it. I
6913         used a styles.Versioned this time, so hopefully users won't have
6914         to rebuild their .tap files this time.
6915         * contrib/debug.glade: add a "Poke IRC" button
6916         * contrib/debugclient.py: same
6918         * setup.py: bump to 0.4.2+ while between releases
6920 2004-01-08  Brian Warner  <warner@lothar.com>
6922         * setup.py (version): Releasing buildbot-0.4.2
6924 2004-01-08  Brian Warner  <warner@lothar.com>
6926         * NEWS: update for 0.4.2 release
6928         * README: document how to run the tests, now that they all pass
6930         * buildbot/changes/maildir.py (Maildir.poll): minor comment
6932         * buildbot/process/step.py (CVS): add a global_options= argument,
6933         which lets you set CVS global options for the command like "-r"
6934         for read-only checkout, or "-R" to avoid writing in the
6935         repository.
6936         * buildbot/slavecommand.py (CVSCommand): same
6938         * buildbot/status/event.py (Logfile): add a .doSwap switch to make
6939         testing easier (it is turned off when testing, to avoid the
6940         leftover timer)
6942         * buildbot/process/step.py (InternalBuildStep): shuffle code a bit
6943         to make it easier to test: break generateStepID() out to a
6944         separate function, only update statusbag if it exists.
6945         (ShellCommands): create useful text for dict-based commands too.
6947         * test/*, buildbot/test/*: move unit tests under the buildbot/
6948         directory
6949         * setup.py (packages): install buildbot.test too
6951         * buildbot/test/test_slavecommand.py: fix it, tests pass now
6952         * buildbot/test/test_steps.py: fix it, tests pass now
6954 2004-01-06  Brian Warner  <warner@lothar.com>
6956         * buildbot/changes/mail.py (parseFreshCVSMail): looks like new
6957         freshcvs mail uses a slightly different syntax for new
6958         directories. Update parser to handle either.
6959         * test/test_mailparse.py (Test1.testMsg9): test for same
6961 2003-12-21  Brian Warner  <warner@lothar.com>
6963         * buildbot/process/process_twisted.py (TwistedDebsBuildFactory): set
6964         'warnOnWarnings' so that lintian errors mark the build orange
6966 2003-12-17  Brian Warner  <warner@lothar.com>
6968         * buildbot/changes/mail.py (parseBonsaiMail): parser for commit
6969         messages emitted by Bonsai, contributed by Stephen Davis.
6971         * test/*: moved all tests to use trial instead of unittest. Some
6972         still fail (test_steps, test_slavecommand, and test_process).
6974         * setup.py (version): bump to 0.4.1+ while between releases
6976 2003-12-09  Brian Warner  <warner@lothar.com>
6978         * setup.py (version): Releasing buildbot-0.4.1
6980 2003-12-09  Brian Warner  <warner@lothar.com>
6982         * NEWS: update for 0.4.1 release
6984         * docs/examples/twisted_master.cfg: add netbsd builder, shuffle
6985         freebsd builder code a little bit
6987         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred.__cmp__):
6988         don't try to compare attributes of different classes
6989         * buildbot/changes/mail.py (MaildirSource.__cmp__): same
6990         (MaildirSource.messageReceived): fix Change delivery
6992         * buildbot/master.py (BuildMaster.loadConfig): insert 'basedir'
6993         into the config file's namespace before loading it, like the
6994         documentation claims it does
6995         * docs/examples/twisted_master.cfg: remove explicit 'basedir'
6996         (useFreshCVS): switch to using a maildir until Twisted's freshcvs
6997         daemon comes back online
6999 2003-12-08  Brian Warner  <warner@lothar.com>
7001         * docs/examples/twisted_master.cfg: provide an explicit 'basedir'
7002         so the example will work with online=0 as well
7004         * buildbot/changes/mail.py (FCMaildirSource, SyncmailMaildirSource):
7005         fix the __implements__ line
7007         * buildbot/changes/maildirtwisted.py (MaildirTwisted): make this
7008         class a twisted.application.service.Service, use startService to
7009         get it moving.
7011         * buildbot/changes/dnotify.py (DNotify): use os.open to get the
7012         directory fd instead of simple open(). I'm sure this used to work,
7013         but the current version of python refuses to open directories with
7014         open().
7016 2003-12-05  Brian Warner  <warner@lothar.com>
7018         * setup.py (version): bump to 0.4.0+ while between releases
7020 2003-12-05  Brian Warner  <warner@lothar.com>
7022         * setup.py (version): Releasing buildbot-0.4.0
7024 2003-12-05  Brian Warner  <warner@lothar.com>
7026         * docs/examples/glib_master.cfg: replace old sample scripts with
7027         new-style config files
7028         * MANIFEST.in: include .cfg files in distribution tarball
7030         * buildbot/changes/freshcvs.py (FreshCVSListener.remote_goodbye):
7031         implement a dummy method to avoid the exception that occurs when
7032         freshcvs sends this to us.
7034         * buildbot/pbutil.py (ReconnectingPBClientFactory.stopFactory):
7035         removed the method, as it broke reconnection. Apparently
7036         stopFactory is called each time the connection attempt fails. Must
7037         rethink this.
7038         (ReconnectingPBClientFactory.__getstate__): squash the _callID
7039         attribute before serialization, since without stopFactory the
7040         reconnect timer may still be active and they aren't serializable.
7042         * test/test_mailparse.py (ParseTest): test with 'self' argument
7044         * buildbot/changes/mail.py (parseFreshCVSMail): add (silly) 'self'
7045         argument, as these "functions" are invoked like methods from class
7046         attributes and therefore always get an instance as the first
7047         argument.
7049         * buildbot/changes/maildir.py (Maildir.start): fix error in error
7050         message: thanks to Stephen Davis for the catch
7052 2003-12-04  Brian Warner  <warner@lothar.com>
7054         * buildbot/pbutil.py: complete rewrite using PBClientFactory and
7055         twisted's standard ReconnectingClientFactory. Handles both oldcred
7056         and newcred connections. Also has a bug-workaround for
7057         ReconnectingClientFactory serializing its connector when it
7058         shouldn't.
7060         * buildbot/bot.py (BotFactory): rewrite connection layer with new
7061         pbutil. Replace makeApp stuff with proper newcred/mktap
7062         makeService(). Don't serialize Ephemerals on shutdown.
7064         * buildbot/changes/changes.py (ChangeMaster): make it a
7065         MultiService and add the sources as children, to get startService
7066         and stopService for free. This also gets rid of the .running flag.
7068         * buildbot/changes/freshcvs.py (FreshCVSSource): rewrite to use
7069         new pbutil, turn into a TCPClient at the same time (to get
7070         startService for free). Two variants exist: FreshCVSSourceOldcred
7071         and FreshCVSSourceNewcred (CVSToys doesn't actualy support newcred
7072         yet, but when it does, we'll be ready).
7073         (FreshCVSSource.notify): handle paths which are empty after the
7074         prefix is stripped. This only happens when the top-level (prefix)
7075         directory is added, at the very beginning of a Repository's life.
7077         * buildbot/clients/base.py: use new pbutil, clean up startup code.
7078         Now the only reconnecting code is in the factory where it belongs.
7079         (Builder.unsubscribe): unregister the disconnect callback when we
7080         delete the builder on command from the master (i.e. when the
7081         buildmaster is reconfigured and that builder goes away). This
7082         fixes a multiple-delete exception when the status client is shut
7083         down afterwards.
7084         * buildbot/clients/gtkPanes.py (GtkClient): cleanup, match the
7085         base Client. 
7087         * buildbot/status/words.py (IrcStatusBot): add some more sillyness
7088         (IrcStatusBot.getBuilderStatus): fix minor exception in error message
7090 2003-10-20  Christopher Armstrong  <radix@twistedmatrix.com>
7092         * contrib/run_maxq.py: Accept a testdir as an argument rather than
7093         a list of globs (ugh). The testdir will be searched for files
7094         named *.tests and run the tests in the order specified in each of
7095         those files. This allows for "dependancies" between tests to be
7096         codified.
7098         * buildbot/process/maxq.py (MaxQ.__init__): Accept a testdir
7099         argument to pass to run_maxq.py, instead of a glob.
7101 2003-10-17  Brian Warner  <warner@lothar.com>
7103         * buildbot/process/step_twisted.py (HLint.start): ignore .xhtml
7104         files that live in the sandbox
7106 2003-10-15  Brian Warner  <warner@lothar.com>
7108         * buildbot/process/step_twisted.py (ProcessDocs.finished): fix
7109         spelling error in "docs" count-warnings output
7110         (HLint.start): stupid thinko meant .xhtml files were ignored
7112         * docs/examples/twisted_master.cfg (reactors): disable cReactor
7113         tests now that cReactor is banished to the sandbox
7115 2003-10-10  Brian Warner  <warner@lothar.com>
7117         * buildbot/process/step_twisted.py (ProcessDocs, HLint): new Twisted
7118         scheme: now .xhtml are sources and .html are generated
7120 2003-10-08  Brian Warner  <warner@lothar.com>
7122         * buildbot/process/step_twisted.py (RunUnitTests.__init__): oops,
7123         we were ignoring the 'randomly' parameter.
7125 2003-10-01  Brian Warner  <warner@lothar.com>
7127         * buildbot/slavecommand.py (ShellCommand.start): set usePTY=1 on
7128         posix, to kill sub-children of aborted slavecommands.
7130         * buildbot/status/builder.py: rename Builder to BuilderStatus.
7131         Clean up initialization: lastBuildStatus remains None until the
7132         first build has been completed.
7134         * buildbot/status/html.py (WaterfallStatusResource.body): handle
7135         None as a lastBuildStatus
7136         * buildbot/clients/gtkPanes.py: same
7138         * buildbot/status/client.py (StatusClientService): keep
7139         BuilderStatus objects in self.statusbags . These objects now live
7140         here in the StatusClientService and are referenced by the Builder
7141         object, rather than the other way around.
7142         * buildbot/status/words.py (IrcStatusBot.getBuilderStatus): same
7143         * buildbot/process/base.py (Builder): same
7144         * test/test_config.py (ConfigTest.testBuilders): same
7146         * buildbot/master.py (BuildMaster.loadConfig_Builders): when modifying
7147         an existing builder, leave the statusbag alone. This will preserve the
7148         event history.
7150         * buildbot/pbutil.py (ReconnectingPB.connect): add initial newcred
7151         hook. This will probably go away in favor of a class in upcoming
7152         Twisted versions.
7154         * buildbot/changes/freshcvs.py (FreshCVSSource.start): Remove old
7155         serviceName from newcred FreshCVSNotifiee setup
7157 2003-09-29  Brian Warner  <warner@lothar.com>
7159         * buildbot/process/process_twisted.py: switch to new reactor
7160         abbreviations
7161         * docs/examples/twisted_master.cfg: same
7163         * README (REQUIREMENTS): mention twisted-1.0.8a3 requirement
7165         * buildbot/status/words.py (IrcStatusBot.getBuilder): use the
7166         botmaster reference instead of the oldapp service lookup
7168         * buildbot/master.py (BuildMaster.__init__): give the
7169         StatusClientService a reference to the botmaster to make it easier to
7170         force builds
7172 2003-09-24  Christopher Armstrong  <radix@twistedmatrix.com>
7174         * buildbot/status/html.py (Box.td): escape hreffy things so you
7175         can have spaces in things like builder names
7176         (StatusResourceBuilder.body)
7177         (WaterfallStatusResource.body)
7178         (WaterfallStatusResource.body0): same
7180 2003-09-25  Brian Warner  <warner@lothar.com>
7182         * buildbot/master.py (BuildMaster.loadConfig_Builders): don't
7183         rearrange the builder list when adding or removing builders: keep
7184         them in the order the user requested.
7185         * test/test_config.py (ConfigTest.testBuilders): verify it
7187         * contrib/debug.glade: give the debug window a name
7189         * buildbot/process/base.py (Builder.buildTimerFired): builders can
7190         now wait on multiple interlocks. Fix code relating to that.
7191         (Builder.checkInterlocks): same
7192         * buildbot/status/builder.py (Builder.currentlyInterlocked): same
7194         * buildbot/master.py (BuildMaster.loadConfig): move from
7195         deprecated pb.BrokerFactory to new pb.PBServerFactory
7196         * test/test_config.py (ConfigTest.testWebPathname): same
7198         * docs/examples/twisted_master.cfg: fix interlock declaration
7200         * buildbot/master.py (BotMaster.addInterlock): move code to attach
7201         Interlocks to their Builders into interlock.py .
7202         (BuildMaster.loadConfig_Interlocks): fix interlock handling
7204         * test/test_config.py (ConfigTest.testInterlocks): validate
7205         interlock handling
7207         * buildbot/process/base.py (Builder.__init__): better comments
7208         * buildbot/process/interlock.py (Interlock.__repr__): same
7209         (Interlock.deactivate): add .active flag, move the code that
7210         attaches/detaches builders into the Interlock
7212 2003-09-24  Christopher Armstrong  <radix@twistedmatrix.com>
7214         * buildbot/process/maxq.py (MaxQ): support for running a set of MaxQ
7215         tests using the new run_maxq.py script, and reporting failures by
7216         parsing its output.
7218         * contrib/run_maxq.py: Hacky little script for running a set of maxq
7219         tests, reporting their success or failure in a buildbot-friendly 
7220         manner.
7222 2003-09-24  Brian Warner  <warner@lothar.com>
7224         * docs/examples/twisted_master.cfg: example of a new-style config
7225         file. This lives in the buildmaster base directory as
7226         "master.cfg".
7228         * contrib/debugclient.py (DebugWidget.do_rebuild): add 'reload'
7229         button to make the master re-read its config file
7231         * buildbot/master.py (BuildMaster.loadConfig): new code to load
7232         buildmaster configuration from a file. This file can be re-read
7233         later, and the buildmaster will update itself to match the new
7234         desired configuration. Also use new Twisted Application class.
7235         * test/Makefile, test/test_config.py: unit tests for same
7237         * buildbot/changes/freshcvs.py (FreshCVSSource.__cmp__): make
7238         FreshCVSSources comparable, to support reload.
7239         * buildbot/changes/mail.py (MaildirSource.__cmp__): same
7241         * buildbot/process/base.py (Builder): make them comparable, make
7242         Interlocks easier to attach, to support reload. Handle
7243         re-attachment of remote slaves.
7244         * buildbot/process/interlock.py (Interlock): same
7246         * buildbot/bot.py, bb_tap.py, changes/changes.py: move to
7247         Twisted's new Application class. Requires Twisted >= 1.0.8 .
7248         buildmaster taps are now constructed with mktap.
7249         * buildbot/status/client.py (StatusClientService): same
7251         * buildbot/status/words.py: move to new Services, add support to
7252         connect to multiple networks, add reload support, allow nickname
7253         to be configured on a per-network basis
7255 2003-09-20  Brian Warner  <warner@lothar.com>
7257         * docs/examples/twisted_master.py (twisted_app): use python2.3 for
7258         the freebsd builder, now that the machine has been upgraded and no
7259         longer has python2.2
7261         * setup.py (version): bump to 0.3.5+ while between releases
7263 2003-09-19  Brian Warner  <warner@lothar.com>
7265         * setup.py (version): Releasing buildbot-0.3.5
7267 2003-09-19  Brian Warner  <warner@lothar.com>
7269         * NEWS: add post-0.3.4 notes
7271         * README (REQUIREMENTS): note twisted-1.0.7 requirement
7273         * MANIFEST.in: add contrib/*
7275         * docs/examples/twisted_master.py (twisted_app): all build slaves must
7276         use a remote root now: cvs.twistedmatrix.com
7278         * buildbot/changes/freshcvs.py (FreshCVSNotifiee.connect): update
7279         to newcred
7280         (FreshCVSNotifieeOldcred): but retain a class that uses oldcred for
7281         compatibility with old servers
7282         (FreshCVSSource.start): and provide a way to use it
7283         (FreshCVSNotifiee.disconnect): handle unconnected notifiee
7285         * docs/examples/twisted_master.py (twisted_app): update to new
7286         makeApp interface.
7287         (twisted_app): listen on new ~buildbot socket
7288         (twisted_app): Twisted CVS has moved to cvs.twistedmatrix.com
7290         * buildbot/process/process_twisted.py: Use 'copydir' on CVS steps
7291         to reduce cvs bandwidth (update instead of full checkout)
7293 2003-09-11  Brian Warner  <warner@lothar.com>
7295         * contrib/fakechange.py: demo how to connect to the changemaster
7296         port. You can use this technique to submit changes to the
7297         buildmaster from source control systems that offer a hook to run a
7298         script when changes are committed.
7300         * contrib/debugclient.py: tool to connect to the debug port. You
7301         can use it to force builds, submit fake changes, and wiggle the
7302         builder state
7304         * buildbot/master.py: the Big NewCred Reorganization. Use a single
7305         'Dispatcher' realm to handle all the different kinds of
7306         connections and Perspectives: buildslaves, the changemaster port,
7307         the debug port, and the status client port. NewCredPerspectives
7308         now have .attached/.detached methods called with the remote 'mind'
7309         reference, much like old perspectives did. All the pb.Services
7310         turned into ordinary app.ApplicationServices .
7311         (DebugService): went away, DebugPerspectives are now created
7312         directly by the Dispatcher.
7313         (makeApp): changed interface a little bit
7315         * buildbot/changes/changes.py: newcred
7316         * buildbot/status/client.py: newcred
7318         * buildbot/clients/base.py: newcred client side changes
7319         * buildbot/bot.py: ditto
7321         * docs/examples/glib_master.py: handle new makeApp() interface
7322         * docs/examples/twisted_master.py: ditto
7324         * buildbot/pbutil.py (NewCredPerspective): add a helper class to
7325         base newcred Perspectives on. This should go away once Twisted
7326         itself provides something sensible.
7329 2003-09-11  Christopher Armstrong  <radix@twistedmatrix.com>
7331         * contrib/svn_buildbot.py: A program that you can call from your
7332         SVNREPO/hooks/post-commit file that will notify a BuildBot master
7333         when a change in an SVN repository has happened. See the top of
7334         the file for some minimal usage info.
7336 2003-09-10  Christopher Armstrong  <radix@twistedmatrix.com>
7338         * buildbot/slavecommand.py (ArglistCommand): Add new
7339         ArglistCommand that takes an argument list rather than a string as
7340         a parameter. Using a st.split() for argv is very bad.
7342         * buildbot/slavecommand.py (SVNFetch): Now has the ability to
7343         update to a particular revision rather than always checking out
7344         (still not very smart about it, there may be cases where the
7345         checkout becomes inconsistent).
7347 2003-09-10  Christopher Armstrong  <radix@twistedmatrix.com>
7349         * buildbot/{bot.py,slavecommand.py,process/step.py}: Rudimentary
7350         SVN fetch support. It can checkout (not update!) a specified
7351         revision from a specified repository to a specified directory.
7353         * buildbot/status/progress.py (Expectations.update): Fix an
7354         obvious bug (apparently created by the change described in the
7355         previous ChangeLog message) by moving a check to *after* the
7356         variable it checks is defined.
7359 2003-09-08  Brian Warner  <warner@lothar.com>
7361         * buildbot/status/progress.py (Expectations.update): hack to catch
7362         an exception TTimo sees: sometimes the update() method seems to
7363         get called before the step has actually finished, so the .stopTime
7364         is not set, so no totalTime() is available and we average None
7365         with the previous value. Catch this and just don't update the
7366         metrics, and emit a log message.
7368 2003-08-24  Brian Warner  <warner@lothar.com>
7370         * buildbot/process/base.py (BasicBuildFactory): accept 'cvsCopy'
7371         parameter to set copydir='original' in CVS commands.
7373         * buildbot/process/step.py (CVS): accept 'copydir' parameter.
7375         * buildbot/slavecommand.py (CVSCommand): add 'copydir' parameter,
7376         which tells the command to maintain a separate original-source CVS
7377         workspace. For each build, this workspace will be updated, then
7378         the tree copied into a new workdir. This reduces CVS bandwidth
7379         (from a full checkout to a mere update) while doubling the local
7380         disk usage (to keep two copies of the tree).
7382 2003-08-21  Brian Warner  <warner@lothar.com>
7384         * buildbot/status/event.py (Logfile.addEntry): if the master web
7385         server dies while we're serving a page, request.write raises
7386         pb.DeadReferenceError . Catch this and treat it like a
7387         notifyFinish event by dropping the request.
7389 2003-08-18  Brian Warner  <warner@lothar.com>
7391         * buildbot/status/words.py (IrcStatusBot.command_FORCE): complain
7392         (instead of blowing up) if a force-build command is given without
7393         a reason field
7395         * buildbot/changes/changes.py (ChangeMaster.getChangeNumbered):
7396         don't blow up if there aren't yet any Changes in the list
7398 2003-08-02  Brian Warner  <warner@lothar.com>
7400         * buildbot/bot.py (updateApplication): don't set the .tap name,
7401         since we shouldn't assume we own the whole .tap file
7403         * buildbot/bb_tap.py (updateApplication): clean up code, detect
7404         'mktap buildbot' (without a subcommand) better
7406 2003-07-29  Brian Warner  <warner@lothar.com>
7408         * buildbot/status/words.py
7409         (IrcStatusFactory.clientConnectionLost): when we lose the
7410         connection to the IRC server, schedule a reconnection attempt.
7412         * buildbot/slavecommand.py (CVSCommand.doClobber): on non-posix,
7413         use shutil.rmtree instead of forking off an "rm -rf" command.
7414         rmtree may take a while and will block until it finishes, so we
7415         use "rm -rf" if available.
7417         * docs/examples/twisted_master.py: turn off kqreactor, it hangs
7418         freebsd buildslave badly
7420         * setup.py (version): bump to 0.3.4+ while between releases
7422 2003-07-28  Brian Warner  <warner@lothar.com>
7424         * setup.py (version): Releasing buildbot-0.3.4
7426 2003-07-28  Brian Warner  <warner@lothar.com>
7428         * NEWS: update in preparation for release
7430         * buildbot/slavecommand.py (ShellCommand.doTimeout): use
7431         process.signalProcess instead of os.kill, to improve w32
7432         portability
7434         * docs/examples/twisted_master.py (twisted_app): turn off
7435         win32eventreactor: the tests hang the buildslave badly
7437         * buildbot/process/base.py (Build.buildFinished): update ETA even on
7438         failed builds, since usually the failures are consistent
7440         * buildbot/process/process_twisted.py (TwistedReactorsBuildFactory):
7441         add compileOpts/compileOpts2 to reactors build
7443         * docs/examples/twisted_master.py (twisted_app): add "-c mingw32"
7444         (twisted_app): use both default and win32eventreactor on w32 build.
7445         Use both default and kqreactor on freebsd build.
7447         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
7448         add compileOpts2, which is put after the build_ext argument. w32
7449         needs "-c mingw32" here.
7451         * buildbot/status/html.py (StatusResourceBuilder.getChild): don't
7452         touch .acqpath, it goes away in recent Twisted releases
7454         * docs/examples/twisted_master.py (twisted_app): use "python" for
7455         the w32 buildslave, not "python2.2"
7457         * buildbot/bot.py (Bot.remote_getSlaveInfo): only look in info/ if
7458         the directory exists.. should hush an exception under w32
7460         * buildbot/slavecommand.py (ShellCommandPP.processEnded): use
7461         ProcessTerminated -provided values for signal and exitCode rather
7462         than parsing the unix status code directly. This should remove one
7463         more roadblock for a w32-hosted buildslave.
7465         * test/test_mailparse.py: add test cases for Syncmail parser
7467         * Buildbot/changes/freshcvsmail.py: remove leftover code, leave a
7468         temporary compatibility import. Note! Start importing
7469         FCMaildirSource from changes.mail instead of changes.freshcvsmail
7471         * buildbot/changes/mail.py (parseSyncmail): finish Syncmail parser
7473 2003-07-27  Brian Warner  <warner@lothar.com>
7475         * NEWS: started adding new features
7477         * buildbot/changes/mail.py: start work on Syncmail parser, move
7478         mail sources into their own file
7480         * buildbot/changes/freshcvs.py (FreshCVSNotifiee): mark the class
7481         as implementing IChangeSource
7482         * buildbot/changes/freshcvsmail.py (FCMaildirSource): ditto
7484         * buildbot/interfaces.py: define the IChangeSource interface
7486 2003-07-26  Brian Warner  <warner@lothar.com>
7488         * buildbot/master.py (makeApp): docstring (thanks to Kevin Turner)
7490 2003-06-25  Brian Warner  <warner@lothar.com>
7492         * buildbot/status/words.py (IrcStatusBot.emit_last): round off
7493         seconds display
7495 2003-06-17  Brian Warner  <warner@lothar.com>
7497         * buildbot/status/words.py: clean up method usage to avoid error
7498         in silly IRC command
7499         (IrcStatusBot.emit_status): round off seconds display
7501         * buildbot/process/base.py (Build): delete the timer when saving
7502         to the .tap file, and restore it (if it should still be running)
7503         upon restore. This should fix the "next build in -34 seconds"
7504         messages that result when the master is restarted while builds are
7505         sitting in the .waiting slot. If the time for the build has
7506         already passed, start it very soon (in 1 second).
7508         * buildbot/status/words.py: more silly commands
7510         * README (REQUIREMENTS): add URLs to all required software
7512         * buildbot/status/words.py ('last'): mention results of, and time
7513         since last build
7515 2003-05-28  Brian Warner  <warner@lothar.com>
7517         * buildbot/status/words.py: add 'last' command
7518         (IrcStatusBot.emit_status): add current-small text to 'status' output
7520         * docs/examples/twisted_master.py (twisted_app): turn on IRC bot
7521         (twisted_app): remove spaces from OS-X builder name
7523         * buildbot/master.py (makeApp): add knob to turn on IRC bot
7524         * buildbot/status/words.py: IRC bot should actually be useful now
7526 2003-05-23  Brian Warner  <warner@lothar.com>
7528         * buildbot/bot.py (Bot.remote_getSlaveInfo): add routines to get
7529         "slave information" from $(slavedir)/info/* . These files are
7530         maintained by the slave administrator, and describe the
7531         machine/environment that is hosting the slave. Information from
7532         them is put into the "Builder" HTML page. Still need to establish
7533         a set of well-known filenames and meanings for this data: at the
7534         moment, *all* info/* files are sent to the master, but only
7535         'admin' and 'host' are used on that end.
7536         * buildbot/status/html.py (StatusResourceBuilder.body): ditto
7537         * buildbot/process/base.py (Builder.setRemoteInfo):  ditto
7538         * buildbot/master.py (BotPerspective.got_info):  ditto
7540 2003-05-22  Brian Warner  <warner@lothar.com>
7542         * setup.py (version): bump version to 0.3.3+ while between releases
7544 2003-05-21  Brian Warner  <warner@lothar.com>
7546         * setup.py: Releasing buildbot-0.3.3
7548 2003-05-21  Brian Warner  <warner@lothar.com>
7550         * NEWS: 0.3.3 news items
7552         * README: describe --keepalive and life behind a NAT box
7554         * buildbot/bot.py (Bot.connected): implement application-level
7555         keepalives to deal with NAT timeouts, turn them on with
7556         --keepalive option or when SO_KEEPALIVE doesn't work.
7558         * buildbot/master.py (BotPerspective): accept keepalives silently
7560         * buildbot/process/base.py (Build.buildException): CopiedFailures
7561         don't carry as much information as local ones, so don't try to
7562         create a big HTMLized version of them.
7564         * buildbot/process/step.py (InternalShellCommand.stepFailed): close
7565         log file when step fails due to an exception, such as when the slave
7566         becomes unreachable
7568         * buildbot/process/step_twisted.py (RunUnitTests): use trial's new
7569         --testmodule argument instead of grepping for test-case-name tags
7570         ourselves. Remove FindUnitTests code.
7571         * buildbot/slavecommand.py, buildbot/bot.py: remove old code
7573         * MANIFEST.in: Add docs/examples, files under test/ . Oops!
7575 2003-05-16  Brian Warner  <warner@lothar.com>
7577         * buildbot/process/base.py (BasicBuildFactory): add 'configureEnv'
7578         argument to allow things like CFLAGS=-O0 to be passed without relying
7579         upon /bin/sh processing on the slave.
7581         * buildbot/process/step.py (InternalShellCommand.start): send
7582         'env' dict to slave
7583         * buildbot/slavecommand.py (ShellCommand.start): create argv with
7584         'split' instead of letting /bin/sh do it. This should also remove
7585         the need for /bin/sh on the buildslave, making it more likely to
7586         work with win32.
7588         * buildbot/status/html.py: html-escape text in blamelist.
7589         Add "force build" button to the Builder page.
7591         * buildbot/process/step_twisted.py (countFailedTests): look at
7592         last 1000 characters for status line, as import errors can put it
7593         before the -200 point.
7595 2003-05-15  Brian Warner  <warner@lothar.com>
7597         * docs/examples/twisted_master.py: use clobber=0 for remote builds
7599         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
7600         make 'clobber' a parameter, so it is possible to have builds which
7601         do full tests but do a cvs update instead of hammering the CVS
7602         server with a full checkout each build
7604         * buildbot/process/step.py (InternalShellCommand): bump default
7605         timeout to 20 minutes
7607         * buildbot/bot.py (Bot.debug_forceBuild): utility method to ask
7608         the master to trigger a build. Run it via manhole.
7610         * buildbot/master.py (BotPerspective.perspective_forceBuild):
7611         allow slaves to trigger any build that they host, to make life
7612         easier for slave admins who are testing out new build processes
7614         * buildbot/process/process_twisted.py (TwistedReactorsBuildFactory):
7615         don't flunk cReactor or qtreactor on failure, since they fail alot
7616         these days. Do warnOnFailure instead.
7618         * buildbot/process/base.py: change Builder.buildable from a list
7619         into a single slot. When we don't have a slave, new builds (once
7620         they make it past the timeout) are now merged into an existing
7621         buildable one instead of being queued. With this change, a slave
7622         which has been away for a while doesn't get pounded with all the
7623         builds it missed, but instead just does a single build.
7625 2003-05-07  Brian Warner  <warner@lothar.com>
7627         * setup.py (version): bump version to 0.3.2+ while between releases
7629 2003-05-07  Brian Warner  <warner@lothar.com>
7631         * setup.py: Releasing buildbot-0.3.2
7633 2003-05-07  Brian Warner  <warner@lothar.com>
7635         * setup.py: fix major packaging error: include subdirectories!
7636         
7637         * NEWS: add changes since last release
7639         * README (REQUIREMENTS): update twisted/python dependencies
7641         * buildbot/status/builder.py (Builder.startBuild): change
7642         BuildProcess API: now they should call startBuild/finishBuild
7643         instead of pushing firstEvent / setLastBuildStatus. Moving towards
7644         keeping a list of builds in the statusbag, to support other kinds of
7645         status delivery.
7646         (Builder.addClient): send current-activity-small to new clients
7647         * buildbot/process/base.py (Build.startBuild, .buildFinished): use
7648         new API
7650         * buildbot/status/client.py: drop RemoteReferences at shutdown
7652         * buildbot/status/event.py (Event.stoppedObserving): oops, add it
7654         * buildbot/status/progress.py (BuildProgress.remote_subscribe):
7655         more debug messages for remote status client
7657         * buildbot/process/step.py (InternalBuildStep.stepComplete)
7658         (.stepFailed): only fire the Deferred once, even if both
7659         stepComplete and stepFailed are called. I think this can happen if
7660         an exception occurs at a weird time.
7662         * buildbot/status/words.py: work-in-progress: IRC status delivery
7664 2003-05-05  Brian Warner  <warner@lothar.com>
7666         * docs/examples/twisted_master.py (twisted_app): hush internal
7667         python2.3 distutils deprecation warnings
7668         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
7669         add compileOpts= argument which inserts extra args before the
7670         "setup.py build_ext" command. This can be used to give -Wignore
7671         warnings, to hush some internal python-2.3 deprecation messages.
7673         * buildbot/process/step_twisted.py (RunUnitTests): parameterize
7674         the ['twisted.test'] default test case to make it easier to change
7675         in subclasses
7677         * buildbot/clients/base.py: switch to pb.Cacheable-style Events
7678         * buildbot/clients/gtkPanes.py: ditto
7680         * buildbot/process/step_twisted.py (RunUnitTests): use randomly=
7681         arg to collapse RunUnitTestsRandomly into RunUnitTests
7682         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
7683         use RunUnitTests(randomly=1) instead of RunUnitTestsRandomly
7685         * buildbot/status/html.py (StatusResource): shuffle Resources
7686         around to fix a bug: both 'http://foo:8080' and 'http://foo:8080/'
7687         would serve the waterfall display, but the internal links were
7688         only valid on the trailing-slash version. The correct behavior is
7689         for the non-slashed one to serve a Redirect to the slashed one.
7690         This only shows up when the buildbot page is hanging off another
7691         server, like a Twisted-Web distributed server.
7693         * buildbot/status/event.py (Event, RemoteEvent): make Events
7694         pb.Cacheable, with RemoteEvent as the cached version. This removes
7695         a lot of explicit send-an-update code.
7696         * buildbot/status/builder.py (Builder): remove send-update code
7697         * buildbot/status/client.py (ClientBuilder): remove send-update
7698         code, and log errors that occur during callRemote (mostly to catch
7699         InsecureJelly exceptions)
7701         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
7702         run Lore with the same python used in the rest of the build
7704         * buildbot/process/step_twisted2.py (RunUnitTestsJelly): moved
7706         * buildbot/process/step_twisted.py (HLint): accept 'python'
7707         argument. Catch rc!=0 and mark the step as failed. This marks the
7708         build orange ("has warnings").
7709         (RunUnitTestsJelly): move out to step_twisted2.py
7711         * buildbot/util.py (ignoreStaleRefs): add utility function
7713         * buildbot/master.py (DebugPerspective.perspective_setCurrentState):
7714         don't fake ETA object, it's too hard to get right
7716 2003-05-02  Brian Warner  <warner@lothar.com>
7718         * docs/examples/twisted_master.py (twisted_app): add FreeBSD builder
7720 2003-05-01  Brian Warner  <warner@lothar.com>
7722         * buildbot/status/html.py (StatusResource.body): oops, I was
7723         missing a <tr>, causing the waterfall page to be misrendered in
7724         everything except Galeon.
7726 2003-04-29  Brian Warner  <warner@lothar.com>
7728         * docs/examples/twisted_master.py: make debuild use python-2.2
7729         explicitly, now that Twisted stopped supporting 2.1
7731         * buildbot/process/step_twisted.py (BuildDebs.finishStatus): oops,
7732         handle tuple results too. I keep forgetting this, which suggests
7733         it needs to be rethought.
7735         * setup.py (setup): bump version to 0.3.1+ while between releases
7736         
7737 2003-04-29  Brian Warner  <warner@lothar.com>
7739         * setup.py: Releasing buildbot-0.3.1
7741 2003-04-29  Brian Warner  <warner@lothar.com>
7743         * README (SUPPORT): add plea to send questions to the mailing list
7745         * NEWS, MANIFEST.in: add description of recent changes
7747         * docs/examples/twisted_master.py: add the code used to create the
7748         Twisted buildmaster, with passwords and such removed out to a
7749         separate file.
7751         * buildbot/changes/changes.py, freshcvs.py, freshcvsmail.py: split
7752         out cvstoys-using bits from generic changes.py, to allow non-cvstoys
7753         buildmasters to not require CVSToys be installed.
7754         * README, docs/examples/glib_master: update to match the change
7756         * buildbot/clients/base.py, buildbot/bot.py,
7757         buildbot/changes/changes.py, buildbot/pbutil.py: copy
7758         ReconnectingPB from CVSToys distribution to remove CVSToys
7759         dependency for build slaves and status clients. Buildmasters which
7760         use FreshCVSSources still require cvstoys be installed, of course.
7762 2003-04-25  Brian Warner  <warner@lothar.com>
7764         * buildbot/process/process_twisted.py (FullTwistedBuildFactory): add
7765         runTestsRandomly arg to turn on trial -z
7767         * buildbot/process/step_twisted.py (TwistedJellyTestResults):
7768         experimental code to use trial's machine-parseable output to get
7769         more detailed test results. Still has some major issues.
7770         (RunUnitTestsRandomly): subclass to add "-z 0" option, runs tests
7771         in random sequence
7773         * buildbot/status/builder.py (Builder.setCurrentBuild):
7774         anticipating moving build history into statusbag, not used yet
7776         * buildbot/status/tests.py: code to centralize test results,
7777         doesn't work quite yet
7779         * buildbot/status/event.py (Event): use hasattr("setName") instead
7780         of isinstance for now.. need better long-term solution
7782         * buildbot/status/html.py: Remove old imports
7784 2003-04-24  Brian Warner  <warner@lothar.com>
7786         * buildbot/process/process_twisted.py (TwistedBuild.isFileImportant):
7787         ignore changes under doc/fun/ and sandbox/
7789         * buildbot/process/step_twisted.py: update pushEvent and friends.
7791         * buildbot/status/html.py (Box.td): replace event.buildername with
7792         event.parent.getSwappableName(). Needs more thought.
7794         * buildbot/status/builder.py (Builder): Replace pushEvent and
7795         getLastEvent with {set|update|addFileTo|finish}CurrentActivity.
7796         Tell events they are being pruned with event.delete().
7798         * buildbot/process/base.py (Build): Remove Builder status-handling
7799         methods. s/pushEvent/setCurrentActivity/.
7801         * buildbot/process/step.py (BuildStep): clean up status delivery.
7802         Gouse builder.statusbag methods instead of intermediate builder
7803         methods. s/updateLastEvent/updateCurrentActivity/.
7804         s/finalizeLastEvent/finishCurrentActivity/. Use
7805         addFileToCurrentActivity for summaryFunction.
7807         * buildbot/status/event.py (Logfile): put data in a Swappable when
7808         .finish is called.
7809         (Event): add more setter methods. Remove .buildername, use .parent
7810         and getSwappableName instead (needs more thought).
7812         * buildbot/util.py (Swappable):
7813         * test/test_swap.py: don't bother setting filename at __init__
7814         time, do it later. Change setFilename args to take parent first,
7815         since it provides the most significant part of the filename.
7817 2003-04-23  Brian Warner  <warner@lothar.com>
7819         * buildbot/status/event.py (Logfile.addEntry): append to previous
7820         entry, if possible
7822         * buildbot/process/step.py (BuildStep.finalizeLastEvent):
7823         anticipating Swappable
7824         (InternalShellCommand.remoteUpdate): split out various log-adding
7825         methods so subclasses can snarf stdout separately
7827         * buildbot/process/base.py (Builder.finalizeLastEvent): more code
7828         in anticipation of Swappable build logs
7829         (Builder.testsFinished): anticipating TestResults, still disabled
7831         * buildbot/status/builder.py (Builder.pruneEvents): only keep the
7832         last 100 events
7834         * buildbot/status/event.py (Logfile): add (disabled) support for
7835         Swappable, not ready for use yet
7837         * buildbot/util.py (Swappable): object which is swapped out to
7838         disk after some period of no use.
7839         * test/test_swap.py: test buildbot.utils.Swappable
7841 2003-04-14  Brian Warner  <warner@lothar.com>
7843         * buildbot/process/base.py (Builder.doPeriodicBuild): add simple
7844         periodic-build timer. Set the .periodicBuildTime on a builder
7845         instance to some number of seconds to activate it.
7847         * buildbot/master.py (BotMaster.forceBuild): change forceBuild API
7849         * buildbot/process/step.py (ShellCommand.finishStatus): use log.msg in
7850         a way that survives result tuples
7852 2003-04-12  Brian Warner  <warner@lothar.com>
7854         * buildbot/process/step.py (ShellCommand.finishStatusSummary):
7855         return a dict instead of a tuple: allow summarizers to provide
7856         multiple summaries if they want
7857         * buildbot/process/step_twisted.py (trialTextSummarizer): return dict
7858         (debuildSummarizer): summarize lintian warnings/errors
7860 2003-04-10  Brian Warner  <warner@lothar.com>
7862         * README (REQUIREMENTS): slave requires twisted-1.0.4a2
7864 2003-04-09  Brian Warner  <warner@lothar.com>
7866         * buildbot/process/step_twisted.py (trialTextSummarizer): Don't create
7867         empty summaries: happens when the tests fail so hard they don't emit
7868         a parseable summary line.
7870         * buildbot/process/step.py (ShellCommand.finishStatusSummary):
7871         Allow summaryFunction to return None to indicate no summary should
7872         be added.
7874         * buildbot/status/event.py (Logfile.removeHtmlWatcher): avoid
7875         writing to stale HTTP requests: notice when they disconnect and
7876         remove the request from the list. Also add CacheToFile from
7877         moshez, will be used later.
7879 2003-04-08  Brian Warner  <warner@lothar.com>
7881         * buildbot/process/step_twisted.py (ProcessDocs.finished): warnings
7882         should be an int, not a list of strings
7884         * buildbot/changes/changes.py (FreshCVSSource.stop): don't disconnect
7885         if we weren't actually connected
7887         * buildbot/process/step_twisted.py (trialTextSummarizer): function
7888         to show the tail end of the trial text output
7890         * buildbot/process/step.py (ShellCommand.finishStatusSummary): add
7891         hook to summarize the results of a ShellCommand
7893 2003-04-07  Brian Warner  <warner@lothar.com>
7895         * buildbot/process/step_twisted.py (RunUnitTests): consolidate all
7896         twisted test suite code into a single class.
7897         * buildbot/process/process_twisted.py: same
7899 2003-04-04  Brian Warner  <warner@lothar.com>
7901         * setup.py, MANIFEST.in: hack to make sure plugins.tml gets installed
7903         * README (SLAVE): document use of mktap to create slave .tap file
7904         (REQUIREMENTS): describe dependencies
7906         * buildbot/bb_tap.py, buildbot/plugins.tml:
7907         * buildbot/bot.py (updateApplication): Add mktap support for creating
7908         buildslave .tap files
7910 2003-03-28  Brian Warner  <warner@lothar.com>
7912         * buildbot/process/step.py (InternalShellCommand.finished): handle
7913         new tuple result values (fix embarrasing bug that appeared during
7914         PyCon demo)
7916 2003-03-27  Brian Warner  <warner@lothar.com>
7918         * docs/examples/glib_master.py, README: add sample buildmaster.tap
7919         -making program
7921 2003-03-25  Brian Warner  <warner@lothar.com>
7923         * buildbot/process/step.py (CVS, ShellCommand): add reason for failure
7924         to overall build status
7925         * buildbot/clients/base.py (Builder): improve event printing
7926         * buildbot/process/base.py (BasicBuildFactory): use specific steps
7927         instead of generic ShellCommand
7928         (Build): Add .stopBuild, use it when slave is detached
7930         * buildbot/process/step.py (Configure,Test): give the steps their
7931         own names and status strings
7933         * buildbot/status/html.py (StatusResource): add "show" argument,
7934         lets you limit the set of Builders being displayed.
7936 2003-03-20  Brian Warner  <warner@lothar.com>
7938         * buildbot/process/basic.py: removed
7940 2003-03-19  Brian Warner  <warner@lothar.com>
7942         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
7943         turn off process-docs by default
7945         * buildbot/process/base.py (Builder.getBuildNumbered): Don't blow up
7946         when displaying build information without anything in allBuilds[]
7948         * buildbot/bot.py (makeApp): really take password from sys.argv
7950 2003-03-18  Brian Warner  <warner@lothar.com>
7952         * buildbot/bot.py (buildApp): take password from sys.argv
7954         * README: replace with more useful text
7956         * setup.py: add a real one
7957         * MANIFEST.in, .cvsignore: more distutils packaging stuff
7958         
7959         * docs/PyCon-2003/: added sources for PyCon paper.
7961         * buildbot/process/base.py, step.py: revamp. BuildProcess is gone,
7962         now Build objects control the process and Builder only handles
7963         slave stuff and distribution of changes/status. A new BuildFactory
7964         class creates Build objects on demand.
7966         Created ConfigurableBuild which takes a list of steps to run. This
7967         makes it a lot easier to set up a new kind of build and moves us
7968         closer to being able to configure a build from a web page.
7970         * buildbot/process/step_twisted.py, process_twisted.py: move to
7971         new model. A lot of code went away.
7972         
7973         * buildbot/status/progress.py (BuildProgress.newProgress): Don't
7974         send lots of empty progress messages to the client.
7976         * buildbot/master.py (makeApp): enforce builder-name uniqueness
7978 2003-02-20  Brian Warner  <warner@lothar.com>
7980         * buildbot/process/step_twisted.py (BuildDebs): count lintian hits
7982         * buildbot/slavecommand.py (ShellCommand): back to usePTY=0. The
7983         Twisted bug that prevented non-pty processes from working just got
7984         fixed, and the bug that leaks ptys is still being investigated.
7986         * buildbot/process/step.py (CVS): send timeout arg to slave
7988         * buildbot/clients/gtkPanes.py: add connection-status row, handle
7989         builders coming and going
7990         * buildbot/clients/base.py: clean up protocol, move to ReconnectingPB
7991         from CVSToys, handle lost-buildmaster
7993         * buildbot/status/client.py (StatusClientService.removeBuilder):
7994         Clean up status client protocol: send builders (with references)
7995         as they are created, rather than sending a list and requiring the
7996         client to figure out which ones are new.
7997         * buildbot/master.py (BotMaster.forceBuild): Log debugclient
7998         attempts to force a build on an unknown builder
8000 2003-02-19  Brian Warner  <warner@lothar.com>
8002         * buildbot/slavecommand.py (CVSCommand): add timeout to sub-commands
8003         * buildbot/slavecommand.py (ShellCommand.start): stop using PTYs until
8004         Twisted stops leaking them.
8005         * buildbot/clients/gtkPanes.py (CompactBuilder): forget ETA when the
8006         builder goes to an idle state.
8008         * buildbot/slavecommand.py (ShellCommand.start): bring back PTYs until
8009         I figure out why CVS commands hang without them, and/or I fix the
8010         hung-command timeout
8012 2003-02-16  Brian Warner  <warner@lothar.com>
8014         * buildbot/process/step_twisted.py: bin/hlint went away, replace
8015         with 'bin/lore --output lint'. Use 'bin/trial -o' to remove
8016         ansi-color markup. Remove GenerateLore step. Count hlint warnings in
8017         GenerateDocs now that they are prefixed with WARNING:.
8019         * buildbot/status/html.py (StatusResource.body): Fix Builder link,
8020         use manual href target instead of request.childLink
8022         * buildbot/clients/gtkPanes.py: Fix progress countdown: update the
8023         display every second, but update the ETA every 5 seconds (or
8024         whenever) as remote_progress messages arrive.
8027 2003-02-12  Brian Warner  <warner@lothar.com>
8029         * *: import current sources from home CVS repository
8030         
8032 # Local Variables:
8033 # add-log-time-format: add-log-iso8601-time-string
8034 # End: