waterfall: add queryargs to control what timespan of events are shown. Helps with...
[buildbot.git] / ChangeLog
blob35c725ed767c5e500f14f924e40d272d7ec349e2
1 2007-08-12  Brian Warner  <warner@lothar.com>
3         * buildbot/status/web/waterfall.py (WaterfallStatusResource): add
4         new query args: 'last_time' is a timestamp of the top-most event
5         on the display, 'first_time' is a timestamp for the bottom-most
6         event. 'show_time' is the difference between them, and overrides
7         'first_time'. 'num_events' puts an upper limit on the number of
8         timestamps that will be displayed on the left hand edge.
9         (WaterfallStatusResource.body): add a 'next page' link to the
10         bottom, which shows the events that come just after those shown on
11         the current page. This is a first step towards #67, but we need
12         some more controls before we can close that one.
14         * buildbot/buildslave.py (BuildSlave): these are now MultiService
15         instances too, and live as children of the BotMaster. The main
16         advantage of this approach is that BuildSlaves can know when they
17         are being removed (so they can shut off the upcoming
18         when-do-we-email-an-admin-because-we-lost-our-slave timer).
19         * buildbot/interfaces.py (IBuildSlave): marker interface so we can
20         identify which service children are BuildSlaves
21         * buildbot/master.py (BuildMaster.loadConfig_Slaves): handle the
22         Checker updates here, but delegate the rest to..
23         (BotMaster.loadConfig_Slaves): .. here, which looks at the
24         BotMaster's service children to identify the old slaves. I think
25         the previous approach of using master.slaves was broken in the
26         face of config updates that modified BuildSlave instances but did
27         not completely replace them.
28         * docs/buildbot.texinfo (Developer's Appendix): note the change to
29         the Service hierarchy
31         * buildbot/status/web/slaves.py (BuildSlavesResource): new status
32         page (at URL /buildslaves/) to view status of all buildslaves at
33         once, including how long it's been since we last heard from them,
34         and which Builders use them.
36         * buildbot/status/web/baseweb.py: fix title of one-line-per-build
37         pages
39         * buildbot/interfaces.py (IStatus.getSlaveNames): new method to
40         list all buildslaves
42         * buildbot/buildslave.py (BuildSlave.messageReceivedFromSlave):
43         use the BuildSlave to keep track of the last time we've heard from
44         the buildslave. This is updated upon receipt of any message from
45         any SlaveBuilder (which generally means when RemoteCommands are
46         giving us status updates, as BuildSteps run). In the future this
47         will include slave pings too.
48         * buildbot/process/base.py
49         (Build.setupBuild): give each BuildStep a reference to the BuildSlave
50         * buildbot/process/buildstep.py:
51         (BuildStep.setBuildSlave): accept that reference
52         (BuildStep.runCommand): pass the reference on to the RemoteCommand
53         (RemoteCommand.remote_update): update the timestamp
54         (RemoteCommand.remote_complete): same
55         * buildbot/test/runutils.py (StepTester.makeStep): match the change
56         * buildbot/test/test_steps.py (BuildStep.testShellCommand1): same
57         * buildbot/interfaces.py (ISlaveStatus.lastMessageReceived): new
58         interface to retrieve this timestamp
59         * buildbot/status/builder.py (SlaveStatus): track a copy of the
60         timestamp
63         * buildbot/status/web/baseweb.py (OneLineMixin.make_line): tighten
64         up the format a bit
65         (OneLinePerBuild.body): use a <ul> instead of <div>s
66         (OneLinePerBuildOneBuilder.body): same
68         * contrib/darcs_buildbot.py (makeChange): handle moved files too,
69         by adding the file's new name to the list of changed files. This
70         ought to be sufficient for things like isFileImportant and trial
71         tests that only exercise tests for files that have been modified.
72         Closes #31.
74         * buildbot/status/web/xmlrpc.py (XMLRPCServer): add preliminary
75         XMLRPC server to the WebStatus page. This only has two methods
76         right now (getAllBuildsInInterval and getBuild), but we'll be
77         adding more in the future. This server is extracted from the
78         trac-plugin branch.
80         * buildbot/status/web/baseweb.py (OneLinePerBuild): refactor using
81         generateFinishedBuilds, and improve the data displayed.
82         * buildbot/status/web/build.py (StatusResourceBuild): rearrange
83         the per-Build page, add some information like ETA and got_revision
84         * buildbot/status/web/builder.py (StatusResourceBuilder): same,
85         adding a list of recently completed builds
86         * buildbot/status/web/base.py (css_classes): factor this out
88         * buildbot/interfaces.py (IStatus.generateFinishedBuilds): define
89         new method, to make status display classes easier to write,
90         especially the WebStatus 'one_line_per_build' page.
91         (IBuilderStatus.generateFinishedBuilds): same
92         * buildbot/status/builder.py (BuilderStatus.generateFinishedBuilds):
93         (Status.generateFinishedBuilds): implement it
95         * buildbot/process/factory.py (GNUAutoconf.__init__): allow
96         'source' to be a BuildStep instance, since BuildFactory accepts
97         them now.
98         (CPAN.__init__): same
99         (Distutils.__init__): same
100         (Trial.__init__): same
102         * buildbot/interfaces.py (IBuildStatus.getProperty): note that
103         this might raise KeyError
105 2007-08-07  Brian Warner  <warner@lothar.com>
107         * buildbot/slave/commands.py (P4): use 'p4user' to construct the
108         'Owner:' field of the view, rather than 'p4logname', since
109         p4logname comes from the buildslave's environment and seems
110         unlikely to ever do the right thing. Thanks to Wade Brainerd for
111         the patch. Closes #40.
113         * buildbot/buildslave.py (BuildSlave.__init__): add max_builds=,
114         which imposes a per-slave limit on how many builds are allowed to
115         run simultaneously. This has a the same scope than the SlaveLock,
116         but is different because max_builds= gives the buildmaster the
117         freedom to assign the build to a different slave, whereas the
118         SlaveLock doesn't get tested until after the build is irrevocably
119         assigned to a slave. Therefore using max_builds= will improve
120         utilization in the presence of multiple buildslaves that are
121         attached to the same Builder. This completes the incorporation of
122         Dustin Mitchell's patches, and closes ticket #48. Thanks Dustin!
123         * buildbot/process/builder.py (SlaveBuilder.buildFinished): when
124         any Builder finishes, potentially trigger *all* Builders, since
125         max_builds= may have stalled someone else while waiting for the
126         slave.
127         * buildbot/scripts/sample.cfg: mention max_builds=
128         * buildbot/test/test_run.py (ConcurrencyLimit): test it
129         * docs/buildbot.texinfo (Buildslave Specifiers): document it
131         * buildbot/test/test_run.py (CanStartBuild._do_test2): tests which
132         inherit from RunMixin do not need to call master.stopService()
133         themselves, since RunMixin.tearDown does that. The double call
134         fails on Twisted-2.0.x, which didn't happen to protect against it.
135         * buildbot/test/test_slaves.py (BuildSlave.test_track_builders): same
137         * buildbot/buildslave.py (BuildSlave.addSlaveBuilder): third patch
138         from #48, this one to have the BuildSlave objects track
139         SlaveBuilders, so they'll be able to use that knowledge to
140         influence their canStartBuild() response.
141         * buildbot/process/builder.py (SlaveBuilder.attached): call it
142         (SlaveBuilder.detached): same
143         * buildbot/test/test_slaves.py (BuildSlave): test it
145         * buildbot/buildslave.py (BuildSlave.canStartBuild): incorporate
146         the second of Dustin's #48 patches, this one adding a method to
147         the BuildSlave that allows it to decide whether it is willing to
148         participate in a build or not.
149         (SlaveBuilder.isAvailable): use canStartBuild() to decide
151         * buildbot/test/test_run.py (CanStartBuild): test for it
153         * all: incorporate the first of four patches by Dustin Mitchell
154         from ticket #48, working towards improving control over slave
155         concurrency. The first patch is to use a long-lived BuildSlave
156         object per slave, on which other behavior can be added later. I've
157         modified his patch considerably.
158         * buildbot/buildslave.py (BuildSlave): move class out of
159         slave/__init__.py (where it would get loaded by the slave as well
160         as the master, making dependencies trickier), and merge it with
161         BotPerspective. Now these BuildSlave instances are created once in
162         the master.cfg file, and not destroyed until they are either
163         removed from the config file or changed so
164         much (name/password/class changes) that we cannot continue to use
165         the old one. This affects config files: they must use
166         'from buildbot.buildslave import BuildSlave' instead of using
167         'from buildbot.slave import BuildSlave'.
168         * buildbot/master.py: move BotPerspective out
169         (BuildMaster.loadConfig_Slaves): examine old and new slaves,
170         add or remove as necessary, update the rest using data from
171         the new config file.
172         * buildbot/slave/__init__.py: move BuildSlave out
173         * buildbot/test/test*.py: import BuildSlave from the new place
174         * buildbot/scripts/sample.cfg: update to match
175         * docs/buildbot.texinfo: update to match
176         * buildbot/process/builder.py: update comments to match
178 2007-08-02  Brian Warner  <warner@lothar.com>
180         * buildbot/status/web/baseweb.py (OneLinePerBuild): improve
181         one-line-per-build pages a bit, add a header, refactor slightly
183         * buildbot/test/test_maildir.py (MaildirTest.testMaildir): cleanup
184         the TimeOutError timer, patch by Dustin Mitchell.
186 2007-08-01  Brian Warner  <warner@lothar.com>
188         * buildbot/status/web/baseweb.py (OneLinePerBuild): make this
189         mostly work (branch= is still ignored, we need a useful header)
190         (OneLinePerBuildOneBuilder.body): this too
192         * buildbot/status/web/builder.py (StatusResourceBuilder.force):
193         bring this up-to-date w.r.t. recent refactorings, and fix
194         redirections to bounce the browser to the top page after hitting
195         the 'force' button. This needs to be improved, but at least it now
196         redirects to a valid page.
197         (StatusResourceBuilder.ping): same
198         (StatusResourceBuilder.getChild): same, although I think this code
199         might be dead anyways
201         * buildbot/status/web/waterfall.py (WaterfallStatusResource): add
202         a branch= query argument, to filter the display down to builds and
203         changes that involve the given branch. You can add multiple
204         branch= arguments to see multiple branches (using a logical OR).
205         Note that there is no way to include the default branch (i.e.
206         None, i.e. trunk) yet, there is still work to be done to allow for
207         simple+uniform names of branches (i.e. removing the VC-specific
208         details of how branches are implemented, so calling the branch
209         'beta4' even though the SVN checkout step requires
210         'branches/beta4').
211         * buildbot/status/builder.py (BuilderStatus.eventGenerator): same
212         * buildbot/changes/changes.py (ChangeMaster.eventGenerator): same
213         * buildbot/interfaces.py (IEventSource.eventGenerator): same
214         * docs/buildbot.texinfo (Buildbot Web Resources): document it
216         * all: bring import statements up-to-date: don't import
217         __future__, assume cPickle and cStringIO are always available.
218         Also remove #!/usr/bin/python lines from non-scripts, my editor
219         has been a bit over-enthusiastic about stuffing them into new .py
220         files.
222         * buildbot/status/web/index.html: put a link to the waterfall page
223         on the index, otherwise first-time users of WebStatus aren't going
224         to see anything very interesting.
226         * buildbot/interfaces.py (IEventSource): document this interface.
227         Thanks to Dustin Mitchell for the patch. Closes #60.
228         * buildbot/status/builder.py (BuilderStatus): same
229         * buildbot/changes/changes.py (ChangeMaster): same
231         * buildbot/status/web/waterfall.py (WaterfallStatusResource.buildGrid):
232         add a query arg of 'show_events=true' to display non-build events,
233         like slaves attaching/detaching and reconfig events, or
234         'show_events=false' to hide them. The default is 'true'.
235         * docs/buildbot.texinfo (Buildbot Web Resources): document it
237         * web-parts: merge in web-parts branch. Lots of changes. The new
238         functionality is to add buildbot.status.html.WebStatus, which is a
239         superset of the Waterfall that adds new status pages and serves
240         regular files from BASEDIR/public_html/ , which is now the preferred
241         place to put robots.txt, buildbot.css, and index.html .
242         * buildbot/scripts/runner.py: the 'create-master' command now
243         creates public_html/ too, and populates it with a couple of
244         static files.
245         * buildbot/status/web: split waterfall code into smaller pieces
247 2007-07-31  Brian Warner  <warner@lothar.com>
249         * buildbot/scripts/startup.py (launch): import twistd.run in a
250         different way to hush pyflakes
251         * buildbot/process/builder.py: remove unused import
253 2007-07-30  Brian Warner  <warner@lothar.com>
255         * buildbot/interfaces.py (ISourceStamp): cleanup patch by Dustin
256         Mitchell: pass SourceStamps around rather than branch/version/etc
257         tuples. Thanks Dustin! Closes #70.
258         * buildbot/sourcestamp.py (SourceStamp): insist that .changes is a
259         tuple rather than a list, to avoid surprising mutations
260         * buildbot/process/builder.py (BuilderControl.resubmitBuild): same
261         * buildbot/status/mail.py (MailNotifier.buildMessage): same
262         * buildbot/status/builder.py (BuildStatus.getSourceStamp): same
263         * buildbot/test/test_status.py (Subscription): same
264         * buildbot/test/test_control.py (Force): same
265         * buildbot/test/test_buildreq.py (Request.testMerge): same
267 2007-07-29  Brian Warner  <warner@lothar.com>
269         * buildbot/scripts/sample.cfg: remove the spurious 'builders'
270         variable, since it wasn't used and is confusing in the presence of
271         c['builders'] (which *is* used). Thanks to Thomas Vander Stichele
272         for the suggestion.
274         * buildbot/status/web/waterfall.py (WaterfallStatusResource): update
275         the Buildbot home-page link to point at buildbot.net instead of 
276         sourceforge, and add a current-version query parameter so we can
277         get some statistics on which versions are in use out there.
279 2007-07-28  Brian Warner  <warner@lothar.com>
281         * buildbot/master.py (BuildMaster.loadConfig): replace c['sources']
282         with c['change_source'], leaving c['sources'] for backwards
283         compatibility (but deprecated), scheduled for removal in 0.8.0
284         * docs/buildbot.texinfo: same
285         * buildbot/test/test_config.py: verify that c['sources'] still works
286         * buildbot/test/test_*.py: replace c['sources'] with c['change_source']
287         * buildbot/scripts/sample.cfg: update to match
289         * buildbot/changes/mail.py (MaildirSource): parse with python's
290         stdlib 'email' module, which has been available since python2.2,
291         and drop use of the 'rfc822' module, which has been depreceated
292         since python2.3 .
293         * buildbot/test/test_maildir.py: same: use parse_file() not parse
295         * buildbot/test/test_maildir.py (MaildirTest.testMaildir): oops,
296         this needs to match the renaming in test/mail/msg*
298         * README (SETTING UP A BUILD MASTER): fix capitalization-typo.
299         Closes SF#1752648.
301         * buildbot/test/test_mailparse.py: rename sample emails a bit
302         * buildbot/test/mail/msg*: same
304         * buildbot/changes/mail.py (SVNCommitEmailMaildirSource): add a
305         parser for the "commit-email.pl" script that is shipped with SVN,
306         written by Justin Mason. Thanks! Closes SF#1072845.
307         * buildbot/test/mail/svn-commit.*: sample messages
308         * buildbot/test/test_mailparse.py (TestSVNCommitEmail): test it
309         * docs/buildbot.texinfo (SVNCommitEmailMaildirSource): docs
311 2007-07-27  Brian Warner  <warner@lothar.com>
313         * buildbot/changes/mail.py: refactor: move parsing into a method
314         named 'parse', each parser type gets a separate subclass. Remove
315         the old 'sep' argument (hardcode it to '/'), fix usage of prefix=
316         to be a simple leading-substring match. Add a warning to the logs
317         if prefix= does not end in a slash, since that's probably a
318         mistake. Fix both places where a prefix= mismatch would skip all
319         subsequent files in the same email, instead of just skipping the
320         one that didn't match.
321         * buildbot/test/test_mailparse.py: match changes
323         * docs/buildbot.texinfo (Getting Source Code Changes): refactor
324         docs on email-based ChangeSources
326         * docs/buildbot.texinfo (Getting Source Code Changes): move all
327         the changesource types up a level, removing the one-entry menu in
328         the process
330         * buildbot/master.py (BuildMaster.loadConfig_Slaves): rename
331         c['bots'] to c['slaves'], and use buildbot.slave.BuildSlave
332         instances instead of tuples. Closes #63.
333         * buildbot/slave/__init__.py (BuildSlave): define marker class
334         * buildbot/scripts/sample.cfg: use c['slaves'] in sample config
335         * docs/buildbot.texinfo (Buildslave Specifiers): document c['slaves']
336         * buildbot/test/test_*.py: update tests to match
337         * buildbot/test/test_config.py (ConfigTest.testBots): verify that
338         the c['bots'] backwards-compatibility handler works
340 2007-07-26  Brian Warner  <warner@lothar.com>
342         * buildbot/changes/hgbuildbot.py (hook): add an in-process
343         Mercurial change-sending hook, contributed by Frederic Leroy.
344         Thanks! Addresses #50.
345         * docs/buildbot.texinfo (MercurialHook): document it
347         * buildbot/changes/hgbuildbot.py: change the way imports are done,
348         to make it compatible with at least hg-0.9.1 and the current 0.9.4
350 2007-07-17  Brian Warner  <warner@lothar.com>
352         * buildbot/process/buildstep.py (BuildStep.getLog): add a
353         convenience method to retrieve a log added with
354         addLog()/addCompleteLog()/etc or logfiles= . I should have added
355         this two years ago..
357 2007-07-03  Brian Warner  <warner@lothar.com>
359         * buildbot/slave/commands.py (ShellCommand._startCommand): when
360         logging the environment variables, put one variable on each line,
361         rather than having one really long line with all of them. This
362         should make them a bit more readable and not trigger the
363         horizontal scrollbar (when viewing it in a web browser) quite so
364         much. Thanks to Albert Hofkamp for the patch.
366         * buildbot/steps/shell.py (ShellCommand): allow workdir= to be a
367         WithProperties instance. Thanks to Axel Hecht for the patch.
368         Closes #43.
369         * buildbot/test/test_properties.py (Interpolate.testWorkdir): test it
370         * docs/buildbot.texinfo (Build Properties): document it
371         * buildbot/slave/commands.py (ShellCommand._startCommand): create the
372         workdir if it didn't already exist.
374         * docs/buildbot.texinfo (Scheduler Types): correct the description
375         of Dependent schedulers. Thanks to Greg Ward for the patch.
377         * buildbot/steps/source.py (SVN.startVC): when applying a patch,
378         add "[patch]" to the step's display. Thanks to Dustin Mitchell for
379         the patch. Closes #49.
381         * buildbot/slave/commands.py (rmdirRecursive): chmod everything to
382         0700 before removing it, to deal with situations where a build will
383         leave files around without write permissions and the 'copy' or
384         'clobber' VC checkout modes need to blow away the tree first.
385         Thanks to Steve Milner for the suggestion and the patch (which I
386         mangled horribly). Closes #29.
387         * buildbot/test/test_slavecommand.py (Utilities.test_rmdirRecursive):
388         test for it
390         * buildbot/test/runutils.py (RunMixin.disappearSlave): oops, add
391         an allowReconnect= argument to let callers control whether they
392         want this don't-let-it-reconnect behavior, since some tests care.
393         Factor out the .continueTrying=False lines from those callers.
394         * buildbot/test/test_slaves.py: same
395         * buildbot/test/test_run.py: same
397 2007-07-02  Brian Warner  <warner@lothar.com>
399         * buildbot/test/runutils.py (RunMixin.disappearSlave): once a
400         slave has been disappeared, don't let it reconnect. This was
401         causing an intermittent failure in test_slaves.py, when the slave
402         that was supposed to be gone managed to come back by the end of
403         the test and affect the count.
404         * buildbot/test/test_slaves.py (Slave.testFallback2): minor
405         refactorings
406         * buildbot/process/builder.py (SlaveBuilder.__repr__): added some
407         diagnostic messages to track down this problem
408         (Builder.startBuild): same
410         * buildbot/process/builder.py (Builder.maybeStartBuild): choose
411         the slave randomly rather than always taking the first one. Thanks
412         to Pike for the patch. Closes #36.
413         * buildbot/test/test_slaves.py: match the change. to avoid huge
414         changes to the tests, I added a CHOOSE_SLAVES_RANDOMLY flag which
415         enables/disables the round-robin-ness (enabled by default), and
416         some unit tests disable it.
417         * docs/buildbot.texinfo (Buildmaster Architecture): document it
419         * buildbot/slave/bot.py (BuildSlave.__init__): rename the 'host'
420         argument to 'buildmaster_host', to make it more obvious that this
421         points to the buildmaster. Thanks to Bob Proulx for the
422         suggestion.
423         * buildbot/scripts/runner.py (slaveTAC): same
424         * buildbot/test/test_runner.py (Create.testSlave): match the change
426         * contrib/hg_buildbot.py: patch from Frederic Leroy to make this
427         work better.
429 2007-06-17  Brian Warner  <warner@lothar.com>
431         * buildbot/test/test_config.py (Factories.testAllSteps): make sure
432         we can round-trip all of our current step classes by calling
433         getStepFactory() and using the results to make a clone of the
434         original step.
436         * buildbot/steps/maxq.py: fix import errors. Guess this hasn't been
437         used in a while..
439         * buildbot/process/factory.py (BuildFactory.addStep): To simplify
440         the config file, we're moving to using actual instances instead of
441         the (class, kwargs) 'step specification' tuples. BuildFactory
442         still keeps a list of tuples internally, but when real instances
443         are passed in to addStep(), they are asked for their class and
444         kwargs using the new BuildStep.getStepFactory method. BuildFactory
445         accepts both instances and the tuple form, and converts instances
446         to the tuple form, but the instance form is preferred because it
447         gives the Steps a chance to do argument validation. Closes: #11.
449         * buildbot/process/buildstep.py (BuildStep.__init__): record the
450         factory information necessary to implement getStepFactory. The
451         addFactoryArguments() method can be used to include arguments that
452         aren't passed to the BuildStep base class constructor.
453         (BuildStep.setBuild):
454         (BuildStep.setDefaultWorkdir): new methods to take parameters that
455         are needed for live BuildSteps but not to construct the specification
456         tuples that are stashed in the factory.
458         * buildbot/process/base.py (Build.setupBuild): pass 'build' and
459         'workdir' into new BuildSteps by using methods instead of
460         arguments. This makes the constructor for BuildSteps a lot
461         simpler.
463         * buildbot/steps/*.py: update to match this change. Basically this
464         means adding calls to addFactoryArguments() in the __init__
465         methods to capture the arguments that aren't passed through to the
466         base class.
467         * buildbot/steps/shell.py (ShellCommand.setDefaultWorkdir): copy
468         the new workdir (if any) into the RemoteShellCommands arguments.
469         * buildbot/steps/source.py: allow workdir= to be optional,
470         implement setDefaultWorkdir() since we don't inherit from
471         (CVS): finally remove old clobber=/export=/copydir= arguments,
472         in favor of the mode= argument that's been around forever now.
473         * buildbot/steps/transfer.py: remove build= argument
475         * buildbot/test/*.py: update to match, generally by turning all
476         build= arguments into subsequent calls to s.setBuild()
477         * buildbot/test/test_config.py (Factories): verify that we can
478         use either BuildStep instances or class/kwarg tuples in both
479         BuildFactory.addStep and BuildFactory.__init__
481         * docs/buildbot.texinfo (Build Steps): document the new approach,
482         mention compatibility with the old approach, update all examples
483         to use the new style.
485 2007-06-16  Brian Warner  <warner@lothar.com>
487         * buildbot/changes/svnpoller.py: when the poll fails, don't kill
488         the LoopingCall, just eat the failure so that we'll poll again
489         next time. This should allow us to tolerate (e.g.) sf.net SVN
490         failures more gracefully. Many thanks to Dustin Mitchell for the
491         patch. Closes #34.
493 2007-05-17  Brian Warner  <warner@lothar.com>
495         * buildbot/status/words.py: refactor the IRC status bot into
496         separate 'Contact' and 'Channel' classes. The base Contact class
497         contains the interaction code: commands and responses. The
498         IRCContact subclass (and IrcStatusBot 'Channel') handle the
499         IRC-specific aspects. The plan is to write other subclasses for
500         other IM protocols like AIM and Jabber.
502 2007-04-16  Brian Warner  <warner@lothar.com>
504         * CREDITS: update list of contributors. Thank you all!
506 2007-04-13  Brian Warner  <warner@lothar.com>
508         * buildbot/status/mail.py (MailNotifier): add the project name to
509         the subject line and message body, to make it easier to
510         distinguish email coming from different buildmasters. Thanks to
511         Benoit Sigoure for the patch.
512         * buildbot/test/test_status.py (Mail): update to match
514 2007-03-24  Brian Warner  <warner@lothar.com>
516         * buildbot/steps/transfer.py: open all files in 'b' binary mode to
517         avoid text-conversion problems between DOS/windows and unix.
518         Thanks to Phil Thompson for the patch. Fixes SF#1674927.
520 2007-03-03  Brian Warner  <warner@lothar.com>
522         * buildbot/status/html.py (_hush_pyflakes): hush a pyflakes
523         warning about the use of Waterfall here
525 2007-03-01  Brian Warner  <warner@lothar.com>
527         * buildbot/interfaces.py (IStatus.getBuilder): mention exceptions
529 2007-02-28  Brian Warner  <warner@lothar.com>
531         * buildbot/changes/p4poller.py (P4Source): apply change from Scott
532         Lamb to use a more optimal form of 'p4 changes', to reduce server
533         load. He reports that this optimization was added to p4d release
534         2005.2, but it should work in all versions. Closes #27.
535         * buildbot/test/test_p4poller.py: match it
537 2007-02-27  Brian Warner  <warner@lothar.com>
539         * buildbot/status/web/*.py: move all web status stuff into a
540         separate directory, in anticipation of splitting it into smaller
541         pieces and adding more files. html.py was getting way too big.
542         * buildbot/status/classic.css: move it too
543         * setup.py: add the new sub-package
544         * buildbot/test/test_web.py: match the changes
545         * MANIFEST.in: handle the move of classic.css
547 2007-02-07  Brian Warner  <warner@lothar.com>
549         * contrib/OS-X/*: add some launchd .plist files for automatically
550         starting a buildmaster or buildslave under OS-X (10.4 or later).
551         Thanks to Mark Pauley for these.
553 2007-02-06  Brian Warner  <warner@lothar.com>
555         * docs/buildbot.texinfo (Requirements): update requirements to
556         stop claiming compatibility with python-2.2 or twisted-1.3.x .
557         Closes #13.
558         * README: mention python-2.5 and twisted-2.5 compatibility
560         * buildbot/clients/debug.py: hush pyflakes warnings by removing a
561         redundant import
562         * buildbot/scripts/startup.py: same, by removing twisted-1.3.0
563         compatibility
564         * buildbot/status/builder.py: same, by requiring cStringIO
565         * buildbot/status/words.py: same, remove twisted-1.3.0 compat
566         * buildbot/test/test_vc.py: same
567         * buildbot/test/test_web.py:
568         * buildbot/test/test_steps.py: same, remove unused import
570         * buildbot/status/html.py (StatusResourceBuild.body): oops, close
571         the FORM tag
573         * buildbot/master.py (BuildMaster.loadConfig): warn the user if we
574         see any Builders that don't have Schedulers to drive them
576         * buildbot/master.py (BotPerspective.__repr__): fit bitrot, the
577         attributes this uses went away
579         * contrib/bb_applet.py (MyApplet.filled): add a small prefs
580         dialog, to allow you to reset the buildmaster and force
581         connect/disconnect. Correctly handle losing the buildmaster
582         connection (by switching the display to the hexnut, at which point
583         you can use the 'Connect' menu item to reconnect).
585         * buildbot/steps/source.py (Source.start): if we're using a patch,
586         add it as a LogFile to the checkout/update step. This will turn
587         into a link on the waterfall page.
589         * buildbot/scripts/tryclient.py (Try.createJob): implement --diff
590         option, to take the patch from a pre-made file rather than
591         generating it from the local tree. Thanks to Robert Helmer for the
592         idea. Closes #15 (the Trac ticket on the new http://buildbot.net/).
593         * buildbot/scripts/runner.py (TryOptions): add --diff,
594         --patchlevel, and --baserev options
595         * buildbot/scheduler.py (Try_Jobdir.parseJob): treat a baserev of ""
596         as None, meaning HEAD.
597         * buildbot/sourcestamp.py (SourceStamp): update docstring to
598         indicate that baserev=None means HEAD
599         * docs/buildbot.texinfo (try --diff): document it
601         * buildbot/test/test_steps.py (BuildStep): remove use of
602         reactor.iterate(), although the technique I replaced it with is a
603         gross polling hack that must be cleaned up properly some day. This
604         was the last use of reactor.iterate in the entire tree, yay.
606 2007-02-05  Brian Warner  <warner@lothar.com>
608         * buildbot/status/mail.py (MailNotifier.__init__): assert that 'mode'
609         is one of the three known values, otherwise we emit some confusing
610         messages later on. Thanks to Grig Gheorghiu for the catch.
612 2007-01-30  Brian Warner  <warner@lothar.com>
614         * buildbot/changes/bonsaipoller.py (BonsaiParser.__init__): Ben
615         Hearsum contributed a patch to let BonsaiPoller work with results
616         that contain non-ascii characters. Closes SF#1632641.
618 2007-01-27  Brian Warner  <warner@lothar.com>
620         * Makefile (release): produce both .tar.gz and .zip source bundles.
621         Closes SF#1222216.
623 2007-01-23  Brian Warner  <warner@lothar.com>
625         * buildbot/changes/freshcvsmail.py: hush a pyflakes warning
626         * buildbot/changes/monotone.py: same
628         * buildbot/changes/maildir.py: combine several files into one,
629         clean up maildir.py to use Services properly.
630         * buildbot/changes/maildirtwisted.py: remove
631         * buildbot/changes/maildirgtk.py: remove, it wasn't used by
632         buildbot anyways.
633         * buildbot/changes/mail.py: match the change
634         * buildbot/scheduler.py: same, since Try_Jobdir uses a maildir
635         * buildbot/test/test_maildir.py: remove use of reactor.iterate()
637         * buildbot/slave/commands.py (command_version): bump to "2.3" to
638         indicate that the buildslave knows about the 'bzr' command
640 2007-01-22  Brian Warner  <warner@lothar.com>
642         * buildbot/process/builder.py (Builder.fireTestEvent): don't use
643         'with', it will become a reserved work in python2.6 .
645         * contrib/bb_applet.py: add a simple gnome-panel applet, to
646         display a terse summary of buildbot status.
647         * docs/hexnut32.png, docs/hexnut48.png, docs/hexnut64.png: add
648         some icons, small versions of the Blender object that lives in
649         docs/images/icon.blend
651         * buildbot/steps/source.py (Bzr): add Bazaar-ng support
652         * buildbot/slave/commands.py (Bzr): same
653         * buildbot/scripts/tryclient.py (BzrExtractor): same
654         (SourceStampExtractor.dovc): modify this to allow non-zero exit
655         status, since 'bzr diff' does that
656         * buildbot/test/test_vc.py (Bzr): same
657         * docs/buildbot.texinfo (How Different VC Systems Specify Sources):
658         add notes on bzr
659         (Bzr): document it
661 2007-01-20  Brian Warner  <warner@lothar.com>
663         * contrib/darcs_buildbot.py: tidy up the progress messages
665 2007-01-17  Brian Warner  <warner@lothar.com>
667         * contrib/darcs_buildbot.py: enhance to handle multiple patches
668         being pushed at a time. This keeps state in the repository in a
669         small file named .darcs_buildbot-lastchange, but that shouldn't
670         interfere with normal repository operations. Fixes SF#1534049.
671         * buildbot/clients/sendchange.py (Sender): make a single Sender
672         capable of sending Changes with different usernames.
674 2006-12-11  Brian Warner  <warner@lothar.com>
676         * buildbot/changes/freshcvsmail.py: mark this file as deprecated,
677         scheduled for removal in 0.7.7 . The FCMaildirSource was moved to
678         buildbot.changes.mail a long time ago, but I forgot to add the
679         DeprecationWarning until now.
681         * buildbot/process/maxq.py: remove this, the functionality now
682         lives in buildbot.steps.maxq
684         * buildbot/clients/debug.py: remove an unnecessary gnome.ui import
685         * buildbot/clients/gtkPanes.py: remove unused import
687         * buildbot/slave/trial.py: remove an unused/incomplete/buggy file,
688         that was meant to provide a special Reporter to run inside trial
689         and give the buildslave lots of machine-readable status. We never
690         finished this project.
692         * buildbot/changes/bonsaipoller.py: remove unused imports
693         * buildbot/changes/svnpoller.py: same
694         * buildbot/process/builder.py: same
695         * buildbot/process/buildstep.py: same
696         * buildbot/slave/bot.py: hush pyflakes warning
697         * buildbot/status/tests.py: remove unused imports
698         * buildbot/status/tinderbox.py: same
699         * buildbot/steps/python_twisted.py: same
701         * buildbot/process/step.py: remove this file, these names were
702         deprecated in 0.7.5 and are now being removed.
703         * buildbot/process/step_twisted.py: same
704         * buildbot/test/test_steps.py (ReorgCompatibility): remove test
706         * buildbot/twcompat.py: remove the empty file, yay it is gone
708         * buildbot/twcompat.py (waitForDeferred): remove the monkeypatch,
709         tw-2.0.0 and newer have the method we need.
710         (getProcessOutputAndValue): same
711         (which): remove this method, tw-2.0.0 t.p.procutils has it
713         * buildbot/twcompat.py (implements): remove this method
714         * buildbot/*: import implements() from zope.interface directly
716         * buildbot/status/mail.py: stop falling back to importing
717         twisted.protocols.smtp.sendmail, now that we don't need tw-1.3.0
718         support
720         * buildbot/twcompat.py (Interface): remove this import
721         * buildbot/*: import Interface from zope.interface directly
723         * buildbot/twcompat.py (providedBy): remove this method
724         * buildbot/*: turn all uses of providedBy(obj, iface) into
725         iface.providedBy(obj)
727         * buildbot/twcompat.py (maybeWait): remove this method, now that
728         we no longer maintain compatibility with Twisted<=1.3.0 .
729         Twisted-2.0.0 and later allow trial methods to return Deferreds
730         directly.
731         * buildbot/test/*: remove all uses of maybeWait
733         * buildbot/__init__.py (version): bump to 0.7.5+ while between
734         releases
735         * docs/buildbot.texinfo: same
737 2006-12-10  Brian Warner  <warner@lothar.com>
739         * buildbot/__init__.py (version): Releasing buildbot-0.7.5
740         * docs/buildbot.texinfo: set version to match
742 2006-12-10  Brian Warner  <warner@lothar.com>
744         * README (REQUIREMENTS): update for release
745         * NEWS: update for release
746         * buildbot/slave/commands.py (command_version): mention that this
747         version (2.2) was released with buildbot-0.7.5
749         * buildbot/test/test_config.py (StartService.testStartService):
750         inhibit the usual read-config-on-startup behavior, since otherwise
751         the log.err that gets recorded causes the test to fail
753         * buildbot/status/builder.py (LogFile.finish): forget about all
754         subscribers once the log has finished, since after that point
755         we're never going to use them again. This might help free up some
756         memory somewhere.
758         * buildbot/clients/debug.py: update to use gtk.main_quit() rather
759         than the old/deprecated gtk.mainquit()
761 2006-12-09  Brian Warner  <warner@lothar.com>
763         * buildbot/steps/transfer.py (_FileWriter.__del__): handle errors
764         better when we can't open the masterdst file
766         * buildbot/scripts/startup.py (Follower._failure): add missing
767         import statement for BuildSlaveDetectedError
769         * buildbot/steps/transfer.py (FileUpload): cleanup
770         (FileDownload): same. Add tests for slave version, add mode=.
771         * buildbot/slave/commands.py (SlaveFileUploadCommand): same
772         (SlaveFileDownloadCommand): same
773         * buildbot/test/test_transfer.py: enhance tests
774         * buildbot/test/runutils.py (makeBuildStep): create a fake form of
775         step.slaveVersion
777 2006-12-08  Brian Warner  <warner@lothar.com>
779         * buildbot/scripts/runner.py (sendchange): halt the reactor on
780         both success *and* failure. Without this, the 'buildbot
781         sendchange' command would hang if it could not contact the
782         buildmaster or deliver the Change, which would generally cause the
783         user's commit/record/checkin command to hang too. Thanks to
784         Christian Unger for the catch.
786 2006-12-06  Brian Warner  <warner@lothar.com>
788         * NEWS: update with items for the next release
790         * docs/buildbot.texinfo (Adding LogObservers): add a somewhat
791         whimsical example pulled from a punch-drunk email I sent out late
792         one night.
793         (Transferring Files): document some of the other parameters
794         (Adding LogObservers): update to 0.7.5 buildbot.steps.*
795         (SVNPoller): rename svnpoller.SvnSource to SVNPoller
796         * buildbot/test/test_svnpoller.py: same
797         * buildbot/changes/svnpoller.py (SVNPoller): same
799 2006-11-26  Brian Warner  <warner@lothar.com>
801         * docs/buildbot.texinfo (Build Properties): remind users that
802         WithProperties must appear in a command= list, not as a top-level
803         instance.
804         * buildbot/steps/shell.py (ShellCommand.start): and assert that
805         we're sending a list or a single string to the RemoteShellCommand
807         * buildbot/scheduler.py (Nightly): Improve docs slightly.
809         * buildbot/scripts/startup.py (start): skip the whole
810         watch-the-logfile thing under windows, since it needs os.fork()
812         * buildbot/scripts/runner.py (restart): remove the old message
813         that got printed after the buildbot was restarted.. it most cases
814         it didn't get printed at the right time anyways
816 2006-11-25  Brian Warner  <warner@lothar.com>
818         * buildbot/scripts/runner.py: enhance 'start' and 'restart' to
819         follow twistd.log and print lines until the process has started
820         started properly. For the buildmaster, this means until the config
821         file has been parsed and accepted. For the buildslave, this means
822         until we've connected to the master. We give up after 5 seconds in
823         any case. Helpful error messages and troubleshooting suggestions
824         are printed when we don't see a successful startup. This closes the
825         remainder of SF#1517975.
826         * buildbot/scripts/startup.py: moved app startup code to here
827         * buildbot/scripts/logwatcher.py: utility class to follow log
828         * buildbot/scripts/reconfig.py: rewrite to use LogWatcher
829         * buildbot/slave/bot.py: announce our BuildSlaveness to the log
830         so the LogWatcher can tell the difference between a buildmaster
831         and a buildslave
833 2006-11-24  Brian Warner  <warner@lothar.com>
835         * docs/examples/twisted_master.cfg: update to match the version
836         in use on twistedmatrix.com
837         (IRC): re-enable IRC bot. The 'irc.us.freenode.net' hostname I
838         was using before stopped working, but 'irc.freenode.net' works
839         just fine.
841         * buildbot/scripts/runner.py (run): oops, forgot to enable the new
842         'reconfig' command
844         * buildbot/clients/base.py (TextClient.not_connected): upon
845         UnauthorizedLogin failures, remind the user to connect to the
846         PBListener port instead of the slaveport.
847         (TextClient.disconnected): shut down more quietly
848         * docs/buildbot.texinfo (statuslog): add another reminder
850         * buildbot/scripts/runner.py (Options.subCommands): rename
851         'buildbot sighup DIR' to 'buildbot reconfig DIR', but keep
852         'sighup' as an alias.
853         * buildbot/scripts/reconfig.py (Reconfigurator): enhance the
854         reconfig command to follow twistd.log and print all of the lines
855         from the start of the config-file reload to its completion. This
856         should make it a lot easier to discover bugs in the config file.
857         Use --quiet to disable this behavior. This addresses half of
858         SF#1517975, the other half will be to add this same utility to
859         'buildbot start' and 'buildbot restart'.
860         * docs/buildbot.texinfo (Loading the Config File): same
861         (Shutdown): same
863         * buildbot/interfaces.py (IBuilderControl.forceBuild): remove this
864         method, it has been deprecated for a long time. Use
865         IBuilderControl.requestBuild instead.
866         * buildbot/process/builder.py (BuilderControl.forceBuild): remove
867         * buildbot/master.py (BotPerspective.perspective_forceBuild): same
868         * buildbot/slave/bot.py (Bot.debug_forceBuild): same
869         * buildbot/test/test_control.py (Force.testForce): same
870         * buildbot/test/test_run.py: use requestBuild instead
872         * buildbot/clients/debug.py: replace 'Force Build' button with
873         'Request Build' (which just adds one to the queue), add Ping
874         Builder, add branch/revision fields to Request Build.
875         * buildbot/clients/debug.glade: same
876         * buildbot/master.py: update interface to match. This creates an
877         incompatibility between new debugclients and old buildmasters.
879         * buildbot/process/builder.py (Builder._attached): delay the call
880         to maybeStartBuild for a reactor turn, to avoid starting a build
881         in the middle of a reconfig (say, if the new Builder uses a new
882         slave which is already connected).
884 2006-11-23  Brian Warner  <warner@lothar.com>
886         * buildbot/test/test_transfer.py: appease pyflakes
887         * buildbot/test/test_steps.py: same
889         * buildbot/test/test_bonsaipoller.py: remove the 'import *' that
890         keeps pyflakes from finding undefined names
892         * buildbot/master.py (BuildMaster.loadConfig_Builders): changing a
893         Builder no longer induces a disconnect/reconnect cycle. This means
894         that any builds currently in progress will not be interrupted, and
895         any builds which are queued in the Builder will not be lost. This
896         is implemented by having the new Builder extract the state (i.e.
897         all pending Builds and any desired SlaveBuilders) from the old
898         Builder.
899         (BotPerspective): refactor. The BotPerspective no longer keeps
900         track of all the Builders that want to use this slave; instead, it
901         asks the BotMaster each time it needs this list. This removes
902         addBuilder and removeBuilder. Clean up attached() to acquire all
903         the slave's information in a more atomic fashion. updateSlave() is
904         now the way to make sure the slave is using the right set of
905         Builders: just call it after everything else has been
906         reconfigured.
907         (BotMaster): refactor, removing addBuilder/removeBuilder and
908         replacing them with an all-at-once setBuilders() call.
910         * buildbot/test/test_slaves.py (Reconfig): new test case to
911         exercise this functionality
912         * buildbot/steps/dummy.py (Wait): new dummy BuildStep for the test
913         * buildbot/slave/commands.py (WaitCommand): same
915         * docs/buildbot.texinfo (Loading the Config File): document the
916         changes
918         * buildbot/process/builder.py (SlaveBuilder): refactor. Allow the
919         SlaveBuilder to have its parent Builder changed.
920         (SlaveBuilder.isAvailable): new method to give access to state,
921         which is now a private attribute
922         (SlaveBuilder.buildStarted,buildFinished): new methods to inform
923         the SlaveBuilder about how it is being used. These methods update
924         its internal state. buildFinished() is now the place that invokes
925         maybeStartBuild() on its parent Builder.
926         (Builder.consumeTheSoulOfYourPredecessor): new method to allow a
927         new Builder to take over for an old one, transferring state from
928         the old one.
929         (Buider): refactor the way that SlaveBuilders are used to match,
930         giving them a bit more autonomy.
931         (Builder.buildFinished): this no longer calls maybeStartBuild():
932         instead the SlaveBuilder calls it on whoever its parent Builder is
933         at the time. This way, when an old Builder is replaced by a new
934         one, and there was a build in progress during the transition, when
935         that build finishes, it will be the new Builder that is told about
936         the newly available slave so it can start a new build.
938         * buildbot/process/base.py (Build.startBuild._release_slave): when
939         the Build finishes, tell the SlaveBuilder that they've been
940         released.
942         * buildbot/status/builder.py (SlaveStatus): add some new setter
943         methods for use by BotPerspective, to keep some attributes more
944         private
946         * buildbot/slave/bot.py (Bot.remote_getDirs): this is no longer
947         called by the buildmaster.
948         (Bot.setBuilderList): instead, we locally announce any leftover
949         directories based upon which Builders we were told about. The
950         master doesn't really care; it's the local admin who may or may not
951         wish to delete them.
954         * contrib/svn_buildbot.py: use /usr/bin/python, not /usr/bin/env,
955         to allow use of python2.4 or whatever. This tool still requires
956         python2.3 or newer.
958 2006-11-19  Brian Warner  <warner@lothar.com>
960         * NEWS (IStatusLog.readlines): more news items
962 2006-11-18  Brian Warner  <warner@lothar.com>
964         * NEWS: start collecting items for the next release.
966 2006-11-04  Brian Warner  <warner@lothar.com>
968         * buildbot/changes/bonsaipoller.py: apply updates from Ben
969         Hearsum. Closes SF#1590310.
970         * buildbot/test/test_bonsaipoller.py: and tests
972         * buildbot/status/tinderbox.py
973         (TinderboxMailNotifier.buildMessage): send out a "testfailed"
974         status when the build results in WARNINGS. Patch from Dave
975         Liebreich. Closes SF#1587352.
977         * buildbot/slave/commands.py (LogFileWatcher.poll): overcome a
978         linux-vs-osx behavior difference w.r.t. reading from files that
979         have reached EOF. This should fix LogFileWatcher on OS-X. Thanks
980         to Mark Rowe for the patch.
982 2006-10-15  Brian Warner  <warner@lothar.com>
984         * buildbot/interfaces.py (IStatus.getURLForThing): oops, the
985         method name was misspelled in the interface definition. Thanks to
986         Roy Rapoport for the catch.
988 2006-10-13  Brian Warner  <warner@lothar.com>
990         * docs/buildbot.texinfo (Adding LogObservers): update sample code
991         to match the great Steps renaming
993         * buildbot/steps/transfer.py (FileUpload.start): Fix stupid error.
994         Maybe I should run my own unit tests before recording a big
995         change. Good thing I've got a buildbot to remind me.
997 2006-10-12  Brian Warner  <warner@lothar.com>
999         * buildbot/steps/transfer.py: rework __init__ and args setup
1000         * buildbot/slave/commands.py (SlaveFileDownloadCommand): minor
1001         docs improvements
1002         * buildbot/slave/commands.py (SlaveFileDownloadCommand.setup):
1003         when opening the target file, only catch IOError (to report via
1004         stderr/rc!=0), let the others be reported as normal exceptions
1006 2006-10-08  Brian Warner  <warner@lothar.com>
1008         * contrib/svn_watcher.py: fix security holes by using proper argv
1009         arrays and subprocess.Popen() rather than commands.getoutput().
1010         Thanks to Nick Mathewson for the patch. Note that svn_watcher.py
1011         is deprecated in favor of buildbot/changes/svnpoller.py, and will
1012         probably be removed by the next release.
1013         * CREDITS: add Nick
1015 2006-10-04  Brian Warner  <warner@lothar.com>
1017         * buildbot/steps/python.py (PyFlakes.createSummary): skip any
1018         initial lines that weren't emitted by pyflakes. When the pyflakes
1019         command is run under a Makefile, 'make' will echo the command it
1020         runs to stdio, and that was getting logged as a "misc" warning.
1021         * buildbot/test/test_steps.py (Python.testPyFlakes2): test it
1022         * buildbot/test/test_steps.py (testPyFlakes3): another test
1024 2006-10-01  Brian Warner  <warner@lothar.com>
1026         * buildbot/status/html.py (HtmlResource.render): if we get a
1027         unicode object from our content() method, encode it into utf-8
1028         like we've been claiming to all along. This allows the comments
1029         and author names from svnpoller.py to be delivered properly.
1031         * buildbot/changes/svnpoller.py (SvnSource.create_changes):
1032         de-unicodify filenames before creating the Change, because the
1033         rest of buildbot is unlikely to handle them well. Leave the 'who'
1034         field as a unicode object.. I don't think there's anything that
1035         will break very soon, and it will probably nudge us towards
1036         accepting unicode everywhere sooner or later. Stop using the
1037         "date" field that comes out of SVN, since it is using the
1038         repository's clock (and timezone) and what we care about is the
1039         buildmaster's (otherwise Changes from the future show up later
1040         than the builds they triggered).
1041         * buildbot/test/test_svnpoller.py (Everything.test1): match the
1042         change to .when
1044         * buildbot/changes/svnpoller.py (SvnSource): added Niklaus Giger's
1045         Suvbersion repository polling ChangeSource. I've hacked it up
1046         considerably: any bugs are entirely my own fault. Thank you
1047         Niklaus!
1048         * buildbot/test/test_svnpoller.py: tests for it
1049         * docs/buildbot.texinfo (SvnSource): document it
1051 2006-09-30  Brian Warner  <warner@lothar.com>
1053         * buildbot/scheduler.py (Periodic): submit a reason= to the
1054         BuildSet to indicate which Scheduler triggered the build. Thanks
1055         to Mateusz Loskot for the suggestion.
1056         (Nightly): same
1057         * buildbot/test/test_scheduler.py (Scheduling.testPeriodic1): test it
1059         * buildbot/changes/p4poller.py (P4Source): some minor stylistic
1060         changes: set self.loop in __init__, remove unused volatile=
1062         * docs/buildbot.texinfo (.buildbot config directory): add more
1063         docs on the .buildbot/options keys used by "buildbot try"
1064         * buildbot/scripts/tryclient.py (Try.createJob): remove dead code
1065         (Try.deliverJob): same
1067         * buildbot/changes/bonsaipoller.py (BonsaiParser): more updates
1068         from Robert Helmer
1069         (BonsaiPoller): same
1071         * buildbot/slave/commands.py (LogFileWatcher.stop): explicitly
1072         close the filehandle when we stop watching the file. Before, the
1073         filehandle was only closed when the LogFileWatcher was
1074         garbage-collected, which could be quite a while in the future. If
1075         it was still open by the time the next build started, windows will
1076         refuse to let the new build delete the old build/ directory. Fixes
1077         SF#1568415, thanks to <scmikes>, <FireMoth>, and <radix> on
1078         #twisted for the catch.
1080 2006-09-29  Brian Warner  <warner@lothar.com>
1082         * buildbot/status/tinderbox.py (TinderboxMailNotifier): updates
1083         from Robert Helmer
1085 2006-09-25  Brian Warner  <warner@lothar.com>
1087         * setup.py: the new buildbot.steps module wasn't being installed.
1088         Thanks to Jose Dapena Paz for the catch, fixes SF#1560631.
1089         (testmsgs): add the extra stuff from buildbot/test/* so you can
1090         run unit tests on an installed copy of buildbot, not just from
1091         the source tree.
1093         * contrib/svn_buildbot.py (ChangeSender.getChanges): the first *4*
1094         columns of 'svnlook changed' output contain status information, so
1095         strip [:4] instead of [:6]. Depending upon what the status flags
1096         were, this would sometimes lead to mangled filenames. Thanks to
1097         Riccardo Magliocchetti for the patch. Closes SF#1545146.
1099         * buildbot/steps/source.py (Monotone): initial Monotone support,
1100         contributed by Nathaniel Smith. Still needs docs and tests, but
1101         this code has been in use on the Monotone buildbot for a long
1102         time now.
1103         * buildbot/slave/commands.py (Monotone): slave-side support
1104         * buildbot/changes/monotone.py (MonotoneSource): polling change
1105         source
1107         * buildbot/changes/bonsaipoller.py (BonsaiPoller): Ben also
1108         contributed a Change Source that polls a Bonsai server (a
1109         kind of web-based viewcvs CGI script).
1111         * buildbot/status/tinderbox.py (TinderboxMailNotifier): Ben
1112         Hearsum contributed a status plugin which sends email in the same
1113         format that Tinderbox does: this allows a number of tinderbox
1114         tools to be driven by Buildbot instead. Thanks Ben!
1116 2006-09-24  Brian Warner  <warner@lothar.com>
1118         * buildbot/changes/mail.py (parseBonsaiMail): fix the parser.
1119         Thanks to Robert Helmer for the patch.
1121         * buildbot/process/base.py (Build.setupSlaveBuilder): tell our
1122         BuildStatus about the buildslave name at the *beginning* of the
1123         build, rather than at the end. Thanks to Alexander Lorenz for the
1124         patch.
1125         * buildbot/status/html.py (StatusResourceBuild.body): always
1126         include the slavename in the build page, not just when the build
1127         has finished.
1128         * buildbot/status/mail.py (MailNotifier.buildMessage): include the
1129         slavename in the email message
1131 2006-09-21  Brian Warner  <warner@lothar.com>
1133         * buildbot/scripts/sample.cfg: update to use new BuildStep classes
1134         from buildbot.steps
1135         * docs/examples/glib_master.cfg: same
1136         * docs/examples/hello.cfg: same
1137         * docs/examples/twisted_master.cfg: same, update to current usage
1139 2006-09-19  Brian Warner  <warner@lothar.com>
1141         * buildbot/steps/python.py (PyFlakes): refactor, add summary logs
1142         (PyFlakes.createSummary): make it compatible with python-2.2
1144         * buildbot/test/test_steps.py (Python.testPyFlakes): add a test
1145         for at least the output-parsing parts of PyFlakes
1147 2006-09-18  Brian Warner  <warner@lothar.com>
1149         * buildbot/steps/python.py: oops, fix import of StringIO
1151 2006-09-17  Brian Warner  <warner@lothar.com>
1153         * buildbot/test/test_vc.py (VCBase._do_vctest_update_retry_1): it
1154         turns out that SVN-1.4.0 doesn't fail to update once you've
1155         replaced a file with a directory, unlike older versions of SVN and
1156         pretty much every other VC tool we support. Since what we really
1157         care about is that the update succeeds anyway, stop checking that
1158         the tree got clobbered and just assert that the build succeeded.
1159         (VCBase.printLogs): add a utility function for debugging
1161         * buildbot/process/step.py: oops, added extra imports by mistake
1163         * buildbot/changes/p4poller.py (P4Source._process_describe): do an
1164         rstrip() on the first line coming out of the 'p4 describe'
1165         process, to remove the stray ^M that Wade Brainerd reports seeing
1166         in the 'when' field. Fixes SF#1555985.
1168         * buildbot/master.py (BuildMaster.loadConfig): improve the error
1169         message logged when c['schedulers'] is not right
1170         * buildbot/scheduler.py (Scheduler.__init__): improve error
1171         message when a Scheduler() is created with the wrong arguments
1172         * buildbot/test/test_config.py (ConfigTest.testSchedulerErrors):
1173         verify that these error messages are emitted
1175         * buildbot/process/buildstep.py: rename step.py to buildstep.py .
1176         The idea is that all the base classes (like BuildStep and
1177         RemoteCommand and LogObserver) live in b.p.buildstep, and b.p.step
1178         will be a leftover backwards-compatibility file that only contains
1179         aliases for the steps that were moved out to buildbot.steps.*
1180         * lots: change imports to match
1181         * buildbot/process/step.py: add a DeprecationWarning if it ever
1182         gets imported
1184 2006-09-12  Brian Warner  <warner@lothar.com>
1186         * buildbot/scheduler.py (Scheduler.__init__): make sure that
1187         builderNames= is actually a sequence, since if you happen to give
1188         it a single builder-specification dictionary instead, it won't get
1189         caught by the existing assert. Thanks to Brett Neely for the
1190         catch.
1192         * buildbot/steps/python.py (BuildEPYDoc, PyFlakes): add new steps. No
1193         tests yet, alas.
1194         * docs/buildbot.texinfo (Python BuildSteps): document them
1195         (sendchange): include a link to PBChangeSource, since you need one
1197         * buildbot/steps/shell.py: clean up test-case-name line, remove some
1198         unnecessary imports
1199         * buildbot/steps/dummy.py: same
1201 2006-09-08  Brian Warner  <warner@lothar.com>
1203         * buildbot/steps/transfer.py (FileUpload,FileDownload): new
1204         BuildStep which lets you transfer files from the master to the
1205         slave or vice versa. Thanks to Albert Hofkamp for the original
1206         patch. Fixes SF#1504631.
1207         * buildbot/slave/commands.py (SlaveFileUploadCommand): slave-side
1208         support for it
1209         (SlaveFileDownloadCommand): same
1210         * docs/buildbot.texinfo (Transferring Files): document it
1211         * buildbot/test/test_transfer.py: test it
1212         * buildbot/test/runutils.py (StepTester): new utility class for
1213         testing BuildSteps and RemoteCommands without Builds or Bots or PB
1214         * buildbot/test/test_steps.py (CheckStepTester): validate that the
1215         utility class works
1217         * buildbot/interfaces.py (IStatusLog.readlines): make it easier to
1218         walk through StatusLogs one line at a time, mostly for the benefit
1219         of ShellCommand.createSummary methods. You can either walk through
1220         STDOUT or STDERR, but the default is STDOUT.
1222         * buildbot/status/builder.py (LogFile.readlines): implement it.
1223         Note that this is not yet memory-efficient, it just pulls the
1224         whole file into RAM and then splits it up with a StringIO.
1225         Eventually this should be a generator that only pulls chunks from
1226         disk as necessary.
1227         * buildbot/test/test_status.py (Log.testReadlines): test it
1229         * docs/buildbot.texinfo: update to match changes
1230         * buildbot/process/factory.py: stop using old definitions
1231         * buildbot/process/process_twisted.py: same
1232         * buildbot/test/test_*.py: same
1234         * buildbot/process/step_twisted.py: move definition to..
1235         * buildbot/steps/python_twisted.py: .. here, unfortunately python's
1236         relative-import mechanisms prevent this from being named 'twisted'
1237         or 'python/twisted' as I would have preferred.
1239         * buildbot/process/maxq.py: move definition to..
1240         * buildbot/steps/maxq.py: .. here, leave a compatibility import
1242         * buildbot/process/step.py: split the user-visible BuildSteps into
1243         separate files, all under buildbot/steps/
1244         * buildbot/steps/source.py: this holds VC-checkout steps like SVN
1245         * buildbot/steps/shell.py: this holds ShellCommand and friends
1246         * buildbot/steps/dummy.py: this holds the testing steps like Dummy
1248 2006-09-05  Brian Warner  <warner@lothar.com>
1250         * lots: run pyflakes, removed a lot of unused imports, changed the
1251         form of some conditional imports to remove false pyflakes
1252         warnings. There are still a number of warnings left, mostly from
1253         imports that are done for their side-effects.
1254         * buildbot/test/test_vc.py: import twisted.python.failure, since it
1255         was missing
1257 2006-08-26  Brian Warner  <warner@lothar.com>
1259         * buildbot/test/test_locks.py (Unit.testLater): make the tests
1260         compatible with twisted-1.3.0, for some reason I just can't seem
1261         to let go of the past.
1263 2006-08-25  Brian Warner  <warner@lothar.com>
1265         * buildbot/status/mail.py (MailNotifier.__init__): fix typo in docs
1267         * buildbot/process/step.py (LoggingBuildStep.startCommand): set up
1268         all logfiles= in startCommand(), rather than in start() . This
1269         makes it easier to have the 'stdio' log come before any secondary
1270         logfiles, which I feel makes the waterfall display more
1271         understandable.
1272         (LoggingBuildStep.setupLogfiles): move the addLog/cmd.useLog code
1273         from ShellCommand up into LoggingBuildStep
1274         (LoggingBuildStep.__init__): move the handling of logfiles= from
1275         ShellCommand up to LoggingBuildStep, because startCommand is
1276         provided by LoggingBuildStep, whereas start() was specific to
1277         subclasses like ShellCommand and Source. This removes code
1278         duplication in those subclasses.
1279         (ShellCommand.__init__): same
1280         (ShellCommand.checkForOldSlaveAndLogfiles): split out the check
1281         for a slave that's too old to understand logfiles= into a separate
1282         method, so it can live in ShellCommand. The rest of
1283         setupLogfiles() can live in LoggingBuildStep.
1285 2006-08-24  Brian Warner  <warner@lothar.com>
1287         * buildbot/locks.py (BaseLock): you can now configure Locks to
1288         allow multiple simultaneous owners. They still default to
1289         maxCount=1. Fixes SF#1434997. Thanks to James Knight (foom) for
1290         the patch.
1291         * docs/buildbot.texinfo (Interlocks): document the new options
1292         * buildbot/test/test_locks.py: add a bunch of new unit tests
1293         * buildbot/process/base.py (Build.acquireLocks): locks now offer
1294         waitUntilMaybeAvailable, not waitUntilAvailable
1295         * buildbot/process/step.py (BuildStep.acquireLocks): same
1296         * buildbot/master.py (BotMaster.getLockByID): real locks now use
1297         the whole lockid in their constructor, not just the name. Also,
1298         keep track of which real locks we've handed out by the full
1299         lockid, not just class+name, otherwise changing just the maxCount=
1300         in the master.cfg file would not actually cause a behavioral
1301         change
1303 2006-08-23  Brian Warner  <warner@lothar.com>
1305         * buildbot/__init__.py (version): bump to 0.7.4+ while between
1306         releases
1307         * docs/buildbot.texinfo: same
1309 2006-08-23  Brian Warner  <warner@lothar.com>
1311         * buildbot/__init__.py (version): Releasing buildbot-0.7.4
1312         * docs/buildbot.texinfo: set version to match
1313         * NEWS: update for 0.7.4
1314         * buildbot/slave/commands.py (command_version): mention that this
1315         version (2.1) was released with buildbot-0.7.4
1317 2006-08-22  Brian Warner  <warner@lothar.com>
1319         * README: update
1321         * CREDITS: new file, list of people who have helped. Thanks!
1322         * MANIFEST.in: ship it
1324         * MANIFEST.in: stop shipping the old PyCon-2003 paper.. with the
1325         new diagrams, the user's manual is more informative than it was.
1326         Start shipping the .html user's manual (and generated .png
1327         images).
1328         * Makefile: update 'release' target to match
1330         * buildbot/test/test_web.py (GetURL.testBrokenStuff): delete this
1331         test.. I think the web-parts effort will render it pointless well
1332         before it ever actually starts to work.
1334 2006-08-20  Brian Warner  <warner@lothar.com>
1336         * buildbot/changes/pb.py (PBChangeSource): fix and simplify
1337         meaning of the prefix= argument. It is now just a string which is
1338         stripped from the beginning of the filename. If prefix= is set but
1339         not found on any given filename, that filename is ignored. If all
1340         filenames in a Change are ignored, the Change is dropped. This is
1341         much simpler than the previous sep= nonsense, and I should have
1342         implemented it this way from the beginning. Effectively resolves
1343         SF#1217699 and SF#1381867. Thanks to Gary Granger and Marius
1344         Gedminas for the catch and suggested fixes.
1345         (ChangePerspective.perspective_addChange): implement the actual
1346         prefix comparison
1347         * buildbot/test/test_changes.py (TestChangePerspective): test it
1348         * docs/buildbot.texinfo (PBChangeSource): document it, explain
1349         how to properly use prefix=
1350         * docs/examples/twisted_master.cfg (source): update prefix= by
1351         adding the trailing slash
1354         * docs/examples/twisted_master.cfg: update to actual practice
1356         * buildbot/test/test_web.py (WaterfallSteps.test_urls): oops,
1357         update test case to match new link text.. the HREF has both a
1358         class= setting and an enclosing [] pair that I didn't match in the
1359         test.
1361         * docs/buildbot.texinfo (ShellCommand.command=): explain why a
1362         list of strings is preferred over a single string with embedded
1363         spaces
1364         (ShellCommand.description=): explain that either single strings or
1365         a list of strings is acceptable, and why you might prefer one over
1366         the other. Add an example. Fixes SF#1524659, thanks to Paul
1367         Winkler for the catch.
1368         (Build Steps): update to use f.addStep() rather than using s()
1369         and the constructor list
1371         * buildbot/process/step.py (ShellCommand): accept either a single
1372         string or a list of strings in both description= and
1373         descriptionDone=
1374         * buildbot/test/test_steps.py (Steps.test_description): test it
1375         * buildbot/test/runutils.py (makeBuildStep): support for that test
1377         * contrib/CSS/*.css: add some contributed CSS stylesheets, to make
1378         the Waterfall display a bit less ugly. Thanks to John O'Duinn for
1379         collecting the files and creating the patch.
1381         * docs/buildbot.texinfo (BuildStep URLs): document new feature:
1382         per-step URLs that will be displayed on the waterfall display,
1383         for things like the HTML output of code-coverage tools, when
1384         the results are hosted elsewhere.
1385         * buildbot/interfaces.py (IBuildStepStatus.getURLs): document the
1386         way to retrieve these URLs
1387         * buildbot/status/builder.py (BuildStepStatus.getURLs): implement
1388         the method to retrieve these URLs. Also provide backwards
1389         compatibility for saved BuildStepStatus instances that didn't have
1390         the .urls attribute
1391         * buildbot/process/step.py (BuildStep.addURL): method to set these
1392         URLs from within a BuildStep
1393         * buildbot/status/html.py (StepBox.getBox): emit links to the URLs
1394         (StepBox.getBox): give these external links a distinct CSS class
1395         named "BuildStep external" so a .css file can display them
1396         differently
1398         * buildbot/test/test_web.py (WaterfallSteps): test that we really
1399         do emit those links
1400         * buildbot/test/test_steps.py (Steps): test that we can all the
1401         URLs. Also add a bunch of other tests on methods that can be
1402         called from within BuildSteps
1403         * buildbot/test/runutils.py (makeBuildStep): add utility function
1405 2006-08-13  Brian Warner  <warner@lothar.com>
1407         * docs/buildbot.texinfo (BuildStep LogFiles): document them
1409 2006-08-10  Brian Warner  <warner@lothar.com>
1411         * docs/buildbot.texinfo (Index of master.cfg keys): add another
1412         index, this one of things like c['sources'] and c['schedulers']
1413         (indices): it looks like my clever idea of putting the @fooindex
1414         commands in between the @node and the @subsection (to make the
1415         HREF anchor jump to slightly above the section title, which works
1416         much better in html) confused texinfo horribly, so I'm moving the
1417         index tags back to be just after the @subsection marker. I also
1418         added extra lines between the @node/@section paragraph and the
1419         index tags, since I think maybe texinfo wants to see these be
1420         separate paragraphs.
1422         * docs/Makefile (images): make sure images get built when
1423         rendering the manual
1424         * docs/images/Makefile: same
1426         * buildbot/scripts/runner.py: rename 'buildbot master' to
1427         'buildbot create-master', and 'buildbot slave' to 'buildbot
1428         create-slave'
1429         * docs/buildbot.texinfo: same
1430         * README: same
1432         * docs/buildbot.texinfo: reimplement the "useful classes" index
1433         with actual texinfo indices. The .info rendering is a bit
1434         weird-looking but it works well, and the HTML rendering is quite
1435         nice. This also puts the index targets in the regular flow of the
1436         text, which is easier to maintain.
1438 2006-08-06  Brian Warner  <warner@lothar.com>
1440         * buildbot/slave/commands.py (ShellCommand.__init__): patch from
1441         Kevin Turner to prefer the environ= argument be a list rather than
1442         a string. If it is a list, it will be joined with a platform-local
1443         os.pathsep delimiter, and then prepended to any existing
1444         $PYTHONPATH value. This works better in cross-platform (i.e.
1445         windows buildslaves) environments when you need to push multiple
1446         directories onto the front of the path.
1447         (SlaveShellCommand): documented the new magic
1448         * docs/buildbot.texinfo (ShellCommand): documented the new magic
1449         in a user-visible form
1451         * buildbot/test/test_vc.py (BaseHelper.dovc): patch from Kevin
1452         Turner to prefer lists over strings when creating/running VC
1453         commands during unit tests. This is clearly necessary to survive
1454         vcexe containing spaces, like "C:\Program Files\darcs.exe". I
1455         renamed the wq() function to qw() though, since that's how it's
1456         spelled in perl. Eventually I'd prefer all commands to be
1457         specified with lists.
1459         * buildbot/slave/commands.py (LogFileWatcher): handle logfiles
1460         which are deleted (or not yet created) correctly. Also add
1461         failsafe code to not explode if the file-watching poller doesn't
1462         get started. Thanks to JP Calderone for the catch and the poller
1463         patch.
1464         * buildbot/test/test_shell.py (SlaveSide._testLogFiles): add test
1465         for that case
1466         * buildbot/test/emitlogs.py: same
1468         * NEWS: summarize recent changes
1470         * docs/buildbot.texinfo (Debug options): suggest an .ssh/options
1471         clause to avoid the "host key mismatch" warning
1473         * buildbot/process/step_twisted.py (Trial.start): if the
1474         buildslave is too old to understand logfiles=, fall back to
1475         running 'cat _trial_temp/test.log' like before.
1476         (Trial.commandComplete): same. this takes advantage of the
1477         LoggingBuildStep refactoring to stall commandComplete long enough
1478         to run a second RemoteShellCommand.
1480         * buildbot/process/step.py (LoggingBuildStep.startCommand):
1481         refactor command-completion handling, to allow methods like
1482         commandComplete/createSummary/evaluateCommand to return Deferreds.
1483         (LoggingBuildStep._commandComplete): delete the refactored method
1484         (ShellCommand.setupLogfiles): if the buildslave is too old to
1485         understand logfiles=, put a warning message both into twistd.log
1486         and into the otherwise empty user-visible LogFiles.
1488         * buildbot/process/step.py (LoggedRemoteCommand.useLog): allow
1489         callers to provide the slave-side logfile name, rather than
1490         forcing it to come from the local name of the LogFile.
1491         (BuildStep.getSlaveName): new method
1493         * buildbot/process/base.py (Build.getSlaveName): new method, so
1494         steps can find out which buildslave they're running on
1496         * buildbot/test/test_steps.py (Version.checkCompare): oops, update
1497         to match the s/cvs_ver/command_version/ change
1499 2006-08-05  Brian Warner  <warner@lothar.com>
1501         * buildbot/slave/commands.py (command_version): replace the CVS
1502         auto-updated cvs_ver keyword with a manually-updated variable,
1503         since CVS is no longer the master repository. Add a description of
1504         the remote API change starting in this version (2.1), specifically
1505         the fact that SlaveShellCommand now accepts 'initial_stdin',
1506         'keep_stdin_open', and 'logfiles'.
1508 2006-07-31  Brian Warner  <warner@lothar.com>
1510         * docs/buildbot.texinfo (System Architecture): Finally add lots of
1511         diagrams to describe how the whole system fits together. The
1512         images themselves are kept in SVG files, with ascii-art versions
1513         in corresponding .txt files. Texinfo knows how to interpolate the
1514         text version into .info files, reference the .png versions from
1515         .html files, and include .eps versions in the .ps format.
1516         * docs/images/Makefile: tools to create .png and .eps
1517         * docs/images/*.svg: created pictures with Inkscape.
1518         * .darcs-boring: ignore the generated .eps and .png files
1520 2006-07-24  Brian Warner  <warner@lothar.com>
1522         * buildbot/master.py (BuildMaster.loadConfig): check for duplicate
1523         Scheduler names, since they cause setServiceParent to explode
1524         later.
1525         * buildbot/test/test_config.py (ConfigTest._testSchedulers_7): test it
1527 2006-07-20  Brian Warner  <warner@lothar.com>
1529         * buildbot/scripts/sample.cfg: simplify the sample BuildFactory,
1530         which runs the buildbot unit tests
1532         * docs/buildbot.texinfo (Index of Useful Classes): add a table of
1533         classes that are useful in master.cfg
1535 2006-07-15  Brian Warner  <warner@lothar.com>
1537         * Makefile (some-apidocs): new target to build only some epydocs
1539         * setup.py: minor comment.. does the classifiers= argument prevent
1540         the setup.py script from working on python2.2/2.3?
1542         * buildbot/scripts/sample.cfg: update manhole example, arrange into
1543         major sections
1545         * buildbot/twcompat.py: fix minor typo in comments
1547         * buildbot/manhole.py: move all Manhole-related code out to this
1548         module. Implement SSH-based manholes (with TwistedConch), and move
1549         to conch's nifty line-editing syntax-coloring REPL shell instead
1550         of the boring non-editing monochromatic (and deprecated) old
1551         'telnet' protocol.
1552         * buildbot/master.py: remove all Manhole-related code
1553         (BuildMaster.loadConfig._add): make sure the old manhole is
1554         removed before we add the new one
1555         * docs/buildbot.texinfo (Debug options): document new Manhole options
1557         * buildbot/twcompat.py (_which): fix some epydoc issues
1558         * buildbot/status/html.py (Waterfall.__init__): same
1560 2006-06-29  Brian Warner  <warner@lothar.com>
1562         * buildbot/interfaces.py: get Interface from b.twcompat to hush
1563         deprecation warnings under newer Twisteds (by using
1564         zope.interface.Interface instead of old twisted.python.components
1565         stuff)
1566         * buildbot/slave/interfaces.py: same
1568 2006-06-28  Brian Warner  <warner@lothar.com>
1570         * buildbot/slave/commands.py (SVN): add --non-interactive to all
1571         svn commands, so it will fail immediately instead of hanging while
1572         it waits for a username/password to be typed in.
1574         * buildbot/slave/bot.py (SlaveBuilder.commandComplete): add minor
1575         log message if the step was shut down
1577         * buildbot/scripts/runner.py (SlaveOptions.longdesc): remove
1578         obsolete reference to mktap.
1580 2006-06-20  Brian Warner  <warner@lothar.com>
1582         * buildbot/test/test_steps.py (BuildStep.testShellCommand1): update
1583         test to include new 'logfiles' argument sent from master to slave
1585 2006-06-19  Brian Warner  <warner@lothar.com>
1587         * buildbot/process/step_twisted.py (Trial): track Progress from
1588         _trial_temp/test.log too
1590         * buildbot/process/step.py (OutputProgressObserver): generalize
1591         the earlier StdioProgressObserver into an OutputProgressObserver
1592         that can track LogFiles other than stdio.
1593         (LoggingBuildStep.__init__): same
1595         * buildbot/process/step_twisted.py (Trial): use logfiles= to track
1596         _trial_temp/test.log, not a separate 'cat' command. TODO: this
1597         will fail under windows because of os.sep issues. It might have
1598         worked before if 'cat' was doing cygwin path conversion.
1600         * buildbot/slave/commands.py (LogFileWatcher.__init__): note the
1601         creation of LogFileWatchers
1602         (ShellCommand._startCommand): and record the files that were
1603         watched in the 'headers' section of the ShellCommand output
1605         * buildbot/process/step.py (RemoteShellCommand.__init__): duh, you
1606         need to actually pass it to the slave if you want it to work.
1607         (ShellCommand): document it a bit
1609         * buildbot/test/test_shell.py: new test to validate LogFiles
1610         * buildbot/test/runutils.py (SlaveCommandTestBase): updates to
1611         test LogFiles
1612         * buildbot/test/emitlogs.py: enhance to wait for a line on stdin
1613         before printing the last batch of lines, to test that the polling
1614         logic is working properly
1616         * buildbot/process/step.py (LoggedRemoteCommand): improve LogFile
1617         handling, making it possible to track multiple logs for a single
1618         RemoteCommand. The previous single logfile is now known as the
1619         'stdio' log.
1620         (LoggedRemoteCommand.remoteUpdate): accept key='log' updates
1621         (RemoteShellCommand.__init__): accept logfiles=
1622         (LoggingBuildStep.startCommand): stdio_log is now one of many
1623         (ShellCommand): added logfiles= argument, as well as a class-level
1624         .logfiles attribute, which will be merged together to figure out
1625         which logfiles should be tracked. The latter maybe be useful for
1626         subclasses of ShellCommand which know they will aways produce
1627         secondary logfiles in the same location.
1629         * buildbot/slave/commands.py (ShellCommandPP): add writeStdin()
1630         and closeStdin() methods, preparing to make it possible to write
1631         to a ShellCommand's stdin at any time, not just at startup. These
1632         writes are buffered if the child process hasn't started yet.
1633         (LogFileWatcher): new helper class to watch arbitrary logfiles
1634         while a ShellCommand runs. This class polls the file every two
1635         seconds, and sends back 10k chunks to the buildmaster.
1636         (ShellCommand): rename stdin= to initialStdin=, and add
1637         keepStdinOpen= and logfiles= to arguments. Set up LogFileWatchers
1638         at startup.
1639         (ShellCommand.addLogfile): LogFile text is sent in updates with a
1640         key of "log" and a value of (logname, data).
1641         (SlaveShellCommand): add 'initial_stdin', 'keep_stdin_open', and
1642         'logfiles' to the master-visible args dictionary.
1643         (SourceBase.doPatch): match s/stdin/initialStdin/ change
1644         (CVS.start): same
1645         (P4.doVCFull): same
1646         * buildbot/test/test_vc.py (Patch.testPatch): same
1649         * buildbot/test/emit.py: write to a logfile in the current
1650         directory. We use this to figure out what was used as a basedir
1651         rather than looking to see which copy of emit.py gets run, so that
1652         we can run the commands from inside _trial_temp rather than inside
1653         buildbot/test
1654         * buildbot/test/subdir/emit.py: same
1655         * buildbot/test/runutils.py (FakeSlaveBuilder): take a 'basedir'
1656         argument rather than running from buildbot/test/
1657         (SlaveCommandTestBase.setUpBuilder): explicitly set up the Builder
1658         rather than using an implicit setUp()
1659         * buildbot/test/test_slavecommand.py (ShellBase.setUp): same
1660         (ShellBase.testShell1, etc): use explicit path to emit.py instead
1661         of assuming that we're running in buildbot/test/ (and that '.' is
1662         on our $PATH)
1664         * buildbot/slave/commands.py (Command.doStart): refactor Command
1665         startup/completion a bit: now the SlaveBuilder calls doStart(),
1666         which is not meant for overridding by subclasses, and doStart()
1667         calls start(), which is. Likewise the SlaveBuilder calls
1668         doInterrupt(), and subclasses override interrupt(). This also puts
1669         responsibility for maintaining .running in Command rather than in
1670         SlaveBuilder.
1671         (Command.doInterrupt): same
1672         (Command.commandComplete): same, this is called when the deferred
1673         returned by start() completes.
1674         * buildbot/slave/bot.py (SlaveBuilder.remote_startCommand): same
1675         (SlaveBuilder.remote_interruptCommand): same
1676         (SlaveBuilder.stopCommand): same
1678 2006-06-16  Brian Warner  <warner@lothar.com>
1680         * buildbot/test/test_shell.py: new test file to contain everything
1681         relating to ShellCommand
1682         (SlaveSide.testLogFiles): (todo) test for the upcoming "watch
1683         multiple logfiles in realtime" feature, not yet implemented
1684         * buildbot/test/emitlogs.py: support file for testLogFiles
1685         * docs/buildbot.texinfo (ShellCommand): document the feature
1687         * buildbot/test/test_steps.py (BuildStep.setUp): rmtree refactoring
1689         * buildbot/test/runutils.py (SlaveCommandTestBase): utility class
1690         for tests which exercise SlaveCommands in isolation.
1692         * buildbot/test/test_slavecommand.py: Move some utilities like
1693         SignalMixin and FakeSlaveBuilder from here ..
1694         * buildbot/test/runutils.py: .. to here, so they can be used by
1695         other test classes too
1696         * buildbot/test/test_vc.py: more SignalMixin refactoring
1697         * buildbot/test/test_control.py: same
1698         * buildbot/test/test_run.py: and some rmtree refactoring
1700 2006-06-15  Brian Warner  <warner@lothar.com>
1702         * buildbot/test/test_vc.py (P4.testCheckoutBranch): rename from
1703         'testBranch' to match other VC tests and have the tests run in
1704         roughly increasing order of dependency
1706         * buildbot/test/test_steps.py (LogObserver): new test to verify
1707         LogObservers can be created at various times and still get
1708         connected up properly
1710         * buildbot/test/runutils.py (setupBuildStepStatus): utility method
1711         to create BuildStepStatus instances that actually work.
1713         * buildbot/process/step.py (LogObserver): add outReceived and
1714         errReceived base methods, to be overridden
1716         * buildbot/status/builder.py (BuildStatus.addStepWithName): change
1717         API to take a name instead of a step, reducing the coupling
1718         somewhat. This returns the BuildStepStatus object so it can be
1719         passed to the new Step, instead of jamming it directly into the
1720         Step.
1721         * buildbot/process/step.py (BuildStep.setStepStatus): add a setter
1722         method
1723         * buildbot/process/base.py (Build.setupBuild): use both methods
1724         * buildbot/test/test_web.py (Logfile.setUp): rearrange the setup
1725         process a bit to match
1727 2006-06-14  Brian Warner  <warner@lothar.com>
1729         * docs/buildbot.texinfo (Adding LogObservers): add some limited
1730         docs on writing new LogObserver classes
1731         (Writing New Status Plugins): brief docs on how Status Plugins fit
1732         together
1734         * buildbot/process/step_twisted.py (TrialTestCaseCounter):
1735         implement a LogObserver that counts how many unit tests have been
1736         run so far
1737         (Trial.__init__): wire it in
1738         * buildbot/test/test_twisted.py (Counter): unit test for it
1740         * buildbot/process/step_twisted.py (HLint.commandComplete): update
1741         to new cmd.logs['stdio'] scheme
1742         (Trial.commandComplete): same
1743         (BuildDebs.commandComplete): same
1745         * buildbot/process/step.py (LoggedRemoteCommand): use a dict of
1746         LogFiles, instead of just a single one. The old single logfile is
1747         now called "stdio". LoggedRemoteCommand no longer creates a
1748         LogFile for you (the code to do that was broken anyway). If you
1749         don't create a "stdio" LogFile, then stdout/stderr will be
1750         discarded.
1751         (LogObserver): implement "LogObservers", which a BuildStep can add
1752         to parse the output of a command in real-time. The primary use is
1753         to provide more useful information to the Progress code, allowing
1754         better ETA estimates.
1755         (LogLineObserver): utility subclass which feeds complete lines to
1756         the parser instead of bytes.
1757         (BuildStep.progressMetrics): this is safer as a tuple
1758         (BuildStep.setProgress): utility method, meant to be called by
1759         LogObservers
1760         (BuildStep.addLogObserver): new method, to be called at any time
1761         during the BuildStep (even before any LogFiles have been created),
1762         to attach (or schedule for eventual attachment) a LogObserver to a
1763         LogFile.
1764         (StdioProgressObserver): new LogObserver which replaces the old
1765         "output" progress gatherer
1766         (LoggingBuildStep.__init__): same
1767         (LoggingBuildStep.startCommand): set up the "stdio" LogFile
1768         (LoggingBuildStep._commandComplete): must use logs['stdio']
1769         instead of the old single ".log" attribute.
1770         * buildbot/status/builder.py (LogFile): remove old logProgressTo
1771         functionality, now subsumed into StdioProgressObserver
1772         * buildbot/test/test_status.py (Subscription._testSlave_2): the
1773         log name changed from "output" to "stdio".
1776         * buildbot/interfaces.py (ILogFile): add the Interface used from
1777         the BuildStep towards the LogFile
1778         (ILogObserver): and the one provided by a LogObserver
1779         * buildbot/status/builder.py (LogFile): implement it
1781         * buildbot/interfaces.py (LOG_CHANNEL_*): move STDOUT / STDERR /
1782         HEADER constants here ..
1783         * buildbot/status/builder.py (STDOUT): .. from here
1785 2006-06-13  Brian Warner  <warner@lothar.com>
1787         * buildbot/test/test_p4poller.py (TestP4Poller.failUnlessIn): fix
1788         compatibility with python2.2, which doesn't have the 'substr in
1789         str' feature.
1790         (TestP4Poller.makeTime): utility function to construct the
1791         timestamp using the same strptime() approach as p4poller does. It
1792         turns out that time.mktime() behaves slightly differently under
1793         python2.2, probably something to do with the DST flag, and that
1794         causes the test to fail under python2.2. (changing the mktime()
1795         arguments to have dst=0 instead of -1 caused it to fail under
1796         python2.3. Go figure.)
1797         (TestP4Poller._testCheck3): use our makeTime() instead of mktime()
1799 2006-06-12  Brian Warner  <warner@lothar.com>
1801         * buildbot/process/step.py (P4): merge in patch SF#1473939, adding
1802         proper Perforce (P4) support. Many many thanks to Scott Lamb for
1803         contributing such an excellent patch, including docs and unit
1804         tests! This makes it *so* much easier to apply. I had to update
1805         test_vc.py to handle some recent refactorings, but everything else
1806         applied smoothly. The only remaining thing I'd like to fix would
1807         be to remove the hard-wired port 1666 used by p4d, and allow it to
1808         claim any unused port. This would allow two copies of the test
1809         suite to run on the same host at the same time, as well as
1810         allowing the test suite to run while a real (production) p4d was
1811         running on the same host. Oh, and maybe we should add a warning to
1812         step.P4 that gets emitted if the slave is too old to provide the
1813         'p4' SlaveCommand. Otherwise it looks great. (closes: SF#1473939).
1814         * buildbot/slave/commands.py (P4): same
1815         (P4Sync): same, some minor updates
1816         * buildbot/changes/p4poller.py: same
1817         * docs/buildbot.texinfo: same
1818         * buildbot/test/test_p4poller.py: same
1819         * buildbot/test/test_vc.py (P4): same
1821         * setup.py: add Trove classifiers for PyPI
1823 2006-06-08  Brian Warner  <warner@allmydata.com>
1825         * buildbot/status/client.py
1826         (RemoteBuilder.remote_getCurrentBuilds): oops, I screwed up when
1827         changing this from getCurrentBuild() to getCurrentBuilds(). Each
1828         build needs to be IRemote'd separately, rather than IRemote'ing
1829         the whole list at once. I can't wait until newpb's serialization
1830         adapters make this unnecessary.
1832 2006-06-06  Brian Warner  <warner@lothar.com>
1834         * buildbot/process/step.py (WithProperties): make this inherit
1835         from ComparableMixin, so that reloading an unchanged config file
1836         doesn't cause us to spuriously reload any Builders which use them.
1837         * buildbot/test/test_config.py (ConfigTest.testWithProperties):
1838         add a test for it
1840 2006-06-03  Brian Warner  <warner@lothar.com>
1842         * contrib/windows/{setup.py, buildbot_service.py}: add support for
1843         running py2exe on windows, contributed by Mark Hammond. Addresses
1844         SF#1401121, but I think we still need to include
1845         buildbot/scripts/sample.cfg
1846         * setup.py: include buildbot_service.py as a script under windows
1847         * buildbot/status/html.py: when sys.frozen (i.e. we're running in
1848         a py2exe application), get the icon/css datafiles from a different
1849         place than usual.
1851         * buildbot/status/mail.py (MailNotifier.buildMessage): don't
1852         double-escape the build URL. Thanks to Olivier Bonnet for the
1853         patch. Fixes SF#1452801.
1855 2006-06-02  Brian Warner  <warner@lothar.com>
1857         * contrib/svn_buildbot.py (ChangeSender.getChanges): ignore the
1858         first six columns of 'svnlook' output, not just the first column,
1859         since property changes appear in the other five. Thanks to Olivier
1860         Bonnet for the patch. Fixes SF#1398174.
1862 2006-06-01  Brian Warner  <warner@lothar.com>
1864         * buildbot/test/test_web.py (Logfile.setUp): set the .reason on
1865         the fake build, so that title= has something to be set to
1867         * buildbot/status/html.py (BuildBox.getBox): set the 'title='
1868         attribute of the "Build #NN" link in the yellow start-the-build
1869         box to the build's reason. This means that you get a little
1870         tooltip explaining why the build was done when you hover over the
1871         yellow box. Thanks to Zandr Milewski for the suggestion.
1873         * buildbot/clients/gtkPanes.py (Box.setColor): ignore color=None
1874         (Box.setETA): handle ETA=None (by stopping the timer)
1875         (Box.update): make the [soon] text less different than the usual
1876         text, so the rest of the text doesn't flop around so much. It
1877         would be awfully nice to figure out how to center this stuff.
1878         (ThreeRowBuilder.stepETAUpdate): more debugging printouts
1880         * buildbot/process/step.py (ShellCommand): set flunkOnFailure=True
1881         by default, so that any ShellCommand which fails marks the overall
1882         build as a failure. I should have done this from the beginning.
1883         Add flunkOnFailure=False to the arguments if you want to turn off
1884         this behavior.
1886 2006-05-30  Brian Warner  <warner@lothar.com>
1888         * buildbot/clients/gtkPanes.py: add a third row: now it shows
1889         last-build/current-build/current-step. Show what step is currently
1890         running. Show ETA for both the overall build and the current step.
1891         Update GTK calls to modern non-deprecated forms. There's still a
1892         lot of dead code and debug noise to remove.
1894         * buildbot/process/step_twisted.py (Trial): set the step name, so it
1895         shows up properly in status displays
1897 2006-05-28  Brian Warner  <warner@lothar.com>
1899         * buildbot/test/test_properties.py (Run.testInterpolate): on the
1900         build we use to verify that WithProperties works:
1902         ** set flunkOnFailure=True so that build failures get noticed
1903         ** set workdir='.' so that the build succeeds, otherwise it is trying
1904             to touch 'build/something', and 'build/' doesn't exist because
1905             usually that's created by a Source step
1906         ** set timeout=10, because Twisted-1.3.0 has a race condition that
1907             this test somehow triggers, in which the 'touch' process becomes
1908             a zombie and we wait for th etimeout before giving up on it.
1910         * buildbot/test/runutils.py (RunMixin.logBuildResults): utility method
1911         to log the Build results and step logs to the twisted log.
1912         (RunMixin.failUnlessBuildSucceeded): use logBuildResults to record
1913         what went wrong if a build was expected to succeed but didn't.
1915         * buildbot/process/step_twisted.py (Trial): set the default
1916         trialMode to '--reporter=bwverbose', which specifies verbose
1917         black-and-white text. Back in twisted-1.3/2.0 days we had to use
1918         '-to', but those are completely missing in modern Twisteds.
1920         * buildbot/scripts/sample.cfg: make the sample Manhole config use
1921         a localhost-only port, to encourage better security
1923         * docs/buildbot.texinfo (Change Sources): mention
1924         darcs_buildbot.py
1926         * .darcs-boring: add a Darcs boringfile
1928         * README (REQUIREMENTS): stop claiming compatibility with
1929         Twisted-1.3.0
1931         * contrib/darcs_buildbot.py: write a darcs-commit-hook change
1932         sender
1934 2006-05-27  Brian Warner  <warner@lothar.com>
1936         * buildbot/__init__.py: bump to 0.7.3+ while between releases
1937         * docs/buildbot.texinfo: same
1939 2006-05-23  Brian Warner  <warner@lothar.com>
1941         * buildbot/__init__.py (version): Releasing buildbot-0.7.3
1942         * docs/buildbot.texinfo: set version to match
1943         * NEWS: update for 0.7.3
1945         * docs/buildbot.texinfo (Change Sources): mention hg_buildbot.py,
1946         give a quick mapping from VC system to possible ChangeSources
1947         (Build Properties): add 'buildername'
1949         * buildbot/process/base.py (Build.setupStatus): oops, set
1950         'buildername' and 'buildnumber' properties
1951         * buildbot/test/test_properties.py (Interpolate.testBuildNumber):
1952         test them
1954 2006-05-22  Brian Warner  <warner@lothar.com>
1956         * docs/buildbot.texinfo (Build Properties): explain the syntax of
1957         property interpolation better
1959         * README (INSTALLATION): remove old '-v' argument from recommended
1960         trial command line
1962         * docs/buildbot.texinfo (ShellCommand): add docs for description=
1963         and descriptionDone= arguments. Thanks to Niklaus Giger for the
1964         patch. SF#1475494.
1966         * buildbot/slave/commands.py (SVN.parseGotRevision._parse): use
1967         'svnversion' instead of grepping the output of 'svn info', much
1968         simpler and avoids CR/LF problems on windows. Thanks to Olivier
1969         Bonnet for the suggestion.
1970         (SVN.parseGotRevision): oops, older verisons of 'svnversion'
1971         require the WC_PATH argument, so run 'svnversion .' instead.
1973         * buildbot/interfaces.py (IChangeSource): methods in Interfaces
1974         aren't supposed to have 'self' in their argument list
1976 2006-05-21  Brian Warner  <warner@lothar.com>
1978         * buildbot/process/step.py (ShellCommand.start): make
1979         testInterpolate pass. I was passing the uninterpolated command to
1980         the RemoteShellCommand constructor
1981         (ShellCommand._interpolateProperties): oops, handle non-list
1982         commands (i.e. strings with multiple words separated by spaces in
1983         them) properly, instead of forgetting about them.
1985         * buildbot/test/test_properties.py (Run.testInterpolate): new test
1986         to actually try to use build properties in a real build. This test
1987         fails.
1988         * buildbot/test/runutils.py (RunMixin.requestBuild): utility methods
1989         to start and evaluate builds
1991         * buildbot/test/test__versions.py: add a pseudo-test to record
1992         what version of Twisted/Python/Buildbot are running. This should
1993         show up at the beginning of _trial_tmp/test.log, and exists to help
1994         debug other problems.
1996         * buildbot/status/html.py (Waterfall): add 'robots_txt=' argument,
1997         a filename to be served as 'robots.txt' to discourage web spiders.
1998         Adapted from a patch by Tobi Vollebregt, thanks!
1999         * buildbot/test/test_web.py (Waterfall._test_waterfall_5): test it
2000         (Waterfall.test_waterfall): tweak the way that filenames are put
2001         into the config file, to accomodate windows pathnames better.
2003         * docs/buildbot.texinfo (HTML Waterfall): document it
2005         * buildbot/process/process_twisted.py
2006         (QuickTwistedBuildFactory.__init__): recent versions of Twisted
2007         changed the build process. The new setup.py no longer takes the
2008         'all' argument.
2009         (FullTwistedBuildFactory.__init__): same
2010         (TwistedReactorsBuildFactory.__init__): same
2012         * contrib/hg_buildbot.py: wrote a commit script for mercurial, to
2013         be placed in the [hooks] section of the central repository (the
2014         one that everybody pushes changes to).
2016 2006-05-20  Brian Warner  <warner@lothar.com>
2018         * buildbot/slave/commands.py (Darcs.doVCFull): when writing the
2019         .darcs-context file, use binary mode. I think this was causing a
2020         Darcs failure under windows.
2022 2006-05-19  Brian Warner  <warner@lothar.com>
2024         * buildbot/scripts/tryclient.py (CVSExtractor.getBaseRevision):
2025         use a timezone string of +0000 and gmtime, since this timestamp is
2026         sent to a buildmaster and %z is broken.
2028         * buildbot/test/test_vc.py (CVSHelper.getdate): use no timezone
2029         string and localtime, since this timestamp will only be consumed
2030         locally, and %z is broken.
2032         * buildbot/slave/commands.py (CVS.parseGotRevision): use +0000 and
2033         gmtime, since this timestamp is returned to the buildmaster, and
2034         %z is broken.
2036 2006-05-18  Brian Warner  <warner@lothar.com>
2038         * NEWS: update in preparation for next release
2040         * buildbot/test/test_vc.py (VCS_Helper): factor out all the
2041         setup-repository and do-we-have-the-vc-tools code into a separate
2042         "helper" class, which sticks around in a single module-level
2043         object. This seems more likely to continue to work in the future
2044         than having it hide in the TestCase and hope that TestCases stick
2045         around for a long time.
2047         * buildbot/test/test_vc.py (MercurialSupport.vc_create): 'hg
2048         addremove' has been deprecated in recent versions of mercurial, so
2049         use 'hg add' instead
2051 2006-05-07  Brian Warner  <warner@lothar.com>
2053         * buildbot/scheduler.py (Try_Jobdir.messageReceived): when
2054         operating under windows, move the file before opening it, since
2055         you can't rename a file that somebody has open.
2057         * buildbot/process/base.py (Build.setupBuild): if something goes
2058         wrong while creating a Step, log the name and arguments, since the
2059         error message when you get the number of arguments wrong is really
2060         opaque.
2062 2006-05-06  Brian Warner  <warner@lothar.com>
2064         * buildbot/process/step_twisted.py (Trial.setupEnvironment): more
2065         bugs in twisted-specific code not covered by my unit tests, this
2066         time use 'cmd' argument instead of self.cmd
2068         * buildbot/process/process_twisted.py (TwistedBuild.isFileImportant):
2069         fix stupid braino: either use startwith or find()==0, not both.
2070         (TwistedReactorsBuildFactory.__init__): another dumb typo
2072         * buildbot/test/test_slavecommand.py (ShellBase.testInterrupt1): 
2073         mark this test as TODO under windows, since process-killing seems
2074         dodgy there. We'll come back to this later and try to fix it
2075         properly.
2077         * buildbot/test/test_vc.py (CVSSupport.getdate): use localtime,
2078         and don't include a timezone
2079         (CVSSupport.vc_try_checkout): stop trying to strip the timezone.
2080         This should avoid the windows-with-verbose-timezone-name problem
2081         altogether.
2082         (Patch.testPatch): add a test which runs 'patch' with less
2083         overhead than the full VCBase.do_patch sequence, to try to isolate
2084         a windows test failure. This one uses slave.commands.ShellCommand
2085         and 'patch', but none of the VC code.
2087         * buildbot/slave/commands.py (getCommand): use which() to find the
2088         executables for 'cvs', 'svn', etc. This ought to help under
2089         windows.
2091         * buildbot/test/test_vc.py (VCBase.do_getpatch): Delete the
2092         working directory before starting. If an earlier test failed, the
2093         leftover directory would mistakenly flunk a later test.
2094         (ArchCommon.registerRepository): fix some tla-vs-baz problems.
2095         Make sure that we use the right commandlines if which("tla") picks
2096         up "tla.exe" (as it does under windows).
2097         (TlaSupport.do_get): factor out this tla-vs-baz difference
2098         (TlaSupport.vc_create): more tla-vs-baz differences
2100         * buildbot/test/test_slavecommand.py
2101         (ShellBase.testShellMissingCommand): stop trying to assert
2102         anything about the error message: different shells on different
2103         OSes with different languages makes it hard, and it really isn't
2104         that interesting of a thing to test anyway.
2106         * buildbot/test/test_vc.py (CVSSupport.capable): skip CVS tests if
2107         we detect cvs-1.10 (which is the version shipped with OS-X 10.3
2108         "Panther"), because it has a bug which flunks a couple tests in
2109         weird ways. I've checked that cvs-1.12.9 (as shipped with debian)
2110         is ok. OS-X 10.4 "Tiger" ships with cvs-1.11, but I haven't been
2111         able to test that yet.
2113 2006-04-30  Brian Warner  <warner@lothar.com>
2115         * buildbot/test/test_vc.py (VCBase.runCommand): set $LC_ALL="C" to
2116         make sure child commands emit messages in english, so our regexps
2117         will match. Thanks to Nikaus Giger for identifying the problems.
2118         (VCBase._do_vctest_export_1): mode="export" is not responsible
2119         for setting the "got_revision" property, since in many cases it is
2120         not convenient to determine.
2121         (SVNSupport.capable): when running 'svn --version' to check for
2122         ra_local, we want error messages in english
2123         * buildbot/test/test_slavecommand.py 
2124         (ShellBase.testShellMissingCommand): set $LC_ALL="C" to get bash
2125         to emit the error message in english
2127         * buildbot/slave/commands.py (SourceBase.setup): stash a copy of
2128         the environment with $LC_ALL="C" so that Commands which need to
2129         parse the output of their child processes can obtain it in
2130         english.
2131         (SVN.parseGotRevision): call "svn info" afterwards instead of
2132         watching the output of the "svn update" or "svn checkout".
2133         (Darcs.parseGotRevision): use $LC_ALL="C" when running the command
2134         (Arch.parseGotRevision): same
2135         (Bazaar.parseGotRevision): same
2136         (Mercurial.parseGotRevision): same
2138         * buildbot/scripts/tryclient.py (SourceStampExtractor.dovc): set
2139         $LC_ALL="C" when running commands under 'buildbot try', too
2141         * buildbot/test/__init__.py: remove the global os.environ()
2142         setting, instead we do it just for the tests that run commands and
2143         need to parse their output.
2145         * buildbot/test/test_scheduler.py (Scheduling.testTryJobdir):
2146         remove the overly-short .timeout on this test, because non-DNotify
2147         platforms must fall back to polling which happens at 10 second
2148         intervals, so a 5 second timeout would never succeed.
2150 2006-04-24  Brian Warner  <warner@lothar.com>
2152         * docs/buildbot.texinfo (Installing the code): update trial
2153         invocation, SF#1469116 by Niklaus Giger.
2154         (Attributes of Changes): updated branch-name examples to be
2155         a bit more realistic, SF#1475240 by Stephen Davis.
2157         * contrib/windows/buildbot2.bat: utility wrapper for windows
2158         developers, contributed by Nick Trout (after a year of neglect..
2159         sorry!). SF#1194231.
2161         * buildbot/test/test_vc.py (*.capable): store the actual VC
2162         binary's pathname in VCS[vcname], so it can be retrieved later
2163         (CVSSupport.vc_try_checkout): incorporate Niklaus Giger's patch to
2164         strip out non-numeric timezone information, specifically the funky
2165         German string that his system produced that confuses CVS.
2166         (DarcsSupport.vc_create): use dovc() instead of vc(), this should
2167         allow Darcs tests to work on windows
2168         * buildbot/scripts/tryclient.py (SourceStampExtractor): use
2169         procutils.which() everywhere, to allow tryclient to work under
2170         windows. Also from Niklaus Giger, SF#1463394.
2172         * buildbot/twcompat.py (which): move the replacement for a missing
2173         twisted.python.procutils.which from test_vc.py to here, so it can
2174         be used in other places too (specifically tryclient.py)
2176 2006-04-23  Brian Warner  <warner@lothar.com>
2178         * buildbot/status/html.py (StatusResourceBuild.body): replace the
2179         bare buildbotURL/projectName line with a proper DIV, along with a
2180         CSS class of "title", from Stefan Seefeld (SF#1461675).
2181         (WaterfallStatusResource.body0): remove the redundant 'table'
2182         class from the table
2183         (WaterfallStatusResource.body): same. Also add class="LastBuild"
2184         to the top-row TR, and class="Activity" to the second-row TR,
2185         rather than putting them in the individual TD nodes.
2187         * buildbot/test/test_vc.py (VCBase.checkGotRevision): test
2188         'got_revision' build property for all VC systems that implement
2189         accurate ones: SVN, Darcs, Arch, Bazaar, Mercurial.
2191         * buildbot/slave/commands.py (SourceBase._handleGotRevision): try
2192         to determine which revision we actually obtained
2193         (CVS.parseGotRevision): implement this for CVS, which just means
2194         to grab a timestamp. Not ideal, and it depends upon the buildslave
2195         having a clock that is reasonably well syncronized with the server,
2196         but it's better than nothing.
2197         (SVN.parseGotRevision): implement it for SVN, which is accurate
2198         (Darcs.parseGotRevision): same
2199         (Arch.parseGotRevision): same
2200         (Bazaar.parseGotRevision): same
2201         (Mercurial.parseGotRevision): same
2203         * buildbot/process/step.py (LoggedRemoteCommand.remoteUpdate):
2204         keep a record of all non-stdout/stderr/header/rc status updates,
2205         for the benefit of RemoteCommands that send other useful things,
2206         like got_revision
2207         (Source.commandComplete): put any 'got_revision' status values
2208         into a build property of the same name
2211         * buildbot/process/step_twisted.py (Trial): update to deal with
2212         new ShellCommand refactoring
2214         * docs/buildbot.texinfo (Build Properties): document new feature
2215         that allows BuildSteps to get/set Build-wide properties like which
2216         revision was requested and/or checked out.
2218         * buildbot/interfaces.py (IBuildStatus.getProperty): new method
2219         * buildbot/status/builder.py (BuildStatus.getProperty): implement
2220         it. Note that this bumps the persistenceVersion of the saved Build
2221         object, so add the necessary upgrade-old-version logic to include
2222         an empty properties dict.
2224         * buildbot/process/base.py (Build.setProperty): implement it
2225         (Build.getProperty): same
2226         (Build.startBuild): change build startup to set 'branch',
2227         'revision', and 'slavename' properties at the right time
2229         * buildbot/process/step.py (BuildStep.__init__): change setup to
2230         require 'build' argument in a better way
2231         (LoggingBuildStep): split ShellCommand into two pieces, for better
2232         subclassing elsewhere. LoggingBuildStep is a BuildStep which runs
2233         a single RemoteCommand that sends stdout/stderr status text. It
2234         also provides the usual commandComplete / createSummary /
2235         evaluateCommand / getText methods to be overridden...
2236         (ShellCommand): .. whereas ShellCommand is specifically for
2237         running RemoteShellCommands. Other shell-like BuildSteps (like
2238         Source) can inherit from LoggingBuildStep instead of ShellCommand
2239         (WithProperties): marker class to do build-property interpolation
2240         (Source): inherit from LoggingBuildStep instead of ShellCommand
2241         (RemoteDummy): same
2243         * buildbot/test/test_properties.py: test new functionality
2245 2006-04-21  Brian Warner  <warner@lothar.com>
2247         * buildbot/test/test_vc.py: rename testBranch to
2248         testCheckoutBranch to keep the tests in about the right
2249         alphabetical order
2251 2006-04-18  Brian Warner  <warner@lothar.com>
2253         * docs/buildbot.texinfo (PBListener): improve cross-references
2254         between PBListener and 'buildbot statusgui', thanks to John Pye
2255         for the suggestion.
2257 2006-04-17  Brian Warner  <warner@lothar.com>
2259         * buildbot/twcompat.py (maybeWait): handle SkipTest properly when
2260         running under Twisted-1.3.0, otherwise skipped tests are reported
2261         as errors.
2263         * all: use isinstance() instead of 'type(x) is foo', suggested by
2264         Neal Norwitz
2266         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
2267         oops, fix a brain-fade from the other week, when making the
2268         addStep changes. I changed all the __init__ upcalls to use the
2269         wrong superclass name.
2270         (FullTwistedBuildFactory.__init__): same
2271         (TwistedDebsBuildFactory.__init__): same
2272         (TwistedReactorsBuildFactory.__init__): same
2273         (TwistedBuild.isFileImportant): use .startswith for clarity,
2274         thanks to Neal Norwitz for the suggestions.
2276         * contrib/viewcvspoll.py: script to poll a viewcvs database for
2277         changes, then deliver them over PB to a remote buildmaster.
2279         * contrib/svnpoller.py: added script by John Pye to poll a remote
2280         SVN repository (by running 'svn log') from a cronjob, and run
2281         'buildbot sendchange' to deliver the changes to a remote
2282         buildmaster.
2283         * contrib/svn_watcher.py: added script by Niklaus Giger (a
2284         modification of svnpoller.py), same purpose, but this one loops
2285         internally (rather than expecting to run from a cronjob) and works
2286         under windows.
2287         * contrib/README.txt: same
2289 2006-04-11  Brian Warner  <warner@lothar.com>
2291         * all: fix a number of incorrect names and missing imports, thanks
2292         to Anthony Baxter for the patch.
2293         * buildbot/status/html.py (WaterfallStatusResource.statusToHTML): 
2294         remove unused buggy method.
2295         * buildbot/status/builder.py (BuildStatus.saveYourself): rmtree
2296         comes from shutil, not "shutils"
2297         * buildbot/process/step.py (TreeSize.evaluateCommand): fix bad name
2298         (Arch.checkSlaveVersion): same
2299         * buildbot/process/step_twisted.py (Trial.commandComplete): same, in
2300         some disabled code
2301         * buildbot/process/step_twisted2.py: add some missing imports
2302         * buildbot/twcompat.py (_deferGenerator): fix cut-and-paste error,
2303         this code used to live in twisted.internet.defer
2305 2006-04-10  Brian Warner  <warner@lothar.com>
2307         * buildbot/process/step.py (Mercurial): add Mercurial support
2308         * buildbot/slave/commands.py (Mercurial): same
2309         * buildbot/scripts/tryclient.py (MercurialExtractor): same
2310         * buildbot/test/test_vc.py (Mercurial): same, checkout over HTTP is
2311         not yet tested, but 'try' support *is* covered
2312         * docs/buildbot.texinfo (Mercurial): document it
2314         * buildbot/process/step.py (LoggedRemoteCommand.remoteUpdate): add
2315         some debugging messages (turned off)
2316         * buildbot/test/test_vc.py: improve debug messages
2318 2006-04-07  Brian Warner  <warner@lothar.com>
2320         * buildbot/test/test_vc.py (which): define our own which() in case
2321         we can't import twisted.python.procutils, because procutils doesn't
2322         exist in Twisted-1.3
2324         * docs/buildbot.texinfo (Interlocks): fix some typos, mention use
2325         of SlaveLocks for performance tests
2327         * docs/examples/twisted_master.cfg: update to match current usage
2329         * buildbot/changes/p4poller.py (P4Source): add new arguments:
2330         password, p4 binary, pollinterval, maximum history to check.
2331         Patch from an anonymous sf.net contributor, SF#1219384.
2332         * buildbot/process/step.py (P4Sync.__init__): add username,
2333         password, and client arguments.
2334         * buildbot/slave/commands.py (P4Sync): same
2336 2006-04-05  Brian Warner  <warner@lothar.com>
2338         * buildbot/process/factory.py (BuildFactory.addStep): new method
2339         to add steps to a BuildFactory. Use it instead of f.steps.append,
2340         and you can probably avoid using the s() convenience function.
2341         Patch from Neal Norwitz, sf.net #1412605.
2342         (other): update all factories to use addStep
2343         * buildbot/process/process_twisted.py: update all factories to use
2344         addStep.
2346 2006-04-03  Brian Warner  <warner@lothar.com>
2348         * buildbot/test/test_vc.py: modified find-the-VC-command logic to
2349         work under windows too. Adapted from a patch by Niklaus Giger,
2350         addresses SF#1463399.
2352         * buildbot/test/__init__.py: set $LANG to 'C', to insure that
2353         spawned commands emit parseable results in english and not some
2354         other language. Patch from Niklaus Giger, SF#1463395.
2356         * README (INSTALLATION): discourage users from running unit tests on
2357         a "network drive", patch from Niklaus Giger, SF#1463394.
2359 2006-03-22  Brian Warner  <warner@lothar.com>
2361         * contrib/svn_buildbot.py: rearrange, add an easy-to-change
2362         function to turn a repository-relative pathname into a (branch,
2363         branch-relative-filename) tuple. Change this function to handle
2364         the branch naming policy used by your Subversion repository.
2365         Thanks to AllMyData.com for sponsoring this work.
2367 2006-03-16  Brian Warner  <warner@lothar.com>
2369         * buildbot/scripts/sample.cfg: add python-mode declaration for
2370         vim. Thanks to John Pye for the patch.
2372         * docs/buildbot.texinfo (Launching the daemons): fix @reboot job
2373         command line, mention the importance of running 'crontab' as the
2374         buildmaster/buildslave user. Thanks to John Pye for the catch.
2376 2006-03-13  Brian Warner  <warner@lothar.com>
2378         * buildbot/status/words.py (IRC): add an optional password=
2379         argument, which will be sent to Nickserv in an IDENTIFY message at
2380         login, to claim the nickname. freenode requires this before the
2381         bot can sent (or reply to) private messages. Thanks to Clement
2382         Stenac for the patch.
2383         * docs/buildbot.texinfo (IRC Bot): document it
2385         * buildbot/status/builder.py (LogFile.merge): don't write chunks
2386         larger than chunkSize. Fixes SF#1349253.
2387         * buildbot/test/test_status.py (Log.testLargeSummary): test it
2388         (Log.testConsumer): update to match new internal chunking behavior
2390 2006-03-12  Brian Warner  <warner@lothar.com>
2392         * buildbot/test/test_vc.py: remove the last use of waitForDeferred
2394         * buildbot/test/test_maildir.py (MaildirTest): rename the
2395         'timeout' method, as it collides with trial's internals
2397         * buildbot/scripts/runner.py: add 'buildbot restart' command
2398         (stop): don't sys.exit() out of here, otherwise restart can't work
2399         * docs/buildbot.texinfo (Shutdown): document it
2401         * buildbot/buildset.py (BuildSet.__init__): clean up docstring
2402         * buildbot/status/html.py (Waterfall.__init__): same
2403         * buildbot/process/builder.py (Builder.startBuild): same
2404         * buildbot/process/base.py (BuildRequest): same
2405         * buildbot/sourcestamp.py (SourceStamp): same
2406         * buildbot/scheduler.py (Nightly): same
2408         * buildbot/__init__.py (version): bump to 0.7.2+ while between
2409         releases
2410         * docs/buildbot.texinfo: same
2412 2006-02-17  Brian Warner  <warner@lothar.com>
2414         * buildbot/__init__.py (version): Releasing buildbot-0.7.2
2415         * docs/buildbot.texinfo: set version number to match
2416         * NEWS: update for 0.7.2
2418 2006-02-16  Brian Warner  <warner@lothar.com>
2420         * docs/buildbot.texinfo (Build Dependencies): add cindex tag
2422 2006-02-09  Brian Warner  <warner@lothar.com>
2424         * docs/buildbot.texinfo (How Different VC Systems Specify Sources):
2425         add text to explain per-build branch parameters
2426         * NEWS: mention --umask
2428 2006-02-08  Brian Warner  <warner@lothar.com>
2430         * buildbot/scripts/runner.py (Maker.makeSlaveTAC): remove unused
2431         method
2432         (SlaveOptions.optParameters): add --umask, to make it possible to
2433         make buildslave-generated files (including build products) be
2434         world-readable
2435         (slaveTAC): same
2436         * buildbot/slave/bot.py (BuildSlave.startService): same
2438 2006-01-23  Brian Warner  <warner@lothar.com>
2440         * buildbot/status/builder.py: urllib.quote() all URLs that include
2441         Builder names, so that builders can include characters like '/'
2442         and ' ' without completely breaking the resulting HTML. Thanks to
2443         Kevin Turner for the patch.
2444         * buildbot/status/html.py: same
2445         * buildbot/test/test_web.py (GetURL.testBuild): match changes
2447         * NEWS: update in preparation for upcoming release
2449 2006-01-18  Brian Warner  <warner@lothar.com>
2451         * docs/examples/twisted_master.cfg: update to match the Twisted
2452         buildbot: remove python2.2, switch to exarkun's buildslaves,
2453         disable the .deb builder until we figure out how to build twisted
2454         .debs from SVN, add some ktrace debugging to the OS-X build
2455         process and remove the qt build, remove threadless builders,
2456         change freebsd builder to use landonf's buildslave.
2458 2006-01-12  Brian Warner  <warner@lothar.com>
2460         * buildbot/master.py (Manhole.__init__): let port= be a strports
2461         specification string, but handle a regular int for backwards
2462         compatibility. This allows "tcp:12345:interface=127.0.0.1" to be
2463         used in master.cfg to limit connections to just the local host.
2464         (BuildMaster.loadConfig): same for c['slavePortnum']
2465         * buildbot/scheduler.py (Try_Userpass.__init__): same
2466         * buildbot/status/client.py (PBListener.__init__): same
2467         * buildbot/status/html.py (Waterfall.__init__): same, for both
2468         http_port and distrib_port. Include backwards-compatibility checks
2469         so distrib_port can be a filename string and still mean unix:/foo
2470         * docs/buildbot.texinfo (Setting the slaveport): document it
2471         (Debug options): same
2472         (HTML Waterfall): same
2473         (PBListener): same
2474         (try): same
2475         * buildbot/test/test_config.py (ConfigTest): test it
2477         * buildbot/master.py (BuildMaster.loadConfig): wait for the
2478         slaveport's disownServiceParent deferred to fire before opening
2479         the new one. Fixes an annoying bug in the unit tests.
2481 2006-01-03  Brian Warner  <warner@lothar.com>
2483         * buildbot/master.py (BuildMaster): remove the .schedulers
2484         attribute, replacing it with an allSchedulers() method that looks
2485         for all IService children that implement IScheduler. Having only
2486         one parent/child relationship means fewer opportunities for bugs.
2487         (BuildMaster.allSchedulers): new method
2488         (BuildMaster.loadConfig_Schedulers): update to use allSchedulers,
2489         also fix ugly bug that caused any config-file reload to
2490         half-forget about the earlier Schedulers, causing an exception
2491         when a Change arrived and was handed to a half-connected
2492         Scheduler. The exception was in scheduler.py line 54ish:
2493           self.parent.submitBuildSet(bs)
2494           exceptions.AttributeError: 'NoneType' object has no attribute
2495           'submitBuildSet'
2496         (BuildMaster.addChange): update to use allSchedulers()
2498         * buildbot/scheduler.py (BaseScheduler.__implements__): fix this
2499         to work properly with twisted-1.3.0, where you must explicitly
2500         include the __implements__ from parent classes
2501         (BaseScheduler.__repr__): make it easier to distinguish distinct
2502         instances
2503         (BaseUpstreamScheduler.__implements__): same
2505         * buildbot/status/builder.py (Status.getSchedulers): update to
2506         use allSchedulers()
2507         * buildbot/test/test_run.py (Run.testMaster): same
2508         * buildbot/test/test_dependencies.py (Dependencies.findScheduler): same
2509         * buildbot/test/test_config.py (ConfigTest.testSchedulers): same,
2510         make sure Scheduler instances are left alone when an identical
2511         config file is reloaded
2512         (ConfigElements.testSchedulers): make sure Schedulers are properly
2513         comparable
2515         * Makefile (TRIALARGS): my local default Twisted version is now
2516         2.1.0, update the trial arguments accordingly
2518 2005-12-22  Brian Warner  <warner@lothar.com>
2520         * docs/examples/twisted_master.cfg: merge changes from pyr: add
2521         new win32 builders
2523         * buildbot/scheduler.py (BaseScheduler.addChange): include a dummy
2524         addChange in the parent class, although I suspect this should be
2525         fixed better in the future.
2527 2005-11-26  Brian Warner  <warner@lothar.com>
2529         * buildbot/scheduler.py (AnyBranchScheduler.addChange): don't
2530         explode when branch==None, thanks to Kevin Turner for the catch
2531         * buildbot/test/test_scheduler.py (Scheduling.testAnyBranch): test
2532         it
2534         * buildbot/__init__.py (version): bump to 0.7.1+ while between
2535         releases
2536         * docs/buildbot.texinfo: same
2538 2005-11-26  Brian Warner  <warner@lothar.com>
2540         * buildbot/__init__.py (version): Releasing buildbot-0.7.1
2541         * docs/buildbot.texinfo: set version number to match
2543 2005-11-26  Brian Warner  <warner@lothar.com>
2545         * NEWS: update for 0.7.1
2547         * buildbot/status/builder.py (BuildStepStatus.unsubscribe): make
2548         sure that unsubscribe works even if we never sent an ETA update.
2549         Also, don't explode on duplicate unsubscribe.
2550         (BuildStepStatus.addLog): make the convenience "return self"-added
2551         watcher automatically unsubscribe when the Step finishes.
2552         (BuildStatus.unsubscribe): same handle-duplicate-unsubscribe
2553         (BuildStatus.stepStarted): same auto-unsubscribe
2554         (BuilderStatus.buildStarted): same auto-unsubscribe
2556         * buildbot/interfaces.py (IStatusReceiver.buildStarted): document
2557         auto-unsubscribe
2558         (IStatusReceiver.stepStarted): same
2559         (IStatusReceiver.logStarted): same
2561         * buildbot/test/test_run.py (Status): move the Status test..
2562         * buildbot/test/test_status.py (Subscription): .. to here
2564 2005-11-25  Brian Warner  <warner@lothar.com>
2566         * NEWS: more updates
2568         * buildbot/locks.py: fix the problem in which loading a master.cfg
2569         file that changes some Builders (but not all of them) can result
2570         in having multiple copies of the same Lock. Now, the real Locks
2571         are kept in a table inside the BotMaster, and the Builders/Steps
2572         use "LockIDs", which are still instances of MasterLock and
2573         SlaveLock. The real Locks are instances of the new RealMasterLock
2574         and RealSlaveLock classes.
2575         * buildbot/master.py (BotMaster.getLockByID): new method to
2576         convert LockIDs into real Locks.
2577         * buildbot/process/base.py (Build.startBuild): convert LockIDs
2578         into real Locks before building
2579         * buildbot/process/step.py (BuildStep.startStep): same
2580         * buildbot/test/test_locks.py (Locks.testLock1a): add a test which
2581         exercises the problem
2584         * docs/buildbot.texinfo (Scheduler Types): give a few hints about
2585         what Schedulers are available
2587         * buildbot/scheduler.py (Nightly): add new Scheduler based upon
2588         work by Dobes Vandermeer and hacked mercilessly by me. This offers
2589         'cron'-style build scheduling at certain times of day, week,
2590         month, or year.
2591         * buildbot/test/test_scheduler.py (Scheduling.testNightly): test it
2593         * buildbot/scheduler.py (Scheduler): change fileIsImportant
2594         handling: treat self.fileIsImportant more as an attribute that
2595         contains a callable than as a method. If the attribute is None,
2596         don't call it and assume all filenames are important. It is still
2597         possible to provide a fileIsImportant method in a subclass,
2598         however.
2599         (AnyBranchScheduler): handle fileIsImportant=None, previously it
2600         was broken
2601         * buildbot/test/test_scheduler.py (Scheduling.testAnyBranch2):
2602         test using AnyBranchScheduler with fileIsImportant=None
2604 2005-11-24  Brian Warner  <warner@lothar.com>
2606         * buildbot/test/test_config.py (StartService): don't claim a fixed
2607         port number, instead set slavePort=0 on the first pass, figure out
2608         what port was allocated, then switch to a config file that uses
2609         the allocated port.
2611         * buildbot/master.py (BuildMaster.loadConfig): close the old
2612         slaveport before opening the new one, because unit tests might
2613         replace slavePort=0 with the same allocated portnumber, and if we
2614         don't wait for the old port to close first, we get a "port already
2615         in use" error. There is a tiny race condition here, but the only
2616         threat is from other programs that bind (statically) to the same
2617         port number we happened to be allocated, and only if those
2618         programs use SO_REUSEADDR, and only if they get control in between
2619         reactor turns.
2621         * Makefile (TRIALARGS): update to handle Twisted > 2.1.0
2623         * buildbot/master.py (BuildMaster.loadConfig_Sources): remove all
2624         deleted ChangeSources before adding any new ones
2625         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): fix
2626         compare_attrs, to make sure that a config-file reload does not
2627         unnecessarily replace an unmodified ChangeSource instance
2628         * buildbot/test/test_config.py (ConfigTest.testSources): update
2630         * buildbot/scheduler.py (AnyBranchScheduler): fix branches=[] to
2631         mean "don't build anything", and add a warning if it gets used
2632         because it isn't actually useful.
2634         * contrib/svn_buildbot.py: update example usage to match the port
2635         number that gets used by the PBChangeSource
2636         * buildbot/scripts/sample.cfg: add example of PBChangeSource
2638 2005-11-22  Brian Warner  <warner@lothar.com>
2640         * NEWS: start collecting items for next release
2642         * buildbot/process/step.py (SVN.computeSourceRevision): assume
2643         revisions are strings
2644         (P4Sync.computeSourceRevision): same
2646         * buildbot/status/html.py (StatusResourceBuild.body): add a link
2647         to the Buildbot's overall status page
2648         (StatusResourceBuilder.body): same
2650 2005-11-15  Brian Warner  <warner@lothar.com>
2652         * buildbot/master.py (BuildMaster.loadConfig): serialize the
2653         config-file loading, specifically to make sure old StatusTargets
2654         are finished shutting down before new ones start up (thus
2655         resolving a bug in which changing the Waterfall object would fail
2656         because both new and old instances were claiming the same
2657         listening port). Also load new Schedulers after all the new
2658         Builders are set up, in case they fire off a new build right away.
2659         * buildbot/test/test_config.py (StartService): test it
2661         * buildbot/status/mail.py (MailNotifier.buildMessage): oops, add
2662         the branch name to the mail body
2664         * buildbot/changes/pb.py (PBChangeSource.compare_attrs): add this.
2665         Without it, a config-file reload fails to update an existing
2666         PBChangeSource.
2667         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): add
2668         username/passwd to compare_attrs, for the same reason
2669         * buildbot/status/html.py (Waterfall): add favicon to
2670         compare_attrs, same reason
2672 2005-11-05  Brian Warner  <warner@lothar.com>
2674         * buildbot/scripts/tryclient.py (createJobfile): stringify the
2675         baserev before stuffing it in the jobfile. This resolves problems
2676         under SVN (and probably Arch) where revisions are expressed as
2677         numbers. I'm inclined to use string-based revisions everywhere in
2678         the future, but this fix should be safe for now. Thanks to Steven
2679         Walter for the patch.
2681         * buildbot/changes/changes.py (ChangeMaster.saveYourself): use
2682         binary mode when opening pickle files, to make windows work
2683         better. Thanks to Dobes Vandermeer for the catch.
2684         * buildbot/status/builder.py (BuildStatus.saveYourself): same
2685         (BuilderStatus.getBuildByNumber): same
2686         (Status.builderAdded): same
2687         * buildbot/master.py (BuildMaster.loadChanges): same
2689         * buildbot/util.py (Swappable): delete unused leftover code
2691         * buildbot/process/step.py (SVN): when building on a non-default
2692         branch, add the word "[branch]" to the VC step's description, so
2693         it is obvious that we're not building the usual stuff. Likewise,
2694         when we are building a specific revision, add the text "rNNN" to
2695         indicate what that revision number is. Thanks to Brad Hards and
2696         Nathaniel Smith for the suggestion.
2697         (Darcs.startVC): same
2698         (Arch.startVC): same
2699         (Bazaar.startVC): same
2701         * buildbot/process/factory.py (GNUAutoconf.__init__): fix a silly
2702         typo, caught by Mark Dillavou, closes SF#1216636.
2704         * buildbot/test/test_status.py (Log.TODO_testDuplicate): add notes
2705         about a test to add some day
2707         * docs/examples/twisted_master.cfg: update: bot1 can now handle
2708         the 'full-2.3' build, and the 'reactors' build is now run under
2709         python-2.4 because the buildslave no longer has gtk/etc bindings
2710         for earlier versions.
2712 2005-11-03  Brian Warner  <warner@lothar.com>
2714         * buildbot/interfaces.py (IBuilderControl.resubmitBuild): new
2715         method, takes an IBuildStatus and rebuilds it. It might make more
2716         sense to add this to IBuildControl instead, but that instance goes
2717         away completely once the build has finished, and resubmitting
2718         builds can take place weeks later.
2719         * buildbot/process/builder.py (BuilderControl.resubmitBuild): same
2720         * buildbot/status/html.py (StatusResourceBuild): also stash an
2721         IBuilderControl so we can use resubmitBuild.
2722         (StatusResourceBuild.body): render "resubmit" button if we can.
2723         Also add hrefs for each BuildStep
2724         (StatusResourceBuild.rebuild): add action for "resubmit" button
2725         (StatusResourceBuilder.getChild): give it an IBuilderControl
2727         * buildbot/status/builder.py (Status.getURLForThing): change the
2728         URL for BuildSteps to have a "step-" prefix, so the magic URLs
2729         that live as targets of buttons like "stop" and "rebuild" can't
2730         collide with them.
2731         * buildbot/status/builder.py (Status.getURLForThing): same
2732         * buildbot/status/html.py (StatusResourceBuild.getChild): same
2733         (StepBox.getBox): same
2734         * buildbot/test/test_web.py (GetURL): same
2735         (Logfile): same
2737         * buildbot/process/step.py (SVN.__init__): put svnurl/baseURL
2738         exclusivity checks after Source.__init__ upcall, so misspelled
2739         arguments will be reported more usefully
2740         (Darcs.__init__): same
2742 2005-10-29  Brian Warner  <warner@lothar.com>
2744         * docs/examples/twisted_master.cfg: don't double-fire the 'quick'
2745         builder. Move the Try scheduler off to a separate port.
2747 2005-10-27  Brian Warner  <warner@lothar.com>
2749         * buildbot/clients/gtkPanes.py
2750         (TwoRowClient.remote_builderRemoved): disappearing Builders used
2751         to cause the app to crash, now they don't.
2753         * buildbot/clients/debug.py: display the buildmaster's location
2754         in the window's title bar
2756 2005-10-26  Brian Warner  <warner@lothar.com>
2758         * buildbot/status/mail.py (MailNotifier): urllib.escape the URLs
2759         in case they have spaces or whatnot. Patch from Dobes Vandermeer.
2760         * buildbot/test/test_status.py (MyStatus.getURLForThing): fix it
2762         * buildbot/status/html.py (td): put a single non-breaking space
2763         inside otherwise empty <td> elements, as a workaround for buggy
2764         browsers which would optimize them away (along with any associated
2765         styles, like the kind that create the waterfall grid borders).
2766         Patch from Frerich Raabe.
2768         * buildbot/process/step_twisted.py (Trial): expose the trialMode=
2769         argv-list as an argument, defaulting to ["-to"], which is
2770         appropriate for the Trial that comes with Twisted-2.1.0 and
2771         earlier. The Trial in current Twisted SVN wants
2772         ["--reporter=bwverbose"] instead. Also expose trialArgs=, which
2773         defaults to an empty list.
2774         * buildbot/process/process_twisted.py (TwistedTrial.trialMode):
2775         match it, now that trialMode= is a list instead of a single string
2777         * buildbot/__init__.py (version): bump to 0.7.0+ while between
2778         releases
2779         * docs/buildbot.texinfo: same
2781 2005-10-24  Brian Warner  <warner@lothar.com>
2783         * buildbot/__init__.py (version): Releasing buildbot-0.7.0
2784         * docs/buildbot.texinfo: set version number to match
2786 2005-10-24  Brian Warner  <warner@lothar.com>
2788         * README: update for 0.7.0
2789         * NEWS: same
2790         * docs/buildbot.texinfo: move the freshcvs stuff out of the README
2792         * buildbot/clients/debug.glade: add 'branch' box to fake-commit
2793         * buildbot/clients/debug.py (DebugWidget.do_commit): same. Don't
2794         send the branch= argument unless the user really provided one, to
2795         retain compatibility with older buildmasters that don't accept
2796         that argument.
2797         * buildbot/master.py (DebugPerspective.perspective_fakeChange):
2798         same
2800         * docs/buildbot.texinfo: update lots of stuff
2802         * buildbot/scripts/runner.py (sendchange): add a --branch argument
2803         to the 'buildbot sendchange' command
2804         * buildbot/clients/sendchange.py (Sender.send): same
2805         * buildbot/changes/pb.py (ChangePerspective): same
2806         * buildbot/test/test_changes.py (Sender.testSender): test it
2808         * buildbot/process/step.py (SVN.__init__): change 'base_url' and
2809         'default_branch' argument names to 'baseURL' and 'defaultBranch',
2810         for consistency with other BuildStep arguments that use camelCase.
2811         Well, at least more of them use camelCase (like flunkOnWarnings)
2812         than don't.. I wish I'd picked one style and stuck with it
2813         earlier. Annoying, but it's best done before the release, since
2814         these arguments didn't exist at all in 0.6.6 .
2815         (Darcs): same
2816         * buildbot/test/test_vc.py (SVN.testCheckout): same
2817         (Darcs.testPatch): same
2818         * docs/buildbot.texinfo (SVN): document the change
2819         (Darcs): same, add some build-on-branch docs
2820         * docs/examples/twisted_master.cfg: match change
2822         * buildbot/process/step.py (BuildStep): rename
2823         slaveVersionNewEnough to slaveVersionIsOlderThan, because that's
2824         how it is normally used.
2825         * buildbot/test/test_steps.py (Version.checkCompare): same
2827         * buildbot/process/step.py (CVS.startVC): refuse to build
2828         update/copy -style builds on a non-default branch with an old
2829         buildslave (<=0.6.6) that doesn't know how to do it properly. The
2830         concern is that it will do a VC 'update' in an existing tree when
2831         it is supposed to be switching branches (and therefore clobbering
2832         the tree to do a full checkout), thus building the wrong source.
2833         This used to be a warning, but I think the confusion it is likely
2834         to cause warrants making it an error.
2835         (SVN.startVC): same, also make mode=export on old slaves an error
2836         (Darcs.startVC): same
2837         (Git.startVC): improve error message for non-Git-enabled slaves
2838         (Arch.checkSlaveVersion): same. continue to emit a warning when a
2839         specific revision is built on a slave that doesn't pay attention
2840         to args['revision'], because for slowly-changing trees it will
2841         probably do the right thing, and because we have no way to tell
2842         whether we're asking it to build the most recent version or not.
2843         * buildbot/interfaces.py (BuildSlaveTooOldError): new exception
2845         * buildbot/scripts/runner.py (SlaveOptions.postOptions): assert
2846         that 'master' is in host:portnum format, to catch errors sooner
2848 2005-10-23  Brian Warner  <warner@lothar.com>
2850         * buildbot/process/step_twisted.py (ProcessDocs.createSummary):
2851         when creating the list of warning messages, include the line
2852         immediately after each WARNING: line, since that's usually where
2853         the file and line number wind up.
2855         * docs/examples/twisted_master.cfg: OS-X slave now does QT, add a
2856         TryScheduler
2858         * NEWS: update
2860 2005-10-22  Brian Warner  <warner@lothar.com>
2862         * buildbot/status/html.py (HtmlResource): incorporate valid-HTML
2863         patch from Brad Hards
2864         * buildbot/status/classic.css: same
2865         * buildbot/test/test_web.py (Waterfall): match changes
2867         * buildbot/test/test_steps.py (BuildStep.setUp): set
2868         nextBuildNumber so the test passes
2869         * buildbot/test/test_status.py (MyBuilder): same
2871         * buildbot/status/html.py (StatusResourceBuild.body): revision
2872         might be numeric, so stringify it before html-escapifying it
2873         (CurrentBox.getBox): add a "waiting" state, and show a countdown
2874         timer for the upcoming build
2875         * buildbot/status/classic.css: add background-color attributes for
2876         offline/waiting/building classes
2878         * buildbot/status/builder.py (BuildStatus): derive from
2879         styles.Versioned, fix upgrade of .sourceStamp attribute. Also set
2880         the default (i.e. unknown) .slavename to "???" instead of None,
2881         since even unknown slavenames need to be printed eventually.
2882         (BuilderStatus): also derive from styles.Versioned . More
2883         importantly, determine .nextBuildNumber at creation/unpickling
2884         time by scanning the directory of saved BuildStatus instances and
2885         choosing one larger than the highest-numbered one found. This
2886         should fix the problem where random errors during upgrades cause
2887         the buildbot to forget about earlier builds. .nextBuildNumber is
2888         no longer stored in the pickle.
2889         (Status.builderAdded): if we can't unpickle the BuilderStatus,
2890         at least log the error. Also call Builder.determineNextBuildNumber
2891         once the basedir is set.
2893         * buildbot/master.py (BuildMaster.loadChanges): do
2894         styles.doUpgrade afterwards, in case I decide to make Changes
2895         derived from styles.Versioned some day and forget to make this
2896         change later.
2899         * buildbot/test/test_runner.py (Options.testForceOptions): skip
2900         when running under older pythons (<2.3) in which the shlex module
2901         doesn't have a 'split' function.
2903         * buildbot/process/step.py (ShellCommand.start): make
2904         errorMessages= be a list of strings to stuff in the log before the
2905         command actually starts. This makes it easier to flag multiple
2906         warning messages, e.g. when the Source steps have to deal with an
2907         old buildslave.
2908         (CVS.startVC): handle slaves that don't handle multiple branches
2909         by switching into 'clobber' mode
2910         (SVN.startVC): same. Also reject branches without base_url
2911         (Darcs.startVC): same. Also reject revision= in older slaves
2912         (Arch.checkSlaveVersion): same (just the multiple-branches stuff)
2913         (Bazaar.startVC): same, and test for baz separately than for arch
2915         * buildbot/slave/commands.py (cvs_ver): document new features
2917         * buildbot/process/step.py (BuildStep.slaveVersion): document it
2918         (BuildStep.slaveVersionNewEnough): more useful utility method
2919         * buildbot/test/test_steps.py (Version): start testing it
2921         * buildbot/status/words.py (IrcStatusBot.command_FORCE): note that
2922         the 'force' command requires python2.3, for the shlex.split method
2924         * docs/examples/twisted_master.cfg: remove old freshcvs stuff,
2925         since we don't use it anymore. The Twisted buildbot uses a
2926         PBChangeSource now.
2928 2005-10-21  Brian Warner  <warner@lothar.com>
2930         * buildbot/process/process_twisted.py: rework all BuildFactory
2931         classes to take a 'source' step as an argument, instead of
2932         building up the SVN instance in the factory.
2933         * docs/examples/twisted_master.cfg: enable build-on-branch by
2934         providing a base_url and default_branch
2936         * buildbot/status/words.py (IrcStatusBot.command_FORCE): add
2937         control over --branch and --revision, not that they are always
2938         legal to provide
2939         * buildbot/status/html.py (StatusResourceBuilder.force): same
2940         (StatusResourceBuild.body): display SourceStamp components
2942         * buildbot/scripts/runner.py (ForceOptions): option parser for the
2943         IRC 'force' command, so it can be shared with an eventual
2944         command-line-tool 'buildbot force' mode.
2945         * buildbot/test/test_runner.py (Options.testForceOptions): test it
2947 2005-10-20  Brian Warner  <warner@lothar.com>
2949         * buildbot/status/mail.py (MailNotifier.buildMessage): reformat
2951         * docs/examples/twisted_master.cfg: update to use Schedulers
2953         * buildbot/scripts/sample.cfg: update with Schedulers
2955         * buildbot/interfaces.py (IBuilderControl.requestBuildSoon): new
2956         method specifically for use by HTML "force build" button and the
2957         IRC "force" command. Raises an immediate error if there are no
2958         slaves available.
2959         (IBuilderControl.requestBuild): make this just submit a build, not
2960         try to check for existing slaves or set up any when-finished
2961         Deferreds or anything.
2962         * buildbot/process/builder.py (BuilderControl): same
2963         * buildbot/status/html.py (StatusResourceBuilder.force): same
2964         * buildbot/status/words.py (IrcStatusBot.command_FORCE): same
2965         * buildbot/test/test_slaves.py: same
2966         * buildbot/test/test_web.py: same
2968 2005-10-19  Brian Warner  <warner@lothar.com>
2970         * docs/examples/twisted_master.cfg: re-sync with reality: bring
2971         back python2.2 tests, turn off OS-X threadedselect-reactor tests
2973 2005-10-18  Brian Warner  <warner@lothar.com>
2975         * buildbot/status/html.py: provide 'status' argument to most
2976         StatusResourceFOO objects
2977         (StatusResourceBuild.body): href-ify the Builder name, add "Steps
2978         and Logfiles" section to make the Build page into a more-or-less
2979         comprehensive source of status information about the build
2981         * buildbot/status/mail.py (MailNotifier): include the Build's URL
2982         * buildbot/status/words.py (IrcStatusBot.buildFinished): same
2984 2005-10-17  Brian Warner  <warner@lothar.com>
2986         * buildbot/process/process_twisted.py (TwistedTrial): update Trial
2987         arguments to accomodate Twisted >=2.1.0 . I will have to figure
2988         out what to do about other projects: the correct options for
2989         recent Twisteds will not work for older ones.
2991 2005-10-15  Brian Warner  <warner@lothar.com>
2993         * buildbot/status/builder.py (Status.getURLForThing): add method
2994         to provide a URL for arbitrary IStatusFoo objects. The idea is to
2995         use this in email/IRC status clients to make them more useful, by
2996         providing the end user with hints on where to learn more about the
2997         object being reported on.
2998         * buildbot/test/test_web.py (GetURL): tests for it
3000 2005-10-14  Brian Warner  <warner@lothar.com>
3002         * buildbot/test/test_config.py (ConfigTest._testSources_1): oops,
3003         fix bug resulting from deferredResult changes
3005 2005-10-13  Brian Warner  <warner@lothar.com>
3007         * buildbot/test/test_changes.py: remove use of deferredResult
3008         * buildbot/test/test_config.py: same
3009         * buildbot/test/test_control.py: same
3010         * buildbot/test/test_status.py: same
3011         * buildbot/test/test_vc.py: this is the only remaining use, since
3012         it gets used at module level. This needs to be replaced by some
3013         sort of class-level run-once routine.
3015         * buildbot/status/words.py (IrcStatusBot.command_WATCH): fix typo
3017         * lots: implement multiple slaves per Builder, which means multiple
3018         current builds per Builder. Some highlights:
3019         * buildbot/interfaces.py (IBuilderStatus.getState): return a tuple
3020         of (state,currentBuilds) instead of (state,currentBuild)
3021         (IBuilderStatus.getCurrentBuilds): replace getCurrentBuild()
3022         (IBuildStatus.getSlavename): new method, so you can tell which
3023         slave got used. This only gets set when the build completes.
3024         (IBuildRequestStatus.getBuilds): new method
3026         * buildbot/process/builder.py (SlaveBuilder): add a .state
3027         attribute to track things like ATTACHING and IDLE and BUILDING,
3028         instead of..
3029         (Builder): .. the .slaves attribute here, which has been turned
3030         into a simple list of available slaves. Added a separate
3031         attaching_slaves list to track ones that are not yet ready for
3032         builds.
3033         (Builder.fireTestEvent): put off the test-event callback for a
3034         reactor turn, to make tests a bit more consistent.
3035         (Ping): cleaned up the slaveping a bit, now it disconnects if the
3036         ping fails due to an exception. This needs work, I'm worried that
3037         a code error could lead to a constantly re-connecting slave.
3038         Especially since I'm trying to move to a distinct remote_ping
3039         method, separate from the remote_print that we currently use.
3040         (BuilderControl.requestBuild): return a convenience Deferred that
3041         provides an IBuildStatus when the build finishes.
3042         (BuilderControl.ping): ping all connected slaves, only return True
3043         if they all respond.
3045         * buildbot/slave/bot.py (BuildSlave.stopService): stop trying to
3046         reconnect when we shut down.
3048         * buildbot/status/builder.py: implement new methods, convert
3049         one-build-at-a-time methods to handle multiple builds
3050         * buildbot/status/*.py: do the same in all default status targets
3051         * buildbot/status/html.py: report the build's slavename in the
3052         per-Build page, report all buildslaves on the per-Builder page
3054         * buildbot/test/test_run.py: update/create tests
3055         * buildbot/test/test_slaves.py: same
3056         * buildbot/test/test_scheduler.py: remove stale test
3058         * docs/buildbot.texinfo: document the new builder-specification
3059         'slavenames' parameter
3061 2005-10-12  Brian Warner  <warner@lothar.com>
3063         * buildbot/buildset.py (BuildSet): fix bug where BuildSet did not
3064         report failure correctly, causing Dependent builds to run when
3065         they shouldn't have.
3066         * buildbot/status/builder.py (BuildSetStatus): same
3067         * buildbot/test/test_buildreq.py (Set.testBuildSet): verify it
3068         (Set.testSuccess): test the both-pass case too
3069         * buildbot/test/test_dependencies.py (Dependencies.testRun_Fail):
3070         fix this test: it was ending too early, masking the failure before
3071         (Logger): specialized StatusReceiver to make sure the dependent
3072         builds aren't even started, much less completed.
3074 2005-10-07  Brian Warner  <warner@lothar.com>
3076         * buildbot/slave/bot.py (SlaveBuilder.activity): survive
3077         bot.SlaveBuilder being disowned in the middle of a build
3079         * buildbot/status/base.py (StatusReceiverMultiService): oops, make
3080         this inherit from StatusReceiver. Also upcall in __init__. This
3081         fixes the embarrasing crash when the new buildSetSubmitted method
3082         is invoked and Waterfall/etc don't implement their own.
3083         * buildbot/test/test_run.py: add a TODO note about a test to catch
3084         just this sort of thing.
3086         * buildbot/process/builder.py (Builder.attached): remove the
3087         already-attached warning, this situation is normal. Add some
3088         comments explaining it.
3090 2005-10-02  Brian Warner  <warner@lothar.com>
3092         * buildbot/changes/maildir.py (Maildir.start): Tolerate
3093         OverflowError when setting up dnotify, because some 64-bit systems
3094         have problems with signed-vs-unsigned constants and trip up on the
3095         DN_MULTISHOT flag. Patch from Brad Hards.
3097 2005-09-06  Fred Drake  <fdrake@users.sourceforge.net>
3099         * buildbot/process/step.py (BuildStep, ShellCommand): Add
3100         progressMetrics, description, descriptionDone to the 'parms' list,
3101         and make use the 'parms' list from the implementation class
3102         instead of only BuildStep to initialize the parameters.  This
3103         allows buildbot.process.factory.s() to initialize all the parms,
3104         not just those defined in directly by BuildStep.
3106 2005-09-03  Brian Warner  <warner@lothar.com>
3108         * NEWS: start adding items for the next release
3110         * docs/examples/twisted_master.cfg: (sync with reality) turn off
3111         python2.2 tests, change 'Quick' builder to only use python2.3
3113 2005-09-02  Fred Drake  <fdrake@users.sourceforge.net>
3115         * buildbot/status/html.py (StatusResourceBuilder.body): only show
3116         the "Ping Builder" button if the build control is available; the
3117         user sees an exception otherwise
3119         * docs/buildbot.texinfo (PBChangeSource): fix a typo
3121 2005-09-01  Brian Warner  <warner@lothar.com>
3123         * buildbot/interfaces.py (IBuilderStatus.getState): update
3124         signature, point out that 'build' can be None
3125         (IBuildStatus.getETA): point out ETA can be none
3127         * buildbot/status/html.py (CurrentBox.getBox): tolerate build/ETA
3128         being None
3129         * buildbot/status/words.py (IrcStatusBot.emit_status): same
3131 2005-08-31  Brian Warner  <warner@lothar.com>
3133         * buildbot/status/base.py (StatusReceiver.builderChangedState):
3134         update to match correct signature: removed 'eta' argument
3135         * buildbot/status/mail.py (MailNotifier.builderChangedState): same
3137 2005-08-30  Brian Warner  <warner@lothar.com>
3139         * buildbot/status/builder.py (LogFile): remove the assertion that
3140         blows up when you try to overwrite an existing logfile, instead
3141         just emit a warning. This case gets hit when the buildmaster is
3142         killed and doesn't get a chance to write out the serialized
3143         BuilderStatus object, so the .nextBuildNumber attribute gets out
3144         of date.
3146         * buildbot/scripts/runner.py (sendchange): add --revision_file to
3147         the 'buildbot sendchange' arguments, for the Darcs context file
3148         * docs/buildbot.texinfo (sendchange): document it
3150         * buildbot/status/html.py: add pending/upcoming builds to CurrentBox
3151         * buildbot/interfaces.py (IScheduler.getPendingBuildTimes): new method
3152         (IStatus.getSchedulers): new method
3153         * buildbot/status/builder.py (BuilderStatus): track pendingBuilds
3154         (Status.getSchedulers): implement
3155         * buildbot/process/builder.py (Builder): maintain
3156         BuilderStatus.pendingBuilds
3157         * buildbot/scheduler.py (Scheduler.getPendingBuildTimes): new method
3158         (TryBase.addChange): Try schedulers should ignore Changes
3160         * buildbot/scripts/tryclient.py (getTopdir): implement getTopdir
3161         for 'try' on CVS/SVN
3162         * buildbot/test/test_runner.py (Try.testGetTopdir): test case
3164         * buildbot/scripts/tryclient.py (Try): make jobdir-style 'try'
3165         report status properly.
3166         (Try.createJob): implement unique buildset IDs
3168         * buildbot/status/client.py (StatusClientPerspective): add a
3169         perspective_getBuildSets method for the benefit of jobdir-style
3170         'try'.
3171         * docs/buildbot.texinfo (try): more docs
3172         * buildbot/test/test_scheduler.py (Scheduling.testGetBuildSets):
3173         new test case
3175 2005-08-18  Brian Warner  <warner@lothar.com>
3177         * buildbot/scripts/tryclient.py (Try): make 'try' status reporting
3178         actually work. It's functional but still kind of clunky. Also, it
3179         only works with the pb-style.. needs to be made to work with the
3180         jobdir-style too.
3182         * buildbot/status/client.py (RemoteBuildSet): new class
3183         (RemoteBuildRequest): same
3184         (RemoteBuild.remote_waitUntilFinished): return the RemoteBuild
3185         object, not the internal BuildStatus object.
3186         (RemoteBuild.remote_subscribe): new method to subscribe to builds
3187         outside of the usual buildStarted() return value.
3188         (BuildSubscriber): support class for RemoteBuild.remote_subscribe
3190         * buildbot/scheduler.py (Try_Jobdir): convey buildsetID properly
3191         (Try_Userpass_Perspective.perspective_try): return a remotely
3192         usable BuildSetStatus object
3194         * buildbot/interfaces.py (IBuildStatus): remove obsolete
3195         isStarted()/waitUntilStarted()
3197 2005-08-16  Brian Warner  <warner@lothar.com>
3199         * buildbot/status/builder.py: implement IBuildSetStatus and
3200         IBuildRequestStatus, wire them into place.
3201         * buildbot/buildset.py: same. Add ID, move wait-until-finished
3202         methods into the BuildSetStatus object.
3203         * buildbot/interfaces.py: same
3204         (IStatus.getBuildSets): new method to get pending BuildSets
3205         (IStatusReceiver.buildsetSubmitted): new method which hears about
3206         new BuildSets
3207         * buildbot/master.py (BuildMaster.submitBuildSet): same
3208         * buildbot/process/base.py (BuildRequest): same, replace
3209         waitUntilStarted with subscribe/unsubscribe
3210         * buildbot/process/builder.py (BuilderControl.forceBuild): use
3211         subscribe instead of waitUntilStarted
3212         * buildbot/status/base.py (StatusReceiver.buildsetSubmitted): stub
3213         for new method
3214         * buildbot/status/client.py (StatusClientPerspective.builderRemoved): 
3215         same
3216         * buildbot/test/test_buildreq.py: update for new code
3217         * buildbot/test/test_control.py (Force.testRequest): same
3220         * buildbot/slave/commands.py (Darcs.doVCFull): fix get-revision
3221         for Darcs to not use the tempfile module, so it works under
3222         python-2.2 too. We really didn't need the full cleverness of that
3223         module, since the slave has exclusive control of its own builddir.
3225 2005-08-15  Brian Warner  <warner@lothar.com>
3227         * buildbot/scripts/tryclient.py (CVSExtractor): implement 'try'
3228         for CVS trees. It doesn't work for non-trunk branches,
3229         unfortunately.
3230         * buildbot/test/test_vc.py (CVS.testTry): test it, but skip the
3231         branch test
3233         * Makefile: make it easier to test against python2.2
3235         * buildbot/test/test_vc.py (VCBase.tearDown): provide for
3236         tearDown2, so things like Arch can unregister archives as they're
3237         shutting down. The previous subclass-override-tearDown technique
3238         resulted in a nested maybeWait() and test failures under
3239         Twisted-1.3.0
3241         * buildbot/scripts/tryclient.py (getSourceStamp): extract branches
3242         where we can (Arch), add a branch= argument to set the branch used
3243         when we can't
3244         (BazExtractor): extract the branch too
3245         (TlaExtractor): same
3246         * buildbot/scripts/runner.py (TryOptions): add --branch
3247         * docs/buildbot.texinfo (try): document --branch/try_branch
3249         * buildbot/slave/commands.py (Darcs): implement get-revision for
3250         Darcs, so that 'try' will work. This requires the tempfile module
3251         from python-2.3 .
3253         * buildbot/test/test_vc.py: rewrite tests, getting better coverage
3254         of revisions, branches, and 'try' in the process.
3256 2005-08-11  Brian Warner  <warner@lothar.com>
3258         * buildbot/master.py (DebugPerspective.perspective_pokeIRC): fix
3259         this, it got broken at some point in the last few releases
3260         * buildbot/status/words.py (IrcBuildRequest): reply was broken
3261         (IrcStatusBot.emit_status): handle new IBuilderStatus.getState,
3262         specifically the removal of ETA information from the tuple
3264         * buildbot/locks.py: use %d for id() instead of %x, avoid a silly
3265         warning message
3267         * docs/buildbot.texinfo (try): document both --builder and
3268         'try_builders' in .buildbot/options
3269         * buildbot/scripts/runner.py (TryOptions): add --builder,
3270         accumulate the values into opts['builders']
3271         * buildbot/scripts/tryclient.py (Try.__init__): set builders
3272         * buildbot/test/test_runner.py (Try): add some quick tests to make
3273         sure 'buildbot try --options' and .buildbot/options get parsed
3274         * buildbot/test/test_scheduler.py (Scheduling.testTryUserpass):
3275         use --builder control
3277         * docs/buildbot.texinfo (try): add --port argument to PB style
3279         * buildbot/scripts/tryclient.py (SourceStampExtractor): return an
3280         actual SourceStamp. Still need to extract a branch name, somehow.
3281         (Try): finish implementing the try client side, still need a UI
3282         for specifying which builders to use
3283         (Try.getopt): factor our options/config-file reading
3284         * buildbot/test/test_scheduler.py (Scheduling.testTryUserpass):
3285         test it
3286         * buildbot/test/test_vc.py: match SourceStampExtractor change
3288         * buildbot/scripts/runner.py (Options.opt_verbose): --verbose
3289         causes the twisted log to be sent to stderr
3291         * buildbot/scheduler.py (Try_Userpass): implement the PB style
3293 2005-08-10  Brian Warner  <warner@lothar.com>
3295         * buildbot/scripts/runner.py: Add 'buildbot try' command, jobdir
3296         style is 90% done, still missing status reporting or waiting for
3297         the buildsets to finish, and it is completely untested.
3299         * buildbot/trybuild.py: delete file, move contents to ..
3300         * buildbot/scripts/tryclient.py (getSourceStamp): .. here
3301         * buildbot/test/test_vc.py: match the move
3303         * buildbot/scheduler.py (Try_Jobdir): implement the jobdir style
3304         of the TryScheduler, no buildsetID or status-tracking support yet
3305         * buildbot/test/test_scheduler.py (Scheduling.testTryJobdir): test it
3307         * buildbot/changes/maildir.py (Maildir.setBasedir): make it
3308         possible to set the basedir after __init__ time, so it is easier
3309         to use as a Service-child of the BuildMaster instance
3311         * buildbot/changes/maildirtwisted.py (MaildirService): make a form
3312         that delivers messages to its Service parent instead of requiring
3313         a subclass to be useful. This turns out to be much easier to build
3314         unit tests around.
3316         * buildbot/scripts/tryclient.py (createJob): utility code to
3317         create jobfiles, will eventually be used by 'buildbot try'
3319 2005-08-08  Brian Warner  <warner@lothar.com>
3321         * docs/buildbot.texinfo (try): add docs on the
3322         as-yet-unimplemented Try scheduler
3324         * buildbot/test/test_buildreq.py: move Scheduling tests out to ..
3325         * buildbot/test/test_scheduler.py: .. here
3326         (Scheduling.testTryJobdir): add placeholder test for 'try'
3328         * buildbot/test/test_status.py (Log.testMerge3): update to match new
3329         addEntry merging (>=chunkSize) behavior
3330         (Log.testConsumer): update to handle new callLater(0) behavior
3332         * buildbot/test/test_web.py: rearrange tests a bit, add test for
3333         both the MAX_LENGTH bugfix and the resumeProducing hang.
3335         * buildbot/status/builder.py (LogFileProducer.resumeProducing):
3336         put off the actual resumeProducing for a moment with
3337         reactor.callLater(0). This works around a twisted-1.3.0 bug which
3338         causes large logfiles to hang midway through.
3340         * buildbot/process/step.py (BuildStep.addCompleteLog): break the
3341         logfile up into chunks, both to avoid NetstringReceiver.MAX_LENGTH
3342         and to improve memory usage when streaming the file out to a web
3343         browser.
3344         * buildbot/status/builder.py (LogFile.addEntry): change > to >= to
3345         make this work cleanly
3347 2005-08-03  Brian Warner  <warner@lothar.com>
3349         * buildbot/trybuild.py: new file for 'try' utilities
3350         (getSourceStamp): run in a tree, find out the baserev+patch
3351         * buildbot/test/test_vc.py (VCBase.do_getpatch): test it,
3352         implemented for SVN and Darcs, still working on Arch. I don't know
3353         how to make CVS work yet.
3355         * docs/buildbot.texinfo: document the 'buildbot' command-line
3356         tool, including the not-yet-implemented 'try' feature, and the
3357         in-flux .buildbot/ options directory.
3359 2005-07-20  Brian Warner  <warner@lothar.com>
3361         * buildbot/locks.py: added temporary id() numbers to Lock
3362         descriptions, to track down a not-really-sharing-the-Lock bug
3364         * buildbot/test/runutils.py: must import errno, cut-and-paste bug
3366         * buildbot/test/test_slavecommand.py (ShellBase.failUnlessIn):
3367         needed for python2.2 compatibility
3368         * buildbot/test/test_vc.py: python2.2 compatibility: generators
3369         are from the __future__
3371 2005-07-19  Brian Warner  <warner@lothar.com>
3373         * buildbot/master.py (BuildMaster.loadConfig): give a better error
3374         message when schedulers use unknown builders
3376         * buildbot/process/builder.py (Builder.compareToSetup): make sure
3377         SlaveLock('name') and MasterLock('name') are distinct
3379         * buildbot/master.py (BuildMaster.loadConfig): oops, sanity-check
3380         c['schedulers'] in such a way that we can actually accept
3381         Dependent instances
3382         * buildbot/test/test_config.py: check it
3384         * buildbot/scheduler.py (Dependent.listBuilderNames): oops, add
3385         utility method to *all* the Schedulers
3386         (Periodic.listBuilderNames): same
3388         * docs/buildbot.texinfo (Interlocks): update chapter to match
3389         reality
3391         * buildbot/master.py (BuildMaster.loadConfig): Add sanity checks
3392         to make sure that c['sources'], c['schedulers'], and c['status']
3393         are all lists of the appropriate objects, and that the Schedulers
3394         all point to real Builders
3395         * buildbot/interfaces.py (IScheduler, IUpstreamScheduler): add
3396         'listBuilderNames' utility method to support this
3397         * buildbot/scheduler.py: implement the utility method
3398         * buildbot/test/test_config.py (ConfigTest.testSchedulers): test it
3400         * docs/buildbot.texinfo: add some @cindex entries
3402         * buildbot/test/test_vc.py (Arch.createRepository): set the tla ID
3403         if it wasn't already set: most tla commands will fail unless one
3404         has been set.
3405         (Arch.createRepository): and disable bazaar's revision cache, since
3406         they cause test failures (the multiple repositories we create all
3407         interfere with each other through the cache)
3409         * buildbot/test/test_web.py (WebTest): remove use of deferredResult,
3410         bring it properly up to date with twisted-2.0 test guidelines
3412         * buildbot/master.py (BuildMaster): remove references to old
3413         'interlock' module, this caused a bunch of post-merge test
3414         failures
3415         * buildbot/test/test_config.py: same
3416         * buildbot/process/base.py (Build): same
3418         * buildbot/test/test_slaves.py: stubs for new test case
3420         * buildbot/scheduler.py: add test-case-name tag
3421         * buildbot/test/test_buildreq.py: same
3423         * buildbot/slave/bot.py (SlaveBuilder.__init__): remove some
3424         unnecessary init code
3425         (Bot.remote_setBuilderList): match it
3427         * docs/buildbot.texinfo (@settitle): don't claim version 1.0
3429         * buildbot/changes/mail.py (parseSyncmail): update comment
3431         * buildbot/test/test_slavecommand.py: disable Shell tests on
3432         platforms that don't suport IReactorProcess
3434         * buildbot/status/builder.py (LogFile): remove the 't' mode from
3435         all places where we open logfiles. It causes OS-X to open the file
3436         in some weird mode that that prevents us from mixing reads and
3437         writes to the same filehandle, which we depend upon to implement
3438         _generateChunks properly. This change doesn't appear to break
3439         win32, on which "b" and "t" are treated differently but a missing
3440         flag seems to be interpreted as "t".
3442 2005-07-18  Brian Warner  <warner@lothar.com>
3444         * buildbot/slave/commands.py (ShellCommand): overhaul
3445         error-handling code, to try and make timeout/interrupt work
3446         properly, and make win32 happier
3447         * buildbot/test/test_slavecommand.py: clean up, stop using
3448         reactor.iterate, add tests for timeout and interrupt
3449         * buildbot/test/sleep.py: utility for a new timeout test
3451         * buildbot/twcompat.py: copy over twisted 1.3/2.0 compatibility
3452         code from the local-usebranches branch
3454 2005-07-17  Brian Warner  <warner@lothar.com>
3456         * buildbot/process/process_twisted.py
3457         (TwistedReactorsBuildFactory): change the treeStableTimer to 5
3458         minutes, to match the other twisted BuildFactories, and don't
3459         excuse failures in c/qt/win32 reactors any more.
3461         * docs/examples/twisted_master.cfg: turn off the 'threadless' and
3462         'freebsd' builders, since the buildslaves have been unavailable
3463         for quite a while
3465 2005-07-13  Brian Warner  <warner@lothar.com>
3467         * buildbot/test/test_vc.py (VCBase.do_branch): test the new
3468         build-on-branch feature
3470         * buildbot/process/step.py (Darcs.__init__): add base_url and
3471         default_branch arguments, just like SVN
3472         (Arch.__init__): note that the version= argument is really the
3473         default branch name
3475         * buildbot/slave/commands.py (SourceBase): keep track of the
3476         repository+branch that was used for the last checkout in
3477         SRCDIR/.buildbot-sourcedata . If the contents of this file do not
3478         match, we clobber the directory and perform a fresh checkout
3479         rather than trying to do an in-place update. This should protect
3480         us against trying to get to branch B by doing an update in a tree
3481         obtained from branch A.
3482         (CVS.setup): add CVS-specific sourcedata: root, module, and branch
3483         (SVN.setup): same, just the svnurl
3484         (Darcs.setup): same, just the repourl
3485         (Arch.setup): same, arch coordinates (url), version, and
3486         buildconfig. Also pull the buildconfig from the args dictionary,
3487         which we weren't doing before, so the build-config was effectively
3488         disabled.
3489         (Arch.sourcedirIsUpdateable): don't try to update when we're
3490         moving to a specific revision: arch can't go backwards, so it is
3491         safer to just clobber the tree and checkout a new one at the
3492         desired revision.
3493         (Bazaar.setup): same sourcedata as Arch
3495         * buildbot/test/test_dependencies.py (Dependencies.testRun_Fail):
3496         use maybeWait, to work with twisted-1.3.0 and twcompat
3497         (Dependencies.testRun_Pass): same
3499         * buildbot/test/test_vc.py: rearrange, cleanup
3501         * buildbot/twcompat.py: add defer.waitForDeferred and
3502         utils.getProcessOutputAndValue, so test_vc.py (which uses them)
3503         can work under twisted-1.3.0 .
3505         * buildbot/test/test_vc.py: rewrite. The sample repositories are
3506         now created at setUp time. This increases the runtime of the test
3507         suite considerably (from 91 seconds to 151), but it removes the
3508         need for an offline tarball, which should solve a problem I've
3509         seen where the test host has a different version of svn than the
3510         tarball build host. The new code also validates that mode=update
3511         really picks up recent commits. This approach will also make it
3512         easier to test out branches, because the code which creates the VC
3513         branches is next to the code which uses them. It will also make it
3514         possible to test some change-notification hooks, by actually
3515         performing a VC commit and watching to see the ChangeSource get
3516         notified.
3518 2005-07-12  Brian Warner  <warner@lothar.com>
3520         * docs/buildbot.texinfo (SVN): add branches example
3521         * docs/Makefile (buildbot.ps): add target for postscript manual
3523         * buildbot/test/test_dependencies.py: s/test_interlocks/test_locks/ 
3524         * buildbot/test/test_locks.py: same
3526         * buildbot/process/step.py (Darcs): comment about default branches
3528         * buildbot/master.py (BuildMaster.loadConfig): don't look for
3529         c['interlocks'] in the config file, complain if it is present.
3530         Scan all locks in c['builders'] to make sure the Locks they use
3531         are uniquely named.
3532         * buildbot/test/test_config.py: remove old c['interlocks'] test,
3533         add some tests to check for non-uniquely-named Locks
3534         * buildbot/test/test_vc.py (Patch.doPatch): fix factory.steps,
3535         since the unique-Lock validation code requires it now
3537         * buildbot/locks.py: fix test-case-name
3539         * buildbot/interlock.py: remove old file
3541 2005-07-11  Brian Warner  <warner@lothar.com>
3543         * buildbot/test/test_interlock.py: rename to..
3544         * buildbot/test/test_locks.py: .. something shorter
3546         * buildbot/slave/bot.py (BuildSlave.stopService): newer Twisted
3547         versions (after 2.0.1) changed internet.TCPClient to shut down the
3548         connection in stopService. Change the code to handle this
3549         gracefully.
3551         * buildbot/process/base.py (Build): handle whole-Build locks
3552         * buildbot/process/builder.py (Builder.compareToSetup): same
3553         * buildbot/test/test_interlock.py: make tests work
3555         * buildbot/process/step.py (BuildStep.startStep): complain if a
3556         Step tries to claim a lock that's owned by its own Build
3557         (BuildStep.releaseLocks): typo
3559         * buildbot/locks.py (MasterLock): use ComparableMixin so config
3560         file reloads don't replace unchanged Builders
3561         (SlaveLock): same
3562         * buildbot/test/test_config.py (ConfigTest.testInterlocks):
3563         rewrite to cover new Locks instead of old c['interlocks']
3564         * buildbot/test/runutils.py (RunMixin.connectSlaves): remember
3565         slave2 too
3568         * buildbot/test/test_dependencies.py (Dependencies.setUp): always
3569         start the master and connect the buildslave
3571         * buildbot/process/step.py (FailingDummy.done): finish with a
3572         FAILURE status rather than raising an exception
3574         * buildbot/process/base.py (BuildRequest.mergeReasons): don't try to
3575         stringify a BuildRequest.reason that is None
3577         * buildbot/scheduler.py (BaseUpstreamScheduler.buildSetFinished):
3578         minor fix
3579         * buildbot/status/builder.py (BuildSetStatus): implement enough to
3580         allow scheduler.Dependent to work
3581         * buildbot/buildset.py (BuildSet): set .reason and .results
3583         * buildbot/test/test_interlock.py (Locks.setUp): connect both
3584         slaves, to make the test stop hanging. It still fails, of course,
3585         because I haven't even started to implement Locks.
3587         * buildbot/test/runutils.py (RunMixin.connectSlaves): new utility
3589         * docs/buildbot.texinfo (Build-Dependencies): redesign the feature
3590         * buildbot/interfaces.py (IUpstreamScheduler): new Interface
3591         * buildbot/scheduler.py (BaseScheduler): factor out common stuff
3592         (Dependent): new class for downstream build dependencies
3593         * buildbot/test/test_dependencies.py: tests (still failing)
3595         * buildbot/buildset.py (BuildSet.waitUntilSuccess): minor notes
3597 2005-07-07  Brian Warner  <warner@lothar.com>
3599         * buildbot/test/runutils.py (RunMixin): factored this class out..
3600         * buildbot/test/test_run.py: .. from here
3601         * buildbot/test/test_interlock.py: removed old c['interlock'] tests,
3602         added new buildbot.locks tests (which all hang right now)
3603         * buildbot/locks.py (SlaveLock, MasterLock): implement Locks
3604         * buildbot/process/step.py: claim/release per-BuildStep locks
3606         * docs/Makefile: add 'buildbot.html' target
3608         * buildbot/process/step.py (CVS.__init__): allow branch=None to be
3609         interpreted as "HEAD", so that all VC steps can accept branch=None
3610         and have it mean the "default branch".
3612         * docs/buildbot.texinfo: add Schedulers, Dependencies, and Locks
3614 2005-07-07  Brian Warner  <warner@lothar.com>
3616         * docs/examples/twisted_master.cfg: update to match current usage
3618         * docs/buildbot.texinfo (System Architecture): comment out the
3619         image, it doesn't exist yet and just screws up the HTML manual.
3621 2005-07-05  Brian Warner  <warner@lothar.com>
3623         * debian/.cvsignore: oops, missed one. Removing leftover file.
3625 2005-06-17  Brian Warner  <warner@lothar.com>
3627         * buildbot/test/test_vc.py (VCSupport.__init__): svn --version
3628         changed its output in 1.2.0, don't mistakenly think that the
3629         subversion we find isn't capable of supporting our tests.
3631         * debian/*: remove the debian/ directory and its contents, to make
3632         life easier for the proper Debian maintainer
3633         * MANIFEST.in: same
3634         * Makefile (release): same
3636 2005-06-07  Brian Warner  <warner@lothar.com>
3638         * everything: create a distinct SourceStamp class to replace the
3639         ungainly 4-tuple, let it handle merging instead of BuildRequest.
3640         Changed the signature of Source.startVC to include the revision
3641         information (instead of passing it through self.args). Implement
3642         branches for SVN (now only Darcs/Git is missing support). Add more
3643         Scheduler tests.
3645 2005-06-06  Brian Warner  <warner@lothar.com>
3647         * everything: rearrange build scheduling. Create a new Scheduler
3648         object (configured in c['schedulers'], which submit BuildSets to a
3649         set of Builders. Builders can now use multiple slaves. Builds can
3650         be run on alternate branches, either requested manually or driven
3651         by changes. This changed some of the Status classes. Interlocks
3652         are out of service until they've been properly split into Locks
3653         and Dependencies. treeStableTimer, isFileImportant, and
3654         periodicBuild have all been moved from the Builder to the
3655         Scheduler.
3656         (BuilderStatus.currentBigState): removed the 'waiting' and
3657         'interlocked' states, removed the 'ETA' argument.
3659 2005-05-24  Brian Warner  <warner@lothar.com>
3661         * buildbot/pbutil.py (ReconnectingPBClientFactory): Twisted-1.3
3662         erroneously abandons the connection (in clientConnectionFailed)
3663         for non-UserErrors, which means that if we lose the connection due
3664         to a network problem or a timeout, we'll never try to reconnect.
3665         Fix this by not upcalling to the buggy parent method. Note:
3666         twisted-2.0 fixes this, but the function only has 3 lines so it
3667         makes more sense to copy it than to try and detect the buggyness
3668         of the parent class. Fixes SF#1207588.
3670         * buildbot/changes/changes.py (Change.branch): doh! Add a
3671         class-level attribute to accomodate old Change instances that were
3672         pickled before 0.6.5 (where .branch was added for new Changes).
3673         This fixes the exception that occurs when you try to look at an
3674         old Change (through asHTML).
3676         * buildbot/__init__.py (version): bump to 0.6.6+ while between
3677         releases
3679 2005-05-23  Brian Warner  <warner@lothar.com>
3681         * buildbot/__init__.py (version): release 0.6.6
3683 2005-05-23  Brian Warner  <warner@lothar.com>
3685         * NEWS: update for 0.6.6 release
3686         * debian/changelog: same
3688         * buildbot/scripts/runner.py (start): put the basedir in sys.path
3689         before starting: this was done by twistd back when we spawned it,
3690         now that we're importing the pieces and running them in the
3691         current process, we have to do it ourselves. This allows
3692         master.cfg to import files from the same directory without
3693         explicitly manipulating PYTHONPATH. Thanks to Thomas Vander
3694         Stichele for the catch.
3695         (Options.opt_version): Add a --version command (actually, just make
3696         the existing --version command emit Buildbot's version too)
3698         * buildbot/status/builder.py (HTMLLogFile.upgrade): oops! second
3699         fix to make this behave like other LogFiles, this time to handle
3700         existing LogFiles on disk. (add the missing .upgrade method)
3701         * buildbot/test/test_status.py (Log.testHTMLUpgrade): test it
3703 2005-05-21  Brian Warner  <warner@lothar.com>
3705         * buildbot/test/test_runner.py (Create.testMaster): match the
3706         rawstring change in runner.py:masterTAC
3708         * buildbot/test/test_config.py (ConfigTest.testIRC): skip unless
3709         TwistedWords is installed
3710         * buildbot/test/test_status.py: same, with TwistedMail
3712         * buildbot/master.py: remove old IRC/Waterfall imports (used by
3713         some old, deprecated, and removed config keys). This should enable
3714         you to use the base buildbot functionality with Twisted-2.0.0 when
3715         you don't also have TwistedWeb and TwistedWords installed
3717 2005-05-20  Brian Warner  <warner@lothar.com>
3719         * buildbot/scripts/runner.py (run): call sendchange(), not
3720         do_sendchange(): thus 'buildbot sendchange' was broken in 0.6.5
3721         (run): call stop("HUP"), not "-HUP", 'buildbot stop' was broken.
3722         (stop): don't wait for process to die when sending SIGHUP
3723         (masterTAC): use a rawstring for basedir=, otherwise '\' in the
3724         directory name gets interpreted, which you don't want
3725         (slaveTAC): same
3727         * buildbot/__init__.py (version): bump to 0.6.5+ while between
3728         releases
3730 2005-05-18  Brian Warner  <warner@lothar.com>
3732         * buildbot/__init__.py (version): Releasing buildbot-0.6.5
3734 2005-05-18  Brian Warner  <warner@lothar.com>
3736         * README: update for 0.6.5
3737         * debian/changelog: same
3739         * buildbot/changes/changes.py: rename tag= to branch=, since
3740         that's how we're using it, and my design for the upcoming "build a
3741         specific branch" feature wants it. also, tag= was too CVS-centric
3742         * buildbot/changes/mail.py (parseSyncmail): same
3743         * buildbot/process/base.py (Build.isBranchImportant): same
3744         * buildbot/test/test_mailparse.py (Test3.testMsgS4): same
3745         * docs/buildbot.texinfo (Attributes of Changes): same
3747         * NEWS: update tag=, update for upcoming release
3749 2005-05-17  Brian Warner  <warner@lothar.com>
3751         * buildbot/scripts/runner.py (stop): actually poll once per
3752         second, instead of re-killing the poor daemon once per second.
3753         Sleep briefly (0.1s) before the first poll, since there's a good
3754         chance we can avoid waiting the full second if the daemon shuts
3755         down quickly. Also remove the sys.exit() at the end.
3756         (start): remove the unneighborly sys.exit()
3758         * Makefile: improve permission-setting to not kick Arch so badly
3760         * buildbot/scripts/runner.py (SlaveOptions.optParameters): set a
3761         default --keepalive=600, since it doesn't hurt very much, and it's
3762         a hassle to discover that you need it.
3763         * buildbot/test/test_runner.py (Create.testSlave): test it
3765         * buildbot/status/words.py (IrcStatusBot.buildFinished): Teach the
3766         IRC bot about EXCEPTION
3768         * buildbot/status/client.py (PBListener): upcall more correctly
3770         * buildbot/process/base.py (Build.allStepsDone): if a step caused
3771         an exception mark the overall build with EXCEPTION, not SUCCESS
3773         * buildbot/scripts/runner.py (makefile_sample): remove the leading
3774         newline
3775         * buildbot/status/mail.py (MailNotifier): oops, forgot to upcall
3776         * Makefile: update some release-related stuff
3778         * buildbot/slave/commands.py (ShellCommand.kill): if somehow this
3779         gets called when there isn't actually an active process, just end
3780         the Command instead of blowing up. I don't know how it gets into
3781         this state, but the twisted win32 buildslave will sometimes hang,
3782         and when it shakes its head and comes back, it thinks it's still
3783         running a Command. The next build causes this command to be
3784         interrupted, but the lack of self.process.pid breaks the interrupt
3785         attempt.
3787         * NEWS: document changes since the last release
3789         * buildbot/scripts/runner.py (start): change 'buildbot start' to
3790         look for Makefile.buildbot instead of a bare Makefile . The
3791         'buildbot start' does not install this file, so you have to
3792         manually copy it if you want to customize startup behavior.
3793         (createMaster): change 'buildbot master' command to create
3794         Makefile.sample instead of Makefile, to create master.cfg.sample
3795         instead of master.cfg (requiring you to copy it before the
3796         buildmaster can be started). Both sample files are kept up to
3797         date, i.e. they are overwritten if they have been changed. The
3798         'buildbot.tac' file is *not* overwritten, but if the new contents
3799         don't match the old, a 'buildbot.tac.new' file is created and the
3800         user is warned. This seems to be a much more sane way to handle
3801         startup files. Also, don't sys.exit(0) when done, so we can run
3802         unit tests against it.
3803         (createSlave): same. Don't overwrite the sample info/ files.
3804         * buildbot/scripts/sample.mk: remove. the contents were pulled
3805         into runner.py, since they need to match the behavior of start()
3806         * setup.py: same
3807         * MANIFEST.in: same
3809         * docs/buildbot.texinfo (Launching the daemons): document it
3810         * buildbot/test/test_runner.py (Create): test it
3812         * buildbot/test/test_vc.py (SetupMixin.failUnlessIn): Add a
3813         version that can handle string-in-string tests, because otherwise
3814         python-2.2 fails the tests. It'd be tremendous if Trial's test
3815         took two strings under 2.2 too.
3817         * everything: fixed all deprecation warnings when running against
3818         Twisted-2.0 . (at least all the ones in buildbot code, there are a
3819         few that come from Twisted itself). This involved putting most of
3820         the Twisted-version specific code in the new buildbot.twcompat
3821         module, and creating some abstract base classes in
3822         buildbot.changes.base and buildbot.status.base (which might be
3823         useful anyway). __implements__ is a nuisance and requires an ugly
3824         'if' clause everywhere.
3826         * buildbot/test/test_status.py (Mail.testMail): add a 0.1 second
3827         delay before finishing the test: it seems that smtp.sendmail
3828         doesn't hang up on the server, so we must wait a moment so it can
3829         hang up on us. This removes the trial warning about an unclean
3830         reactor.
3832 2005-05-16  Brian Warner  <warner@lothar.com>
3834         * buildbot/process/step.py (Source): add 'retry' argument. It is a
3835         tuple of (delay, repeats).
3836         * buildbot/test/test_vc.py (Retry): test it
3837         * docs/buildbot.texinfo (Source Checkout): document it
3838         * buildbot/slave/commands.py (SourceBase): add 'retry' parameter.
3839         (SourceBase.maybeDoVCRetry): If 'retry' is set, failures in
3840         doVCFull() are handled by re-trying the checkout (after a delay)
3841         some number of times.
3842         (ShellCommand._startCommand): make header lines easier to read
3844         * buildbot/test/test_web.py (WebTest.tearDown): factor out master
3845         shutdown
3846         (WebTest.test_logfile): make sure master gets shut down, silences
3847         some "unclean reactor" test errors
3849         * buildbot/test/test_changes.py (Sender.tearDown): spin the
3850         reactor once after shutdown, something in certain versions of
3851         Twisted trigger a test failure. 1.3.0 is ok, 2.0.0 fails, 2.0.1pre
3852         fails, svn-trunk is ok.
3854         * buildbot/test/test_slavecommand.py (Shell.testShellZ): add a
3855         second win32 error message
3857         * buildbot/test/test_run.py (Status.testSlave): be smarter about
3858         validating the ETA, so the tests don't fail on slow systems
3860 2005-05-15  Brian Warner  <warner@lothar.com>
3862         * buildbot/status/builder.py (HTMLLogFile): make this behave like
3863         the new LogFile class, so upgrading works properly
3864         (LogFileProducer.resumeProducing): survive resumeProducing after
3865         we've exhausted the chunkGenerator
3867         * buildbot/test/test_web.py (WebTest.test_logfile): validate HTML
3868         logs too
3869         * buildbot/test/test_status.py (Log.testAdd): validate hasContents
3870         (Log.testUpgrade): same
3872         * docs/buildbot.texinfo (Maintenance): describe how to delete old
3873         Builds and logs with a cron job.
3875         * buildbot/status/builder.py (LogFile): revamp LogFiles. Got rid
3876         of the old non-offline LogFile, added code to upgrade these to
3877         new-style contents-live-on-disk instances at load time (in a way
3878         that doesn't invalidate the old Build pickles, so upgrading to
3879         0.6.5 is not a one-way operation). Got rid of everything related
3880         to 'stub' builds.
3881         (LogFile.__init__): create LogFiles with the parent step status,
3882         the log's name, and a builder-relative filename where it can keep
3883         the contents on disk.
3884         (LogFile.hasContents): new method, clients are advised to call it
3885         before getText or getChunks and friends. If it returns False, the
3886         log's contents have been deleted and getText() will raise an
3887         error.
3888         (LogFile.getChunks): made it a generator
3889         (LogFile.subscribeConsumer): new method, takes a Twisted-style
3890         Consumer (except one that takes chunks instead of strings). This
3891         enables streaming of very large logfiles without storing the whole
3892         thing in memory.
3893         (BuildStatus.generateLogfileName): create names like
3894         12-log-compile-output, with a _0 suffix if required to be unique
3895         (BuildStatus.upgradeLogfiles): transform any old-style (from 0.6.4
3896         or earlier) logfiles into new-style ones
3897         (BuilderStatus): remove everything related to 'stub' builds. There
3898         is now only one build cache, and we don't strip logs from old
3899         builds anymore.
3900         (BuilderStatus.getBuildByNumber): check self.currentBuild too,
3901         since we no longer fight to keep it in the cache
3903         * buildbot/status/html.py (TextLog.render_GET): use a
3904         ChunkConsumer to stream the log entries efficiently.
3905         (ChunkConsumer): wrapper which consumes chunks and writes
3906         formatted HTML.
3908         * buildbot/test/test_twisted.py (Parse.testParse): use a
3909         LogFile-like object instead of a real one
3911         * buildbot/test/test_status.py (MyLog): handle new LogFile code
3912         (Log.testMerge3): validate more merge behavior
3913         (Log.testChunks): validate LogFile.getChunks
3914         (Log.testUpgrade): validate old-style LogFile upgrading
3915         (Log.testSubscribe): validate LogFile.subscribe
3916         (Log.testConsumer): validate LogFile.subscribeConsumer
3918         * buildbot/interfaces.py (IStatusLogStub): remove
3919         (IStatusLog.subscribeConsumer): new method
3920         (IStatusLog.hasContents): new method
3921         (IStatusLogConsumer): describes things passed to subscribeConsumer
3923         * buildbot/status/html.py (StepBox.getBox): Don't offer an href to
3924         the log contents if it does not have any contents.
3925         (StatusResourceBuildStep.body): same
3926         (StatusResourceBuildStep.getChild): give a 404 for empty logs
3928 2005-05-14  Brian Warner  <warner@lothar.com>
3930         * buildbot/test/test_web.py (WebTest.test_logfile): add 5-second
3931         timeouts to try and make the windows metabuildslave not hang
3933 2005-05-13  Mike Taylor  <bear@code-bear.com>
3935         * buildbot/slave/commands.py (rmdirRecursive): added a check
3936         to ensure the path passed into rmdirRecursive actually exists.
3937         On win32 a non-existant path would generate an exception.
3939 2005-05-13  Brian Warner  <warner@lothar.com>
3941         * buildbot/slave/commands.py (rmdirRecursive): replacement for
3942         shutil.rmtree which behaves correctly on windows in the face of
3943         files that you have to chmod before deleting. Thanks to Bear at
3944         the OSAF for the routine.
3945         (SourceBase.doClobber): use rmdirRecursive
3947 2005-05-12  Brian Warner  <warner@lothar.com>
3949         * buildbot/status/builder.py (OfflineLogFile.getChunks): have this
3950         method generate chunks instead of returning a big list. This
3951         allows the same method to be used for both old LogFile and new
3952         OfflineLogFile.
3953         (OfflineLogFile.getText): use the generator
3954         (OfflineLogFile.subscribe): same
3955         * buildbot/status/html.py (TextLog.resumeProducing): same
3956         * buildbot/interfaces.py (IStatusLog.getChunks): document it
3958         * buildbot/test/test_web.py (WebTest.test_logfile): Add a test to
3959         point out that OfflineLogFile does not currently work with
3960         html.Waterfall . Fixing this is high-priority.
3962         * buildbot/scripts/runner.py (start): add --logfile=twistd.log, since
3963         apparently windows defaults to using stdout
3965         * buildbot/test/test_slavecommand.py (Shell.testShellZ): log a
3966         better message on failure so I can figure out the win32 problem
3968         * buildbot/slave/commands.py (ShellCommand._startCommand): update
3969         log messages to include more useful copies of the command being
3970         run, the argv array, and the child command's environment.
3971         (Git.doVCFull): update cg-close usage, patch from Brandon Philips.
3973 2005-05-11  Brian Warner  <warner@lothar.com>
3975         * setup.py: oops, install debug.glade so 'buildbot debugclient'
3976         will actually work
3977         * Makefile: update the deb-snapshot version
3979         * docs/buildbot.texinfo: move all .xhtml docs into a new
3980         .texinfo-format document, adding a lot of material in the process.
3981         This is starting to look like a real user's manual. Removed all
3982         the Lore-related files: *.xhtml, *.css, template.tpl .
3983         * docs/Makefile: simple makefile to run 'makeinfo'
3984         * buildbot/scripts/sample.cfg: rearrange slightly
3985         * MANIFEST.in: include .info and .textinfo, don't include *.xhtml
3987 2005-05-10  Brian Warner  <warner@lothar.com>
3989         * buildbot/scripts/runner.py (start): Twisted-1.3.0 used a
3990         different name for the internal twistw module, handle it.
3992         * MANIFEST.in: we deleted plugins.tml, so stop shipping it
3993         * setup.py: .. and stop trying to install it
3995         * buildbot/process/step.py (Git): added support for 'cogito' (aka
3996         'git'), the new linux kernel VC system (http://kernel.org/git/).
3997         Thanks to Brandon Philips for the patch.
3998         * buildbot/slave/commands.py (Git): same
4000 2005-05-06  Brian Warner  <warner@lothar.com>
4002         * buildbot/status/builder.py (OfflineLogFile): replace the default
4003         LogFile with a form that appends its new contents to a disk file
4004         as they arrive. The complete log data is never kept in RAM. This
4005         is the first step towards handling very large (100MB+) logfiles
4006         without choking quite so badly. (The other half is
4007         producer/consumer on the HTML pages).
4008         (BuildStepStatus.addLog): use OfflineLogFile by default
4009         (BuildStatus.getLogfileName): helper code to give the
4010         OfflineLogFile a filename to work with
4012         * buildbot/test/test_status.py (Results.testAddResults): update
4013         tests to handle new asserts
4014         * buildbot/test/test_vc.py (Patch.doPatch): same
4015         * buildbot/test/test_steps.py (BuildStep.setUp): same
4017 2005-05-05  Brian Warner  <warner@lothar.com>
4019         * buildbot/scripts/runner.py (start): if there is no Makefile,
4020         launch the app by importing twistd's internals and calling run(),
4021         rather than spawning a new twistd process. This stands a much
4022         better chance of working under windows.
4023         (stop): kill the process with os.kill instead of spawning
4024         /bin/kill, again to reduce the number of external programs which
4025         windows might not have in the PATH. Also wait up to 5 seconds for
4026         the process to go away, allowing things like 'buildbot stop;
4027         buildbot start' to be reliable in the face of slow shutdowns.
4029         * buildbot/master.py (Dispatcher.__getstate__): remove old
4030         .tap-related methods
4031         (BuildMaster.__getstate__): same
4032         (makeService): same
4033         * buildbot/slave/bot.py (makeService): same
4034         (Options.longdesc): same
4035         * buildbot/scripts/runner.py: copy over some old mktap option text
4037         * buildbot/scripts/runner.py (masterTAC): stop using mktap.
4038         'buildbot master' now creates a buildbot.tac file, so there is no
4039         longer a create-instance/save/reload sequence. mktap is dead, long
4040         live twistd -y.
4041         * buildbot/scripts/sample.mk: use twistd -y, not -f
4042         * buildbot/test/test_config.py: remove mktap-based test
4043         * buildbot/bb_tap.py, buildbot/plugins.tml: delete old files
4044         * README: don't reference mktap
4046         * docs/source.xhtml: document some of the attributes that Changes
4047         might have
4049         * docs/steps.xhtml (Bazaar): document the Bazaar checkout step
4051         * general: merge in Change(tag=) patch from Thomas Vander Stichele.
4052         [org.apestaart@thomas--buildbot/buildbot--cvstag--0-dev--patch-2]
4053         * buildbot/changes/changes.py (Change)
4054         * buildbot/changes/mail.py (parseSyncmail)
4055         * buildbot/test/test_mailparse.py (Test3.getNoPrefix)
4056         (Test3.testMsgS5)
4057         * buildbot/process/base.py (Build.isTagImportant)
4058         (Build.addChange)
4061 2005-05-04  Brian Warner  <warner@lothar.com>
4063         * buildbot/clients/sendchange.py (Sender.send): tear down the PB
4064         connection after sending the change, so that unit tests don't
4065         complain about sockets being left around
4067         * buildbot/status/html.py (WaterfallStatusResource.body): fix
4068         exception in phase=0 rendering
4069         * buildbot/test/test_web.py (WebTest.test_waterfall): test it
4071         * buildbot/changes/dnotify.py (DNotify.__init__): remove debug msg
4073         * buildbot/master.py (BuildMaster.loadConfig): finally remove
4074         deprecated config keys: webPortnum, webPathname, irc, manholePort,
4075         and configuring builders with tuples.
4076         * buildbot/test/test_config.py: stop testing compatibility with
4077         deprecated config keys
4078         * buildbot/test/test_run.py: same
4080 2005-05-03  Brian Warner  <warner@lothar.com>
4082         * contrib/arch_buildbot.py: survive if there are no logfiles
4083         (username): just use a string, os.getlogin isn't reliable
4085         * buildbot/scripts/runner.py (sendchange): oops, fix the command
4086         so 'buildbot sendchange' actually works. The earlier test only
4087         covered the internal (non-reactor-running) form.
4089         * contrib/arch_buildbot.py: utility that can run as an Arch hook
4090         script to notify the buildmaster about changes
4092         * buildbot/scripts/runner.py (sendchange): new command to send a
4093         change to a buildbot.changes.pb.PBChangeSource receiver.
4094         * buildbot/test/test_changes.py (Sender): test it
4096         * buildbot/master.py (BuildMaster.startService): mark .readConfig
4097         after any reading of the config file, not just when we do it in
4098         startService. This makes some tests a bit cleaner.
4100         * buildbot/changes/pb.py: add some log messages
4102         * buildbot/process/base.py (Build.startBuild): fix a bug that
4103         caused an exception when the build terminated in the very first
4104         step.
4105         (Build.stepDone): let steps return a status of EXCEPTION. This
4106         terminates the build right away, and sets the build's overall
4107         status to EXCEPTION too.
4108         * buildbot/process/step.py (BuildStep.failed): return a status of
4109         EXCEPTION when that is what has happened.
4111         * buildbot/process/step.py (Arch.computeSourceRevision): finally
4112         implement this, allowing Arch-based projects to get precise
4113         checkouts instead of always using the latest code
4114         (Bazaar): create variant of Arch to let folks use baz instead of
4115         tla. Requires a new buildslave too.
4116         * buildbot/slave/commands.py (Arch): add 'revision' argument
4117         (Bazaar): create variant of Arch that uses baz instead of tla.
4118         Remove the code that extracts the archive name from the
4119         register-archive output, since baz doesn't provide it, and require
4120         the user provide both the archive name and its location.
4121         * buildbot/test/test_vc.py (VC.testBazaar): added tests
4123 2005-05-02  Brian Warner  <warner@lothar.com>
4125         * buildbot/scripts/sample.cfg: improve docs for c['buildbotURL'],
4126         thanks to Nick Trout.
4128         * buildbot/scripts/runner.py (Maker.makefile): chmod before edit,
4129         deals better with source Makefile coming from a read-only CVS
4130         checkout. Thanks to Nick Trout for the catch.
4132         * buildbot/__init__.py (version): bump to 0.6.4+ while between
4133         releases
4135 2005-04-28  Brian Warner  <warner@lothar.com>
4137         * buildbot/__init__.py (version): Releasing buildbot-0.6.4
4139         * debian/changelog: update for 0.6.4
4141 2005-04-28  Brian Warner  <warner@lothar.com>
4143         * README.w32: add a checklist of steps for getting buildbot
4144         running on windows.
4145         * MANIFEST.in: include it in the tarball
4147         * NEWS: update
4149         * buildbot/master.py (BuildMaster.upgradeToVersion3): deal with
4150         broken .tap files from 0.6.3 by getting rid of .services,
4151         .namedServices, and .change_svc at load time.
4153 2005-04-27  Brian Warner  <warner@lothar.com>
4155         * NEWS: update in preparation for new release
4157         * buildbot/test/test_config.py (Save.testSave): don't pull in
4158         twisted.scripts.twistd, we don't need it and it isn't for windows
4159         anyway.
4161         * buildbot/changes/changes.py (ChangeMaster.saveYourself):
4162         accomodate win32 which can't do atomic-rename
4164 2005-04-27  Brian Warner  <warner@lothar.com>
4166         * buildbot/test/test_run.py (Disconnect.testBuild2): crank up some
4167         timeouts to help the slow metabuildbot not flunk them so much
4168         (Disconnect.testBuild3): same
4169         (Disconnect.testBuild4): same
4170         (Disconnect.testInterrupt): same
4172         * buildbot/master.py (BuildMaster.loadChanges): fix change_svc
4173         setup, it was completely broken for new buildmasters (those which
4174         did not have a 'change.pck' already saved. Thanks to Paul Warren
4175         for catching this (embarrassing!) bug.
4176         (Dispatcher.__getstate__): don't save our registered avatar
4177         factories, since they'll be re-populated when the config file is
4178         re-read.
4179         (BuildMaster.__init__): add a dummy ChangeMaster, used only by
4180         tests (since the real mktap-generated BuildMaster doesn't save
4181         this attribute).
4182         (BuildMaster.__getstate__): don't save any service children,
4183         they'll all be re-populated when the config file is re-read.
4184         * buildbot/test/test_config.py (Save.testSave): test for this
4186 2005-04-26  Brian Warner  <warner@lothar.com>
4188         * buildbot/buildbot.png: use a new, smaller (16x16) icon image,
4189         rendered with Blender.. looks a bit nicer.
4190         * buildbot/docs/images/icon.blend: add the Blender file for it
4192         * buildbot/slave/commands.py (ShellCommand._startCommand): prepend
4193         'cmd.exe' (or rather os.environ['COMSPEC']) to the argv list when
4194         running under windows. This appears to be the best way to allow
4195         BuildSteps to do something normal like 'trial -v buildbot.test' or
4196         'make foo' and still expect it to work. The idea is to make the
4197         BuildSteps look as much like what a developer would type when
4198         compiling or testing the tree by hand. This approach probably has
4199         problems when there are spaces in the arguments, so if you've got
4200         windows buildslaves, you'll need to pay close attention to your
4201         commands.
4203         * buildbot/status/html.py (WaterfallStatusResource.body): add the
4204         timezone to the timestamp column.
4205         * buildbot/test/test_web.py (WebTest.test_waterfall): test it
4207         * buildbot/scripts/runner.py (loadOptions): do something sane for
4208         windows, I think. We use %APPDATA%/buildbot instead of
4209         ~/.buildbot, but we still search everywhere from the current
4210         directory up to the root for a .buildbot/ subdir. The "is it under
4211         $HOME" security test was replaced with "is it owned by the current
4212         user", which is only performed under posix.
4213         * buildbot/test/test_runner.py (Options.testFindOptions): update
4214         tests to match. The "is it owned by the current user" check is
4215         untested. The test has been re-enabled for windows.
4217         * buildbot/test/test_slavecommand.py (Shell.checkOutput): replace
4218         any "\n" in the expected output with the platform-specific line
4219         separator. Make this separator "\r\n" on PTYs under unix, they
4220         seem to do that and I don't know why
4222         * buildbot/test/test_runner.py (Options.optionsFile): disable on
4223         windows for now, I don't know what ~/.buildbot/ should mean there.
4225         * buildbot/test/test_run.py (BuilderNames.testGetBuilderNames):
4226         win32 compatibility, don't use "/tmp"
4227         (Basedir.testChangeBuilddir): remove more unixisms
4229 2005-04-26  Brian Warner  <warner@lothar.com>
4231         * buildbot/test/test_control.py (Force.rmtree): python2.2
4232         compatibility, apparently its shutil.rmtree ignore_errors=
4233         argument is ignored.
4234         * buildbot/test/test_run.py (Run.rmtree): same
4235         (RunMixin.setUp): same
4237         * buildbot/test/test_runner.py (make): python2.2 has os.sep but
4238         not os.path.sep
4240         * buildbot/test/test_twisted.py (Parse.failUnlessIn): 2.2 has no
4241         'substring in string' operator, must use string.find(substr)!=-1
4242         * buildbot/test/test_vc.py (Patch.failUnlessIn): same
4243         * buildbot/test/test_web.py (WebTest.failUnlessIn): same
4245         * buildbot/scripts/runner.py (loadOptions): add code to search for
4246         ~/.buildbot/, a directory with things like 'options', containing
4247         defaults for various 'buildbot' subcommands. .buildbot/ can be in
4248         the current directory, your $HOME directory, or anywhere
4249         inbetween, as long as you're somewhere inside your home directory.
4250         (debugclient): look in ~/.buildbot/options for master and passwd
4251         (statuslog): look in ~/.buildbot/options for 'masterstatus'
4252         * buildbot/test/test_runner.py (Options.testFindOptions): test it
4254         * buildbot/status/client.py (makeRemote): new approach to making
4255         IRemote(None) be None, which works under Twisted-2.0
4256         * buildbot/test/test_status.py (Client.testAdaptation): test it
4258         * buildbot/status/builder.py (Status.builderAdded): when loading a
4259         pickled BuilderStatus in from disk, set its name after loading.
4260         The config file might have changed its name (but not its
4261         directory) while it wasn't looking.
4262         
4263         * buildbot/process/builder.py (Builder.attached): always return a
4264         Deferred, even if the builder was already attached
4265         * buildbot/test/test_run.py (Basedir.testChangeBuilddir): test it
4267 2005-04-25  Brian Warner  <warner@lothar.com>
4269         * buildbot/status/words.py (IrcStatusBot.buildFinished): fix a
4270         category-related exception when announcing a build has finished
4272         * buildbot/status/html.py (StatusResourceChanges.body): oops, don't
4273         reference no-longer-existent changemaster.sources
4274         * buildbot/test/test_web.py (WebTest.test_waterfall): test for it
4276         * buildbot/__init__.py (version): bump to 0.6.3+ while between
4277         releases
4279 2005-04-25  Brian Warner  <warner@lothar.com>
4281         * buildbot/__init__.py (version): Releasing buildbot-0.6.3
4283         * debian/changelog: update for 0.6.3
4285 2005-04-25  Brian Warner  <warner@lothar.com>
4287         * MANIFEST.in: make sure debug.glade is in the tarball
4289         * README (REQUIREMENTS): list necessary Twisted-2.0 packages
4291         * NEWS: update for the imminent 0.6.3 release
4293         * buildbot/status/html.py (HtmlResource.content): make the
4294         stylesheet <link> always point at "buildbot.css".
4295         (StatusResource.getChild): map "buildbot.css" to a static.File
4296         containing whatever css= argument was provided to Waterfall()
4297         (Waterfall): provide the "classic" css as the default.
4298         * docs/waterfall.classic.css: move default CSS from here ..
4299         * buildbot/status/classic.css: .. to here
4301         * MANIFEST.in: make sure classic.css is included in the tarball
4302         * setup.py: and that it is installed too, under buildbot/status/
4304         * buildbot/master.py (BuildMaster): oops, set .change_svc=None at
4305         the module level, because buildbot.tap files from 0.6.2 don't have
4306         it in their attribute dictionary.
4308         * buildbot/slave/bot.py (Bot.startService): make sure the basedir
4309         really exists at startup, might save some confusion somewhere.
4311 2005-04-24  Thomas Vander Stichele  <thomas at apestaart dot org>
4313         * docs/waterfall.classic.css:
4314           add a stylesheet that's almost the same as the "classic"
4315           buildbot style
4317         * buildbot/status/builder.py:
4318           add EXCEPTION as a result - this is a problem for the bot
4319           maintainer, not a build problem for the changers
4320         * buildbot/process/step.py:
4321           use EXCEPTION instead of FAILURE for exceptions
4322         * buildbot/status/html.py:
4323           add build_get_class to get a class out of a build/buildstep
4324           finish naming the classes
4325           split out sourceNames to changeNames and builderNames so we
4326           can style them separately
4327         * docs/config.xhtml:
4328           finish documenting classes as they are right now
4330         * buildbot/status/html.py:
4331           name the classes as we agreed on IRC
4332         * docs/config.xhtml:
4333           and document them
4335         * buildbot/status/html.py:
4336           same for cssclass->class_
4338         * buildbot/status/html.py:
4339           as decided on IRC, use class_ for the "class" attribute to not
4340           conflict with the class keyword, and clean up the messy **{} stuff.
4342         * buildbot/status/mail.py:
4343           put back "builders" argument, and fix docstring, because the
4344           code *ignores* builders listed in this argument
4346         * buildbot/process/builder.py:
4347           remove FIXME notes - category is now indeed a cvar of BuilderStatus
4349         * docs/config.xhtml:
4350           describe the category argument for builders
4352         * buildbot/status/builder.py:
4353           Fix a silly bug due to merging
4355         * buildbot/process/builder.py:
4356           remove category from the process Builder ...
4357         * buildbot/status/builder.py:
4358           ... and add it to BuilderStatus instead.
4359           Set category on unpickled builder statuses, they might not have it.
4360         * buildbot/master.py:
4361           include category when doing builderAdded
4362         * buildbot/status/mail.py:
4363           return None instead of self for builders we are not interested in.
4364         * buildbot/test/test_run.py:
4365           fix a bug due to only doing deferredResult on "dummy" waiting
4366         * buildbot/test/test_status.py:
4367           add checks for the Mail IStatusReceiver returning None or self
4369         * buildbot/status/html.py:
4370           fix testsuite by prefixing page title with BuildBot
4372         * buildbot/status/builder.py:
4373           have .category in builder status ...
4374         * buildbot/process/builder.py:
4375           ... and set it from Builder
4376         * buildbot/status/html.py:
4377           make .css a class variable 
4378         * buildbot/test/test_status.py:
4379           write more tests to cover our categories stuff ...
4380         * buildbot/status/mail.py:
4381           ... and fix the bug that this uncovered
4383         * buildbot/changes/mail.py:
4384         * buildbot/changes/pb.py:
4385         * buildbot/master.py:
4386         * buildbot/process/base.py:
4387         * buildbot/process/factory.py:
4388         * buildbot/process/interlock.py:
4389         * buildbot/process/step.py:
4390         * buildbot/process/step_twisted.py:
4391         * buildbot/slave/commands.py:
4392         * buildbot/status/builder.py:
4393         * buildbot/status/client.py:
4394         * buildbot/status/html.py:
4395         * buildbot/status/mail.py:
4396         * buildbot/status/progress.py:
4397         * buildbot/test/test_changes.py:
4398         * buildbot/test/test_config.py:
4399         * buildbot/test/test_control.py:
4400         * buildbot/test/test_interlock.py:
4401         * buildbot/test/test_maildir.py:
4402         * buildbot/test/test_mailparse.py:
4403         * buildbot/test/test_run.py:
4404         * buildbot/test/test_slavecommand.py:
4405         * buildbot/test/test_status.py:
4406         * buildbot/test/test_steps.py:
4407         * buildbot/test/test_twisted.py:
4408         * buildbot/test/test_util.py:
4409         * buildbot/test/test_vc.py:
4410         * buildbot/test/test_web.py:
4411         * buildbot/util.py:
4412           add test-case-name at the top of a whole set of files
4414         * buildbot/status/builder.py:
4415           keep order of addition when getting builder names
4416         * buildbot/status/words.py:
4417         * buildbot/test/test_run.py:
4418           add test for getBuilderNames
4420         * buildbot/process/base.py:
4421         * buildbot/process/step.py:
4422         * buildbot/status/builder.py:
4423         * buildbot/status/html.py:
4424           make buildbot css-able
4425           replace the color code for purple with purple, don't understand
4426           why it wasn't purple to start with
4428         * buildbot/status/words.py:
4429           ok, so it doesn't look like BuilderStatus.remote is still valid.
4430           Use what waterfall uses instead.
4432         * buildbot/interfaces.py:
4433         * buildbot/status/builder.py:
4434         * buildbot/status/html.py:
4435         * buildbot/status/mail.py:
4436         * buildbot/status/words.py:
4437         * buildbot/test/test_run.py:
4438           use categories everywhere and make it be a list.  More sensible
4439           for the future.  Also make words actually respect this in
4440           buildFinished.
4442         * buildbot/interfaces.py:
4443           add category argument to getBuilderNames
4444         * buildbot/process/builder.py:
4445         * buildbot/status/builder.py:
4446         * buildbot/status/html.py:
4447         * buildbot/status/mail.py:
4448         * buildbot/status/words.py:
4449         * buildbot/test/test_run.py:
4450           move from specifying builders by name to specifying the category
4452         * buildbot/status/html.py:
4453         * buildbot/status/words.py:
4454           add "builders=" to __init__ of status clients so they can
4455           limit themselves to the given list of builders to report on
4457         * buildbot/status/html.py: set the title to the product name
4459 2005-04-23  Thomas Vander Stichele  <thomas at apestaart dot org>
4461         * buildbot/interfaces.py:
4462         * buildbot/status/builder.py:
4463           more documentation.  Hm, not sure if ChangeLog entries make sense
4464           here...
4466 2005-04-23  Brian Warner  <warner@lothar.com>
4468         * buildbot/test/test_vc.py (SetupMixin.do_vc): increase timeouts
4470         * buildbot/test/test_slavecommand.py (Shell): increase timeouts
4472         * buildbot/scripts/runner.py: make 'statuslog' and 'statusgui' be
4473         the sub-commands that log buildmaster status to stdout and to a
4474         GUI window, respectively.
4476         * buildbot/clients/gtkPanes.py: overhaul. basic two-row
4477         functionality is working again, but all the step-status and ETA
4478         stuff is missing. Commented out a lot of code pending more
4479         overhaul work.
4481         * buildbot/status/client.py: make sure that IRemote(None) is None
4483         * buildbot/changes/changes.py: import defer, oops
4484         (ChangeMaster): remove the .sources list, rely upon the fact that
4485         MultiServices can be treated as sequences of their children. This
4486         cleans up the add/remove ChangeSource routines a lot, as we keep
4487         exactly one list of the current sources instead of three.
4489         * buildbot/master.py (BuildMaster.__init__): remove .sources, set
4490         up an empty ChangeMaster at init time.
4491         (BuildMaster.loadChanges): if there are changes to be had from
4492         disk, replace self.change_svc with the new ones. If not, keep
4493         using the empty ChangeMaster set up in __init__.
4494         (BuildMaster.loadConfig_Sources): use list(self.change_svc)
4495         instead of a separate list, makes the code a bit cleaner.
4496         * buildbot/test/test_config.py (ConfigTest.testSimple): match it
4497         (ConfigTest.testSources): same, also wait for loadConfig to finish.
4498         Extend the test to make sure we can get rid of the sources when
4499         we're done.
4501 2005-04-22  Brian Warner  <warner@lothar.com>
4503         * buildbot/scripts/runner.py (Maker.mkinfo): create the info/admin
4504         and info/host files when making the slave directory
4506         * buildbot/test/test_run.py (RunMixin.shutdownSlave): remove the
4507         whendone= argument, just return the Deferred and let the caller do
4508         what they want with it.
4509         (Disconnect.testBuild1): wait for shutdownSlave
4510         (Basedir.testChangeBuilddir): new test to make sure changes to the
4511         builddir actually get propagated to the slave
4513         * buildbot/slave/bot.py (SlaveBuilder.setBuilddir): use an
4514         explicit method, rather than passing the builddir in __init__ .
4515         Make sure to update self.basedir too, this was broken before.
4516         (Bot.remote_setBuilderList): use b.setBuilddir for both new
4517         builders and for ones that have just had their builddir changed.
4518         (BotFactory): add a class-level .perspective attribute, so
4519         BuildSlave.waitUntilDisconnected won't get upset when the
4520         connection hasn't yet been established
4521         (BuildSlave.__init__): keep track of the bot.Bot instance, so
4522         tests can reach through it to inspect the SlaveBuilders
4524         * buildbot/process/base.py (Build.buildException): explain the
4525         log.err with a log.msg
4526         * buildbot/process/builder.py (Builder.startBuild): same
4527         (Builder._startBuildFailed): improve error message
4529         * buildbot/pbutil.py (RBCP.failedToGetPerspective): if the failure
4530         occurred because we lost the brand-new connection, retry instead
4531         of giving up. If not, it's probably an authorization failure, and
4532         it makes sense to stop trying. Make sure we log.msg the reason
4533         that we're log.err'ing the failure, otherwise test failures are
4534         really hard to figure out.
4536         * buildbot/master.py: change loadConfig() to return a Deferred
4537         that doesn't fire until the change has been fully implemented.
4538         This means any connected slaves have been updated with the new
4539         builddir. This change makes it easier to test the code which
4540         actually implements this builddir-updating.
4541         (BotPerspective.addBuilder): return Deferred
4542         (BotPerspective.removeBuilder): same
4543         (BotPerspective.attached): same
4544         (BotPerspective._attached): same. finish with remote_print before
4545         starting the getSlaveInfo, instead of doing them in parallel
4546         (BotPerspective.list_done): same
4547         (BotMaster.removeSlave): same. Fix the typo that meant we weren't
4548         actually calling slave.disconnect()
4549         (BotMaster.addBuilder): same
4550         (BotMaster.removeBuilder): same
4551         (BuildMaster.loadConfig): same
4552         (BuildMaster.loadConfig_Slaves): same
4553         (BuildMaster.loadConfig_Sources): same
4554         (BuildMaster.loadConfig_Builders): same
4555         (BuildMaster.loadConfig_status): same
4557         * buildbot/changes/changes.py (ChangeMaster.removeSource): return
4558         a Deferred that fires when the source is finally removed
4560         * buildbot/slave/commands.py (SourceBase.doClobber): when removing
4561         the previous tree on win32, where we have to do it synchronously,
4562         make sure we return a Deferred anyway.
4563         (SourceBase.doCopy): same
4565         * buildbot/scripts/runner.py (statusgui): use the text client for
4566         now, while I rewrite the Gtk one
4567         * buildbot/clients/base.py: strip out old code, leaving just the
4568         basic print-message-on-event functionality. I also remove the
4569         ReconnectingPBClientFactory, but it does at least quit when it
4570         loses the connection instead of going silent
4572 2005-04-21  Brian Warner  <warner@lothar.com>
4574         * Makefile: minor tweaks
4576         * NEWS: point out deprecation warnings, new features for
4577         /usr/bin/buildbot
4579         * buildbot/master.py (BuildMaster.loadConfig): emit
4580         DeprecationWarnings for Builders defined with tuples. Rearrange
4581         code to facility removal of deprecated configuration keys in the
4582         next release.
4584         * buildbot/scripts/runner.py (createMaster,createSlave): rewrite
4585         'buildbot' command to put a little Makefile in the target that
4586         helps you re-create the buildbot.tap file, start or stop the
4587         master/slave, and reconfigure (i.e. SIGHUP) the master. Also chmod
4588         all the files 0600, since they contain passwords.
4589         (start): if there is a Makefile, and /usr/bin/make exists, use
4590         'make start' in preference to a raw twistd command. This lets
4591         slave admins put things like PYTHONPATH variables in their
4592         Makefiles and have them still work when the slave is started with
4593         'buildbot start ~/slave/foo'. The test is a bit clunky, it would
4594         be nice to first try the 'make' command and only fall back to
4595         twistd if it fails. TODO: the Makefile's "start" command does not
4596         add the --reactor=win32 argument when running under windows.
4597         (Options.debugclient, Options.statusgui): add sub-commands to launch
4598         the debug client (formerly in contrib/debugclient.py) and the
4599         Gtk status application (currently broken)
4600         * buildbot/clients/debug.py: move from contrib/debugclient.py
4601         * buildbot/clients/debug.glade: same
4603         * buildbot/test/test_trial.py: remove it. This requires some
4604         functionality out of Twisted that isn't there yet, and until then
4605         having it around just confuses things.
4607         * buildbot/test/test_slavecommand.py (Shell): test both with and
4608         without PTYs, and make sure that command output is properly
4609         interleaved in the with-PTY case. I think the without-PTY test
4610         should pass on windows, where we never use PTYs anyway.
4612 2005-04-20  Brian Warner  <warner@lothar.com>
4614         * README (REQUIREMENTS): mention Twisted-2.0.0 compatibility
4616         * MANIFEST.in: add epyrun, gen-reference, buildbot.png
4618         * NEWS: start creating entries for the next release
4620         * buildbot/slave/commands.py (ShellCommand.__init__): use os.pathsep
4622         * buildbot/test/test_web.py (WebTest.test_webPortnum): add timeout
4623         (WebTest.test_webPathname): same
4624         (WebTest.test_webPathname_port): same
4625         (WebTest.test_waterfall): use the default favicon rather than
4626         rooting around the filesystem for it. Open the expected-icon file
4627         in binary mode, to make win32 tests happier (thanks to Nick Trout
4628         for the catch)
4629         * buildbot/status/html.py (buildbot_icon): win32 portability
4631         * buildbot/test/test_slavecommand.py (SlaveCommandTestCase.testShellZ):
4632         win32-compatibility fixes from Nick Trout, the "file not found" message
4633         is different under windows
4634         (FakeSlaveBuilder.__init__): clean up setup a bit
4635         * buildbot/test/test_vc.py (VCSupport.__init__): win32: use os.pathsep
4637 2005-04-19  Brian Warner  <warner@lothar.com>
4639         * buildbot/test/test_vc.py (SetupMixin.setUpClass): fix the
4640         skip-if-repositories-are-unavailable test to not kill the trial
4641         that comes with Twisted-1.3.0
4643         * setup.py: install buildbot.png icon file when installing code
4645         * buildbot/slave/commands.py (ShellCommand._startCommand): log the
4646         environment used by the command, at least on the child side.
4648         * buildbot/status/html.py (TextLog.pauseProducing): add a note,
4649         this method needs to be added and implemented because it gets
4650         called under heavy load. I don't quite understand the
4651         producer/consumer API enough to write it.
4652         (StatusResource.getChild): add a resource for /favicon.ico
4653         (Waterfall.__init__): add favicon= argument
4654         * buildbot/test/test_web.py (WebTest.test_waterfall): test it
4655         (WebTest.test_webPortnum): stop using deprecated 'webPortnum'
4656         (WebTest.test_webPathname): same
4657         (WebTest.test_webPathname_port): same
4658         * docs/config.xhtml: mention favicon=
4659         * buildbot/buildbot.png: add a default icon, dorky as it is
4661 2005-04-18  Thomas Vander Stichele  <thomas at apestaart dot org>
4663         * buildbot/master.py:
4664         * buildbot/process/base.py:
4665         * buildbot/process/builder.py:
4666         * buildbot/process/interlock.py:
4667         * buildbot/status/builder.py:
4668         * buildbot/status/html.py:
4669         * buildbot/status/mail.py:
4670         * buildbot/status/words.py:
4671           new documentation while digging through the code
4673 2005-04-17  Brian Warner  <warner@lothar.com>
4675         * general: try to fix file modes on all .py files: a+r, a-x,
4676         but let buildbot/clients/*.py be +x since they're tools
4678         * docs/epyrun (addMod): when an import fails, say why
4680         * Makefile: Add a 'docs' target, hack on the PYTHONPATH stuff
4682 2005-04-17  Thomas Vander Stichele  <thomas at apestaart dot org>
4684         * buildbot/process/base.py:
4685         * buildbot/process/builder.py:
4686         * buildbot/status/builder.py:
4687           new documentation while digging through the code
4689 2005-04-17  Thomas Vander Stichele  <thomas at apestaart dot org>
4691         * buildbot/changes/changes.py:
4692         * buildbot/changes/p4poller.py:
4693         * buildbot/interfaces.py:
4694         * buildbot/process/base.py:
4695         * buildbot/process/builder.py:
4696         * buildbot/process/step.py:
4697         * buildbot/process/step_twisted.py:
4698         * buildbot/slave/bot.py:
4699         * buildbot/slave/commands.py:
4700         * buildbot/status/builder.py:
4701           fix all docstrings to make epydoc happy.  In the process of fixing
4702           some, I also moved pieces of docs, and removed some deprecated
4703           documentation
4705 2005-04-17  Thomas Vander Stichele  <thomas at apestaart dot org>
4707         * buildbot/process/builder.py:
4708         * buildbot/process/interlock.py:
4709         * buildbot/process/process_twisted.py:
4710         * buildbot/process/step.py:
4711           BuildProcess -> Build, as it looks like that's what happened
4712         * buildbot/process/base.py:
4713         * buildbot/process/factory.py:
4714           update epydoc stuff
4716 2005-04-17  Brian Warner  <warner@lothar.com>
4718         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
4719         update compile command to accomodate the Twisted split.. now
4720         instead of './setup.py build_ext -i', you do './setup.py all
4721         build_ext -i', to run build_ext over all sub-projects.
4722         (FullTwistedBuildFactory): same
4723         (TwistedReactorsBuildFactory): same
4725         * buildbot/status/html.py (TextLog.finished): null out self.req
4726         when we're done, otherwise the reference cycle of TextLog to .req
4727         to .notifications to a Deferred to TextLog.stop keeps them from
4728         being collected, and consumes a huge (610MB on pyramid at last
4729         check) amount of memory.
4731 2005-04-11  Brian Warner  <warner@lothar.com>
4733         * buildbot/test/test_vc.py (VCSupport.__init__): use abspath() to
4734         normalize the VC-repository location.. makes SVN happier with
4735         certain test environments.
4737         * buildbot/process/step.py (RemoteShellCommand.__init__): let each
4738         RemoteShellCommand gets its own .env dictionary, so that code in
4739         start() doesn't mutate the original. I think this should fix the
4740         step_twisted.Trial problem where multiple identical components
4741         kept getting added to PYTHONPATH= over and over again.
4743         * general: merge org.apestaart@thomas/buildbot--doc--0--patch-3,
4744         adding epydoc-format docstrings to many classes. Thanks to Thomas
4745         Vander Stichele for the patches.
4746         * docs/epyrun, docs/gen-reference: add epydoc-generating tools
4747         * buildbot/status/mail.py, buildbot/process/step_twisted.py: same
4748         * buildbot/slave/bot.py, commands.py, registry.py: same
4750 2005-04-05  Brian Warner  <warner@lothar.com>
4752         * buildbot/slave/commands.py (SourceBase.doCopy): use cp -p to
4753         preserve timestamps, helps incremental builds of large trees.
4754         Patch from Rene Rivera.
4756         * buildbot/slave/bot.py (SlaveBuilder.commandComplete): oops, log
4757         'failure' and not the non-existent 'why'. Thanks to Rene Rivera
4758         for the catch.
4760 2005-04-03  Brian Warner  <warner@lothar.com>
4762         * buildbot/master.py (BuildMaster.loadConfig): only call exec()
4763         with one dict, apparently exec has some scoping bugs when used
4764         with both global/local dicts. Thanks to Nathaniel Smith for the
4765         catch.
4767 2005-04-02  Brian Warner  <warner@lothar.com>
4769         * buildbot/process/step_twisted.py (countFailedTests): the new
4770         trial in Twisted-2.0 emits a slightly different status line than
4771         old trial ("PASSED.." instead of "OK.."). Handle it so we don't
4772         mistakenly think the test count is unparseable.
4773         (Trial.start): note that for some reason each build causes another
4774         copy of self.testpath to be prepended to PYTHONPATH. This needs to
4775         be fixed but I'm not sure quite where the problem is.
4777 2005-04-01  Brian Warner  <warner@lothar.com>
4779         * buildbot/test/test_run.py (Run.testMaster): change some uses of
4780         deferredResult to avoid hangs/warnings under twisted-2.0
4781         (RunMixin.tearDown): same
4782         (RunMixin.shutdownSlave): same
4783         (Disconnect.testIdle1): same
4784         (Disconnect.testBuild2): same: wait one second after the build
4785         finishes for test to really be done.. this should be cleaned up to
4786         avoid wasting that second. Builder.detach uses a callLater(0),
4787         either that should be done in-line (something else needed that
4788         behavior), or it should return a Deferred that fires when the
4789         builder is really offline.
4790         (Disconnect.testBuild3): same
4791         (Disconnect.testDisappear): same
4793         * buildbot/test/test_web.py: rearrange server-setup and teardown
4794         code to remove unclean-reactor warnings from twisted-2.0
4796         * buildbot/test/test_vc.py: rearrange probe-for-VC-program routine
4797         so the tests don't hang under twisted-2.0
4799 2005-03-31  Brian Warner  <warner@lothar.com>
4801         * buildbot/slave/bot.py (Bot.remote_setBuilderList): fix typo that
4802         caused a warning each time the master changed our set of builders
4804         * buildbot/status/builder.py (BuildStatus.saveYourself): under
4805         w32, don't unlink the file unless it already exists. Thanks to
4806         Baptiste Lepilleur for the catch.
4807         (BuilderStatus.saveYourself): same
4809 2005-02-01  Brian Warner  <warner@lothar.com>
4811         * buildbot/status/html.py (TextLog.getChild): use a /text child
4812         URL, such as http://foo.com/svn-hello/builds/1/test/0/text instead
4813         of http://foo.com/svn-hello/builds/1/test/0 , to retrieve the
4814         logfile as text/plain (no markup, no headers). This replaces the
4815         previous scheme (which used an ?text=1 argument), and gets us back
4816         to a relative link (which works better when the buildbot lives
4817         behind another web server, such as Apache configured as a reverse
4818         proxy). Thanks to Gerald Combs for spotting the problem.
4820         * buildbot/__init__.py (version): bump to 0.6.2+ while between
4821         releases
4823 2004-12-13  Brian Warner  <warner@lothar.com>
4825         * buildbot/__init__.py (version): Releasing buildbot-0.6.2
4827         * debian/changelog: update for 0.6.2
4828         * NEWS: finalize for 0.6.2
4830 2004-12-11  Brian Warner  <warner@lothar.com>
4832         * NEWS: bring it up to date
4834         * buildbot/slave/bot.py (BotFactory): revamp keepalive/lost-master
4835         detection code. Require some sign of life from the buildmaster
4836         every BotFactory.keepaliveInterval seconds. Provoke this
4837         indication at BotFactory.keepaliveTimeout seconds before the
4838         deadline by sending a keepalive request. We don't actually care if
4839         that request is answered in a timely fashion, what we care about
4840         is that .activity() is called before the deadline. .activity() is
4841         triggered by any PB message from the master (including an ack to
4842         one of the slave's status-update messages). With this new scheme,
4843         large status messages over slow pipes are OK, as long as any given
4844         message can be sent (and thus acked) within .keepaliveTimeout
4845         seconds (which defaults to 30).
4846         (SlaveBuilder.remote_startCommand): record activity
4847         (SlaveBuilder.ackUpdate): same
4848         (SlaveBuilder.ackComplete): same
4849         (BotFactory.gotPerspective): same
4850         * buildbot/test/test_run.py (Disconnect.testSlaveTimeout): test it
4852 2004-12-09  Brian Warner  <warner@lothar.com>
4854         * buildbot/status/html.py (StatusResourceBuilder.getChild): remove
4855         debug message
4857         * buildbot/process/step_twisted.py (Trial._commandComplete):
4858         update self.cmd when we start the 'cat test.log' transfer. Without
4859         this, we cannot interrupt the correct RemoteCommand when we lose
4860         the connection.
4862         * buildbot/process/step.py (RemoteCommand.interrupt): don't bother
4863         trying to tell the slave to stop the command if we're already
4864         inactive, or if we no longer have a .remote
4866         * buildbot/process/builder.py (Builder._detached): don't let an
4867         exception in currentBuild.stopBuild() prevent the builder from
4868         being marked offline
4870 2004-12-07  Brian Warner  <warner@lothar.com>
4872         * buildbot/status/words.py (IrcStatusBot.getBuilder): catch the
4873         KeyError that happens when you ask for a non-existent Builder, and
4874         translate it into a UsageError.
4876         * buildbot/test/test_run.py (Disconnect.testBuild4): validate that
4877         losing the slave in the middle of a remote step is handled too
4879         * buildbot/process/step.py (ShellCommand.interrupt): 'reason' can
4880         be a Failure, so be sure to stringify it before using it as the
4881         contents of the 'interrupt' logfile
4882         (RemoteCommand.interrupt): use stringified 'why' in
4883         remote_interruptCommand too, just in case
4885 2004-12-06  Brian Warner  <warner@lothar.com>
4887         * buildbot/slave/commands.py (Arch.doVCUpdate): use 'tla replay'
4888         instead of 'tla update', which is more efficient in case we've
4889         missed a couple of patches since the last update.
4891         * debian/changelog: update for previous (0.6.1) release. Obviously
4892         this needs to be handled better.
4894 2004-12-05  Brian Warner  <warner@lothar.com>
4896         * NEWS: update for stuff since last release
4898         * buildbot/master.py (DebugPerspective.attached): return 'self', to
4899         match the maybeDeferred change in Dispatcher.requestAvatar
4900         * buildbot/changes/pb.py (ChangePerspective.attached): same
4901         * buildbot/status/client.py (StatusClientPerspective.attached): same
4902         * buildbot/process/builder.py (Builder._attached3): same
4903         * buildbot/pbutil.py (NewCredPerspective.attached): same
4905         * buildbot/status/html.py (WaterfallStatusResource.phase2): Add
4906         the date to the top-most box, if it is not the same as today's
4907         date.
4909         * docs/slave.xhtml: provide a buildslave setup checklist
4911         * docs/source.xhtml (Arch): correct terminology
4913 2004-12-04  Brian Warner  <warner@lothar.com>
4915         * buildbot/test/test_slavecommand.py: use sys.executable instead
4916         of hard-coding 'python' for child commands, might help portability
4918         * docs/examples/twisted_master.cfg: update to current usage
4920         * buildbot/status/words.py (IrcStatusBot.command_STOP): add a
4921         'stop build' command to the IRC bot
4923         * buildbot/master.py (Dispatcher.requestAvatar): remove debug
4924         message that broke PBChangeSource
4926         * buildbot/slave/bot.py: clean up shutdown/lose-master code
4927         (SlaveBuilder): make some attributes class-level, remove the old
4928         "update queue" which existed to support resuming a build after the
4929         master connection was lost. Try to reimplement that feature later.
4930         (SlaveBuilder.stopCommand): clear self.command when the
4931         SlaveCommand finishes, so that we don't try to kill a leftover one
4932         at shutdown time.
4933         (SlaveBuilder.commandComplete): same, merge with commandFailed and
4934         .finishCommand
4936         * buildbot/slave/commands.py (SourceBase): set self.command for
4937         all VC commands, so they can be interrupted.
4939 2004-12-03  Brian Warner  <warner@lothar.com>
4941         * buildbot/master.py: clean up slave-handling code, to handle
4942         slave-disconnect and multiple-connect better
4943         (BotPerspective): make these long-lasting, exactly one per bot
4944         listed in the config file.
4945         (BotPerspective.attached): if a slave connects while an existing
4946         one appears to still be connected, disconnect the old one first.
4947         (BotPerspective.disconnect): new method to forcibly disconnect a
4948         buildslave. Use some hacks to empty the transmit buffer quickly to
4949         avoid the long (20-min?) TCP timeout that could occur if the old
4950         slave has dropped off the net.
4951         (BotMaster): Keep persistent BotPerspectives in .slaves, let them
4952         own their own SlaveStatus objects. Remove .attached/.detached, add
4953         .addSlave/.removeSlave, treat slaves like Builders (config file
4954         parsing sends deltas to the BotMaster). Inform the slave
4955         instances, i.e. the BotPerspective, about addBuilder and
4956         removeBuilder.
4957         (BotMaster.getPerspective): turns into a single dict lookup
4958         (Dispatcher.requestAvatar): allow .attached to return a Deferred,
4959         which gives BotPerspective.attached a chance to disconnect the old
4960         slave first.
4961         (BuildMaster.loadConfig): add code (disabled) to validate that all
4962         builders use known slaves (listed in c['bots']). The check won't
4963         work with tuple-specified builders, which are deprecated but not
4964         yet invalid, so the check is disabled for now.
4965         (BuildMaster.loadConfig_Slaves): move slave-config into a separate
4966         routine, do the add/changed/removed dance with them like we do
4967         with builders.
4968         (BuildMaster.loadConfig_Sources): move source-config into a
4969         separate routine too
4971         * buildbot/status/builder.py (Status.getSlave): get the
4972         SlaveStatus object from the BotPerspective, not the BotMaster.
4974         * buildbot/test/test_run.py: bunch of new tests for losing the
4975         buildslave at various points in the build, handling a slave that
4976         connects multiple times, and making sure we can interrupt a
4977         running build
4979         * buildbot/slave/bot.py (BuildSlave): make it possible to use
4980         something other than 'Bot' for the Bot object, to make certain
4981         test cases easier to write.
4982         (BuildSlave.waitUntilDisconnected): utility method for testing
4984 2004-11-30  Brian Warner  <warner@lothar.com>
4986         * buildbot/test/test_run.py (RunMixin): refactor, remove debug msg
4988         * buildbot/interfaces.py (IBuilderControl.ping): add timeout=
4989         argument, return a Deferred that always fires with True or False.
4990         I don't use an errback to indicate 'ping failed' so that callers
4991         are free to ignore the deferred without causing spurious errors in
4992         the logs.
4993         * buildbot/process/builder.py (BuilderControl.ping): implement it
4995         * buildbot/test/test_run.py (Status.testDisappear): test ping
4996         (Status.disappearSlave): fix it
4998 2004-11-30  Brian Warner  <warner@lothar.com>
5000         * buildbot/interfaces.py (IBuildControl): add .stopBuild
5001         (IBuilderControl): add .getBuild(num), only works for the current
5002         build, of course, although it might be interesting to offer
5003         something for builds in the .waiting or .interlocked state.
5005         * buildbot/process/base.py (Build): have .stopBuild just do the
5006         interrupt, then let the build die by itself.
5007         (BuildControl): add .stopBuild, and add a point-event named
5008         'interrupt' just after the build so status viewers can tell that
5009         someone killed it.
5010         (BuilderControl): add .getBuild
5012         * buildbot/process/step.py (Dummy): use haltOnFailure so it really
5013         stops when you kill it, good for testing
5014         (ShellCommand.interrupt): add a logfile named 'interrupt' which
5015         contains the 'reason' text.
5017         * buildbot/status/html.py: Add Stop Build button, if the build can
5018         still be stopped. Send a Redirect (to the top page) one second
5019         later, hopefully long enough for the interrupt to have an effect.
5020         Move make_row() up to top-level to share it between Stop Build and
5021         Force Build.
5023         * buildbot/slave/commands.py: only kill the child process once
5025         * buildbot/test/test_run.py: add testInterrupt
5027 2004-11-29  Brian Warner  <warner@lothar.com>
5029         * buildbot/process/base.py: Refactor command interruption. The
5030         Build is now responsible for noticing that the slave has gone
5031         away: Build.lostRemote() interrupts the current step and makes
5032         sure that no further ones will be started.
5033         
5034         * buildbot/process/builder.py: When the initial remote_startBuild
5035         message fails, log it: this usually indicates that the slave has
5036         gone away, but we don't really start paying attention until they
5037         fail to respond to the first step's command.
5039         * buildbot/process/step.py (RemoteCommand): Does *not* watch for
5040         slave disconnect. Now sports a new interrupt() method. Error
5041         handling was simplified a lot by chaining deferreds, so
5042         remoteFailed/remoteComplete were merged into a single
5043         remoteComplete method (which can now get a Failure object).
5044         Likewise failed/finished were merged into just _finished.
5045         (BuildStep): Add interrupt(why) method, and if why is a
5046         ConnectionLost Failure then the step is failed with some useful
5047         error text.
5049         * buildbot/slave/bot.py: stop the current command when the remote
5050         Step reference is lost, and when the slave is shut down.
5051         (Bot): make it a MultiService, so it can have children. Use
5052         stopService to tell when the slave is shutting down.
5053         (SlaveBuilder): make it a Service, and a child of the Bot. Add
5054         remote_interruptCommand (which asks the current SlaveCommand to
5055         stop but allows it to keep emitting status messages), and
5056         stopCommand (which tells it to shut up and die).
5058         * buildbot/slave/commands.py: make commands interruptible
5059         (ShellCommand.kill): factor out os.kill logic
5060         (Command): factor out setup()
5061         (Command.sendStatus): don't send status if .running is false, this
5062         happens when the command has been halted.
5063         (Command.interrupt): new method, used to tell the command to die
5064         (SlaveShellCommand): implement .interrupt
5065         (DummyCommand): implement .interrupt
5066         (SourceBase, etc): factor out setup(), don't continue substeps if
5067         .interrupted is set
5069         * buildbot/status/builder.py: fix all waitUntilFinished() methods
5070         so they can be called after finishing
5072         * buildbot/test/test_run.py: new tests for disconnect behavior,
5073         refactor slave-shutdown routines, add different kinds of
5074         slave-shutdown
5076 2004-11-27  Brian Warner  <warner@lothar.com>
5078         * buildbot/status/words.py (IrcStatusBot.convertTime): utility
5079         method to express ETA time like "2m45s" instead of "165 seconds"
5081 2004-11-24  Brian Warner  <warner@lothar.com>
5083         * buildbot/test/test_vc.py (VC.testArch): unregister the test
5084         archive after the test completes, to avoid cluttering the user's
5085         'tla archives' listing with a bogus entry. Arch doesn't happen to
5086         provide any way to override the use of ~/.arch-params/, so there
5087         isn't a convenient way to avoid touching the setup of the user who
5088         runs the test.
5089         (VC_HTTP.testArchHTTP): same
5091 2004-11-23  Brian Warner  <warner@lothar.com>
5093         * buildbot/status/html.py (TextLog): split render() up into
5094         render_HEAD and render_GET. Use a Producer when sending log
5095         chunks, to reduce memory requirements and avoid sending huge
5096         non-Banana-able strings over web.distrib connections. Requires
5097         peeking under the covers of IStatusLog.
5098         (TextLog.resumeProducing): fix the "as text" link, handle client
5099         disconnects that occur while we're still sending old chunks.
5101         * buildbot/status/builder.py (HTMLLogFile.waitUntilFinished): oops,
5102         use defer.succeed, not the non-existent defer.success
5103         (LogFile.waitUntilFinished): same
5104         (LogFile.subscribe): don't add watchers to a finished logfile
5106         * buildbot/__init__.py (version): bump to 0.6.1+ while between
5107         releases
5109 2004-11-23  Brian Warner  <warner@lothar.com>
5111         * buildbot/__init__.py (version): Releasing buildbot-0.6.1
5113 2004-11-23  Brian Warner  <warner@lothar.com>
5115         * NEWS: update for the 0.6.1 release
5116         * MANIFEST.in: add new files
5118         * README (INSTALLATION): explain how to enable the extra VC tests
5120         * buildbot/status/builder.py (LogFile): add .runEntries at the class
5121         level to, so old pickled builds can be displayed ok
5123 2004-11-22  Brian Warner  <warner@lothar.com>
5125         * NEWS: summarize updates since last release
5127         * README (SLAVE): fix usage of 'buildbot slave' command. Thanks to
5128         Yoz Grahame. Closes SF#1050138.
5130         * docs/changes.xhtml (FreshCVSSourceNewcred): fix typo. Closes
5131         SF#1042563.
5133         * buildbot/process/step_twisted.py (Trial): update docs a bit
5135         * docs/factories.xhtml: fix Trial factory docs to match reality.
5136         Closes: SF#1049758.
5138         * buildbot/process/factory.py (Trial.__init__): add args for
5139         randomly= and recurse=, making them available to instantiators
5140         instead of only to subclassers. Closes: SF#1049759.
5142 2004-11-15  Brian Warner  <warner@lothar.com>
5144         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
5145         try to teach the Quick factory to use multiple versions of python
5147 2004-11-12  Brian Warner  <warner@lothar.com>
5149         * buildbot/status/builder.py (BuilderStatus.saveYourself): use a
5150         safer w32-compatible approach, and only use it on windows
5151         (BuildStatus.saveYourself): same
5153 2004-11-11  Brian Warner  <warner@lothar.com>
5155         * buildbot/status/builder.py (LogFile.addEntry): smarter way to do
5156         it: one string merge per chunk. There are now separate .entries
5157         and .runEntries lists: when enumerating over all chunks, make sure
5158         to look at both.
5159         * buildbot/test/test_status.py (Log): more tests
5161         * buildbot/status/builder.py (LogFile.addEntry): Merge string
5162         chunks together, up to 10kb per chunk. This ought to cut down on
5163         the CPU-burning overhead of large log files. Thanks to Alexander
5164         Staubo for spotting the problem.
5165         * buildbot/test/test_status.py (Log): tests for same
5167 2004-11-10  Brian Warner  <warner@lothar.com>
5169         * buildbot/status/mail.py (MailNotifier.buildMessage): add a Date
5170         header to outbound mail
5171         * buildbot/test/test_status.py (Mail.testBuild1): test for same
5173 2004-11-08  Brian Warner  <warner@lothar.com>
5175         * buildbot/status/builder.py (BuilderStatus.saveYourself): w32
5176         can't do os.rename() onto an existing file, so catch the exception
5177         and unlink the target file first. This introduces a slight window
5178         where the existing file could be lost, but the main failure case
5179         (disk full) should still be handled safely.
5180         (BuildStatus.saveYourself): same
5182         * buildbot/changes/pb.py (ChangePerspective): use a configurable
5183         separator character instead of os.sep, because the filenames being
5184         split here are coming from the VC system, which can have a
5185         different pathname convention than the local host. This should
5186         help a buildmaster running on windows that uses a CVS repository
5187         which runs under unix.
5188         * buildbot/changes/mail.py (MaildirSource): same, for all parsers
5190         * buildbot/process/step_twisted.py (Trial.createSummary): survive
5191         when there are no test failures to be parsed
5193         * buildbot/scripts/runner.py (createMaster): use shutil.copy()
5194         instead of the unix-specific os.system("cp"), thanks to Elliot
5195         Murphy for this and the other buildbot-vs-windows catches.
5196         * buildbot/test/test_maildir.py (MaildirTest.deliverMail): same
5198         * contrib/windows/buildbot.bat: prefix a '@', apparently to not
5199         echo the command as it is run
5201         * setup.py: install sample.mk too, not just sample.cfg
5202         (scripts): install contrib/windows/buildbot.bat on windows
5204 2004-11-07  Brian Warner  <warner@lothar.com>
5206         * buildbot/process/builder.py (Builder._detached): clear the
5207         self.currentBuild reference, otherwise the next build will be
5208         skipped because we think the Builder is already in use.
5210         * docs/examples/twisted_master.cfg: update to match current usage
5211         on the Twisted buildbot
5213 2004-10-29  Brian Warner  <warner@lothar.com>
5215         * buildbot/status/mail.py (MailNotifier): fix typo in docs
5217 2004-10-28  Brian Warner  <warner@lothar.com>
5219         * buildbot/slave/commands.py (SourceBase): refactor subclasses to
5220         have separate doVCUpdate/doVCFull methods. Catch an update failure
5221         and respond by clobbering the source directory and re-trying. This
5222         will handle local changes (like replacing a file with a directory)
5223         that will cause CVS and SVN updates to fail.
5224         * buildbot/test/test_vc.py (SetupMixin.do_vc): test the same
5226         * buildbot/process/step.py (LoggedRemoteCommand.__repr__): avoid a
5227         python-2.4 warning
5229 2004-10-19  Brian Warner  <warner@lothar.com>
5231         * buildbot/process/step_twisted.py (Trial.createSummary): bugfixes
5233         * buildbot/status/html.py (StatusResourceTestResults): display any
5234         TestResults that the Build might have
5235         (StatusResourceTestResult): and the logs for each TestResult
5236         (StatusResourceBuild): add link from the per-build page
5238 2004-10-15  Brian Warner  <warner@lothar.com>
5240         * buildbot/process/step_twisted.py (Trial.createSummary): parse
5241         the 'problems' portion of stdout, add TestResults to our build
5242         * buildbot/test/test_twisted.py (Parse.testParse): test it
5244         * buildbot/interfaces.py (IBuildStatus.getTestResults): new method
5245         to retrieve a dict of accumulated test results
5246         (ITestResult): define what a single test result can do
5247         * buildbot/status/builder.py (TestResult): implement ITestResult
5248         (BuildStatus.getTestResults): retrieve dict of TestResults
5249         (BuildStatus.addTestResult): add TestResults
5250         * buildbot/test/test_status.py (Results.testAddResults): test it
5252 2004-10-14  Brian Warner  <warner@lothar.com>
5254         * buildbot/test/test_maildir.py (MaildirTest): use shutil.rmtree
5255         instead of os.system("rm -rf") for win32 portability
5257         * buildbot/test/test_slavecommand.py (SlaveCommandTestCase): use
5258         SignalMixin instead of starting/stopping the reactor, which is
5259         likely to cause problems with other tests
5261         * buildbot/slave/commands.py (SourceBase.doCopy): remove leftover
5262         self.copyComplete() call. Yoz Grahame makes the catch.
5264         * contrib/windows/buildbot.bat: helper script to deal with path
5265         issues. Thanks to Yoz Grahame.
5267         * buildbot/master.py (BuildMaster.startService): don't register a
5268         SIGHUP handler if the signal module has no SIGHUP attribute.
5269         Apparently win32 does this.
5271         * buildbot/scripts/runner.py (start): add --reactor=win32 on win32
5273         * buildbot/test/test_web.py (WebTest.test_webPathname): skip the
5274         test if the reactor can't offer UNIX sockets
5276         * buildbot/status/html.py (StatusResourceBuild.body): fix syntax
5277         error introduced in the last commit. We really need that
5278         metabuildbot :).
5280 2004-10-12  Brian Warner  <warner@lothar.com>
5282         * buildbot/changes/mail.py (MaildirSource.describe): fix exception
5283         when describing a maildir source. Thanks to Stephen Davis.
5285         * buildbot/status/words.py (IrcStatusBot.command_WATCH): round off
5286         ETA seconds
5288         * buildbot/scripts/runner.py (createMaster): install Makefile too
5289         (start): add --no_save to 'start' command
5290         * buildbot/scripts/sample.mk: simple convenience Makefile with 
5291         start/stop/reload targets
5293         * buildbot/__init__.py (version): bump to 0.6.0+ while between
5294         releases
5296 2004-09-30  Brian Warner  <warner@lothar.com>
5298         * setup.py: Releasing buildbot-0.6.0
5300 2004-09-30  Brian Warner  <warner@lothar.com>
5302         * MANIFEST.in: add debian/*, sample.cfg, more docs files. Remove
5303         test_trial.py from the source tarball until support is complete.
5305         * NEWS: update for 0.6.0 release
5306         * buildbot/__init__.py (version): same
5307         * README: same
5309         * buildbot/status/words.py (IrcStatusBot.command_SOURCE): add
5310         'source' command to tell users where to get the Buildbot source
5312         * docs/examples/*.cfg: update to modern standards
5314         * NEWS: update for release
5316         * buildbot/scripts/runner.py (createMaster): remove the
5317         -shutdown.tap stuff now that it isn't necessary
5318         (createSlave): same
5319         (start): launch buildbot.tap, not buildbot-shutdown.tap
5322         * buildbot/status/mail.py (Domain): shorten class name
5323         (MailNotifier): if lookup= is a string, pass it to Domain()
5324         * buildbot/test/test_status.py (Mail.testBuild1): new class name
5325         (Mail.testBuild2): test the string-to-Domain shortcut
5326         (Mail.testMail): fix test
5329         * buildbot/scripts/sample.cfg: improve the build-the-buildbot
5330         example config file
5332         * buildbot/status/builder.py (BuildStatus.__setstate__): re-set
5333         more attributes on load
5334         (BuilderStatus.stubBuildCacheSize): bump to 30, this was too low
5335         to accomodate the whole waterfall page at once, and the thrashing
5336         results in a lot of unnecessary loads
5337         (BuildStatus.saveYourself): use binary pickles, not fluffy text
5338         (BuilderStatus.saveYourself): same
5339         (BuilderStatus.eventGenerator): stop generating on the first missing
5340         build. We assume that saved builds are deleted oldest-first.
5341         (BuildStepStatus.__getstate__): .progress might not exist
5343         * buildbot/changes/changes.py (ChangeMaster): make it
5344         serializable, in $masterdir/changes.pck
5345         (ChangeMaster.stopService): save on shutdown
5346         * buildbot/master.py (BuildMaster.loadChanges): load at startup
5347         * buildbot/test/test_config.py: load Changes before config file
5350         * buildbot/slave/commands.py (ShellCommand.doTimeout): put the
5351         "Oh my god, you killed the command" header on a separate line
5353         * buildbot/status/builder.py (BuilderStatus.getStubBuildByNumber):
5354         skip over corrupted build pickles
5355         (BuilderStatus.getFullBuildByNumber): same
5356         (BuilderStatus.eventGenerator): skip over unavailable builds
5357         (BuildStatus.saveYourself): save builds to a .tmp file first, then
5358         do an atomic rename. This prevents a corrupted pickle when some
5359         internal serialization error occurs.
5360         (BuilderStatus.saveYourself): same
5362         * buildbot/slave/commands.py (SlaveShellCommand): oops, restore
5363         the timeout for shell commands, it got lost somehow
5365         * buildbot/status/builder.py (BuilderStatus.eventGenerator): if we
5366         run out of build steps, return the rest of the builder events
5368         * buildbot/interfaces.py (IBuilderControl.ping): add method
5370         * buildbot/process/builder.py (BuilderControl.ping): move
5371         slave-ping to BuilderControl, and fix the failure case in the
5372         process (Event.finish() is the verb, Event.finished is the noun).
5374         * buildbot/status/html.py (StatusResourceBuilder.ping): ping
5375         through the BuilderControl instead of the BuilderStatus
5376         (EventBox): add adapter for builder.Event, allowing builder events to
5377         be displayed in the waterfall display
5379         * buildbot/master.py (BotMaster.stopService): add a 'master
5380         shutdown' event to the builder's log
5381         (BuildMaster.startService): and a 'master started' on startup
5383         * buildbot/status/builder.py (BuilderStatus.eventGenerator): merge
5384         builder events into the BuildStep event stream
5385         (Status.builderAdded): add a 'builder created' event
5388         * buildbot/status/words.py (IrcStatusBot.command_WATCH): new
5389         command to announce the completion of a running build
5390         (IrcStatusBot.command_FORCE): announce when the build finishes
5392         * buildbot/status/builder.py (BuilderStatus.addFullBuildToCache):
5393         don't evict unfinished builds from the cache: they must stay in
5394         the full-cache until their logfiles have stopped changing. Make
5395         sure the eviction loop terminates if an unfinished build was hit.
5396         (HTMLLogFile.getTextWithHeaders): return HTML as if it were text.
5397         This lets exceptions be dumped in an email status message. Really
5398         we need LogFiles which contain both text and HTML, instead of two
5399         separate classes.
5400         (BuildStatus.__getstate__): handle self.finished=False
5401         (Status.builderAdded): if the pickle is corrupted, abandon the
5402         history and create a new BuilderStatus object.
5404         * buildbot/process/base.py (Build.stopBuild): tolerate lack of a
5405         self.progress attribute, helped one test which doesn't fully set
5406         up the Build object.
5408         * buildbot/interfaces.py (IStatusLogStub): split out some of the
5409         IStatusLog methods into an Interface that is implemented by "stub"
5410         logs, for which all the actual text chunks are on disk (in the
5411         pickled Build instance). To show the log contents, you must first
5412         adapt the stub log to a full IStatusLog object.
5414         * buildbot/status/builder.py (LogFileStub): create separate stub
5415         log objects, which can be upgraded to a real one if necessary.
5416         (LogFile): make them persistable, and let them stubify themselves
5417         (HTMLLogFile): same
5418         (BuildStepStatus): same
5419         (BuildStatus): same
5420         (BuildStatus.saveYourself): save the whole build out to disk
5421         (BuilderStatus): make it persistable
5422         (BuilderStatus.saveYourself): save the builder to disk
5423         (BuilderStatus.addFullBuildToCache): implement two caches which
5424         hold Build objects: a small one which holds full Builds, and a
5425         larger one which holds "stubbed" Builds (ones with their LogFiles
5426         turned into LogFileStubs). This reduces memory usage by the
5427         buildmaster by not keeping more than a few (default is 2) whole
5428         build logs in RAM all the time.
5429         (BuilderStatus.getBuild): rewrite to pull from disk (through the
5430         cache)
5431         (BuilderStatus.eventGenerator): rewrite since .builds went away
5432         (BuilderStatus.buildStarted): remove the .builds array. Add the
5433         build to the "full" cache when it starts.
5434         (BuilderStatus._buildFinished): save the build to disk when it
5435         finishes
5436         (Status): give it a basedir (same as the BuildMaster's basedir)
5437         where the builder pickles can be saved
5438         (Status.builderAdded): create the BuilderStatus ourselves, by
5439         loading a pickle from disk (or creating a new instance if there
5440         was none on disk). Return the BuilderStatus so the master can glue
5441         it into the new Builder object.
5443         * buildbot/master.py (BotMaster.stopService): on shutdown, tell
5444         all BuilderStatuses to save themselves out to disk. This is in
5445         lieu of saving anything important in the main Application pickle
5446          (the -shutdown.tap file).
5447         (BuildMaster.__init__): give Status() a basedir for its files
5448         (BuildMaster.loadConfig_Builders): do status.builderAdded first,
5449         to get the BuilderStatus, then give it to the Builder (instead of
5450         doing it the other way around). It's ok if the status announces
5451         the new Builder before it's really ready, as the outside world can
5452         only see the BuilderStatus object anyway (and it is ready before
5453         builderAdded returns). Use the builder's "builddir" (which
5454         normally specifies where the slave will run the builder) as the
5455         master's basedir (for saving serialized builds).
5457         * buildbot/status/html.py (StatusResourceBuildStep.getChild):
5458         coerce the logfile to IStatusLog before trying to get the text
5459         chunks out of it. This will pull the full (non-stubified) Build in
5460         from disk if necessary.
5461         (TextLog): fix the adapter registration
5463         * buildbot/test/test_control.py (Force.setUp): create the basedir
5464         * buildbot/test/test_web.py: same
5465         * buildbot/test/test_vc.py (SetupMixin.setUp): same
5466         * buildbot/test/test_status.py (Mail.makeBuild): match new setup
5467         * buildbot/test/test_run.py (Run.testMaster): same
5468         (Status.setUp): same
5470 2004-09-29  Fred L. Drake, Jr.  <fdrake@acm.org>
5472         * buildbot/status/html.py (Waterfall.__init__): store actual
5473         allowForce flag passed in rather than using True for everyone;
5474         make sure setting it to False doesn't cause a NameError
5475         (Waterfall.setup).
5476         (StatusResourceBuilder.__init__) add the builder name to the page
5477         title.
5478         (StatusResourceBuilder.body) move HTML generation for a name/value
5479         row into a helper method (StatusResourceBuilder.make_row); only
5480         generate the "Force Build" form if allowForce was True and the
5481         slave is connected.  Use class attributes in the generated HTML to
5482         spread a little CSS-joy.
5484 2004-09-28  Brian Warner  <warner@lothar.com>
5486         * buildbot/process/step_twisted.py (Trial.createSummary): fix
5487         warning-scanner to not ignore things like
5488         'ComponentsDeprecationWarning' and 'exceptions.RuntimeWarning'
5490         * buildbot/status/html.py (StatusResource.control): add some
5491         class-level values for .control in an attempt to make upgrading
5492         smoother
5494         * buildbot/util.py (ComparableMixin): survive missing attributes,
5495         such as when a class is modified and we're comparing old instances
5496         against new ones
5498         * buildbot/status/words.py (IrcStatusBot.privmsg): clean up
5499         failure handling, remove a redundant try/except block. Don't
5500         return the full traceback to the IRC channel.
5501         (IrcStatusBot.command_FORCE): catch new exceptions, return useful
5502         error messages. Get ETA properly.
5504         * buildbot/status/html.py (StatusResourceBuild.body): html.escape
5505         the reason, since (at least) IRC message will have <> in them.
5506         (StatusResourceBuilder.__init__): take an IBuilderControl
5507         (StatusResourceBuilder.force): use the IBuilderControl we get in
5508         the constructor instead of trying to make our own. Catch the
5509         new exceptions and ignore them for now (until we make an
5510         intermediate web page where we could show the error message)
5511         (StatusResource): create with an IControl, use it to give an
5512         IBuilderControl to all children
5513         (Waterfall): take an allowForce= option, pass an IControl object
5514         to StatusResource if it is True
5516         * buildbot/test/test_web.py (ConfiguredMaster): handle IControl
5518         * buildbot/master.py (BotPerspective.perspective_forceBuild):
5519         catch new exceptions and return string forms
5521         * buildbot/interfaces.py: add NoSlaveError, BuilderInUseError
5522         * buildbot/process/builder.py (Builder.forceBuild): raise them
5523         * buildbot/test/test_control.py (Force.testNoSlave): new test
5524         (Force.testBuilderInUse): same
5527         * buildbot/status/words.py (IrcStatusBot): enable build-forcing
5529         * buildbot/test/test_run.py: use IControl
5530         * buildbot/test/test_vc.py: same
5532         * buildbot/status/html.py (StatusResourceBuilder.force): rewrite
5533         to use IControl. Still offline.
5534         * buildbot/status/words.py (IrcStatusBot.command_FORCE): same
5536         * buildbot/process/builder.py (Builder.doPeriodicBuild): set
5537         who=None so periodic builds don't send out status mail
5538         (Builder.forceBuild): include reason in the log message
5539         (BuilderControl.forceBuild): rename 'name' to 'who'
5541         * buildbot/master.py (BotPerspective.perspective_forceBuild): add
5542         'who' parameter, but make it None by default so builds forced by
5543         slave admins don't cause status mail to be sent to anybody
5544         (BotMaster.forceBuild): same. this method is deprecated.
5545         (DebugPerspective.perspective_forceBuild): same, use IControl.
5546         (DebugPerspective.perspective_fakeChange): use IControl..
5547         (Dispatcher.requestAvatar): .. so don't set .changemaster
5549         * buildbot/interfaces.py (IBuilderControl.forceBuild): rename 'who'
5550         parameter to avoid confusion with the name of the builder
5553         * buildbot/status/mail.py: refine comment about needing 2.3
5555         * buildbot/status/html.py: move all imports to the top
5557         * buildbot/test/test_control.py: test new interfaces
5558         * buildbot/test/test_run.py (Status): handle new interfaces
5559         * buildbot/test/test_vc.py (SetupMixin.doBuild): same
5561         * buildbot/process/base.py (BuildControl): implement IBuildControl
5562         and its lonely getStatus() method
5564         * buildbot/process/builder.py (BuilderControl): implement
5565         IBuilderControl, obtained by adapting the Builder instance
5566         (Builder.startBuild): return a BuilderControl instead of a
5567         Deferred. The caller can use bc.getStatus().waitUntilFinished() to
5568         accomplish the same thing.
5570         * buildbot/master.py: move all import statements to the top
5571         (Control): implement IControl, obtained by adapting the
5572         BuildMaster instance.
5574         * buildbot/interfaces.py: add IControl, IBuilderControl, and
5575         IBuildControl. These are used to force builds. Eventually they
5576         will provide ways to reconfigure the Builders, pause or abandon a
5577         Build, and perhaps control the BuildMaster itself.
5579 2004-09-26  Brian Warner  <warner@lothar.com>
5581         * buildbot/util.py (ComparableMixin): survive twisted>1.3.0 which
5582         ends up comparing us against something without a .__class__
5584 2004-09-24  Brian Warner  <warner@lothar.com>
5586         * buildbot/scripts/runner.py: rearrange option parsing a lot, to get
5587         usage text right.
5589         * Makefile: add 'deb-snapshot' target, to create a timestamped
5590         .deb package
5592         * debian/rules (binary-indep): skip CVS/ files in dh_installexamples
5594 2004-09-23  Brian Warner  <warner@lothar.com>
5596         * buildbot/__init__.py (version): move version string here
5597         * setup.py: get version string from buildbot.version
5598         * buildbot/status/html.py (WaterfallStatusResource.body): add
5599         buildbot version to the page footer
5600         * buildbot/status/words.py (IrcStatusBot.command_VERSION): provide
5601         version when asked
5603         * buildbot/master.py (BotMaster.getPerspective): detect duplicate
5604         slaves, let the second know where the first one is coming from
5605         (BuildMaster.__init__): turn on .unsafeTracebacks so the slave can
5606         see our exceptions. It would be nice if there were a way to just
5607         send them the exception type and value, not the full traceback.
5610         * buildbot/status/mail.py (MailNotifier): add a new argument
5611         sendToInterestedUsers=, which can be set to False to disable the
5612         usual send-to-blamelist behavior.
5613         (top): handle python-2.2 which has no email.MIMEMultipart
5614         (MailNotifier.buildMessage): don't send logs without MIMEMultipart
5615         (MailNotifier.disownServiceParent): unsubscribe on removal
5617         * buildbot/test/test_status.py (Mail.testBuild2): test it
5620         * buildbot/status/progress.py (Expectations.wavg): tolerate
5621         current=None, which happens when steps start failing badly
5622         * buildbot/test/test_status.py (Progress.testWavg): test for it
5624         * buildbot/process/step.py (SVN.startVC): when the (old) slave
5625         doesn't understand args['revision'], emit a warning instead of
5626         bailing completely. Updating to -rHEAD is probably close enough.
5628         * buildbot/process/step_twisted.py (Trial.start): fix sanity-check
5630         * buildbot/test/test_status.py: at least import bb.status.client
5631         even if we don't have any test coverage for it yet
5633         * contrib/svn_buildbot.py: don't require python2.3
5634         (main): wait, do require it (for sets.py), but explain how to
5635         make it work under python2.2
5637 2004-09-23  Brian Warner  <warner@lothar.com>
5639         * contrib/svn_buildbot.py: include the revision number in the Change
5641         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): use when=,
5642         using util.now() because FreshCVS is a realtime service
5644         * buildbot/status/event.py: delete dead code
5645         * buildbot/process/step.py: don't import dead Event class
5646         * buildbot/process/step_twisted.py: same
5647         * buildbot/status/builder.py: same
5648         * buildbot/status/client.py: same
5650         * buildbot/test/test_process.py: kill buggy out-of-date disabled test
5652         * buildbot/changes/changes.py (Change): set .when from an __init__
5653         argument (which defaults to now()), rather than having
5654         ChangeMaster.addChange set it later.
5655         (ChangeMaster.addChange): same
5657         * buildbot/changes/mail.py (parseFreshCVSMail): pass in when=
5658         (parseSyncmail): same. Just use util.now() for now.
5659         (parseBonsaiMail): parse the timestamp field for when=
5661         * buildbot/test/test_vc.py (SourceStamp.addChange): page in when=
5662         instead of setting .when after the fact
5664 2004-09-22  slyphon
5666         * buildbot/slave/trial.py: new SlaveCommand to machine-parse test
5667         results when the target project uses retrial. Still under
5668         development.
5669         * buildbot/test/test_trial.py: same
5671 2004-09-21  Brian Warner  <warner@lothar.com>
5673         * buildbot/status/mail.py (MailNotifier.__init__): include
5674         success/warnings/failure in the Subject line
5675         (MailNotifier.buildMessage): add the buildbot's URL to the body,
5676         use step.logname for the addLogs=True attachment filenames
5677         * buildbot/test/test_status.py (Mail): test Subject lines
5678         (Mail.testLogs): test attachment filenames
5680         * buildbot/master.py (DebugPerspective.perspective_fakeChange):
5681         accept a 'who' argument from the debug tool
5682         * contrib/debugclient.py (DebugWidget.do_commit): send 'who'
5683         * contrib/debug.glade: add text box to set 'who'
5685         * buildbot/interfaces.py (IBuildStatus.getBuilder): replace
5686         .getBuilderName with .getBuilder().getName(), more flexible
5687         (IStatusLog.getName): logs have short names, but you can prefix
5688         them with log.getStep().getName() to make them more useful
5689         * buildbot/status/builder.py: same
5690         * buildbot/status/client.py: same
5691         * buildbot/status/html.py: same
5692         * buildbot/test/test_run.py (Status.testSlave): same
5693         * buildbot/process/step.py: tweak logfile names
5695         * buildbot/status/mail.py (MailNotifier): add lookup, change
5696         argument to extraRecipients. The notifier is now aimed at sending
5697         mail to the people involved in a particular build, with additional
5698         constant recipients as a secondary function.
5700         * buildbot/test/test_status.py: add coverage for IEmailLookup,
5701         including slow-lookup and failing-lookup. Make sure the blamelist
5702         members are included.
5704         * buildbot/interfaces.py: new interfaces IEmailSender+IEmailLookup
5705         (IBuildStatus.getResponsibleUsers): rename from getBlamelist
5706         (IBuildStatus.getInterestedUsers): new method
5707         * buildbot/status/builder.py (BuildStatus.getResponsibleUsers): same
5708         * buildbot/status/client.py (remote_getResponsibleUsers): same
5709         * buildbot/status/html.py (StatusResourceBuild.body): same
5710         * buildbot/test/test_run.py (Status.testSlave): same
5712 2004-09-20  Brian Warner  <warner@lothar.com>
5714         * docs/users.xhtml: update concepts
5716         * Makefile: add a convenience makefile, for things like 'make
5717         test'. It is not included in the source tarball.
5719 2004-09-16  Brian Warner  <warner@lothar.com>
5721         * NEWS: mention /usr/bin/buildbot, debian/*
5723         * debian/*: add preliminary debian packaging. Many thanks to
5724         Kirill Lapshin (and Kevin Turner) for the hard work. I've mangled
5725         it considerably since it left their hands, I am responsible for
5726         all breakage that's resulted.
5728         * bin/buildbot: create a top-level 'buildbot' command, to be
5729         installed in /usr/bin/buildbot . For now it's just a simple
5730         frontend to mktap/twistd/kill, but eventually it will be the entry
5731         point to the 'try' command and also a status client. It is also
5732         intended to support the upcoming debian-packaging init.d scripts.
5733         * buildbot/scripts/runner.py: the real work is done here
5734         * buildbot/scripts/__init__.py: need this too
5735         * buildbot/scripts/sample.cfg: this is installed in new
5736         buildmaster directories
5737         * setup.py: install new stuff
5739 2004-09-15  Brian Warner  <warner@lothar.com>
5741         * buildbot/test/test_vc.py: skip SVN tests if svn can't handle the
5742         'file:' schema (the version shipped with OS-X was built without the
5743         ra_local plugin).
5744         (SetupMixin.tearDown): stop the goofy twisted.web timer which
5745         updates the log-timestamp, to make sure it isn't still running after
5746         the test finishes
5748         * docs/config.xhtml: Add projectName, projectURL, buildbotURL
5749         values to the config file.
5750         * docs/examples/hello.cfg: add examples
5751         * buildbot/interfaces.py (IStatus.getBuildbotURL): define accessors
5752         * buildbot/status/builder.py (Status.getProjectURL): implement them
5753         * buildbot/master.py (BuildMaster.loadConfig): set them from config
5754         * buildbot/test/test_config.py (ConfigTest.testSimple): test them
5755         * buildbot/status/html.py (WaterfallStatusResource): display them
5758         * buildbot/test/test_vc.py (FakeBuilder.name): add attribute so
5759         certain error cases don't suffer a secondary exception.
5760         (top): Skip tests if the corresponding VC tool is not installed.
5762         * buildbot/process/factory.py (Trial): introduce separate
5763         'buildpython' and 'trialpython' lists, since trialpython=[] is
5764         what you want to invoke /usr/bin/python, whereas ./setup.py is
5765         less likely to be executable. Add env= parameter to pass options
5766         to test cases (which is how I usually write tests, I don't know if
5767         anyone else does it this way).
5769         * buildbot/process/step_twisted.py (Trial): handle python=None.
5770         Require 'testpath' be a string, not a list. Fix tests= typo.
5771         (Trial.start): sanity-check any PYTHONPATH value for stringness.
5773         * buildbot/process/step.py (RemoteCommand._remoteFailed): goofy
5774         way to deal with the possibility of removing the disconnect notify
5775         twice.
5776         (CVS): add a 'login' parameter to give a password to 'cvs login',
5777         commonly used with pserver methods (where pw="" or pw="guest")
5779         * buildbot/slave/commands.py (SourceBase): move common args
5780         extraction and setup() to __init__, so everything is ready by the
5781         time setup() is called
5782         (CVS.start): call 'cvs login' if a password was supplied
5783         (ShellCommand): special-case PYTHONPATH: prepend the master's
5784         value to any existing slave-local value.
5786         * buildbot/process/builder.py (Builder.updateBigStatus): if we
5787         don't have a remote, mark the builder as Offline. This whole
5788         function should probably go away and be replaced by individual
5789         deltas.
5790         (Builder.buildFinished): return the results to the build-finished
5791         deferred callback, helps with testing
5793 2004-09-14  Brian Warner  <warner@lothar.com>
5795         * buildbot/test/test_vc.py: put all the repositories needed to run
5796         the complete tests into a single small (1.3MB) tarball, so I can
5797         make that tarball available on the buildbot web site. Test HTTP
5798         access (for Arch and Darcs) by spawning a temporary web server
5799         while the test runs.
5801         * docs/users.xhtml: new document, describe Buildbot's limited
5802         understanding of different human users
5804         * buildbot/test/test_vc.py: rearrange test cases a bit
5806         * buildbot/process/step_twisted.py (Trial): handle testpath=
5807         * buildbot/process/factory.py (Trial): update to use step.Trial
5809         * buildbot/slave/commands.py (ShellCommandPP): fix fatal typo
5811         * buildbot/status/builder.py (BuildStatus.getText): add text2 to
5812         the overall build text (which gives you 'failed 2 tests' rather
5813         than just 'failed')
5814         (BuildStepStatus.text2): default to [], not None
5816         * buildbot/process/step_twisted.py (Trial.commandComplete): text2
5817         must be a list
5819 2004-09-12  Brian Warner  <warner@lothar.com>
5821         * buildbot/master.py (BotPerspective._commandsUnavailable): don't
5822         log the whole exception if it's just an AttributeError (old slave)
5824         * buildbot/process/step.py (ShellCommand.__init__): stash .workdir
5825         so (e.g.) sub-commands can be run in the right directory.
5826         (ShellCommand.start): accept an optional errorMessage= argument
5827         to make life easier for SVN.start
5828         (SVN.startVC): put the "can't do mode=export" warning in the LogFile
5829         headers
5830         (ShellCommand.start): move ['dir'] compatibility hack..
5831         (RemoteShellCommand.start): .. to here so everyone can use it
5833         * buildbot/process/step_twisted.py (Trial): use .workdir
5835         * buildbot/process/step_twisted.py (BuildDebs.getText): fix the
5836         text displayed when debuild fails completely
5837         (Trial): snarf _trial_temp/test.log from the slave and display it
5839 2004-09-11  Brian Warner  <warner@lothar.com>
5841         * buildbot/process/step_twisted.py (ProcessDocs.getText): typo
5843         * buildbot/process/process_twisted.py (TwistedTrial.tests): oops,
5844         set to 'twisted', so --recurse can find twisted/web/test/*, etc
5846         * buildbot/process/step.py (ShellCommand): call .createSummary
5847         before .evaluateCommand instead of the other way around. This
5848         makes it slightly easier to count warnings and then use that to
5849         set results=WARNINGS
5850         * buildbot/process/step_twisted.py: cosmetic, swap the methods
5852         * buildbot/process/base.py (Build.buildFinished): update status
5853         before doing progress. It's embarrassing for the build to be stuck
5854         in the "building" state when an exceptions occurs elsewhere..
5856         * buildbot/status/progress.py (Expectations.expectedBuildTime):
5857         python2.2 doesn't have 'sum'
5859         * buildbot/status/builder.py (Status.getBuilderNames): return a copy,
5860         to prevent clients from accidentally sorting it
5862         * buildbot/master.py (Manhole): add username/password
5863         (BuildMaster.loadConfig): use c['manhole']=Manhole() rather than
5864         c['manholePort'], deprecate old usage
5865         * docs/config.xhtml: document c['manhole']
5866         * docs/examples/hello.cfg: show example of using a Manhole
5869         * buildbot/test/test_steps.py (FakeBuilder.getSlaveCommandVersion):
5870         pretend the slave is up to date
5872         * buildbot/status/builder.py (BuildStepStatus.stepFinished): 'log',
5873         the module, overlaps with 'log', the local variable
5875         * buildbot/status/html.py: oops, 2.2 needs __future__ for generators
5877         * buildbot/process/builder.py (Builder.getSlaveCommandVersion):
5878         new method to let Steps find out the version of their
5879         corresponding SlaveCommand.
5880         * buildbot/process/step.py (BuildStep.slaveVersion): utility method
5881         (ShellCommand.start): add 'dir' argument for <=0.5.0 slaves
5882         (CVS.startVC): backwards compatibility for <=0.5.0 slaves
5883         (SVN.startVC): same
5884         (Darcs.startVC): detect old slaves (missing the 'darcs' command)
5885         (Arch.startVC): same
5886         (P4Sync.startVC): same
5888         * buildbot/process/step.py (LoggedRemoteCommand.start): return the
5889         Deferred so we can catch errors in remote_startCommand
5890         (RemoteShellCommand.start): same
5892         * docs/examples/twisted_master.cfg: update sample config file
5894         * buildbot/slave/commands.py (ShellCommandPP): write to stdin
5895         after connectionMade() is called, not before. Close stdin at that
5896         point too.
5898         * buildbot/process/process_twisted.py: update to use Trial, clean
5899         up argument passing (move to argv arrays instead of string
5900         commands)
5902         * buildbot/process/step_twisted.py (Trial): new step to replace
5903         RunUnitTests, usable by any trial-using project (not just
5904         Twisted). Arguments have changed, see the docstring for details.
5906         * buildbot/process/base.py (Build.startBuild): this now returns a
5907         Deferred. Exceptions that occur during setupBuild are now
5908         caught better and lead to fewer build_status weirdnesses, like
5909         finishing a build that was never started.
5910         (Build.buildFinished): fire the Deferred instead of calling
5911         builder.buildFinished directly. The callback argument is this
5912         Build, everything else can be extracted from it, including the
5913         new build.results attribute.
5914         * buildbot/process/builder.py (Builder.startBuild): same
5915         (Builder.buildFinished): same, extract results from build
5917         * buildbot/process/step.py (ShellCommands): remove dead code
5919 2004-09-08  Brian Warner  <warner@lothar.com>
5921         * buildbot/test/test_vc.py (VC.doPatch): verify that a new build
5922         doesn't try to use the leftover patched workdir
5923         (SourceStamp): test source-stamp computation for CVS and SVN
5925         * buildbot/slave/commands.py (SourceBase.doPatch): mark the
5926         patched workdir ('touch .buildbot-patched') so we don't try to
5927         update it later
5928         (SourceBase.start): add ['revision'] for all Source steps
5929         (CVS): change args: use ['branch'] for -r, remove ['files']
5930         (CVS.buildVC): fix revision/branch stuff
5931         (SVN): add revision stuff
5933         * buildbot/process/step.py (BuildStep.__init__): reject unknown
5934         kwargs (except 'workdir') to avoid silent spelling errors
5935         (ShellCommand.__init__): same
5936         (Source): new base class for CVS/SVN/etc. Factor out everything
5937         common, add revision computation (perform the checkout with a -D
5938         DATE or -r REVISION that gets exactly the sources described by the
5939         last Change), overridable with step.alwaysUseLatest. Add patch
5940         handling (build.getSourceStamp can trigger the use of a base
5941         revision and a patch).
5942         (CVS, SVN, Darcs, Arch, P4Sync): refactor, remove leftover arguments
5943         * docs/steps.xhtml: update docs
5944         * docs/source.xhtml: mention .checkoutDelay
5945         * docs/examples/hello.cfg: show use of checkoutDelay, alwaysUseLatest
5947         * buildbot/process/base.py (Build.setSourceStamp): add a
5948         .sourceStamp attribute to each Build. If set, this indicates that
5949         the build should be done with something other than the most
5950         recent source tree. This will be used to implement "try" builds.
5951         (Build.allChanges): new support method
5952         (Build.lastChangeTime): remove, functionality moved to Source steps
5953         (Build.setupBuild): copy the Step args before adding ['workdir'],
5954         to avoid modifying the BuildFactory (and thus triggering spurious
5955         config changes)
5958         * buildbot/status/html.py: rename s/commits/changes/
5959         (StatusResourceChanges): same
5960         (CommitBox.getBox): same, update URL
5961         (WaterfallStatusResource): same
5962         (StatusResource.getChild): same
5964         * contrib/debugclient.py (DebugWidget.do_commit): send .revision
5965         * contrib/debug.glade: add optional 'revision' to the fakeChange
5967         * buildbot/changes/changes.py (html_tmpl): display .revision
5968         (ChangeMaster.addChange): note .revision in log
5969         * buildbot/changes/pb.py (ChangePerspective.perspective_addChange):
5970         accept a ['revision'] attribute
5972         * buildbot/process/factory.py (BuildFactory): use ComparableMixin
5974         * buildbot/master.py (BotMaster.getPerspective): update the
5975         .connected flag in SlaveStatus when it connects
5976         (BotMaster.detach): and when it disconnects
5977         (DebugPerspective.perspective_fakeChange): take a 'revision' attr
5978         (BuildMaster.loadConfig_Builders): walk old list correctly
5980         * buildbot/test/test_config.py: fix prefix= usage
5982 2004-09-06  Brian Warner  <warner@lothar.com>
5984         * NEWS: mention P4
5986         * buildbot/changes/p4poller.py (P4Source): New ChangeSource to
5987         poll a P4 depot looking for recent changes. Thanks to Dave
5988         Peticolas for the contribution. Probably needs some testing after
5989         I mangled it.
5991         * buildbot/process/step.py (P4Sync): simple P4 source-updater,
5992         requires manual client setup for each buildslave. Rather
5993         experimental. Thanks again to Dave Peticolas.
5994         * buildbot/slave/commands.py (P4Sync): slave-side source-updater
5996         * buildbot/changes/changes.py (Change): add a .revision attribute,
5997         which will eventually be used to generate source-stamp values.
5999         * buildbot/process/step.py (RemoteCommand.start): use
6000         notifyOnDisconnect to notice when we lose the slave, then treat it
6001         like an exception. This allows LogFiles to be closed and the build
6002         to be wrapped up normally. Be sure to remove the disconnect
6003         notification when the step completes so we don't accumulate a
6004         bazillion such notifications which will fire weeks later (when the
6005         slave finally disconnects normally). Fixes SF#915807, thanks to
6006         spiv (Andrew Bennetts) for the report.
6007         (LoggedRemoteCommand): move __init__ code to RemoteCommand, since it
6008         really isn't Logged- specific
6009         (LoggedRemoteCommand.remoteFailed): Add an extra newline to the
6010         header, since it's almost always going to be appended to an
6011         incomplete line
6012         * buildbot/test/test_steps.py (BuildStep.testShellCommand1):
6013         update test to handle use of notifyOnDisconnect
6015         * buildbot/status/builder.py (BuilderStatus.currentlyOffline):
6016         don't clear .ETA and .currentBuild when going offline, let the
6017         current build clean up after itself
6019         * buildbot/process/builder.py (Builder.detached): wait a moment
6020         before doing things like stopping the current build, because the
6021         current step will probably notice the disconnect and cleanup the
6022         build by itself
6023         * buildbot/test/test_run.py (Status.tearDown): update test to
6024         handle asynchronous build-detachment
6026         * buildbot/process/base.py (Build.stopBuild): minor shuffles
6028         * buildbot/status/html.py (WaterfallStatusResource.buildGrid):
6029         hush a debug message
6031 2004-09-05  Brian Warner  <warner@lothar.com>
6033         * buildbot/changes/maildir.py (Maildir.start): catch an IOError
6034         when the dnotify fcntl() fails and fall back to polling. Linux 2.2
6035         kernels do this: the fcntl module has the F_NOTIFY constant, but
6036         the kernel itself doesn't support the operation. Thanks to Olly
6037         Betts for spotting the problem.
6039         * buildbot/process/step.py (Darcs): new source-checkout command
6040         (Arch): new source-checkout command
6041         (todo_P4): fix constructor syntax, still just a placeholder
6042         * buildbot/test/test_vc.py (VC.testDarcs): test it
6043         (VC.testDarcsHTTP): same, via localhost HTTP
6044         (VC.testArch): same
6045         (VC.testArchHTTP): same
6046         * NEWS: mention new features
6048         * buildbot/slave/commands.py (ShellCommand): add .keepStdout,
6049         which tells the step to stash stdout text locally (in .stdout).
6050         Slave-side Commands can use this to make decisions based upon the
6051         output of the the ShellCommand (not just the exit code).
6052         (Darcs): New source-checkout command
6053         (Arch): New source-checkout command, uses .keepStdout in one place
6054         where it needs to discover the archive's default name.
6056         * docs/steps.xhtml: Document options taken by Darcs and Arch.
6057         * docs/source.xhtml: add brief descriptions of Darcs and Arch
6058         * docs/examples/hello.cfg: add examples of Darcs and Arch checkout
6060         * buildbot/process/step.py (ShellCommand.describe): add an
6061         alternate .descriptionDone attribute which provides descriptive
6062         text when the step is complete. .description can be ["compiling"],
6063         for use while the step is running, then .descriptionDone can be
6064         ["compile"], used alone when the step succeeds or with "failed" when
6065         it does not. Updated other steps to use the new text.
6066         * buildbot/process/step_twisted.py: same
6067         * buildbot/test/test_run.py: update tests to match
6069 2004-08-30  Brian Warner  <warner@lothar.com>
6071         * buildbot/process/step.py (ShellCommand.createSummary): fix docs
6072         (CVS.__init__): send 'patch' argument to slave
6073         (CVS.start): don't create the LoggedRemoteCommand until start(),
6074         so we can catch a .patch added after __init__
6075         (SVN.__init__): add 'patch' to SVN too
6076         (SVN.start): same
6078         * buildbot/slave/commands.py (ShellCommand): add a 'stdin'
6079         argument, to let commands push data into the process' stdin pipe.
6080         Move usePTY to a per-instance attribute, and clear it if 'stdin'
6081         is in use, since closing a PTY doesn't really affect the process
6082         in the right way (in particular, I couldn't run /usr/bin/patch
6083         under a pty).
6084         (SourceBase.doPatch): handle 'patch' argument
6086         * buildbot/test/test_vc.py (VC.doPatch): test 'patch' argument for
6087         both CVS and SVN
6089         * buildbot/slave/commands.py (cvs_ver): fix version-parsing goo
6090         * buildbot/slave/bot.py (Bot.remote_getCommands): send command
6091         versions to master
6092         * buildbot/master.py (BotPerspective.got_commands): get command
6093         versions from slave, give to each builder
6094         * buildbot/process/builder.py (Builder.attached): stash slave
6095         command versions in .remoteCommands
6097         * docs/steps.xhtml: bring docs in-line with reality
6099         * buildbot/process/step.py (CVS.__init__): more brutal
6100         compatibility code removal
6101         (SVN.__init__): same
6103         * buildbot/slave/commands.py (SlaveShellCommand): update docs
6104         (SlaveShellCommand.start): require ['workdir'] argument, remove
6105         the ['dir'] fallback (compatibility will come later)
6106         (SourceBase): update docs
6107         (SourceBase.start): remove ['directory'] fallback
6108         (CVS): update docs
6109         (SVN): update docs
6110         * buildbot/test/test_config.py (ConfigTest.testBuilders): update test
6111         * buildbot/test/test_steps.py (BuildStep.testShellCommand1): same
6112         * buildbot/test/test_slavecommand.py (SlaveCommandTestCase): same
6114         * buildbot/process/step.py (RemoteShellCommand.__init__): add
6115         want_stdout/want_stderr. remove old 'dir' keyword (to simplify the
6116         code.. I will figure out 0.5.0-compatibility hooks later)
6118 2004-08-30  Brian Warner  <warner@lothar.com>
6120         * buildbot/process/process_twisted.py: rewrite in terms of new
6121         BuildFactory base class. It got significantly shorter. Yay
6122         negative code days.
6124         * buildbot/process/step_twisted.py (HLint.start): fix to make it
6125         work with the new "self.build isn't nailed down until we call
6126         step.start()" scheme: specifically, __init__ is called before the
6127         build has decided on which Changes are going in, so we don't scan
6128         build.allFiles() for .xhtml files until start()
6129         (HLint.commandComplete): use getText(), not getStdout()
6130         (RunUnitTests.start): same: don't use .build until start()
6131         (RunUnitTests.describe): oops, don't report (None) when using
6132         the default reactor
6133         (RunUnitTests.commandComplete): use getText()
6134         (RunUnitTests.createSummary): same
6135         (BuildDebs.commandComplete): same
6137         * buildbot/process/step.py (RemoteShellCommand.__init__): don't
6138         set args['command'] until start(), since our BuildStep is allowed
6139         to change their mind up until that point
6140         (TreeSize.commandComplete): use getText(), not getStdout()
6142         * docs/examples/twisted_master.cfg: update to current standards
6144         * docs/factories.xhtml: update
6145         * buildbot/process/factory.py: implement all the common factories
6146         described in the docs. The Trial factory doesn't work yet, and
6147         I've probably broken all the process_twisted.py factories in the
6148         process. There are compatibility classes left in for things like
6149         the old BasicBuildFactory, but subclasses of them are unlikely to
6150         work.
6151         * docs/examples/glib_master.cfg: use new BuildFactories
6152         * docs/examples/hello.cfg: same
6154         * buildbot/test/test_config.py (ConfigTest.testBuilders): remove
6155         explicit 'workdir' args
6157         * buildbot/process/base.py (BuildFactory): move factories to ..
6158         * buildbot/process/factory.py (BuildFactory): .. here
6159         * buildbot/process/process_twisted.py: handle move
6160         * buildbot/test/test_config.py: same
6161         * buildbot/test/test_run.py: same
6162         * buildbot/test/test_steps.py: same
6163         * buildbot/test/test_vc.py: same
6164         * docs/factories.xhtml: same
6166         * NEWS: mention config changes that require updating master.cfg
6168         * buildbot/process/base.py (Build.setupBuild): add a 'workdir'
6169         argument to all steps that weren't given one already, pointing at
6170         the "build/" directory.
6172         * docs/examples/hello.cfg: remove explicit 'workdir' args
6174         * docs/factories.xhtml: document standard BuildFactory clases,
6175         including a bunch which are have not yet been written
6177 2004-08-29  Brian Warner  <warner@lothar.com>
6179         * buildbot/interfaces.py (IBuildStepStatus.getResults): move
6180         result constants (SUCCESS, WARNINGS, FAILURE, SKIPPED) to
6181         buildbot.status.builder so they aren't quite so internal
6182         * buildbot/process/base.py, buildbot/process/builder.py: same
6183         * buildbot/process/maxq.py, buildbot/process/step.py: same
6184         * buildbot/process/step_twisted.py, buildbot/status/builder.py: same
6185         * buildbot/status/mail.py, buildbot/test/test_run.py: same
6186         * buildbot/test/test_status.py, buildbot/test/test_vc.py: same
6188         * buildbot/status/html.py (StatusResourceBuildStep): oops, update
6189         to handle new getLogs()-returns-list behavior
6190         (StatusResourceBuildStep.getChild): same
6191         (StepBox.getBox): same
6192         (WaterfallStatusResource.phase0): same
6194         * docs/source.xhtml: document how Buildbot uses version-control
6195         systems (output side: how we get source trees)
6196         * docs/changes.xhtml: rename from sources.xhtml, documents VC
6197         systems (input side: how we learn about Changes)
6199         * buildbot/master.py (Manhole): use ComparableMixin
6200         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): same
6201         * buildbot/changes/mail.py (MaildirSource): same
6202         * buildbot/status/client.py (PBListener): same
6203         * buildbot/status/html.py (Waterfall): same
6204         * buildbot/status/words.py (IRC): same
6206         * NEWS: start describing new features
6208         * buildbot/status/mail.py (MailNotifier): finish implementation.
6209         The message body is still a bit sparse.
6210         * buildbot/test/test_status.py (Mail): test it
6212         * buildbot/util.py (ComparableMixin): class to provide the __cmp__
6213         and __hash__ methods I wind up adding everywhere. Specifically
6214         intended to support the buildbot config-file update scheme where
6215         we compare, say, the old list of IStatusTargets against the new
6216         one and don't touch something which shows up on both lists.
6217         * buildbot/test/test_util.py (Compare): test case for it
6219         * buildbot/interfaces.py (IBuildStatus): change .getLogs() to
6220         return a list instead of a dict
6221         (IBuildStepStatus.getLogs): same. The idea is that steps create
6222         logs with vaguely unique names (although their uniqueness is not
6223         guaranteed). Thus a compilation step should create its sole
6224         logfile with the name 'compile', and contribute it to the
6225         BuildStatus. If a step has two logfiles, try to create them with
6226         different names (like 'test.log' and 'test.summary'), and only
6227         contribute the important ones to the overall BuildStatus.
6228         * buildbot/status/builder.py (Event.getLogs): same
6229         (BuildStepStatus): fix default .text and .results
6230         (BuildStepStatus.addLog): switch to list-like .getLogs()
6231         (BuildStepStatus.stepFinished): same
6232         (BuildStatus.text): fix default .text
6233         (BuildStatus.getLogs): temporary hack to return all logs (from all
6234         child BuildStepStatus objects). Needs to be fixed to only report
6235         the significant ones (as contributed by the steps themselves)
6236         * buildbot/test/test_run.py: handle list-like .getLogs()
6237         * buildbot/test/test_steps.py (BuildStep.testShellCommand1): same
6239 2004-08-28  Brian Warner  <warner@lothar.com>
6241         * buildbot/process/builder.py (Builder.attached): serialize the
6242         attachment process, so the attach-watcher isn't called until the
6243         slave is really available. Add detached watchers too, which makes
6244         testing easier.
6246         * buildbot/test/test_vc.py: test VC modes (clobber/update/etc)
6248         * buildbot/test/test_swap.py: remove dead code
6250         * buildbot/slave/commands.py (ShellCommandPP): add debug messages
6251         (ShellCommand.start): treat errors in _startCommand/spawnProcess
6252         sort of as if the command being run exited with a -1. There may
6253         still be some holes in this scheme.
6254         (CVSCommand): add 'revision' tag to the VC commands, make sure the
6255         -r option appears before the module list
6256         * buildbot/process/step.py (CVS): add 'revision' argument
6258         * buildbot/slave/bot.py (SlaveBuilder._ackFailed): catch failures
6259         when sending updates or stepComplete messages to the master, since
6260         we don't currently care whether they arrive or not. When we revamp
6261         the master/slave protocol to really resume interrupted builds,
6262         this will need revisiting.
6263         (lostRemote): remove spurious print
6265         * buildbot/master.py (BotPerspective.attached): serialize the
6266         new-builder interrogation process, to make testing easier
6267         (BotMaster.waitUntilBuilderDetached): convenience function
6269         * buildbot/status/builder.py (BuilderStatus): prune old builds
6270         (BuildStatus.pruneSteps): .. and steps
6271         (BuildStepStatus.pruneLogs): .. and logs
6272         (BuilderStatus.getBuild): handle missing builds
6273         * buildbot/status/html.py (StatusResourceBuild.body): display build
6274         status in the per-build page
6275         (BuildBox.getBox): color finished builds in the per-build box
6277 2004-08-27  Brian Warner  <warner@lothar.com>
6279         * buildbot/status/mail.py (MailNotifier): new notification class,
6280         not yet finished
6282         * buildbot/slave/commands.py (SourceBase): refactor SVN and CVS into
6283         variants of a common base class which handles all the mode= logic
6285         * buildbot/interfaces.py (IBuildStatus.getPreviousBuild): add
6286         convenience method
6287         * buildbot/status/builder.py (BuildStatus.getPreviousBuild): same
6289 2004-08-26  Brian Warner  <warner@lothar.com>
6291         * buildbot/test/test_slavecommand.py: accomodate new slavecommand
6292         interfaces
6294         * buildbot/test/test_run.py: update to new Logfile interface, new
6295         buildbot.slave modules
6296         * buildbot/test/test_steps.py: same, remove Swappable, add timeouts
6298         * MANIFEST.in: new sample config file
6299         * docs/examples/hello.cfg: same
6301         * buildbot/process/step_twisted.py: remove dead import
6303         * buildbot/process/step.py (RemoteCommand.run): catch errors
6304         during .start
6305         (RemoteCommand.remote_update): ignore updates that arrive after
6306         we've shut down
6307         (RemoteCommand.remote_complete): ignore duplicate complete msgs
6308         (RemoteCommand._remoteComplete): cleanup failure handling, reduce
6309         the responsibilities of the subclass's methods
6310         (BuildStep.failed): catch errors during failure processing
6311         (BuildStep.addHTMLLog): provide all-HTML logfiles (from Failures)
6312         (CVS): move to a mode= argument (described in docstring), rather
6313         than the ungainly clobber=/export=/copydir= combination.
6314         (SVN): add mode= functionality to SVN too
6315         (todo_Darcs, todo_Arch, todo_P4): placeholders for future work
6317         * buildbot/process/base.py (Build.startNextStep): catch errors
6318         during s.startStep()
6320         * buildbot/clients/base.py: update to new PB client interface.
6321         gtkPanes is still broken
6323         * buildbot/bot.py, buildbot/slavecommand.py: move to..
6324         * buildbot/slave/bot.py, buildbot/slave/commands.py: .. new directory
6325         * setup.py: add buildbot.slave module
6326         * buildbot/bb_tap.py: handle move
6327         * buildbot/slave/registry.py: place to register commands, w/versions
6328         * buildbot/slave/bot.py: major simplifications
6329         (SlaveBuilder.remote_startCommand): use registry for slave commands,
6330         instead of a fixed table. Eventually this will make the slave more
6331         extensible. Use 'start' method on the command, not .startCommand.
6332         Fix unsafeTracebacks handling (I think).
6333         * buildbot/slave/commands.py: major cleanup. ShellCommand is now a
6334         helper class with a .start method that returns a Deferred.
6335         SlaveShellCommand is the form reached by the buildmaster. Commands
6336         which use multiple ShellCommands can just chain them as Deferreds,
6337         with some helper methods in Command (_abandonOnFailure and
6338         _checkAbandoned) to bail on rc!=0.
6339         (CVSCommand): prefer new mode= argument
6340         (SVNFetch): add mode= argument
6342         * buildbot/master.py (DebugPerspective.perspective_forceBuild):
6343         put a useful reason string on the build
6345         * buildbot/status/builder.py (LogFile): do LogFile right: move the
6346         core functionality into an IStatusLog object
6347         (BuildStatus.sendETAUpdate): don't send empty build-eta messages
6348         * buildbot/status/html.py (TextLog): HTML-rendering goes here
6349         (StatusResourceBuild.body): use proper accessor methods
6350         * buildbot/status/client.py (RemoteLog): PB-access goes here
6351         (StatusClientPerspective.perspective_subscribe): add "full" mode,
6352         which delivers log contents too
6353         (PBListener.__cmp__): make PBListeners comparable, thus removeable
6354         * buildbot/status/event.py: remove old Logfile completely
6356         * buildbot/interfaces.py (IStatusLog.subscribe): make the
6357         subscription interface for IStatusLog subscriptions just like all
6358         other the status subscriptions
6359         (IStatusReceiver.logChunk): method called on subscribers
6361 2004-08-24  Brian Warner  <warner@lothar.com>
6363         * buildbot/process/builder.py (Builder._pong): oops, ping response
6364         includes a result (the implicit None returned by remote_print).
6365         Accept it so the _pong method handles the response correctly.
6367 2004-08-06  Brian Warner  <warner@lothar.com>
6369         * buildbot/test/test_config.py: update IRC, PBListener tests
6371         * buildbot/status/client.py (StatusClientPerspective): total
6372         rewrite to match new IStatus interfaces. New subscription scheme.
6373         There are still a few optimizations to make (sending down extra
6374         information with event messages so the client doesn't have to do a
6375         round trip). The logfile-retrieval code is probably still broken.
6376         Moved the PB service into its own port, you can no longer share a
6377         TCP socket between a PBListener and, say, the slaveport (this
6378         should be fixed eventually).
6379         * buildbot/clients/base.py (Client): revamp to match. still needs
6380         a lot of work, but basic event reporting works fine. gtkPanes is
6381         completely broken.
6383         * buildbot/status/words.py (IRC): move to c['status']. Each IRC
6384         instance talks to a single irc server. Threw out all the old
6385         multi-server handling code. Still need to add back in
6386         builder-control (i.e. "force build")
6388         * buildbot/status/html.py (StatusResourceBuildStep.body): add some
6389         more random text to the as-yet-unreachable per-step page
6391         * buildbot/status/builder.py (BuildStepStatus.sendETAUpdate):
6392         rename to stepETAUpdate
6393         (BuildStatus.subscribe): add build-wide ETA updates
6394         (BuilderStatus.getState): remove more cruft
6395         (BuilderStatus.getCurrentBuild): remove more cruft
6396         (BuilderStatus.buildStarted): really handle tuple-subscription
6397         * buildbot/test/test_run.py (Status.testSlave): handle the
6398         stepETAUpdate rename
6400         * buildbot/master.py (BuildMaster): don't add a default
6401         StatusClientService. Don't add a default IrcStatusFactory. Both
6402         are now added through c['status'] in the config file. c['irc'] is
6403         accepted for backwards compatibility, the only quirk is you cannot
6404         use c['irc'] to specify IRC servers on ports other than 6667.
6406         * buildbot/interfaces.py (IBuildStatus.getCurrentStep): add method
6407         (IStatusReceiver.buildStarted): allow update-interval on subscribe
6408         (IStatusReceiver.buildETAUpdate): send build-wide ETA updates
6409         (IStatusReceiver.stepETAUpdate): rename since it's step-specific
6412         * buildbot/master.py (BuildMaster.startService): SIGHUP now causes
6413         the buildmaster to re-read its config file
6416         * buildbot/test/test_web.py (test_webPortnum): need a new hack to
6417         find out the port our server is running on
6418         (WebTest.test_webPathname_port): same
6420         * buildbot/test/test_config.py (testWebPortnum): test it
6421         (testWebPathname): ditto
6423         * docs/config.xhtml: document new c['status'] configuration option
6425         * buildbot/status/html.py (Waterfall): new top-level class which
6426         can be added to c['status']. This creates the Site as well as the
6427         necessary TCPServer/UNIXServer. It goes through the BuildMaster,
6428         reachable as .parent, for everything.
6430         * buildbot/master.py (Manhole): make it a normal service Child
6431         (BuildMaster.loadConfig_status): c['status'] replaces webPortnum and
6432         webPathname. It will eventually replace c['irc'] and the implicit
6433         PB listener as well. c['webPortnum'] and c['webPathname'] are left
6434         in as (deprecated) backward compatibility hooks for now.
6437         * buildbot/process/builder.py (Builder.buildFinished): don't
6438         inform out builder_status about a finished build, as it finds out
6439         through its child BuildStatus object
6441         * buildbot/status/html.py: extensive revamp. Use adapters to make
6442         Boxes out of BuildStepStatus and friends. Acknowledge that Steps
6443         have both starting and finishing times and adjust the waterfall
6444         display accordingly, using spacers if necessary. Use SlaveStatus
6445         to get buildslave info.
6446         (StatusResourceBuildStep): new just-one-step resource, used to get
6447         logfiles. No actual href to it yet.
6449         * buildbot/status/event.py (Logfile.doSwap): disable Swappable for
6450         the time being, until I get the file-naming scheme right
6452         * buildbot/status/builder.py (Event): clean started/finished names
6453         (BuildStatus.isFinished): .finished is not None is the right test
6454         (BuildStatus.buildStarted): track started/finished times ourselves
6455         (BuilderStatus.getSlave): provide access to SlaveStatus object
6456         (BuilderStatus.getLastFinishedBuild): all builds are now in
6457         .builds, even the currently-running one. Accomodate this change.
6458         (BuilderStatus.eventGenerator): new per-builder event generator.
6459         Returns BuildStepStatus and BuildStatus objects, since they can
6460         both be adapted as necessary.
6461         (BuilderStatus.addEvent): clean up started/finished attributes
6462         (BuilderStatus.startBuild,finishBuild): remove dead code
6463         (SlaveStatus): new object to provide ISlaveStatus
6465         * buildbot/process/step.py (ShellCommand.getColor): actually
6466         return the color instead of setting it ourselves
6467         (CVS.__init__): pull .timeout and .workdir options out of
6468         **kwargs, since BuildStep will ignore them. Without this neither
6469         will be sent to the slave correctly.
6470         (SVN.__init__): same
6472         * buildbot/process/builder.py (Builder): move flags to class-level
6473         attributes
6474         (Builder.attached): remove .remoteInfo, let the BotPerspective and
6475         SlaveStatus handle that
6477         * buildbot/process/base.py (Build.firstEvent): remove dead code
6478         (Build.stopBuild): bugfix
6480         * buildbot/changes/pb.py (PBChangeSource.describe): add method
6482         * buildbot/changes/changes.py (Change): add IStatusEvent methods
6483         (ChangeMaster.eventGenerator): yield Changes, since there are now
6484         Adapters to turn them into HTML boxes
6486         * buildbot/master.py (BotMaster): track SlaveStatus from BotMaster
6487         (BotPerspective.attached): feed a SlaveStatus object
6488         (BuildMaster.loadConfig): add a manhole port (debug over telnet)
6489         (BuildMaster.loadConfig_Builders): give BuilderStatus a parent
6491         * buildbot/interfaces.py: API additions
6492         (ISlaveStatus): place to get slave status
6494 2004-08-04  Brian Warner  <warner@lothar.com>
6496         * buildbot/slavecommand.py (DummyCommand.finished): send rc=0 when
6497         the delay finishes, so the step is marked as SUCCESS
6499         * buildbot/test/test_run.py (Status.testSlave): cover more of
6500         IBuildStatus and IBuildStepStatus
6502         * buildbot/status/progress.py (StepProgress): move some flags to
6503         class-level attributes
6504         (StepProgress.remaining): if there are no other progress metrics
6505         to go by, fall back to elapsed time
6506         (StepProgress.setExpectations): take a dict of metrics instead of
6507         a list
6508         (BuildProgress.setExpectationsFrom): pull expectations from the
6509         Expectations, instead of having it push them to the BuildProgress
6510         (Expectations): move some flags to class-level attributes
6511         (Expectations.__init__): copy per-step times from the
6512         BuildProgress too
6513         (Expectations.expectedBuildTime): new method for per-build ETA
6515         * buildbot/status/event.py (Logfile): move some flags to
6516         class-level attributes
6517         (Logfile.logProgressTo): better method name, let step set the
6518         progress axis name (instead of always being "output")
6520         * buildbot/status/builder.py (BuildStepStatus.getTimes): track the
6521         times directly, rather than depending upon the (possibly missing)
6522         .progress object. Use 'None' to indicate "not started/finished
6523         yet"
6524         (BuildStepStatus.getExpectations): oops, return the full list of
6525         expectations
6526         (BuilderStatus._buildFinished): append finished builds to .builds
6528         * buildbot/process/step.py (BuildStep): add separate .useProgress
6529         flag, since empty .progressMetrics[] still implies that time is a
6530         useful predictor
6531         (CVS): set up the cmd in __init__, instead of waiting for start()
6533         * buildbot/process/base.py (Build.startBuild): disable the 'when'
6534         calculation, this will eventually turn into a proper sourceStamp
6535         (Build.setupBuild): tell the Progress to load from the Expectations,
6536         instead of having the Expectations stuff things into the Progress
6537         (Build.buildException): add a build-level errback to make sure the
6538         build's Deferred fires even in case of exceptions
6540         * buildbot/master.py (BotMaster.forceBuild): convey the reason into
6541         the forced build
6542         * buildbot/process/builder.py (Builder.forceBuild): convey the
6543         reason instead of creating a fake Change
6545         * docs/examples/twisted_master.cfg: update to match reality
6547         * buildbot/test/test_config.py, buildbot/test/test_process.py:
6548         * buildbot/test/test_run.py, buildbot/test/test_steps.py:
6549         fix or remove broken/breaking tests
6551         * buildbot/status/event.py (Logfile.__len__): remove evil method
6553         * buildbot/status/builder.py (BuildStepStatus.stepStarted): tolerate
6554         missing .build, for test convenience
6556         * buildbot/process/step_twisted.py: import fixes
6558         * buildbot/process/step.py (BuildStep.failed): exception is FAILURE
6560         * buildbot/master.py (BuildMaster.loadConfig_Builders): leftover
6561         .statusbag reference
6563         * buildbot/bot.py (BuildSlave.stopService): tear down the TCP
6564         connection at shutdown, and stop it from reconnecting
6566         * buildbot/test/test_run.py (Run.testSlave): use a RemoteDummy to
6567         chase down remote-execution bugs
6569         * buildbot/process/step.py: more fixes, remove
6570         BuildStep.setStatus()
6571         * buildbot/status/builder.py: move setStatus() functionality into
6572         BuildStatus.addStep
6573         * buildbot/status/event.py: minor fixes
6575 2004-08-03  Brian Warner  <warner@lothar.com>
6577         * buildbot/process/base.py, buildbot/process/builder.py
6578         * buildbot/process/step.py, buildbot/status/builder.py
6579         * buildbot/status/event.py, buildbot/test/test_run.py:
6580         fix status delivery, get a basic test case working
6581         * buildbot/master.py: finish implementing basic status delivery,
6582         temporarily disable HTML/IRC/PB status sources
6584         * buildbot/bot.py (Bot.remote_setBuilderList): remove debug noise
6586         * buildbot/status/progress.py (BuildProgress): remove dead code
6588         * buildbot/interfaces.py
6589         * buildbot/process/base.py, buildbot/process/builder.py
6590         * buildbot/process/step.py, buildbot/process/step_twisted.py
6591         * buildbot/status/builder.py: Complete overhaul of the all
6592         status-delivery code, unifying all types of status clients (HTML,
6593         IRC, PB). See interfaces.IBuildStatus for an idea of what it will
6594         look like. This commit is a checkpointing of the work-in-progress:
6595         the input side is mostly done (Builders/Builds sending status
6596         to the BuilderStatus/BuildStatus objects), but the output side has
6597         not yet been started (HTML resources querying BuilderStatus
6598         objects). Things are probably very broken right now and may remain
6599         so for several weeks, I apologize for the disruption.
6601         * buildbot/status/event.py: add a setHTML method to use pre-rendered
6602         HTML as the log's contents. Currently used for exception tracebacks.
6603         * buildbot/status/progress.py: minor spelling changes
6605 2004-08-02  Brian Warner  <warner@lothar.com>
6607         * docs/config.xhtml: XHTML fixes, makes raw .xhtml files viewable
6608         in mozilla. Also added stylesheets copied from Twisted's docs.
6609         Remember that these files are meant to be run through Lore first.
6610         Thanks to Philipp Frauenfelder for the fixes.
6611         * docs/factories.xhtml, docs/sources.xhtml, docs/steps.xhtml: same
6612         * docs/stylesheet-unprocessed.css, docs/stylesheet.css: same
6613         * docs/template.tpl: added a Lore template
6615 2004-07-29  Brian Warner  <warner@lothar.com>
6617         * buildbot/interfaces.py: revamp status delivery. This is the
6618         preview: these are the Interfaces that will be provided by new
6619         Builder code, and to which the current HTML/IRC/PB status
6620         displayers will be adapted.
6622         * buildbot/slavecommand.py (ShellCommand.start): look for .usePTY
6623         on the SlaveBuilder, not the Bot.
6624         * buildbot/bot.py (Bot.remote_setBuilderList): copy Bot.usePTY to
6625         SlaveBuilder.usePTY
6626         * buildbot/test/test_slavecommand.py (FakeSlaveBuilder.usePTY):
6627         set .usePTY on the FakeSlaveBuilder
6629 2004-07-25  Brian Warner  <warner@lothar.com>
6631         * buildbot/changes/freshcvs.py: add some debug log messages
6632         (FreshCVSConnectionFactory.gotPerspective): pre-emptively fix the
6633         disabled 'setFilter' syntax
6634         (FreshCVSSourceNewcred.__init__): warn about prefix= values that
6635         don't end with a slash
6637         * buildbot/process/base.py (Builder._pong_failed): add TODO note
6639         * setup.py: bump to 0.5.0+ while between releases
6641 2004-07-23  Brian Warner  <warner@lothar.com>
6643         * setup.py (version): Releasing buildbot-0.5.0
6645 2004-07-23  Brian Warner  <warner@lothar.com>
6647         * README: update for 0.5.0 release
6649         * NEWS: update for 0.5.0 release
6651 2004-07-22  Brian Warner  <warner@lothar.com>
6653         * buildbot/slavecommand.py (ShellCommand): make usePTY a
6654         mktap-time configuration flag (--usepty=1, --usepty=0)
6655         * buildbot/bot.py: same
6657         * buildbot/master.py (BotPerspective.got_dirs): don't complain about
6658         an 'info' directory being unwanted
6660         * buildbot/changes/freshcvs.py (FreshCVSSource): flip the
6661         newcred/oldcred switch. Newcred (for CVSToys-1.0.10 and later) is now
6662         the default. To communicate with an oldcred daemond (CVSToys-1.0.9
6663         and earlier), use a FreshCVSSourceOldcred instead.
6664         (test): simple test routine: connect to server, print changes
6666         * buildbot/changes/changes.py (Change.getTime): make it possible
6667         to print un-timestamped changes
6669         * buildbot/master.py (makeApp): delete ancient dead code
6670         (BuildMaster.loadTheConfigFile): make "master.cfg" name configurable
6671         * buildbot/test/test_config.py (testFindConfigFile): test it
6673         * docs/examples/twisted_master.cfg (b22w32): use iocp reactor
6674         instead of win32 one
6677         * buildbot/master.py (BuildMaster.loadConfig_Builders): config file
6678         now takes a dictionary instead of a tuple. See docs/config.xhtml for
6679         details.
6681         * buildbot/process/base.py (Builder.__init__): change constructor
6682         to accept a dictionary of config data, rather than discrete
6683         name/slave/builddir/factory arguments
6685         * docs/examples/twisted_master.cfg: update to new syntax
6686         * docs/examples/glib_master.cfg: same
6687         * buildbot/test/test_config.py (ConfigTest.testBuilders): some
6688         rough tests of the new syntax
6690         
6691         * buildbot/master.py (BuildMaster.loadConfig): allow webPathname
6692         to be an int, which means "run a web.distrib sub-server on a TCP
6693         port". This lets you publish the buildbot status page to a remote
6694         twisted.web server (using distrib.ResourceSubscription). Also
6695         rename the local attributes used to hold these web things so
6696         they're more in touch with reality.
6697         * buildbot/test/test_web.py: test webPortnum and webPathname
6698         * docs/config.xhtml: document this new use of webPathname
6700         * docs/config.xhtml: new document, slightly ahead of reality
6701         
6702         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred.notify): fix
6703         'prefix' handling: treat it as a simple string to check with
6704         .startswith, instead of treating it as a directory. This allows
6705         sub-directories to be used. If you use prefix=, you should give it
6706         a string that starts just below the CVSROOT and ends with a slash.
6707         This prefix will be stripped from all filenames, and filenames
6708         which do not start with it will be ignored.
6710 2004-07-20  Cory Dodt  <corydodt@twistedmatrix.com>
6712         * contrib/svn_buildbot.py: Add --include (synonym for --filter)
6713         and --exclude (inverse of --include).  SVN post-commit hooks
6714         now have total control over which changes get sent to buildbot and which
6715         do not.
6717 2004-07-10  Brian Warner  <warner@lothar.com>
6719         * buildbot/test/test_twisted.py (Case1.testCountFailedTests): fix
6720         test case to match new API
6722         * buildbot/status/event.py (Logfile.getEntries): fix silly bug
6723         which crashed HTML display when self.entries=[] (needed to
6724         distinguish between [], which means "no entries yet", and None,
6725         which means "the entries have been swapped out to disk, go fetch
6726         them").
6728 2004-07-04  Brian Warner  <warner@lothar.com>
6730         * buildbot/process/step_twisted.py (countFailedTests): Count
6731         skips, expectedFailures, and unexpectedSuccesses. Start scanning
6732         10kb from the end because any import errors are wedged there and
6733         they would make us think the test log was unparseable.
6734         (RunUnitTests.finishStatus): add skip/todo counts to the event box
6736 2004-06-26  Brian Warner  <warner@lothar.com>
6738         * buildbot/process/step_twisted.py (RemovePYCs): turn the
6739         delete-*.pyc command into an actual BuildStep, so we can label it
6740         nicely
6741         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
6742         (FullTwistedBuildFactory): same
6744 2004-06-25  Cory Dodt  <corydodt@twistedmatrix.com>
6746         * contrib/fakechange.py: Add an errback when sending the fake 
6747         change, so we know it didn't work.
6749 2004-06-25  Christopher Armstrong  <radix@twistedmatrix.com>
6751         * buildbot/process/step_twisted.py: Delete *.pyc files before
6752         calling trial, so it doesn't catch any old .pyc files whose .py
6753         files have been moved or deleted.
6755         * buildbot/process/step_twisted.py (RunUnitTests): 1) Add a new
6756         parameter, 'recurse', that passes -R to trial. 2) have 'runAll'
6757         imply 'recurse'. 3) Make the default 'allTests' be ["twisted"]
6758         instead of ["twisted.test"], so that the end result is "trial -R
6759         twisted".
6761         * contrib/svn_buildbot.py: Add a --filter parameter that accepts a
6762         regular expression to match filenames that should be ignored when
6763         changed. Also add a --revision parameter that specifies the
6764         revision to examine, which is useful for debugging.
6766 2004-06-25  Brian Warner  <warner@lothar.com>
6768         * buildbot/process/step_twisted.py (trialTextSummarizer): create a
6769         summary of warnings (like DeprecationWarnings), next to the
6770         "summary" file
6772 2004-05-13  Brian Warner  <warner@lothar.com>
6774         * docs/examples/twisted_master.cfg: enable the win32 builder, as
6775         we now have a w32 build slave courtesy of Mike Taylor.
6777         * buildbot/process/base.py (Build.checkInterlocks): OMG this was
6778         so broken. Fixed a race condition that tripped up interlocked
6779         builds and caused the status to be stuck at "Interlocked" forever.
6780         The twisted buildbot's one interlocked build just so happened to
6781         never hit this case until recently (the feeding builds both pass
6782         before the interlocked build is attempted.. usually it has to wait
6783         a while).
6784         (Builder._pong_failed): fix method signature
6786         * setup.py: bump to 0.4.3+ while between releases
6788 2004-04-30  Brian Warner  <warner@lothar.com>
6790         * setup.py (version): Releasing buildbot-0.4.3
6792 2004-04-30  Brian Warner  <warner@lothar.com>
6794         * MANIFEST.in: add the doc fragments in  docs/*.xhtml
6796         * README: update for 0.4.3 release
6798         * NEWS: update for 0.4.3 release
6800         * buildbot/master.py (BuildMaster.__getstate__): make sure
6801         Versioned.__getstate__ is invoked, for upgrade from 0.4.2
6803         * buildbot/process/step_twisted.py (RunUnitTests.trial): add
6804         .trial as a class attribute, for upgrade from 0.4.2
6806         * buildbot/changes/changes.py (Change.links): add .links for
6807         upgrade from 0.4.2
6809         * buildbot/status/event.py (Logfile.__getstate__): get rid of both
6810         .textWatchers and .htmlWatchers at save time, since they are both
6811         volatile, should allow smooth 0.4.2 upgrade
6813         * buildbot/process/step.py (CVS.finishStatus): catch failed
6814         CVS/SVN commands so we can make the status box red
6816 2004-04-29  Brian Warner  <warner@lothar.com>
6818         * buildbot/changes/freshcvs.py
6819         (FreshCVSConnectionFactory.gotPerspective): add (commented-out)
6820         code to do setFilter(), which tells the freshcvs daemon to not
6821         send us stuff that we're not interested in. I will uncomment it
6822         when a new version of CVSToys is available in which setFilter()
6823         actually works, and I get a chance to test it better.
6825         * docs/examples/twisted_master.cfg: start using a PBChangeSource
6827         * buildbot/master.py (Dispatcher): use a registration scheme
6828         instead of hardwired service names
6829         (BuildMaster): keep track of the Dispatcher to support
6830         registration
6832         * buildbot/changes/changes.py (ChangeMaster): create a distinct
6833         PBChangeSource class instead of having it be an undocumented
6834         internal feature of the ChangeMaster. Split out the code into a
6835         new file.
6836         * buildbot/changes/pb.py (PBChangeSource): same
6837         * buildbot/test/test_changes.py: a few tests for PBChangeSource
6839         * docs/{factories|sources|steps}.xhtml: document some pieces
6841         * docs/examples/twisted_master.cfg: use SVN instead of CVS, stop
6842         using FCMaildirSource
6843         (f23osx): update OS-X builder to use python2.3, since the slave
6844         was updated to Panther (10.3.3)
6846 2004-03-21  Brian Warner  <warner@lothar.com>
6848         * buildbot/process/process_twisted.py: factor out doCheckout, change
6849         to use SVN instead of CVS
6851         * buildbot/process/base.py (BasicBuildFactory): refactor to make
6852         an SVN subclass easier
6853         (BasicSVN): subclass which uses Subversion instead of CVS
6855 2004-03-15  Christopher Armstrong  <radix@twistedmatrix.com>
6857         * buildbot/slavecommand.py (ShellCommand.start): use COMSPEC instead
6858         of /bin/sh on win32
6859         (CVSCommand.cvsComplete): don't assume chdir worked on win32
6861 2004-02-25  Brian Warner  <warner@lothar.com>
6863         * buildbot/slavecommand.py (ShellCommand): ['commands'] argument
6864         is now either a list (which is passed to spawnProcess directly) or
6865         a string (which gets passed to /bin/sh -c). This removes the useSH
6866         flag and the ArgslistCommand class. Also send status header at the
6867         start and end of each command, instead of having the master-side
6868         code do that.
6869         (CVSCommand): fix the doUpdate command, it failed to do the 'cp
6870         -r'. Update to use list-based arguments.
6871         (SVNFetch): use list-based arguments, use ['dir'] argument to
6872         simplify code.
6873         * buildbot/test/test_steps.py (Commands): match changes
6875         * buildbot/process/step.py (InternalShellCommand.words): handle
6876         command lists
6877         (SVN): inherit from CVS, cleanup
6879         * buildbot/status/event.py (Logfile.content): render in HTML, with
6880         stderr in red and headers (like the name of the command we're
6881         about to run) in blue. Add link to a second URL (url + "?text=1")
6882         to get just stdout/stderr in text/plain without markup. There is
6883         still a problem with .entries=None causing a crash, it seems to occur
6884         when the logfile is read before it is finished.
6886         * buildbot/bot.py (BotFactory.doKeepalive): add a 30-second
6887         timeout to the keepalives, and use it to explicitly do a
6888         loseConnection instead of waiting for TCP to notice the loss. This
6889         ought to clear up the silent-lossage problem.
6890         (unsafeTracebacks): pass exception tracebacks back to the master,
6891         makes it much easier to debug problems
6893 2004-02-23  Brian Warner  <warner@lothar.com>
6895         * buildbot/slavecommand.py (ShellCommand): add useSH flag to pass
6896         the whole command to /bin/sh instead of execve [Johan Dahlin]
6897         (CVSCommand): drop '-r BRANCH' if BRANCH==None instead of usiing
6898         '-r HEAD' [Johan Dahlin]
6899         (CVSCommand.start2): fix cvsdir calculation [Johan Dahlin]
6901         * buildbot/changes/changes.py (Change): add links= argument, add
6902         asHTML method [Johan Dahlin]. Modified to make a bit more
6903         XHTMLish. Still not sure how to best use links= .
6905         * buildbot/status/html.py (StatusResourceCommits.getChild): use 
6906         Change.asHTML to display the change, not asText
6908         * buildbot/status/html.py (StatusResourceBuilder): web button to
6909         ping slave
6911         * buildbot/test/test_run.py: test to actually start a buildmaster
6912         and poke at it
6914         * MANIFEST.in: bring back accidentally-dropped test helper files
6916         * buildbot/test/test_config.py (ConfigTest.testSources): skip tests
6917         that require cvstoys if it is not installed
6919         * buildbot/process/step_twisted.py (RunUnitTests): allow other
6920         values of "bin/trial" [Dave Peticolas]
6921         (RunUnitTests.finishStatus): say "no tests run" instead of "0
6922         tests passed" when we didn't happen to run any tests
6924         * buildbot/process/step.py (Compile): use haltOnFailure instead of
6925         flunkOnFailure [Johan Dahlin]
6927         * buildbot/process/base.py (ConfigurableBuild.setSteps): allow
6928         multiple instances of the same Step class by suffixing "_2", etc,
6929         to the name until it is unique. This name needs to be unique
6930         because it is used as a key in the dictionary that tracks build
6931         progress.
6932         * buildbot/test/test_steps.py (Steps.testMultipleStepInstances):
6933         add test for it
6935         * buildbot/process/base.py (Builder.ping): add "ping slave" command
6937 2004-01-14  Brian Warner  <warner@lothar.com>
6939         * buildbot/status/words.py (IrcStatusBot): when we leave or get
6940         kicked from a channel, log it
6942         * buildbot/master.py (Dispatcher): add "poke IRC" command to say
6943         something over whatever IRC channels the buildmaster is currently
6944         connected to. Added to try and track down a problem in which the
6945         master thinks it is still connected but the IRCd doesn't see it. I
6946         used a styles.Versioned this time, so hopefully users won't have
6947         to rebuild their .tap files this time.
6948         * contrib/debug.glade: add a "Poke IRC" button
6949         * contrib/debugclient.py: same
6951         * setup.py: bump to 0.4.2+ while between releases
6953 2004-01-08  Brian Warner  <warner@lothar.com>
6955         * setup.py (version): Releasing buildbot-0.4.2
6957 2004-01-08  Brian Warner  <warner@lothar.com>
6959         * NEWS: update for 0.4.2 release
6961         * README: document how to run the tests, now that they all pass
6963         * buildbot/changes/maildir.py (Maildir.poll): minor comment
6965         * buildbot/process/step.py (CVS): add a global_options= argument,
6966         which lets you set CVS global options for the command like "-r"
6967         for read-only checkout, or "-R" to avoid writing in the
6968         repository.
6969         * buildbot/slavecommand.py (CVSCommand): same
6971         * buildbot/status/event.py (Logfile): add a .doSwap switch to make
6972         testing easier (it is turned off when testing, to avoid the
6973         leftover timer)
6975         * buildbot/process/step.py (InternalBuildStep): shuffle code a bit
6976         to make it easier to test: break generateStepID() out to a
6977         separate function, only update statusbag if it exists.
6978         (ShellCommands): create useful text for dict-based commands too.
6980         * test/*, buildbot/test/*: move unit tests under the buildbot/
6981         directory
6982         * setup.py (packages): install buildbot.test too
6984         * buildbot/test/test_slavecommand.py: fix it, tests pass now
6985         * buildbot/test/test_steps.py: fix it, tests pass now
6987 2004-01-06  Brian Warner  <warner@lothar.com>
6989         * buildbot/changes/mail.py (parseFreshCVSMail): looks like new
6990         freshcvs mail uses a slightly different syntax for new
6991         directories. Update parser to handle either.
6992         * test/test_mailparse.py (Test1.testMsg9): test for same
6994 2003-12-21  Brian Warner  <warner@lothar.com>
6996         * buildbot/process/process_twisted.py (TwistedDebsBuildFactory): set
6997         'warnOnWarnings' so that lintian errors mark the build orange
6999 2003-12-17  Brian Warner  <warner@lothar.com>
7001         * buildbot/changes/mail.py (parseBonsaiMail): parser for commit
7002         messages emitted by Bonsai, contributed by Stephen Davis.
7004         * test/*: moved all tests to use trial instead of unittest. Some
7005         still fail (test_steps, test_slavecommand, and test_process).
7007         * setup.py (version): bump to 0.4.1+ while between releases
7009 2003-12-09  Brian Warner  <warner@lothar.com>
7011         * setup.py (version): Releasing buildbot-0.4.1
7013 2003-12-09  Brian Warner  <warner@lothar.com>
7015         * NEWS: update for 0.4.1 release
7017         * docs/examples/twisted_master.cfg: add netbsd builder, shuffle
7018         freebsd builder code a little bit
7020         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred.__cmp__):
7021         don't try to compare attributes of different classes
7022         * buildbot/changes/mail.py (MaildirSource.__cmp__): same
7023         (MaildirSource.messageReceived): fix Change delivery
7025         * buildbot/master.py (BuildMaster.loadConfig): insert 'basedir'
7026         into the config file's namespace before loading it, like the
7027         documentation claims it does
7028         * docs/examples/twisted_master.cfg: remove explicit 'basedir'
7029         (useFreshCVS): switch to using a maildir until Twisted's freshcvs
7030         daemon comes back online
7032 2003-12-08  Brian Warner  <warner@lothar.com>
7034         * docs/examples/twisted_master.cfg: provide an explicit 'basedir'
7035         so the example will work with online=0 as well
7037         * buildbot/changes/mail.py (FCMaildirSource, SyncmailMaildirSource):
7038         fix the __implements__ line
7040         * buildbot/changes/maildirtwisted.py (MaildirTwisted): make this
7041         class a twisted.application.service.Service, use startService to
7042         get it moving.
7044         * buildbot/changes/dnotify.py (DNotify): use os.open to get the
7045         directory fd instead of simple open(). I'm sure this used to work,
7046         but the current version of python refuses to open directories with
7047         open().
7049 2003-12-05  Brian Warner  <warner@lothar.com>
7051         * setup.py (version): bump to 0.4.0+ while between releases
7053 2003-12-05  Brian Warner  <warner@lothar.com>
7055         * setup.py (version): Releasing buildbot-0.4.0
7057 2003-12-05  Brian Warner  <warner@lothar.com>
7059         * docs/examples/glib_master.cfg: replace old sample scripts with
7060         new-style config files
7061         * MANIFEST.in: include .cfg files in distribution tarball
7063         * buildbot/changes/freshcvs.py (FreshCVSListener.remote_goodbye):
7064         implement a dummy method to avoid the exception that occurs when
7065         freshcvs sends this to us.
7067         * buildbot/pbutil.py (ReconnectingPBClientFactory.stopFactory):
7068         removed the method, as it broke reconnection. Apparently
7069         stopFactory is called each time the connection attempt fails. Must
7070         rethink this.
7071         (ReconnectingPBClientFactory.__getstate__): squash the _callID
7072         attribute before serialization, since without stopFactory the
7073         reconnect timer may still be active and they aren't serializable.
7075         * test/test_mailparse.py (ParseTest): test with 'self' argument
7077         * buildbot/changes/mail.py (parseFreshCVSMail): add (silly) 'self'
7078         argument, as these "functions" are invoked like methods from class
7079         attributes and therefore always get an instance as the first
7080         argument.
7082         * buildbot/changes/maildir.py (Maildir.start): fix error in error
7083         message: thanks to Stephen Davis for the catch
7085 2003-12-04  Brian Warner  <warner@lothar.com>
7087         * buildbot/pbutil.py: complete rewrite using PBClientFactory and
7088         twisted's standard ReconnectingClientFactory. Handles both oldcred
7089         and newcred connections. Also has a bug-workaround for
7090         ReconnectingClientFactory serializing its connector when it
7091         shouldn't.
7093         * buildbot/bot.py (BotFactory): rewrite connection layer with new
7094         pbutil. Replace makeApp stuff with proper newcred/mktap
7095         makeService(). Don't serialize Ephemerals on shutdown.
7097         * buildbot/changes/changes.py (ChangeMaster): make it a
7098         MultiService and add the sources as children, to get startService
7099         and stopService for free. This also gets rid of the .running flag.
7101         * buildbot/changes/freshcvs.py (FreshCVSSource): rewrite to use
7102         new pbutil, turn into a TCPClient at the same time (to get
7103         startService for free). Two variants exist: FreshCVSSourceOldcred
7104         and FreshCVSSourceNewcred (CVSToys doesn't actualy support newcred
7105         yet, but when it does, we'll be ready).
7106         (FreshCVSSource.notify): handle paths which are empty after the
7107         prefix is stripped. This only happens when the top-level (prefix)
7108         directory is added, at the very beginning of a Repository's life.
7110         * buildbot/clients/base.py: use new pbutil, clean up startup code.
7111         Now the only reconnecting code is in the factory where it belongs.
7112         (Builder.unsubscribe): unregister the disconnect callback when we
7113         delete the builder on command from the master (i.e. when the
7114         buildmaster is reconfigured and that builder goes away). This
7115         fixes a multiple-delete exception when the status client is shut
7116         down afterwards.
7117         * buildbot/clients/gtkPanes.py (GtkClient): cleanup, match the
7118         base Client. 
7120         * buildbot/status/words.py (IrcStatusBot): add some more sillyness
7121         (IrcStatusBot.getBuilderStatus): fix minor exception in error message
7123 2003-10-20  Christopher Armstrong  <radix@twistedmatrix.com>
7125         * contrib/run_maxq.py: Accept a testdir as an argument rather than
7126         a list of globs (ugh). The testdir will be searched for files
7127         named *.tests and run the tests in the order specified in each of
7128         those files. This allows for "dependancies" between tests to be
7129         codified.
7131         * buildbot/process/maxq.py (MaxQ.__init__): Accept a testdir
7132         argument to pass to run_maxq.py, instead of a glob.
7134 2003-10-17  Brian Warner  <warner@lothar.com>
7136         * buildbot/process/step_twisted.py (HLint.start): ignore .xhtml
7137         files that live in the sandbox
7139 2003-10-15  Brian Warner  <warner@lothar.com>
7141         * buildbot/process/step_twisted.py (ProcessDocs.finished): fix
7142         spelling error in "docs" count-warnings output
7143         (HLint.start): stupid thinko meant .xhtml files were ignored
7145         * docs/examples/twisted_master.cfg (reactors): disable cReactor
7146         tests now that cReactor is banished to the sandbox
7148 2003-10-10  Brian Warner  <warner@lothar.com>
7150         * buildbot/process/step_twisted.py (ProcessDocs, HLint): new Twisted
7151         scheme: now .xhtml are sources and .html are generated
7153 2003-10-08  Brian Warner  <warner@lothar.com>
7155         * buildbot/process/step_twisted.py (RunUnitTests.__init__): oops,
7156         we were ignoring the 'randomly' parameter.
7158 2003-10-01  Brian Warner  <warner@lothar.com>
7160         * buildbot/slavecommand.py (ShellCommand.start): set usePTY=1 on
7161         posix, to kill sub-children of aborted slavecommands.
7163         * buildbot/status/builder.py: rename Builder to BuilderStatus.
7164         Clean up initialization: lastBuildStatus remains None until the
7165         first build has been completed.
7167         * buildbot/status/html.py (WaterfallStatusResource.body): handle
7168         None as a lastBuildStatus
7169         * buildbot/clients/gtkPanes.py: same
7171         * buildbot/status/client.py (StatusClientService): keep
7172         BuilderStatus objects in self.statusbags . These objects now live
7173         here in the StatusClientService and are referenced by the Builder
7174         object, rather than the other way around.
7175         * buildbot/status/words.py (IrcStatusBot.getBuilderStatus): same
7176         * buildbot/process/base.py (Builder): same
7177         * test/test_config.py (ConfigTest.testBuilders): same
7179         * buildbot/master.py (BuildMaster.loadConfig_Builders): when modifying
7180         an existing builder, leave the statusbag alone. This will preserve the
7181         event history.
7183         * buildbot/pbutil.py (ReconnectingPB.connect): add initial newcred
7184         hook. This will probably go away in favor of a class in upcoming
7185         Twisted versions.
7187         * buildbot/changes/freshcvs.py (FreshCVSSource.start): Remove old
7188         serviceName from newcred FreshCVSNotifiee setup
7190 2003-09-29  Brian Warner  <warner@lothar.com>
7192         * buildbot/process/process_twisted.py: switch to new reactor
7193         abbreviations
7194         * docs/examples/twisted_master.cfg: same
7196         * README (REQUIREMENTS): mention twisted-1.0.8a3 requirement
7198         * buildbot/status/words.py (IrcStatusBot.getBuilder): use the
7199         botmaster reference instead of the oldapp service lookup
7201         * buildbot/master.py (BuildMaster.__init__): give the
7202         StatusClientService a reference to the botmaster to make it easier to
7203         force builds
7205 2003-09-24  Christopher Armstrong  <radix@twistedmatrix.com>
7207         * buildbot/status/html.py (Box.td): escape hreffy things so you
7208         can have spaces in things like builder names
7209         (StatusResourceBuilder.body)
7210         (WaterfallStatusResource.body)
7211         (WaterfallStatusResource.body0): same
7213 2003-09-25  Brian Warner  <warner@lothar.com>
7215         * buildbot/master.py (BuildMaster.loadConfig_Builders): don't
7216         rearrange the builder list when adding or removing builders: keep
7217         them in the order the user requested.
7218         * test/test_config.py (ConfigTest.testBuilders): verify it
7220         * contrib/debug.glade: give the debug window a name
7222         * buildbot/process/base.py (Builder.buildTimerFired): builders can
7223         now wait on multiple interlocks. Fix code relating to that.
7224         (Builder.checkInterlocks): same
7225         * buildbot/status/builder.py (Builder.currentlyInterlocked): same
7227         * buildbot/master.py (BuildMaster.loadConfig): move from
7228         deprecated pb.BrokerFactory to new pb.PBServerFactory
7229         * test/test_config.py (ConfigTest.testWebPathname): same
7231         * docs/examples/twisted_master.cfg: fix interlock declaration
7233         * buildbot/master.py (BotMaster.addInterlock): move code to attach
7234         Interlocks to their Builders into interlock.py .
7235         (BuildMaster.loadConfig_Interlocks): fix interlock handling
7237         * test/test_config.py (ConfigTest.testInterlocks): validate
7238         interlock handling
7240         * buildbot/process/base.py (Builder.__init__): better comments
7241         * buildbot/process/interlock.py (Interlock.__repr__): same
7242         (Interlock.deactivate): add .active flag, move the code that
7243         attaches/detaches builders into the Interlock
7245 2003-09-24  Christopher Armstrong  <radix@twistedmatrix.com>
7247         * buildbot/process/maxq.py (MaxQ): support for running a set of MaxQ
7248         tests using the new run_maxq.py script, and reporting failures by
7249         parsing its output.
7251         * contrib/run_maxq.py: Hacky little script for running a set of maxq
7252         tests, reporting their success or failure in a buildbot-friendly 
7253         manner.
7255 2003-09-24  Brian Warner  <warner@lothar.com>
7257         * docs/examples/twisted_master.cfg: example of a new-style config
7258         file. This lives in the buildmaster base directory as
7259         "master.cfg".
7261         * contrib/debugclient.py (DebugWidget.do_rebuild): add 'reload'
7262         button to make the master re-read its config file
7264         * buildbot/master.py (BuildMaster.loadConfig): new code to load
7265         buildmaster configuration from a file. This file can be re-read
7266         later, and the buildmaster will update itself to match the new
7267         desired configuration. Also use new Twisted Application class.
7268         * test/Makefile, test/test_config.py: unit tests for same
7270         * buildbot/changes/freshcvs.py (FreshCVSSource.__cmp__): make
7271         FreshCVSSources comparable, to support reload.
7272         * buildbot/changes/mail.py (MaildirSource.__cmp__): same
7274         * buildbot/process/base.py (Builder): make them comparable, make
7275         Interlocks easier to attach, to support reload. Handle
7276         re-attachment of remote slaves.
7277         * buildbot/process/interlock.py (Interlock): same
7279         * buildbot/bot.py, bb_tap.py, changes/changes.py: move to
7280         Twisted's new Application class. Requires Twisted >= 1.0.8 .
7281         buildmaster taps are now constructed with mktap.
7282         * buildbot/status/client.py (StatusClientService): same
7284         * buildbot/status/words.py: move to new Services, add support to
7285         connect to multiple networks, add reload support, allow nickname
7286         to be configured on a per-network basis
7288 2003-09-20  Brian Warner  <warner@lothar.com>
7290         * docs/examples/twisted_master.py (twisted_app): use python2.3 for
7291         the freebsd builder, now that the machine has been upgraded and no
7292         longer has python2.2
7294         * setup.py (version): bump to 0.3.5+ while between releases
7296 2003-09-19  Brian Warner  <warner@lothar.com>
7298         * setup.py (version): Releasing buildbot-0.3.5
7300 2003-09-19  Brian Warner  <warner@lothar.com>
7302         * NEWS: add post-0.3.4 notes
7304         * README (REQUIREMENTS): note twisted-1.0.7 requirement
7306         * MANIFEST.in: add contrib/*
7308         * docs/examples/twisted_master.py (twisted_app): all build slaves must
7309         use a remote root now: cvs.twistedmatrix.com
7311         * buildbot/changes/freshcvs.py (FreshCVSNotifiee.connect): update
7312         to newcred
7313         (FreshCVSNotifieeOldcred): but retain a class that uses oldcred for
7314         compatibility with old servers
7315         (FreshCVSSource.start): and provide a way to use it
7316         (FreshCVSNotifiee.disconnect): handle unconnected notifiee
7318         * docs/examples/twisted_master.py (twisted_app): update to new
7319         makeApp interface.
7320         (twisted_app): listen on new ~buildbot socket
7321         (twisted_app): Twisted CVS has moved to cvs.twistedmatrix.com
7323         * buildbot/process/process_twisted.py: Use 'copydir' on CVS steps
7324         to reduce cvs bandwidth (update instead of full checkout)
7326 2003-09-11  Brian Warner  <warner@lothar.com>
7328         * contrib/fakechange.py: demo how to connect to the changemaster
7329         port. You can use this technique to submit changes to the
7330         buildmaster from source control systems that offer a hook to run a
7331         script when changes are committed.
7333         * contrib/debugclient.py: tool to connect to the debug port. You
7334         can use it to force builds, submit fake changes, and wiggle the
7335         builder state
7337         * buildbot/master.py: the Big NewCred Reorganization. Use a single
7338         'Dispatcher' realm to handle all the different kinds of
7339         connections and Perspectives: buildslaves, the changemaster port,
7340         the debug port, and the status client port. NewCredPerspectives
7341         now have .attached/.detached methods called with the remote 'mind'
7342         reference, much like old perspectives did. All the pb.Services
7343         turned into ordinary app.ApplicationServices .
7344         (DebugService): went away, DebugPerspectives are now created
7345         directly by the Dispatcher.
7346         (makeApp): changed interface a little bit
7348         * buildbot/changes/changes.py: newcred
7349         * buildbot/status/client.py: newcred
7351         * buildbot/clients/base.py: newcred client side changes
7352         * buildbot/bot.py: ditto
7354         * docs/examples/glib_master.py: handle new makeApp() interface
7355         * docs/examples/twisted_master.py: ditto
7357         * buildbot/pbutil.py (NewCredPerspective): add a helper class to
7358         base newcred Perspectives on. This should go away once Twisted
7359         itself provides something sensible.
7362 2003-09-11  Christopher Armstrong  <radix@twistedmatrix.com>
7364         * contrib/svn_buildbot.py: A program that you can call from your
7365         SVNREPO/hooks/post-commit file that will notify a BuildBot master
7366         when a change in an SVN repository has happened. See the top of
7367         the file for some minimal usage info.
7369 2003-09-10  Christopher Armstrong  <radix@twistedmatrix.com>
7371         * buildbot/slavecommand.py (ArglistCommand): Add new
7372         ArglistCommand that takes an argument list rather than a string as
7373         a parameter. Using a st.split() for argv is very bad.
7375         * buildbot/slavecommand.py (SVNFetch): Now has the ability to
7376         update to a particular revision rather than always checking out
7377         (still not very smart about it, there may be cases where the
7378         checkout becomes inconsistent).
7380 2003-09-10  Christopher Armstrong  <radix@twistedmatrix.com>
7382         * buildbot/{bot.py,slavecommand.py,process/step.py}: Rudimentary
7383         SVN fetch support. It can checkout (not update!) a specified
7384         revision from a specified repository to a specified directory.
7386         * buildbot/status/progress.py (Expectations.update): Fix an
7387         obvious bug (apparently created by the change described in the
7388         previous ChangeLog message) by moving a check to *after* the
7389         variable it checks is defined.
7392 2003-09-08  Brian Warner  <warner@lothar.com>
7394         * buildbot/status/progress.py (Expectations.update): hack to catch
7395         an exception TTimo sees: sometimes the update() method seems to
7396         get called before the step has actually finished, so the .stopTime
7397         is not set, so no totalTime() is available and we average None
7398         with the previous value. Catch this and just don't update the
7399         metrics, and emit a log message.
7401 2003-08-24  Brian Warner  <warner@lothar.com>
7403         * buildbot/process/base.py (BasicBuildFactory): accept 'cvsCopy'
7404         parameter to set copydir='original' in CVS commands.
7406         * buildbot/process/step.py (CVS): accept 'copydir' parameter.
7408         * buildbot/slavecommand.py (CVSCommand): add 'copydir' parameter,
7409         which tells the command to maintain a separate original-source CVS
7410         workspace. For each build, this workspace will be updated, then
7411         the tree copied into a new workdir. This reduces CVS bandwidth
7412         (from a full checkout to a mere update) while doubling the local
7413         disk usage (to keep two copies of the tree).
7415 2003-08-21  Brian Warner  <warner@lothar.com>
7417         * buildbot/status/event.py (Logfile.addEntry): if the master web
7418         server dies while we're serving a page, request.write raises
7419         pb.DeadReferenceError . Catch this and treat it like a
7420         notifyFinish event by dropping the request.
7422 2003-08-18  Brian Warner  <warner@lothar.com>
7424         * buildbot/status/words.py (IrcStatusBot.command_FORCE): complain
7425         (instead of blowing up) if a force-build command is given without
7426         a reason field
7428         * buildbot/changes/changes.py (ChangeMaster.getChangeNumbered):
7429         don't blow up if there aren't yet any Changes in the list
7431 2003-08-02  Brian Warner  <warner@lothar.com>
7433         * buildbot/bot.py (updateApplication): don't set the .tap name,
7434         since we shouldn't assume we own the whole .tap file
7436         * buildbot/bb_tap.py (updateApplication): clean up code, detect
7437         'mktap buildbot' (without a subcommand) better
7439 2003-07-29  Brian Warner  <warner@lothar.com>
7441         * buildbot/status/words.py
7442         (IrcStatusFactory.clientConnectionLost): when we lose the
7443         connection to the IRC server, schedule a reconnection attempt.
7445         * buildbot/slavecommand.py (CVSCommand.doClobber): on non-posix,
7446         use shutil.rmtree instead of forking off an "rm -rf" command.
7447         rmtree may take a while and will block until it finishes, so we
7448         use "rm -rf" if available.
7450         * docs/examples/twisted_master.py: turn off kqreactor, it hangs
7451         freebsd buildslave badly
7453         * setup.py (version): bump to 0.3.4+ while between releases
7455 2003-07-28  Brian Warner  <warner@lothar.com>
7457         * setup.py (version): Releasing buildbot-0.3.4
7459 2003-07-28  Brian Warner  <warner@lothar.com>
7461         * NEWS: update in preparation for release
7463         * buildbot/slavecommand.py (ShellCommand.doTimeout): use
7464         process.signalProcess instead of os.kill, to improve w32
7465         portability
7467         * docs/examples/twisted_master.py (twisted_app): turn off
7468         win32eventreactor: the tests hang the buildslave badly
7470         * buildbot/process/base.py (Build.buildFinished): update ETA even on
7471         failed builds, since usually the failures are consistent
7473         * buildbot/process/process_twisted.py (TwistedReactorsBuildFactory):
7474         add compileOpts/compileOpts2 to reactors build
7476         * docs/examples/twisted_master.py (twisted_app): add "-c mingw32"
7477         (twisted_app): use both default and win32eventreactor on w32 build.
7478         Use both default and kqreactor on freebsd build.
7480         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
7481         add compileOpts2, which is put after the build_ext argument. w32
7482         needs "-c mingw32" here.
7484         * buildbot/status/html.py (StatusResourceBuilder.getChild): don't
7485         touch .acqpath, it goes away in recent Twisted releases
7487         * docs/examples/twisted_master.py (twisted_app): use "python" for
7488         the w32 buildslave, not "python2.2"
7490         * buildbot/bot.py (Bot.remote_getSlaveInfo): only look in info/ if
7491         the directory exists.. should hush an exception under w32
7493         * buildbot/slavecommand.py (ShellCommandPP.processEnded): use
7494         ProcessTerminated -provided values for signal and exitCode rather
7495         than parsing the unix status code directly. This should remove one
7496         more roadblock for a w32-hosted buildslave.
7498         * test/test_mailparse.py: add test cases for Syncmail parser
7500         * Buildbot/changes/freshcvsmail.py: remove leftover code, leave a
7501         temporary compatibility import. Note! Start importing
7502         FCMaildirSource from changes.mail instead of changes.freshcvsmail
7504         * buildbot/changes/mail.py (parseSyncmail): finish Syncmail parser
7506 2003-07-27  Brian Warner  <warner@lothar.com>
7508         * NEWS: started adding new features
7510         * buildbot/changes/mail.py: start work on Syncmail parser, move
7511         mail sources into their own file
7513         * buildbot/changes/freshcvs.py (FreshCVSNotifiee): mark the class
7514         as implementing IChangeSource
7515         * buildbot/changes/freshcvsmail.py (FCMaildirSource): ditto
7517         * buildbot/interfaces.py: define the IChangeSource interface
7519 2003-07-26  Brian Warner  <warner@lothar.com>
7521         * buildbot/master.py (makeApp): docstring (thanks to Kevin Turner)
7523 2003-06-25  Brian Warner  <warner@lothar.com>
7525         * buildbot/status/words.py (IrcStatusBot.emit_last): round off
7526         seconds display
7528 2003-06-17  Brian Warner  <warner@lothar.com>
7530         * buildbot/status/words.py: clean up method usage to avoid error
7531         in silly IRC command
7532         (IrcStatusBot.emit_status): round off seconds display
7534         * buildbot/process/base.py (Build): delete the timer when saving
7535         to the .tap file, and restore it (if it should still be running)
7536         upon restore. This should fix the "next build in -34 seconds"
7537         messages that result when the master is restarted while builds are
7538         sitting in the .waiting slot. If the time for the build has
7539         already passed, start it very soon (in 1 second).
7541         * buildbot/status/words.py: more silly commands
7543         * README (REQUIREMENTS): add URLs to all required software
7545         * buildbot/status/words.py ('last'): mention results of, and time
7546         since last build
7548 2003-05-28  Brian Warner  <warner@lothar.com>
7550         * buildbot/status/words.py: add 'last' command
7551         (IrcStatusBot.emit_status): add current-small text to 'status' output
7553         * docs/examples/twisted_master.py (twisted_app): turn on IRC bot
7554         (twisted_app): remove spaces from OS-X builder name
7556         * buildbot/master.py (makeApp): add knob to turn on IRC bot
7557         * buildbot/status/words.py: IRC bot should actually be useful now
7559 2003-05-23  Brian Warner  <warner@lothar.com>
7561         * buildbot/bot.py (Bot.remote_getSlaveInfo): add routines to get
7562         "slave information" from $(slavedir)/info/* . These files are
7563         maintained by the slave administrator, and describe the
7564         machine/environment that is hosting the slave. Information from
7565         them is put into the "Builder" HTML page. Still need to establish
7566         a set of well-known filenames and meanings for this data: at the
7567         moment, *all* info/* files are sent to the master, but only
7568         'admin' and 'host' are used on that end.
7569         * buildbot/status/html.py (StatusResourceBuilder.body): ditto
7570         * buildbot/process/base.py (Builder.setRemoteInfo):  ditto
7571         * buildbot/master.py (BotPerspective.got_info):  ditto
7573 2003-05-22  Brian Warner  <warner@lothar.com>
7575         * setup.py (version): bump version to 0.3.3+ while between releases
7577 2003-05-21  Brian Warner  <warner@lothar.com>
7579         * setup.py: Releasing buildbot-0.3.3
7581 2003-05-21  Brian Warner  <warner@lothar.com>
7583         * NEWS: 0.3.3 news items
7585         * README: describe --keepalive and life behind a NAT box
7587         * buildbot/bot.py (Bot.connected): implement application-level
7588         keepalives to deal with NAT timeouts, turn them on with
7589         --keepalive option or when SO_KEEPALIVE doesn't work.
7591         * buildbot/master.py (BotPerspective): accept keepalives silently
7593         * buildbot/process/base.py (Build.buildException): CopiedFailures
7594         don't carry as much information as local ones, so don't try to
7595         create a big HTMLized version of them.
7597         * buildbot/process/step.py (InternalShellCommand.stepFailed): close
7598         log file when step fails due to an exception, such as when the slave
7599         becomes unreachable
7601         * buildbot/process/step_twisted.py (RunUnitTests): use trial's new
7602         --testmodule argument instead of grepping for test-case-name tags
7603         ourselves. Remove FindUnitTests code.
7604         * buildbot/slavecommand.py, buildbot/bot.py: remove old code
7606         * MANIFEST.in: Add docs/examples, files under test/ . Oops!
7608 2003-05-16  Brian Warner  <warner@lothar.com>
7610         * buildbot/process/base.py (BasicBuildFactory): add 'configureEnv'
7611         argument to allow things like CFLAGS=-O0 to be passed without relying
7612         upon /bin/sh processing on the slave.
7614         * buildbot/process/step.py (InternalShellCommand.start): send
7615         'env' dict to slave
7616         * buildbot/slavecommand.py (ShellCommand.start): create argv with
7617         'split' instead of letting /bin/sh do it. This should also remove
7618         the need for /bin/sh on the buildslave, making it more likely to
7619         work with win32.
7621         * buildbot/status/html.py: html-escape text in blamelist.
7622         Add "force build" button to the Builder page.
7624         * buildbot/process/step_twisted.py (countFailedTests): look at
7625         last 1000 characters for status line, as import errors can put it
7626         before the -200 point.
7628 2003-05-15  Brian Warner  <warner@lothar.com>
7630         * docs/examples/twisted_master.py: use clobber=0 for remote builds
7632         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
7633         make 'clobber' a parameter, so it is possible to have builds which
7634         do full tests but do a cvs update instead of hammering the CVS
7635         server with a full checkout each build
7637         * buildbot/process/step.py (InternalShellCommand): bump default
7638         timeout to 20 minutes
7640         * buildbot/bot.py (Bot.debug_forceBuild): utility method to ask
7641         the master to trigger a build. Run it via manhole.
7643         * buildbot/master.py (BotPerspective.perspective_forceBuild):
7644         allow slaves to trigger any build that they host, to make life
7645         easier for slave admins who are testing out new build processes
7647         * buildbot/process/process_twisted.py (TwistedReactorsBuildFactory):
7648         don't flunk cReactor or qtreactor on failure, since they fail alot
7649         these days. Do warnOnFailure instead.
7651         * buildbot/process/base.py: change Builder.buildable from a list
7652         into a single slot. When we don't have a slave, new builds (once
7653         they make it past the timeout) are now merged into an existing
7654         buildable one instead of being queued. With this change, a slave
7655         which has been away for a while doesn't get pounded with all the
7656         builds it missed, but instead just does a single build.
7658 2003-05-07  Brian Warner  <warner@lothar.com>
7660         * setup.py (version): bump version to 0.3.2+ while between releases
7662 2003-05-07  Brian Warner  <warner@lothar.com>
7664         * setup.py: Releasing buildbot-0.3.2
7666 2003-05-07  Brian Warner  <warner@lothar.com>
7668         * setup.py: fix major packaging error: include subdirectories!
7669         
7670         * NEWS: add changes since last release
7672         * README (REQUIREMENTS): update twisted/python dependencies
7674         * buildbot/status/builder.py (Builder.startBuild): change
7675         BuildProcess API: now they should call startBuild/finishBuild
7676         instead of pushing firstEvent / setLastBuildStatus. Moving towards
7677         keeping a list of builds in the statusbag, to support other kinds of
7678         status delivery.
7679         (Builder.addClient): send current-activity-small to new clients
7680         * buildbot/process/base.py (Build.startBuild, .buildFinished): use
7681         new API
7683         * buildbot/status/client.py: drop RemoteReferences at shutdown
7685         * buildbot/status/event.py (Event.stoppedObserving): oops, add it
7687         * buildbot/status/progress.py (BuildProgress.remote_subscribe):
7688         more debug messages for remote status client
7690         * buildbot/process/step.py (InternalBuildStep.stepComplete)
7691         (.stepFailed): only fire the Deferred once, even if both
7692         stepComplete and stepFailed are called. I think this can happen if
7693         an exception occurs at a weird time.
7695         * buildbot/status/words.py: work-in-progress: IRC status delivery
7697 2003-05-05  Brian Warner  <warner@lothar.com>
7699         * docs/examples/twisted_master.py (twisted_app): hush internal
7700         python2.3 distutils deprecation warnings
7701         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
7702         add compileOpts= argument which inserts extra args before the
7703         "setup.py build_ext" command. This can be used to give -Wignore
7704         warnings, to hush some internal python-2.3 deprecation messages.
7706         * buildbot/process/step_twisted.py (RunUnitTests): parameterize
7707         the ['twisted.test'] default test case to make it easier to change
7708         in subclasses
7710         * buildbot/clients/base.py: switch to pb.Cacheable-style Events
7711         * buildbot/clients/gtkPanes.py: ditto
7713         * buildbot/process/step_twisted.py (RunUnitTests): use randomly=
7714         arg to collapse RunUnitTestsRandomly into RunUnitTests
7715         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
7716         use RunUnitTests(randomly=1) instead of RunUnitTestsRandomly
7718         * buildbot/status/html.py (StatusResource): shuffle Resources
7719         around to fix a bug: both 'http://foo:8080' and 'http://foo:8080/'
7720         would serve the waterfall display, but the internal links were
7721         only valid on the trailing-slash version. The correct behavior is
7722         for the non-slashed one to serve a Redirect to the slashed one.
7723         This only shows up when the buildbot page is hanging off another
7724         server, like a Twisted-Web distributed server.
7726         * buildbot/status/event.py (Event, RemoteEvent): make Events
7727         pb.Cacheable, with RemoteEvent as the cached version. This removes
7728         a lot of explicit send-an-update code.
7729         * buildbot/status/builder.py (Builder): remove send-update code
7730         * buildbot/status/client.py (ClientBuilder): remove send-update
7731         code, and log errors that occur during callRemote (mostly to catch
7732         InsecureJelly exceptions)
7734         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
7735         run Lore with the same python used in the rest of the build
7737         * buildbot/process/step_twisted2.py (RunUnitTestsJelly): moved
7739         * buildbot/process/step_twisted.py (HLint): accept 'python'
7740         argument. Catch rc!=0 and mark the step as failed. This marks the
7741         build orange ("has warnings").
7742         (RunUnitTestsJelly): move out to step_twisted2.py
7744         * buildbot/util.py (ignoreStaleRefs): add utility function
7746         * buildbot/master.py (DebugPerspective.perspective_setCurrentState):
7747         don't fake ETA object, it's too hard to get right
7749 2003-05-02  Brian Warner  <warner@lothar.com>
7751         * docs/examples/twisted_master.py (twisted_app): add FreeBSD builder
7753 2003-05-01  Brian Warner  <warner@lothar.com>
7755         * buildbot/status/html.py (StatusResource.body): oops, I was
7756         missing a <tr>, causing the waterfall page to be misrendered in
7757         everything except Galeon.
7759 2003-04-29  Brian Warner  <warner@lothar.com>
7761         * docs/examples/twisted_master.py: make debuild use python-2.2
7762         explicitly, now that Twisted stopped supporting 2.1
7764         * buildbot/process/step_twisted.py (BuildDebs.finishStatus): oops,
7765         handle tuple results too. I keep forgetting this, which suggests
7766         it needs to be rethought.
7768         * setup.py (setup): bump version to 0.3.1+ while between releases
7769         
7770 2003-04-29  Brian Warner  <warner@lothar.com>
7772         * setup.py: Releasing buildbot-0.3.1
7774 2003-04-29  Brian Warner  <warner@lothar.com>
7776         * README (SUPPORT): add plea to send questions to the mailing list
7778         * NEWS, MANIFEST.in: add description of recent changes
7780         * docs/examples/twisted_master.py: add the code used to create the
7781         Twisted buildmaster, with passwords and such removed out to a
7782         separate file.
7784         * buildbot/changes/changes.py, freshcvs.py, freshcvsmail.py: split
7785         out cvstoys-using bits from generic changes.py, to allow non-cvstoys
7786         buildmasters to not require CVSToys be installed.
7787         * README, docs/examples/glib_master: update to match the change
7789         * buildbot/clients/base.py, buildbot/bot.py,
7790         buildbot/changes/changes.py, buildbot/pbutil.py: copy
7791         ReconnectingPB from CVSToys distribution to remove CVSToys
7792         dependency for build slaves and status clients. Buildmasters which
7793         use FreshCVSSources still require cvstoys be installed, of course.
7795 2003-04-25  Brian Warner  <warner@lothar.com>
7797         * buildbot/process/process_twisted.py (FullTwistedBuildFactory): add
7798         runTestsRandomly arg to turn on trial -z
7800         * buildbot/process/step_twisted.py (TwistedJellyTestResults):
7801         experimental code to use trial's machine-parseable output to get
7802         more detailed test results. Still has some major issues.
7803         (RunUnitTestsRandomly): subclass to add "-z 0" option, runs tests
7804         in random sequence
7806         * buildbot/status/builder.py (Builder.setCurrentBuild):
7807         anticipating moving build history into statusbag, not used yet
7809         * buildbot/status/tests.py: code to centralize test results,
7810         doesn't work quite yet
7812         * buildbot/status/event.py (Event): use hasattr("setName") instead
7813         of isinstance for now.. need better long-term solution
7815         * buildbot/status/html.py: Remove old imports
7817 2003-04-24  Brian Warner  <warner@lothar.com>
7819         * buildbot/process/process_twisted.py (TwistedBuild.isFileImportant):
7820         ignore changes under doc/fun/ and sandbox/
7822         * buildbot/process/step_twisted.py: update pushEvent and friends.
7824         * buildbot/status/html.py (Box.td): replace event.buildername with
7825         event.parent.getSwappableName(). Needs more thought.
7827         * buildbot/status/builder.py (Builder): Replace pushEvent and
7828         getLastEvent with {set|update|addFileTo|finish}CurrentActivity.
7829         Tell events they are being pruned with event.delete().
7831         * buildbot/process/base.py (Build): Remove Builder status-handling
7832         methods. s/pushEvent/setCurrentActivity/.
7834         * buildbot/process/step.py (BuildStep): clean up status delivery.
7835         Gouse builder.statusbag methods instead of intermediate builder
7836         methods. s/updateLastEvent/updateCurrentActivity/.
7837         s/finalizeLastEvent/finishCurrentActivity/. Use
7838         addFileToCurrentActivity for summaryFunction.
7840         * buildbot/status/event.py (Logfile): put data in a Swappable when
7841         .finish is called.
7842         (Event): add more setter methods. Remove .buildername, use .parent
7843         and getSwappableName instead (needs more thought).
7845         * buildbot/util.py (Swappable):
7846         * test/test_swap.py: don't bother setting filename at __init__
7847         time, do it later. Change setFilename args to take parent first,
7848         since it provides the most significant part of the filename.
7850 2003-04-23  Brian Warner  <warner@lothar.com>
7852         * buildbot/status/event.py (Logfile.addEntry): append to previous
7853         entry, if possible
7855         * buildbot/process/step.py (BuildStep.finalizeLastEvent):
7856         anticipating Swappable
7857         (InternalShellCommand.remoteUpdate): split out various log-adding
7858         methods so subclasses can snarf stdout separately
7860         * buildbot/process/base.py (Builder.finalizeLastEvent): more code
7861         in anticipation of Swappable build logs
7862         (Builder.testsFinished): anticipating TestResults, still disabled
7864         * buildbot/status/builder.py (Builder.pruneEvents): only keep the
7865         last 100 events
7867         * buildbot/status/event.py (Logfile): add (disabled) support for
7868         Swappable, not ready for use yet
7870         * buildbot/util.py (Swappable): object which is swapped out to
7871         disk after some period of no use.
7872         * test/test_swap.py: test buildbot.utils.Swappable
7874 2003-04-14  Brian Warner  <warner@lothar.com>
7876         * buildbot/process/base.py (Builder.doPeriodicBuild): add simple
7877         periodic-build timer. Set the .periodicBuildTime on a builder
7878         instance to some number of seconds to activate it.
7880         * buildbot/master.py (BotMaster.forceBuild): change forceBuild API
7882         * buildbot/process/step.py (ShellCommand.finishStatus): use log.msg in
7883         a way that survives result tuples
7885 2003-04-12  Brian Warner  <warner@lothar.com>
7887         * buildbot/process/step.py (ShellCommand.finishStatusSummary):
7888         return a dict instead of a tuple: allow summarizers to provide
7889         multiple summaries if they want
7890         * buildbot/process/step_twisted.py (trialTextSummarizer): return dict
7891         (debuildSummarizer): summarize lintian warnings/errors
7893 2003-04-10  Brian Warner  <warner@lothar.com>
7895         * README (REQUIREMENTS): slave requires twisted-1.0.4a2
7897 2003-04-09  Brian Warner  <warner@lothar.com>
7899         * buildbot/process/step_twisted.py (trialTextSummarizer): Don't create
7900         empty summaries: happens when the tests fail so hard they don't emit
7901         a parseable summary line.
7903         * buildbot/process/step.py (ShellCommand.finishStatusSummary):
7904         Allow summaryFunction to return None to indicate no summary should
7905         be added.
7907         * buildbot/status/event.py (Logfile.removeHtmlWatcher): avoid
7908         writing to stale HTTP requests: notice when they disconnect and
7909         remove the request from the list. Also add CacheToFile from
7910         moshez, will be used later.
7912 2003-04-08  Brian Warner  <warner@lothar.com>
7914         * buildbot/process/step_twisted.py (ProcessDocs.finished): warnings
7915         should be an int, not a list of strings
7917         * buildbot/changes/changes.py (FreshCVSSource.stop): don't disconnect
7918         if we weren't actually connected
7920         * buildbot/process/step_twisted.py (trialTextSummarizer): function
7921         to show the tail end of the trial text output
7923         * buildbot/process/step.py (ShellCommand.finishStatusSummary): add
7924         hook to summarize the results of a ShellCommand
7926 2003-04-07  Brian Warner  <warner@lothar.com>
7928         * buildbot/process/step_twisted.py (RunUnitTests): consolidate all
7929         twisted test suite code into a single class.
7930         * buildbot/process/process_twisted.py: same
7932 2003-04-04  Brian Warner  <warner@lothar.com>
7934         * setup.py, MANIFEST.in: hack to make sure plugins.tml gets installed
7936         * README (SLAVE): document use of mktap to create slave .tap file
7937         (REQUIREMENTS): describe dependencies
7939         * buildbot/bb_tap.py, buildbot/plugins.tml:
7940         * buildbot/bot.py (updateApplication): Add mktap support for creating
7941         buildslave .tap files
7943 2003-03-28  Brian Warner  <warner@lothar.com>
7945         * buildbot/process/step.py (InternalShellCommand.finished): handle
7946         new tuple result values (fix embarrasing bug that appeared during
7947         PyCon demo)
7949 2003-03-27  Brian Warner  <warner@lothar.com>
7951         * docs/examples/glib_master.py, README: add sample buildmaster.tap
7952         -making program
7954 2003-03-25  Brian Warner  <warner@lothar.com>
7956         * buildbot/process/step.py (CVS, ShellCommand): add reason for failure
7957         to overall build status
7958         * buildbot/clients/base.py (Builder): improve event printing
7959         * buildbot/process/base.py (BasicBuildFactory): use specific steps
7960         instead of generic ShellCommand
7961         (Build): Add .stopBuild, use it when slave is detached
7963         * buildbot/process/step.py (Configure,Test): give the steps their
7964         own names and status strings
7966         * buildbot/status/html.py (StatusResource): add "show" argument,
7967         lets you limit the set of Builders being displayed.
7969 2003-03-20  Brian Warner  <warner@lothar.com>
7971         * buildbot/process/basic.py: removed
7973 2003-03-19  Brian Warner  <warner@lothar.com>
7975         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
7976         turn off process-docs by default
7978         * buildbot/process/base.py (Builder.getBuildNumbered): Don't blow up
7979         when displaying build information without anything in allBuilds[]
7981         * buildbot/bot.py (makeApp): really take password from sys.argv
7983 2003-03-18  Brian Warner  <warner@lothar.com>
7985         * buildbot/bot.py (buildApp): take password from sys.argv
7987         * README: replace with more useful text
7989         * setup.py: add a real one
7990         * MANIFEST.in, .cvsignore: more distutils packaging stuff
7991         
7992         * docs/PyCon-2003/: added sources for PyCon paper.
7994         * buildbot/process/base.py, step.py: revamp. BuildProcess is gone,
7995         now Build objects control the process and Builder only handles
7996         slave stuff and distribution of changes/status. A new BuildFactory
7997         class creates Build objects on demand.
7999         Created ConfigurableBuild which takes a list of steps to run. This
8000         makes it a lot easier to set up a new kind of build and moves us
8001         closer to being able to configure a build from a web page.
8003         * buildbot/process/step_twisted.py, process_twisted.py: move to
8004         new model. A lot of code went away.
8005         
8006         * buildbot/status/progress.py (BuildProgress.newProgress): Don't
8007         send lots of empty progress messages to the client.
8009         * buildbot/master.py (makeApp): enforce builder-name uniqueness
8011 2003-02-20  Brian Warner  <warner@lothar.com>
8013         * buildbot/process/step_twisted.py (BuildDebs): count lintian hits
8015         * buildbot/slavecommand.py (ShellCommand): back to usePTY=0. The
8016         Twisted bug that prevented non-pty processes from working just got
8017         fixed, and the bug that leaks ptys is still being investigated.
8019         * buildbot/process/step.py (CVS): send timeout arg to slave
8021         * buildbot/clients/gtkPanes.py: add connection-status row, handle
8022         builders coming and going
8023         * buildbot/clients/base.py: clean up protocol, move to ReconnectingPB
8024         from CVSToys, handle lost-buildmaster
8026         * buildbot/status/client.py (StatusClientService.removeBuilder):
8027         Clean up status client protocol: send builders (with references)
8028         as they are created, rather than sending a list and requiring the
8029         client to figure out which ones are new.
8030         * buildbot/master.py (BotMaster.forceBuild): Log debugclient
8031         attempts to force a build on an unknown builder
8033 2003-02-19  Brian Warner  <warner@lothar.com>
8035         * buildbot/slavecommand.py (CVSCommand): add timeout to sub-commands
8036         * buildbot/slavecommand.py (ShellCommand.start): stop using PTYs until
8037         Twisted stops leaking them.
8038         * buildbot/clients/gtkPanes.py (CompactBuilder): forget ETA when the
8039         builder goes to an idle state.
8041         * buildbot/slavecommand.py (ShellCommand.start): bring back PTYs until
8042         I figure out why CVS commands hang without them, and/or I fix the
8043         hung-command timeout
8045 2003-02-16  Brian Warner  <warner@lothar.com>
8047         * buildbot/process/step_twisted.py: bin/hlint went away, replace
8048         with 'bin/lore --output lint'. Use 'bin/trial -o' to remove
8049         ansi-color markup. Remove GenerateLore step. Count hlint warnings in
8050         GenerateDocs now that they are prefixed with WARNING:.
8052         * buildbot/status/html.py (StatusResource.body): Fix Builder link,
8053         use manual href target instead of request.childLink
8055         * buildbot/clients/gtkPanes.py: Fix progress countdown: update the
8056         display every second, but update the ETA every 5 seconds (or
8057         whenever) as remote_progress messages arrive.
8060 2003-02-12  Brian Warner  <warner@lothar.com>
8062         * *: import current sources from home CVS repository
8063         
8065 # Local Variables:
8066 # add-log-time-format: add-log-iso8601-time-string
8067 # End: