web.OneLineMixin: add build's getText to each line
[buildbot.git] / ChangeLog
blobd0e3faf014f72f63f41ed3ad0fc51b77ae222064
1 2007-09-30  Brian Warner  <warner@lothar.com>
3         * buildbot/status/web/base.py (OneLineMixin.make_line): add the
4         build's text to the end of the line, without a CSS class so it
5         remains uncolored.
7         * buildbot/interfaces.py (IStatus.generateFinishedBuilds): add a
8         'max_search=' argument, to limit the number of builds that are
9         examined while trying to find ones that match the other criteria.
10         This helps to limit the work we do, since otherwise we might have
11         to trawl through all history.
12         (IBuilderStatus.generateFinishedBuilds): same
13         * buildbot/status/builder.py (Status.generateFinishedBuilds): same
14         (BuilderStatus.generateFinishedBuilds): same
16         * buildbot/status/web/base.py (OneLineMixin.make_line): stringify
17         our got_revision before checking its length: SVN (at least) still
18         reports numeric values for this.
19         * buildbot/status/web/build.py (StatusResourceBuild.body): same
20         * buildbot/status/web/xmlrpc.py
21         (XMLRPCServer.xmlrpc_getAllBuildsInInterval): same, also stop
22         serving a completely fake revision
24         * buildbot/scripts/runner.py (Maker.check_master_cfg): prepend
25         basedir to sys.path, to mimic what a real buildmaster would have
26         access to, since it is common for master.cfg to import helper
27         classes from .py files in the buildmaster directory, and we want
28         config-file checking to accomodate this.
30         * buildbot/status/web/base.py (map_branches): when referring to
31         branches through WebStatus (i.e. by appending ?branch=FOO query
32         arguments to the URL), make "trunk" mean trunk, by mapping it to
33         None before passing it to generateFinishedBuilds() and the like.
34         * buildbot/status/web/baseweb.py (OneLinePerBuild.body): same
35         (OneBoxPerBuilder.body): same, also improve display of branches in
36         the HTML a bit
37         * buildbot/status/web/waterfall.py (BuildTopBox.getBox): same
38         (WaterfallStatusResource.buildGrid): same. Note that this filters
39         Changes as well as Builds.
40         * docs/buildbot.texinfo (Buildbot Web Resources): remove the
41         caveat about trunk branches, now that it's fixed
43         * buildbot/status/web/base.py (OneLineMixin): refactor, move this
44         from builder.py, use it on the Builder page too
46         * buildbot/status/web/builder.py (StatusResourceBuilder): same
47         * buildbot/status/web/baseweb.py (OneLinePerBuild): display branch
48         names, add some CSS classes
49         * buildbot/status/web/classic.css (td.box): new class, for
50         OneBoxPerBuild
52         * docs/buildbot.texinfo (WebStatus): update docs
54         * buildbot/slave/commands.py (SVN.parseGotRevision._parse): remove
55         the trailing "M" indicator that tells us this is a modified file.
56         This should help with mode="update" builds that modify files
57         in-place. Thanks to "Oz" (chris at santacruzgames.com) for the
58         patch.
60         * buildbot/scripts/runner.py (upgradeMaster): improvements: write
61         new copies of files (to .new) when those files already exist,
62         check the master.cfg file for errors (and give DeprecationWarnings
63         a chance to be displayed).
64         * buildbot/test/test_runner.py: add more tests
65         * docs/buildbot.texinfo (Upgrading an Existing Buildmaster): docs
67 2007-09-29  Brian Warner  <warner@lothar.com>
69         * buildbot/steps/source.py (Mercurial.computeSourceRevision): take
70         the revision id from the last change in our list, since that's the
71         best we can do without knowing the full ancestry graph. Closes #103.
73         * buildbot/scripts/sample.cfg: use buildstep instances in
74         f.addStep, to demonstrate the (correct) modern usage.
75         * docs/examples/hello.cfg: bring this up to date. Closes #79.
76         * docs/examples/twisted_master.cfg: add a big warning about how
77         old this is
78         * docs/examples/glib_master.cfg: delete this one entirely, it is
79         ancient and not a very useful example anyways
81         * buildbot/status/web/base.py (HtmlResource.render): keep track of
82         HTTPChannels, so we can shut them down at reconfig time (when the
83         WebStatus goes away). Closes #102.
84         * buildbot/status/web/baseweb.py (WebStatus.__init__): same
85         (WebStatus.registerChannel): same
86         (WebStatus.stopService): do .loseConnection() here
88         * buildbot/test/test_webparts.py (Webparts.testPages): reload the
89         WebStatus, make sure all pages are still retrievable. I thought
90         this would exercise a bug, but it turns out that it was firefox
91         caching connections (and continuing to talk to the old WebStatus
92         even though I'd loaded a new one).
93         * buildbot/status/web/baseweb.py (WebStatus): add some comments
94         (WebStatus.__repr__): include id() in the repr
96         * buildbot/status/tinderbox.py (TinderboxMailNotifier): allow
97         this to specify an errorparser. From Ted Mielczarek and the
98         mozilla crew. Closes #94.
100         * buildbot/changes/bonsaipoller.py (BonsaiParser): "Make
101         bonsaipoller ignore funkyness in xml output for empy log
102         messages", from Axel Hecht. Closes #90.
103         * buildbot/test/test_bonsaipoller.py
104         (TestBonsaiPoller.testMergeEmptyLogMsg): same
106         * buildbot/status/tinderbox.py (TinderboxMailNotifier.buildStarted):
107         respect 'builders' arg, from Ben Hearsum. Closes #89.
109         * buildbot/scripts/runner.py (stop): increase the timeout from 5
110         seconds to 10, to give heavily loaded machines a better chance to
111         finish shutting down. Addresses (partially) #68.
112         * buildbot/scripts/logwatcher.py (LogWatcher.TIMEOUT_DELAY): same,
113         on startup
114         * buildbot/scripts/reconfig.py (Reconfigurator.run): same
115         * buildbot/scripts/startup.py (Follower._failure): update message
117         * buildbot/changes/bonsaipoller.py: apply changes from the Mozilla
118         team, to fix some bugs and avoid the use of blocking urlopen().
119         closes #61.
120         * buildbot/test/test_bonsaipoller.py: same
122 2007-09-28  Brian Warner  <warner@lothar.com>
124         * buildbot/buildslave.py (BuildSlave): add notify_on_missing=
125         argument, to send email about buildslaves which are disconnected
126         for more than an hour. Closes #64.
127         * buildbot/test/test_slaves.py (BuildSlave.test_mail_on_missing):
128         test it
129         * docs/buildbot.texinfo (When Buildslaves Go Missing): document it
130         (MailNotifier): add docs for this too
133         * buildbot/status/web/baseweb.py (OneBoxPerBuilder): make this page
134         respect branch= queryargs, by restricting the builds displayed to
135         those matching the given branch names
136         * buildbot/status/web/waterfall.py (BuildTopBox): same
138         * buildbot/test/test_web.py (WaterfallSteps.test_urls.FakeRequest):
139         fix a test failure by adding .prepath to this fake object
141         * buildbot/status/web/*: big set of changes to WebStatus, cleaning
142         up generation of relative URLs. With luck, this should play with
143         reverse proxies much better now.
144         * buildbot/test/test_webparts.py: new test for most of the subpages
145         * buildbot/test/test_web.py (base_config): add enough of a config
146         to exercise more Waterfall code
148 2007-09-27  Brian Warner  <warner@lothar.com>
150         * buildbot/status/web/build.py (StatusResourceBuild.body): use a
151         relative URL to the buildbot welcome page, rather than
152         getBuildbotURL.
153         * buildbot/status/web/builder.py (StatusResourceBuilder.body): same
155         * buildbot/status/web/base.py (HtmlResource.title): change the
156         default title of all Buildbot-generated page to "Buildbot"
157         * buildbot/status/web/builder.py (StatusResourceBuilder.getTitle):
158         change the title to include the Builder name
159         * buildbot/status/web/build.py (StatusResourceBuild.getTitle):
160         same, and also show the build number
161         (StatusResourceBuild.rebuild): after using the 'Rebuild' button,
162         redirect the browser to the Builder page
164 2007-09-26  Brian Warner  <warner@lothar.com>
166         * buildbot/status/web/baseweb.py (OneBoxPerBuilder.body): fix URL
167         problem with the build links
169 2007-09-25  Brian Warner  <warner@lothar.com>
171         * buildbot/status/web/base.py (HtmlResource.render): fix addSlash
172         to emit relative URLs instead of using URLPath,
174         * docs/buildbot.texinfo (WebStatus): provide an example
176         * buildbot/status/web/baseweb.py (OneBoxPerBuilder): new status
177         page, shows a simple table with one row per Builder. Still pretty
178         ugly, but functional.
179         * buildbot/status/web/index.html: reference it
181         * buildbot/status/web/waterfall.py (Spacer): make this *not*
182         inherit from builder.Event, so that show_events=false doesn't hide
183         spacers, since that would make the waterfall weirdly compressed.
185         * buildbot/status/web/waterfall.py (HELP): put the View button in
186         its own section, so it doesn't get visually confused with the
187         reload-timer section
188         (WaterfallStatusResource.body): make the '[help]' links more
189         visually distinct from each other, and add a link to the Welcome
190         page
191         * buildbot/status/web/slaves.py (BuildSlavesResource): handle
192         unused buildslaves without exploding
194         * buildbot/status/web/waterfall.py
195         (WaterfallStatusResource.body.with_args): don't use req.URLPath,
196         it gives us absolute paths that break proxies
197         * buildbot/status/web/base.py (HtmlResource.path_to_root): fix
198         this, it was giving bad results when the Waterfall is behind a
199         reverse proxy.
201         * buildbot/scripts/runner.py (upgradeMaster): first phase of the
202         new 'upgrade-master' command, which will bring an old buildmaster
203         directory up-to-date. Right now the only thing it does is populate
204         public_html/ if it wasn't already there. Still to do: check the
205         other files, add documentation.
206         * buildbot/test/test_runner.py (Create.testUpgradeMaster): test it
207         (Create.failUnlessSameFiles): use sets.Set() for 2.3 compatibility
209 2007-08-13  Brian Warner  <warner@lothar.com>
211         * buildbot/changes/changes.py (Change.get_HTML_box): add a tooltip
212         that contains the checkin comments when you hover over the entry
213         in the 'changes' column of the waterfall. Thanks to Frederic Leroy
214         for the patch.
216         * buildbot/status/web/waterfall.py (WaterfallStatusResource): improve
217         'help' page linkage
219         * buildbot/status/web/about.py (AboutBuildbot): add an 'about'
220         page with versions of python, buildbot, and twisted
221         * buildbot/status/web/baseweb.py (WebStatus.setupUsualPages): same
222         * buildbot/status/web/index.html: add links to most pages
223         * docs/buildbot.texinfo (Buildbot Web Resources): update docs
225         * buildbot/status/web/robots.txt: put a robots.txt in new installs
226         which discourages robot access to all large dynamically-generated
227         pages. The intention is that the index page and the 'about' page
228         are the only ones which should be crawlable.
229         * buildbot/scripts/runner.py (Maker.public_html): same
230         (createMaster): same
231         * setup.py: ship index.html and robots.txt in source distributions
233         * buildbot/status/web/waterfall.py: add 'refresh' query arg, to
234         activate automatic reloading of the page (using a meta Refresh:
235         tag). Closes #69.
236         (WaterfallHelp): new page to explain all the nifty query arguments
237         you can use on the Waterfall, along with forms to set them for
238         you. From this page, you can add filters for builder=, branch=,
239         show_events=, as well as turning on reload=.
240         (WaterfallStatusResource.buildGrid): new query args: last_time=,
241         first_time=, show_time=, num_events= . The old show= is still
242         accepted, but the new builder= is preferred. We ignore empty
243         branch= arguments, to make the WaterfallHelp form easier to
244         implement.
245         (WaterfallStatusResource.head): new method to add text to the
246         <head> of the page.
247         * buildbot/status/web/base.py (HtmlResource.content): use head()
248         * buildbot/status/web/baseweb.py (OneLinePerBuild.body): ignore
249         empty branch= arguments
250         (OneLinePerBuildOneBuilder.body): same
252 2007-08-12  Brian Warner  <warner@lothar.com>
254         * buildbot/status/web/waterfall.py (WaterfallStatusResource): add
255         new query args: 'last_time' is a timestamp of the top-most event
256         on the display, 'first_time' is a timestamp for the bottom-most
257         event. 'show_time' is the difference between them, and overrides
258         'first_time'. 'num_events' puts an upper limit on the number of
259         timestamps that will be displayed on the left hand edge.
260         (WaterfallStatusResource.body): add a 'next page' link to the
261         bottom, which shows the events that come just after those shown on
262         the current page. This is a first step towards #67, but we need
263         some more controls before we can close that one.
265         * buildbot/buildslave.py (BuildSlave): these are now MultiService
266         instances too, and live as children of the BotMaster. The main
267         advantage of this approach is that BuildSlaves can know when they
268         are being removed (so they can shut off the upcoming
269         when-do-we-email-an-admin-because-we-lost-our-slave timer).
270         * buildbot/interfaces.py (IBuildSlave): marker interface so we can
271         identify which service children are BuildSlaves
272         * buildbot/master.py (BuildMaster.loadConfig_Slaves): handle the
273         Checker updates here, but delegate the rest to..
274         (BotMaster.loadConfig_Slaves): .. here, which looks at the
275         BotMaster's service children to identify the old slaves. I think
276         the previous approach of using master.slaves was broken in the
277         face of config updates that modified BuildSlave instances but did
278         not completely replace them.
279         * docs/buildbot.texinfo (Developer's Appendix): note the change to
280         the Service hierarchy
282         * buildbot/status/web/slaves.py (BuildSlavesResource): new status
283         page (at URL /buildslaves/) to view status of all buildslaves at
284         once, including how long it's been since we last heard from them,
285         and which Builders use them.
287         * buildbot/status/web/baseweb.py: fix title of one-line-per-build
288         pages
290         * buildbot/interfaces.py (IStatus.getSlaveNames): new method to
291         list all buildslaves
293         * buildbot/buildslave.py (BuildSlave.messageReceivedFromSlave):
294         use the BuildSlave to keep track of the last time we've heard from
295         the buildslave. This is updated upon receipt of any message from
296         any SlaveBuilder (which generally means when RemoteCommands are
297         giving us status updates, as BuildSteps run). In the future this
298         will include slave pings too.
299         * buildbot/process/base.py
300         (Build.setupBuild): give each BuildStep a reference to the BuildSlave
301         * buildbot/process/buildstep.py:
302         (BuildStep.setBuildSlave): accept that reference
303         (BuildStep.runCommand): pass the reference on to the RemoteCommand
304         (RemoteCommand.remote_update): update the timestamp
305         (RemoteCommand.remote_complete): same
306         * buildbot/test/runutils.py (StepTester.makeStep): match the change
307         * buildbot/test/test_steps.py (BuildStep.testShellCommand1): same
308         * buildbot/interfaces.py (ISlaveStatus.lastMessageReceived): new
309         interface to retrieve this timestamp
310         * buildbot/status/builder.py (SlaveStatus): track a copy of the
311         timestamp
314         * buildbot/status/web/baseweb.py (OneLineMixin.make_line): tighten
315         up the format a bit
316         (OneLinePerBuild.body): use a <ul> instead of <div>s
317         (OneLinePerBuildOneBuilder.body): same
319         * contrib/darcs_buildbot.py (makeChange): handle moved files too,
320         by adding the file's new name to the list of changed files. This
321         ought to be sufficient for things like isFileImportant and trial
322         tests that only exercise tests for files that have been modified.
323         Closes #31.
325         * buildbot/status/web/xmlrpc.py (XMLRPCServer): add preliminary
326         XMLRPC server to the WebStatus page. This only has two methods
327         right now (getAllBuildsInInterval and getBuild), but we'll be
328         adding more in the future. This server is extracted from the
329         trac-plugin branch.
331         * buildbot/status/web/baseweb.py (OneLinePerBuild): refactor using
332         generateFinishedBuilds, and improve the data displayed.
333         * buildbot/status/web/build.py (StatusResourceBuild): rearrange
334         the per-Build page, add some information like ETA and got_revision
335         * buildbot/status/web/builder.py (StatusResourceBuilder): same,
336         adding a list of recently completed builds
337         * buildbot/status/web/base.py (css_classes): factor this out
339         * buildbot/interfaces.py (IStatus.generateFinishedBuilds): define
340         new method, to make status display classes easier to write,
341         especially the WebStatus 'one_line_per_build' page.
342         (IBuilderStatus.generateFinishedBuilds): same
343         * buildbot/status/builder.py (BuilderStatus.generateFinishedBuilds):
344         (Status.generateFinishedBuilds): implement it
346         * buildbot/process/factory.py (GNUAutoconf.__init__): allow
347         'source' to be a BuildStep instance, since BuildFactory accepts
348         them now.
349         (CPAN.__init__): same
350         (Distutils.__init__): same
351         (Trial.__init__): same
353         * buildbot/interfaces.py (IBuildStatus.getProperty): note that
354         this might raise KeyError
356 2007-08-07  Brian Warner  <warner@lothar.com>
358         * buildbot/slave/commands.py (P4): use 'p4user' to construct the
359         'Owner:' field of the view, rather than 'p4logname', since
360         p4logname comes from the buildslave's environment and seems
361         unlikely to ever do the right thing. Thanks to Wade Brainerd for
362         the patch. Closes #40.
364         * buildbot/buildslave.py (BuildSlave.__init__): add max_builds=,
365         which imposes a per-slave limit on how many builds are allowed to
366         run simultaneously. This has a the same scope than the SlaveLock,
367         but is different because max_builds= gives the buildmaster the
368         freedom to assign the build to a different slave, whereas the
369         SlaveLock doesn't get tested until after the build is irrevocably
370         assigned to a slave. Therefore using max_builds= will improve
371         utilization in the presence of multiple buildslaves that are
372         attached to the same Builder. This completes the incorporation of
373         Dustin Mitchell's patches, and closes ticket #48. Thanks Dustin!
374         * buildbot/process/builder.py (SlaveBuilder.buildFinished): when
375         any Builder finishes, potentially trigger *all* Builders, since
376         max_builds= may have stalled someone else while waiting for the
377         slave.
378         * buildbot/scripts/sample.cfg: mention max_builds=
379         * buildbot/test/test_run.py (ConcurrencyLimit): test it
380         * docs/buildbot.texinfo (Buildslave Specifiers): document it
382         * buildbot/test/test_run.py (CanStartBuild._do_test2): tests which
383         inherit from RunMixin do not need to call master.stopService()
384         themselves, since RunMixin.tearDown does that. The double call
385         fails on Twisted-2.0.x, which didn't happen to protect against it.
386         * buildbot/test/test_slaves.py (BuildSlave.test_track_builders): same
388         * buildbot/buildslave.py (BuildSlave.addSlaveBuilder): third patch
389         from #48, this one to have the BuildSlave objects track
390         SlaveBuilders, so they'll be able to use that knowledge to
391         influence their canStartBuild() response.
392         * buildbot/process/builder.py (SlaveBuilder.attached): call it
393         (SlaveBuilder.detached): same
394         * buildbot/test/test_slaves.py (BuildSlave): test it
396         * buildbot/buildslave.py (BuildSlave.canStartBuild): incorporate
397         the second of Dustin's #48 patches, this one adding a method to
398         the BuildSlave that allows it to decide whether it is willing to
399         participate in a build or not.
400         (SlaveBuilder.isAvailable): use canStartBuild() to decide
402         * buildbot/test/test_run.py (CanStartBuild): test for it
404         * all: incorporate the first of four patches by Dustin Mitchell
405         from ticket #48, working towards improving control over slave
406         concurrency. The first patch is to use a long-lived BuildSlave
407         object per slave, on which other behavior can be added later. I've
408         modified his patch considerably.
409         * buildbot/buildslave.py (BuildSlave): move class out of
410         slave/__init__.py (where it would get loaded by the slave as well
411         as the master, making dependencies trickier), and merge it with
412         BotPerspective. Now these BuildSlave instances are created once in
413         the master.cfg file, and not destroyed until they are either
414         removed from the config file or changed so
415         much (name/password/class changes) that we cannot continue to use
416         the old one. This affects config files: they must use
417         'from buildbot.buildslave import BuildSlave' instead of using
418         'from buildbot.slave import BuildSlave'.
419         * buildbot/master.py: move BotPerspective out
420         (BuildMaster.loadConfig_Slaves): examine old and new slaves,
421         add or remove as necessary, update the rest using data from
422         the new config file.
423         * buildbot/slave/__init__.py: move BuildSlave out
424         * buildbot/test/test*.py: import BuildSlave from the new place
425         * buildbot/scripts/sample.cfg: update to match
426         * docs/buildbot.texinfo: update to match
427         * buildbot/process/builder.py: update comments to match
429 2007-08-02  Brian Warner  <warner@lothar.com>
431         * buildbot/status/web/baseweb.py (OneLinePerBuild): improve
432         one-line-per-build pages a bit, add a header, refactor slightly
434         * buildbot/test/test_maildir.py (MaildirTest.testMaildir): cleanup
435         the TimeOutError timer, patch by Dustin Mitchell.
437 2007-08-01  Brian Warner  <warner@lothar.com>
439         * buildbot/status/web/baseweb.py (OneLinePerBuild): make this
440         mostly work (branch= is still ignored, we need a useful header)
441         (OneLinePerBuildOneBuilder.body): this too
443         * buildbot/status/web/builder.py (StatusResourceBuilder.force):
444         bring this up-to-date w.r.t. recent refactorings, and fix
445         redirections to bounce the browser to the top page after hitting
446         the 'force' button. This needs to be improved, but at least it now
447         redirects to a valid page.
448         (StatusResourceBuilder.ping): same
449         (StatusResourceBuilder.getChild): same, although I think this code
450         might be dead anyways
452         * buildbot/status/web/waterfall.py (WaterfallStatusResource): add
453         a branch= query argument, to filter the display down to builds and
454         changes that involve the given branch. You can add multiple
455         branch= arguments to see multiple branches (using a logical OR).
456         Note that there is no way to include the default branch (i.e.
457         None, i.e. trunk) yet, there is still work to be done to allow for
458         simple+uniform names of branches (i.e. removing the VC-specific
459         details of how branches are implemented, so calling the branch
460         'beta4' even though the SVN checkout step requires
461         'branches/beta4').
462         * buildbot/status/builder.py (BuilderStatus.eventGenerator): same
463         * buildbot/changes/changes.py (ChangeMaster.eventGenerator): same
464         * buildbot/interfaces.py (IEventSource.eventGenerator): same
465         * docs/buildbot.texinfo (Buildbot Web Resources): document it
467         * all: bring import statements up-to-date: don't import
468         __future__, assume cPickle and cStringIO are always available.
469         Also remove #!/usr/bin/python lines from non-scripts, my editor
470         has been a bit over-enthusiastic about stuffing them into new .py
471         files.
473         * buildbot/status/web/index.html: put a link to the waterfall page
474         on the index, otherwise first-time users of WebStatus aren't going
475         to see anything very interesting.
477         * buildbot/interfaces.py (IEventSource): document this interface.
478         Thanks to Dustin Mitchell for the patch. Closes #60.
479         * buildbot/status/builder.py (BuilderStatus): same
480         * buildbot/changes/changes.py (ChangeMaster): same
482         * buildbot/status/web/waterfall.py (WaterfallStatusResource.buildGrid):
483         add a query arg of 'show_events=true' to display non-build events,
484         like slaves attaching/detaching and reconfig events, or
485         'show_events=false' to hide them. The default is 'true'.
486         * docs/buildbot.texinfo (Buildbot Web Resources): document it
488         * web-parts: merge in web-parts branch. Lots of changes. The new
489         functionality is to add buildbot.status.html.WebStatus, which is a
490         superset of the Waterfall that adds new status pages and serves
491         regular files from BASEDIR/public_html/ , which is now the preferred
492         place to put robots.txt, buildbot.css, and index.html .
493         * buildbot/scripts/runner.py: the 'create-master' command now
494         creates public_html/ too, and populates it with a couple of
495         static files.
496         * buildbot/status/web: split waterfall code into smaller pieces
498 2007-07-31  Brian Warner  <warner@lothar.com>
500         * buildbot/scripts/startup.py (launch): import twistd.run in a
501         different way to hush pyflakes
502         * buildbot/process/builder.py: remove unused import
504 2007-07-30  Brian Warner  <warner@lothar.com>
506         * buildbot/interfaces.py (ISourceStamp): cleanup patch by Dustin
507         Mitchell: pass SourceStamps around rather than branch/version/etc
508         tuples. Thanks Dustin! Closes #70.
509         * buildbot/sourcestamp.py (SourceStamp): insist that .changes is a
510         tuple rather than a list, to avoid surprising mutations
511         * buildbot/process/builder.py (BuilderControl.resubmitBuild): same
512         * buildbot/status/mail.py (MailNotifier.buildMessage): same
513         * buildbot/status/builder.py (BuildStatus.getSourceStamp): same
514         * buildbot/test/test_status.py (Subscription): same
515         * buildbot/test/test_control.py (Force): same
516         * buildbot/test/test_buildreq.py (Request.testMerge): same
518 2007-07-29  Brian Warner  <warner@lothar.com>
520         * buildbot/scripts/sample.cfg: remove the spurious 'builders'
521         variable, since it wasn't used and is confusing in the presence of
522         c['builders'] (which *is* used). Thanks to Thomas Vander Stichele
523         for the suggestion.
525         * buildbot/status/web/waterfall.py (WaterfallStatusResource): update
526         the Buildbot home-page link to point at buildbot.net instead of 
527         sourceforge, and add a current-version query parameter so we can
528         get some statistics on which versions are in use out there.
530 2007-07-28  Brian Warner  <warner@lothar.com>
532         * buildbot/master.py (BuildMaster.loadConfig): replace c['sources']
533         with c['change_source'], leaving c['sources'] for backwards
534         compatibility (but deprecated), scheduled for removal in 0.8.0
535         * docs/buildbot.texinfo: same
536         * buildbot/test/test_config.py: verify that c['sources'] still works
537         * buildbot/test/test_*.py: replace c['sources'] with c['change_source']
538         * buildbot/scripts/sample.cfg: update to match
540         * buildbot/changes/mail.py (MaildirSource): parse with python's
541         stdlib 'email' module, which has been available since python2.2,
542         and drop use of the 'rfc822' module, which has been depreceated
543         since python2.3 .
544         * buildbot/test/test_maildir.py: same: use parse_file() not parse
546         * buildbot/test/test_maildir.py (MaildirTest.testMaildir): oops,
547         this needs to match the renaming in test/mail/msg*
549         * README (SETTING UP A BUILD MASTER): fix capitalization-typo.
550         Closes SF#1752648.
552         * buildbot/test/test_mailparse.py: rename sample emails a bit
553         * buildbot/test/mail/msg*: same
555         * buildbot/changes/mail.py (SVNCommitEmailMaildirSource): add a
556         parser for the "commit-email.pl" script that is shipped with SVN,
557         written by Justin Mason. Thanks! Closes SF#1072845.
558         * buildbot/test/mail/svn-commit.*: sample messages
559         * buildbot/test/test_mailparse.py (TestSVNCommitEmail): test it
560         * docs/buildbot.texinfo (SVNCommitEmailMaildirSource): docs
562 2007-07-27  Brian Warner  <warner@lothar.com>
564         * buildbot/changes/mail.py: refactor: move parsing into a method
565         named 'parse', each parser type gets a separate subclass. Remove
566         the old 'sep' argument (hardcode it to '/'), fix usage of prefix=
567         to be a simple leading-substring match. Add a warning to the logs
568         if prefix= does not end in a slash, since that's probably a
569         mistake. Fix both places where a prefix= mismatch would skip all
570         subsequent files in the same email, instead of just skipping the
571         one that didn't match.
572         * buildbot/test/test_mailparse.py: match changes
574         * docs/buildbot.texinfo (Getting Source Code Changes): refactor
575         docs on email-based ChangeSources
577         * docs/buildbot.texinfo (Getting Source Code Changes): move all
578         the changesource types up a level, removing the one-entry menu in
579         the process
581         * buildbot/master.py (BuildMaster.loadConfig_Slaves): rename
582         c['bots'] to c['slaves'], and use buildbot.slave.BuildSlave
583         instances instead of tuples. Closes #63.
584         * buildbot/slave/__init__.py (BuildSlave): define marker class
585         * buildbot/scripts/sample.cfg: use c['slaves'] in sample config
586         * docs/buildbot.texinfo (Buildslave Specifiers): document c['slaves']
587         * buildbot/test/test_*.py: update tests to match
588         * buildbot/test/test_config.py (ConfigTest.testBots): verify that
589         the c['bots'] backwards-compatibility handler works
591 2007-07-26  Brian Warner  <warner@lothar.com>
593         * buildbot/changes/hgbuildbot.py (hook): add an in-process
594         Mercurial change-sending hook, contributed by Frederic Leroy.
595         Thanks! Addresses #50.
596         * docs/buildbot.texinfo (MercurialHook): document it
598         * buildbot/changes/hgbuildbot.py: change the way imports are done,
599         to make it compatible with at least hg-0.9.1 and the current 0.9.4
601 2007-07-17  Brian Warner  <warner@lothar.com>
603         * buildbot/process/buildstep.py (BuildStep.getLog): add a
604         convenience method to retrieve a log added with
605         addLog()/addCompleteLog()/etc or logfiles= . I should have added
606         this two years ago..
608 2007-07-03  Brian Warner  <warner@lothar.com>
610         * buildbot/slave/commands.py (ShellCommand._startCommand): when
611         logging the environment variables, put one variable on each line,
612         rather than having one really long line with all of them. This
613         should make them a bit more readable and not trigger the
614         horizontal scrollbar (when viewing it in a web browser) quite so
615         much. Thanks to Albert Hofkamp for the patch.
617         * buildbot/steps/shell.py (ShellCommand): allow workdir= to be a
618         WithProperties instance. Thanks to Axel Hecht for the patch.
619         Closes #43.
620         * buildbot/test/test_properties.py (Interpolate.testWorkdir): test it
621         * docs/buildbot.texinfo (Build Properties): document it
622         * buildbot/slave/commands.py (ShellCommand._startCommand): create the
623         workdir if it didn't already exist.
625         * docs/buildbot.texinfo (Scheduler Types): correct the description
626         of Dependent schedulers. Thanks to Greg Ward for the patch.
628         * buildbot/steps/source.py (SVN.startVC): when applying a patch,
629         add "[patch]" to the step's display. Thanks to Dustin Mitchell for
630         the patch. Closes #49.
632         * buildbot/slave/commands.py (rmdirRecursive): chmod everything to
633         0700 before removing it, to deal with situations where a build will
634         leave files around without write permissions and the 'copy' or
635         'clobber' VC checkout modes need to blow away the tree first.
636         Thanks to Steve Milner for the suggestion and the patch (which I
637         mangled horribly). Closes #29.
638         * buildbot/test/test_slavecommand.py (Utilities.test_rmdirRecursive):
639         test for it
641         * buildbot/test/runutils.py (RunMixin.disappearSlave): oops, add
642         an allowReconnect= argument to let callers control whether they
643         want this don't-let-it-reconnect behavior, since some tests care.
644         Factor out the .continueTrying=False lines from those callers.
645         * buildbot/test/test_slaves.py: same
646         * buildbot/test/test_run.py: same
648 2007-07-02  Brian Warner  <warner@lothar.com>
650         * buildbot/test/runutils.py (RunMixin.disappearSlave): once a
651         slave has been disappeared, don't let it reconnect. This was
652         causing an intermittent failure in test_slaves.py, when the slave
653         that was supposed to be gone managed to come back by the end of
654         the test and affect the count.
655         * buildbot/test/test_slaves.py (Slave.testFallback2): minor
656         refactorings
657         * buildbot/process/builder.py (SlaveBuilder.__repr__): added some
658         diagnostic messages to track down this problem
659         (Builder.startBuild): same
661         * buildbot/process/builder.py (Builder.maybeStartBuild): choose
662         the slave randomly rather than always taking the first one. Thanks
663         to Pike for the patch. Closes #36.
664         * buildbot/test/test_slaves.py: match the change. to avoid huge
665         changes to the tests, I added a CHOOSE_SLAVES_RANDOMLY flag which
666         enables/disables the round-robin-ness (enabled by default), and
667         some unit tests disable it.
668         * docs/buildbot.texinfo (Buildmaster Architecture): document it
670         * buildbot/slave/bot.py (BuildSlave.__init__): rename the 'host'
671         argument to 'buildmaster_host', to make it more obvious that this
672         points to the buildmaster. Thanks to Bob Proulx for the
673         suggestion.
674         * buildbot/scripts/runner.py (slaveTAC): same
675         * buildbot/test/test_runner.py (Create.testSlave): match the change
677         * contrib/hg_buildbot.py: patch from Frederic Leroy to make this
678         work better.
680 2007-06-17  Brian Warner  <warner@lothar.com>
682         * buildbot/test/test_config.py (Factories.testAllSteps): make sure
683         we can round-trip all of our current step classes by calling
684         getStepFactory() and using the results to make a clone of the
685         original step.
687         * buildbot/steps/maxq.py: fix import errors. Guess this hasn't been
688         used in a while..
690         * buildbot/process/factory.py (BuildFactory.addStep): To simplify
691         the config file, we're moving to using actual instances instead of
692         the (class, kwargs) 'step specification' tuples. BuildFactory
693         still keeps a list of tuples internally, but when real instances
694         are passed in to addStep(), they are asked for their class and
695         kwargs using the new BuildStep.getStepFactory method. BuildFactory
696         accepts both instances and the tuple form, and converts instances
697         to the tuple form, but the instance form is preferred because it
698         gives the Steps a chance to do argument validation. Closes: #11.
700         * buildbot/process/buildstep.py (BuildStep.__init__): record the
701         factory information necessary to implement getStepFactory. The
702         addFactoryArguments() method can be used to include arguments that
703         aren't passed to the BuildStep base class constructor.
704         (BuildStep.setBuild):
705         (BuildStep.setDefaultWorkdir): new methods to take parameters that
706         are needed for live BuildSteps but not to construct the specification
707         tuples that are stashed in the factory.
709         * buildbot/process/base.py (Build.setupBuild): pass 'build' and
710         'workdir' into new BuildSteps by using methods instead of
711         arguments. This makes the constructor for BuildSteps a lot
712         simpler.
714         * buildbot/steps/*.py: update to match this change. Basically this
715         means adding calls to addFactoryArguments() in the __init__
716         methods to capture the arguments that aren't passed through to the
717         base class.
718         * buildbot/steps/shell.py (ShellCommand.setDefaultWorkdir): copy
719         the new workdir (if any) into the RemoteShellCommands arguments.
720         * buildbot/steps/source.py: allow workdir= to be optional,
721         implement setDefaultWorkdir() since we don't inherit from
722         (CVS): finally remove old clobber=/export=/copydir= arguments,
723         in favor of the mode= argument that's been around forever now.
724         * buildbot/steps/transfer.py: remove build= argument
726         * buildbot/test/*.py: update to match, generally by turning all
727         build= arguments into subsequent calls to s.setBuild()
728         * buildbot/test/test_config.py (Factories): verify that we can
729         use either BuildStep instances or class/kwarg tuples in both
730         BuildFactory.addStep and BuildFactory.__init__
732         * docs/buildbot.texinfo (Build Steps): document the new approach,
733         mention compatibility with the old approach, update all examples
734         to use the new style.
736 2007-06-16  Brian Warner  <warner@lothar.com>
738         * buildbot/changes/svnpoller.py: when the poll fails, don't kill
739         the LoopingCall, just eat the failure so that we'll poll again
740         next time. This should allow us to tolerate (e.g.) sf.net SVN
741         failures more gracefully. Many thanks to Dustin Mitchell for the
742         patch. Closes #34.
744 2007-05-17  Brian Warner  <warner@lothar.com>
746         * buildbot/status/words.py: refactor the IRC status bot into
747         separate 'Contact' and 'Channel' classes. The base Contact class
748         contains the interaction code: commands and responses. The
749         IRCContact subclass (and IrcStatusBot 'Channel') handle the
750         IRC-specific aspects. The plan is to write other subclasses for
751         other IM protocols like AIM and Jabber.
753 2007-04-16  Brian Warner  <warner@lothar.com>
755         * CREDITS: update list of contributors. Thank you all!
757 2007-04-13  Brian Warner  <warner@lothar.com>
759         * buildbot/status/mail.py (MailNotifier): add the project name to
760         the subject line and message body, to make it easier to
761         distinguish email coming from different buildmasters. Thanks to
762         Benoit Sigoure for the patch.
763         * buildbot/test/test_status.py (Mail): update to match
765 2007-03-24  Brian Warner  <warner@lothar.com>
767         * buildbot/steps/transfer.py: open all files in 'b' binary mode to
768         avoid text-conversion problems between DOS/windows and unix.
769         Thanks to Phil Thompson for the patch. Fixes SF#1674927.
771 2007-03-03  Brian Warner  <warner@lothar.com>
773         * buildbot/status/html.py (_hush_pyflakes): hush a pyflakes
774         warning about the use of Waterfall here
776 2007-03-01  Brian Warner  <warner@lothar.com>
778         * buildbot/interfaces.py (IStatus.getBuilder): mention exceptions
780 2007-02-28  Brian Warner  <warner@lothar.com>
782         * buildbot/changes/p4poller.py (P4Source): apply change from Scott
783         Lamb to use a more optimal form of 'p4 changes', to reduce server
784         load. He reports that this optimization was added to p4d release
785         2005.2, but it should work in all versions. Closes #27.
786         * buildbot/test/test_p4poller.py: match it
788 2007-02-27  Brian Warner  <warner@lothar.com>
790         * buildbot/status/web/*.py: move all web status stuff into a
791         separate directory, in anticipation of splitting it into smaller
792         pieces and adding more files. html.py was getting way too big.
793         * buildbot/status/classic.css: move it too
794         * setup.py: add the new sub-package
795         * buildbot/test/test_web.py: match the changes
796         * MANIFEST.in: handle the move of classic.css
798 2007-02-07  Brian Warner  <warner@lothar.com>
800         * contrib/OS-X/*: add some launchd .plist files for automatically
801         starting a buildmaster or buildslave under OS-X (10.4 or later).
802         Thanks to Mark Pauley for these.
804 2007-02-06  Brian Warner  <warner@lothar.com>
806         * docs/buildbot.texinfo (Requirements): update requirements to
807         stop claiming compatibility with python-2.2 or twisted-1.3.x .
808         Closes #13.
809         * README: mention python-2.5 and twisted-2.5 compatibility
811         * buildbot/clients/debug.py: hush pyflakes warnings by removing a
812         redundant import
813         * buildbot/scripts/startup.py: same, by removing twisted-1.3.0
814         compatibility
815         * buildbot/status/builder.py: same, by requiring cStringIO
816         * buildbot/status/words.py: same, remove twisted-1.3.0 compat
817         * buildbot/test/test_vc.py: same
818         * buildbot/test/test_web.py:
819         * buildbot/test/test_steps.py: same, remove unused import
821         * buildbot/status/html.py (StatusResourceBuild.body): oops, close
822         the FORM tag
824         * buildbot/master.py (BuildMaster.loadConfig): warn the user if we
825         see any Builders that don't have Schedulers to drive them
827         * buildbot/master.py (BotPerspective.__repr__): fit bitrot, the
828         attributes this uses went away
830         * contrib/bb_applet.py (MyApplet.filled): add a small prefs
831         dialog, to allow you to reset the buildmaster and force
832         connect/disconnect. Correctly handle losing the buildmaster
833         connection (by switching the display to the hexnut, at which point
834         you can use the 'Connect' menu item to reconnect).
836         * buildbot/steps/source.py (Source.start): if we're using a patch,
837         add it as a LogFile to the checkout/update step. This will turn
838         into a link on the waterfall page.
840         * buildbot/scripts/tryclient.py (Try.createJob): implement --diff
841         option, to take the patch from a pre-made file rather than
842         generating it from the local tree. Thanks to Robert Helmer for the
843         idea. Closes #15 (the Trac ticket on the new http://buildbot.net/).
844         * buildbot/scripts/runner.py (TryOptions): add --diff,
845         --patchlevel, and --baserev options
846         * buildbot/scheduler.py (Try_Jobdir.parseJob): treat a baserev of ""
847         as None, meaning HEAD.
848         * buildbot/sourcestamp.py (SourceStamp): update docstring to
849         indicate that baserev=None means HEAD
850         * docs/buildbot.texinfo (try --diff): document it
852         * buildbot/test/test_steps.py (BuildStep): remove use of
853         reactor.iterate(), although the technique I replaced it with is a
854         gross polling hack that must be cleaned up properly some day. This
855         was the last use of reactor.iterate in the entire tree, yay.
857 2007-02-05  Brian Warner  <warner@lothar.com>
859         * buildbot/status/mail.py (MailNotifier.__init__): assert that 'mode'
860         is one of the three known values, otherwise we emit some confusing
861         messages later on. Thanks to Grig Gheorghiu for the catch.
863 2007-01-30  Brian Warner  <warner@lothar.com>
865         * buildbot/changes/bonsaipoller.py (BonsaiParser.__init__): Ben
866         Hearsum contributed a patch to let BonsaiPoller work with results
867         that contain non-ascii characters. Closes SF#1632641.
869 2007-01-27  Brian Warner  <warner@lothar.com>
871         * Makefile (release): produce both .tar.gz and .zip source bundles.
872         Closes SF#1222216.
874 2007-01-23  Brian Warner  <warner@lothar.com>
876         * buildbot/changes/freshcvsmail.py: hush a pyflakes warning
877         * buildbot/changes/monotone.py: same
879         * buildbot/changes/maildir.py: combine several files into one,
880         clean up maildir.py to use Services properly.
881         * buildbot/changes/maildirtwisted.py: remove
882         * buildbot/changes/maildirgtk.py: remove, it wasn't used by
883         buildbot anyways.
884         * buildbot/changes/mail.py: match the change
885         * buildbot/scheduler.py: same, since Try_Jobdir uses a maildir
886         * buildbot/test/test_maildir.py: remove use of reactor.iterate()
888         * buildbot/slave/commands.py (command_version): bump to "2.3" to
889         indicate that the buildslave knows about the 'bzr' command
891 2007-01-22  Brian Warner  <warner@lothar.com>
893         * buildbot/process/builder.py (Builder.fireTestEvent): don't use
894         'with', it will become a reserved work in python2.6 .
896         * contrib/bb_applet.py: add a simple gnome-panel applet, to
897         display a terse summary of buildbot status.
898         * docs/hexnut32.png, docs/hexnut48.png, docs/hexnut64.png: add
899         some icons, small versions of the Blender object that lives in
900         docs/images/icon.blend
902         * buildbot/steps/source.py (Bzr): add Bazaar-ng support
903         * buildbot/slave/commands.py (Bzr): same
904         * buildbot/scripts/tryclient.py (BzrExtractor): same
905         (SourceStampExtractor.dovc): modify this to allow non-zero exit
906         status, since 'bzr diff' does that
907         * buildbot/test/test_vc.py (Bzr): same
908         * docs/buildbot.texinfo (How Different VC Systems Specify Sources):
909         add notes on bzr
910         (Bzr): document it
912 2007-01-20  Brian Warner  <warner@lothar.com>
914         * contrib/darcs_buildbot.py: tidy up the progress messages
916 2007-01-17  Brian Warner  <warner@lothar.com>
918         * contrib/darcs_buildbot.py: enhance to handle multiple patches
919         being pushed at a time. This keeps state in the repository in a
920         small file named .darcs_buildbot-lastchange, but that shouldn't
921         interfere with normal repository operations. Fixes SF#1534049.
922         * buildbot/clients/sendchange.py (Sender): make a single Sender
923         capable of sending Changes with different usernames.
925 2006-12-11  Brian Warner  <warner@lothar.com>
927         * buildbot/changes/freshcvsmail.py: mark this file as deprecated,
928         scheduled for removal in 0.7.7 . The FCMaildirSource was moved to
929         buildbot.changes.mail a long time ago, but I forgot to add the
930         DeprecationWarning until now.
932         * buildbot/process/maxq.py: remove this, the functionality now
933         lives in buildbot.steps.maxq
935         * buildbot/clients/debug.py: remove an unnecessary gnome.ui import
936         * buildbot/clients/gtkPanes.py: remove unused import
938         * buildbot/slave/trial.py: remove an unused/incomplete/buggy file,
939         that was meant to provide a special Reporter to run inside trial
940         and give the buildslave lots of machine-readable status. We never
941         finished this project.
943         * buildbot/changes/bonsaipoller.py: remove unused imports
944         * buildbot/changes/svnpoller.py: same
945         * buildbot/process/builder.py: same
946         * buildbot/process/buildstep.py: same
947         * buildbot/slave/bot.py: hush pyflakes warning
948         * buildbot/status/tests.py: remove unused imports
949         * buildbot/status/tinderbox.py: same
950         * buildbot/steps/python_twisted.py: same
952         * buildbot/process/step.py: remove this file, these names were
953         deprecated in 0.7.5 and are now being removed.
954         * buildbot/process/step_twisted.py: same
955         * buildbot/test/test_steps.py (ReorgCompatibility): remove test
957         * buildbot/twcompat.py: remove the empty file, yay it is gone
959         * buildbot/twcompat.py (waitForDeferred): remove the monkeypatch,
960         tw-2.0.0 and newer have the method we need.
961         (getProcessOutputAndValue): same
962         (which): remove this method, tw-2.0.0 t.p.procutils has it
964         * buildbot/twcompat.py (implements): remove this method
965         * buildbot/*: import implements() from zope.interface directly
967         * buildbot/status/mail.py: stop falling back to importing
968         twisted.protocols.smtp.sendmail, now that we don't need tw-1.3.0
969         support
971         * buildbot/twcompat.py (Interface): remove this import
972         * buildbot/*: import Interface from zope.interface directly
974         * buildbot/twcompat.py (providedBy): remove this method
975         * buildbot/*: turn all uses of providedBy(obj, iface) into
976         iface.providedBy(obj)
978         * buildbot/twcompat.py (maybeWait): remove this method, now that
979         we no longer maintain compatibility with Twisted<=1.3.0 .
980         Twisted-2.0.0 and later allow trial methods to return Deferreds
981         directly.
982         * buildbot/test/*: remove all uses of maybeWait
984         * buildbot/__init__.py (version): bump to 0.7.5+ while between
985         releases
986         * docs/buildbot.texinfo: same
988 2006-12-10  Brian Warner  <warner@lothar.com>
990         * buildbot/__init__.py (version): Releasing buildbot-0.7.5
991         * docs/buildbot.texinfo: set version to match
993 2006-12-10  Brian Warner  <warner@lothar.com>
995         * README (REQUIREMENTS): update for release
996         * NEWS: update for release
997         * buildbot/slave/commands.py (command_version): mention that this
998         version (2.2) was released with buildbot-0.7.5
1000         * buildbot/test/test_config.py (StartService.testStartService):
1001         inhibit the usual read-config-on-startup behavior, since otherwise
1002         the log.err that gets recorded causes the test to fail
1004         * buildbot/status/builder.py (LogFile.finish): forget about all
1005         subscribers once the log has finished, since after that point
1006         we're never going to use them again. This might help free up some
1007         memory somewhere.
1009         * buildbot/clients/debug.py: update to use gtk.main_quit() rather
1010         than the old/deprecated gtk.mainquit()
1012 2006-12-09  Brian Warner  <warner@lothar.com>
1014         * buildbot/steps/transfer.py (_FileWriter.__del__): handle errors
1015         better when we can't open the masterdst file
1017         * buildbot/scripts/startup.py (Follower._failure): add missing
1018         import statement for BuildSlaveDetectedError
1020         * buildbot/steps/transfer.py (FileUpload): cleanup
1021         (FileDownload): same. Add tests for slave version, add mode=.
1022         * buildbot/slave/commands.py (SlaveFileUploadCommand): same
1023         (SlaveFileDownloadCommand): same
1024         * buildbot/test/test_transfer.py: enhance tests
1025         * buildbot/test/runutils.py (makeBuildStep): create a fake form of
1026         step.slaveVersion
1028 2006-12-08  Brian Warner  <warner@lothar.com>
1030         * buildbot/scripts/runner.py (sendchange): halt the reactor on
1031         both success *and* failure. Without this, the 'buildbot
1032         sendchange' command would hang if it could not contact the
1033         buildmaster or deliver the Change, which would generally cause the
1034         user's commit/record/checkin command to hang too. Thanks to
1035         Christian Unger for the catch.
1037 2006-12-06  Brian Warner  <warner@lothar.com>
1039         * NEWS: update with items for the next release
1041         * docs/buildbot.texinfo (Adding LogObservers): add a somewhat
1042         whimsical example pulled from a punch-drunk email I sent out late
1043         one night.
1044         (Transferring Files): document some of the other parameters
1045         (Adding LogObservers): update to 0.7.5 buildbot.steps.*
1046         (SVNPoller): rename svnpoller.SvnSource to SVNPoller
1047         * buildbot/test/test_svnpoller.py: same
1048         * buildbot/changes/svnpoller.py (SVNPoller): same
1050 2006-11-26  Brian Warner  <warner@lothar.com>
1052         * docs/buildbot.texinfo (Build Properties): remind users that
1053         WithProperties must appear in a command= list, not as a top-level
1054         instance.
1055         * buildbot/steps/shell.py (ShellCommand.start): and assert that
1056         we're sending a list or a single string to the RemoteShellCommand
1058         * buildbot/scheduler.py (Nightly): Improve docs slightly.
1060         * buildbot/scripts/startup.py (start): skip the whole
1061         watch-the-logfile thing under windows, since it needs os.fork()
1063         * buildbot/scripts/runner.py (restart): remove the old message
1064         that got printed after the buildbot was restarted.. it most cases
1065         it didn't get printed at the right time anyways
1067 2006-11-25  Brian Warner  <warner@lothar.com>
1069         * buildbot/scripts/runner.py: enhance 'start' and 'restart' to
1070         follow twistd.log and print lines until the process has started
1071         started properly. For the buildmaster, this means until the config
1072         file has been parsed and accepted. For the buildslave, this means
1073         until we've connected to the master. We give up after 5 seconds in
1074         any case. Helpful error messages and troubleshooting suggestions
1075         are printed when we don't see a successful startup. This closes the
1076         remainder of SF#1517975.
1077         * buildbot/scripts/startup.py: moved app startup code to here
1078         * buildbot/scripts/logwatcher.py: utility class to follow log
1079         * buildbot/scripts/reconfig.py: rewrite to use LogWatcher
1080         * buildbot/slave/bot.py: announce our BuildSlaveness to the log
1081         so the LogWatcher can tell the difference between a buildmaster
1082         and a buildslave
1084 2006-11-24  Brian Warner  <warner@lothar.com>
1086         * docs/examples/twisted_master.cfg: update to match the version
1087         in use on twistedmatrix.com
1088         (IRC): re-enable IRC bot. The 'irc.us.freenode.net' hostname I
1089         was using before stopped working, but 'irc.freenode.net' works
1090         just fine.
1092         * buildbot/scripts/runner.py (run): oops, forgot to enable the new
1093         'reconfig' command
1095         * buildbot/clients/base.py (TextClient.not_connected): upon
1096         UnauthorizedLogin failures, remind the user to connect to the
1097         PBListener port instead of the slaveport.
1098         (TextClient.disconnected): shut down more quietly
1099         * docs/buildbot.texinfo (statuslog): add another reminder
1101         * buildbot/scripts/runner.py (Options.subCommands): rename
1102         'buildbot sighup DIR' to 'buildbot reconfig DIR', but keep
1103         'sighup' as an alias.
1104         * buildbot/scripts/reconfig.py (Reconfigurator): enhance the
1105         reconfig command to follow twistd.log and print all of the lines
1106         from the start of the config-file reload to its completion. This
1107         should make it a lot easier to discover bugs in the config file.
1108         Use --quiet to disable this behavior. This addresses half of
1109         SF#1517975, the other half will be to add this same utility to
1110         'buildbot start' and 'buildbot restart'.
1111         * docs/buildbot.texinfo (Loading the Config File): same
1112         (Shutdown): same
1114         * buildbot/interfaces.py (IBuilderControl.forceBuild): remove this
1115         method, it has been deprecated for a long time. Use
1116         IBuilderControl.requestBuild instead.
1117         * buildbot/process/builder.py (BuilderControl.forceBuild): remove
1118         * buildbot/master.py (BotPerspective.perspective_forceBuild): same
1119         * buildbot/slave/bot.py (Bot.debug_forceBuild): same
1120         * buildbot/test/test_control.py (Force.testForce): same
1121         * buildbot/test/test_run.py: use requestBuild instead
1123         * buildbot/clients/debug.py: replace 'Force Build' button with
1124         'Request Build' (which just adds one to the queue), add Ping
1125         Builder, add branch/revision fields to Request Build.
1126         * buildbot/clients/debug.glade: same
1127         * buildbot/master.py: update interface to match. This creates an
1128         incompatibility between new debugclients and old buildmasters.
1130         * buildbot/process/builder.py (Builder._attached): delay the call
1131         to maybeStartBuild for a reactor turn, to avoid starting a build
1132         in the middle of a reconfig (say, if the new Builder uses a new
1133         slave which is already connected).
1135 2006-11-23  Brian Warner  <warner@lothar.com>
1137         * buildbot/test/test_transfer.py: appease pyflakes
1138         * buildbot/test/test_steps.py: same
1140         * buildbot/test/test_bonsaipoller.py: remove the 'import *' that
1141         keeps pyflakes from finding undefined names
1143         * buildbot/master.py (BuildMaster.loadConfig_Builders): changing a
1144         Builder no longer induces a disconnect/reconnect cycle. This means
1145         that any builds currently in progress will not be interrupted, and
1146         any builds which are queued in the Builder will not be lost. This
1147         is implemented by having the new Builder extract the state (i.e.
1148         all pending Builds and any desired SlaveBuilders) from the old
1149         Builder.
1150         (BotPerspective): refactor. The BotPerspective no longer keeps
1151         track of all the Builders that want to use this slave; instead, it
1152         asks the BotMaster each time it needs this list. This removes
1153         addBuilder and removeBuilder. Clean up attached() to acquire all
1154         the slave's information in a more atomic fashion. updateSlave() is
1155         now the way to make sure the slave is using the right set of
1156         Builders: just call it after everything else has been
1157         reconfigured.
1158         (BotMaster): refactor, removing addBuilder/removeBuilder and
1159         replacing them with an all-at-once setBuilders() call.
1161         * buildbot/test/test_slaves.py (Reconfig): new test case to
1162         exercise this functionality
1163         * buildbot/steps/dummy.py (Wait): new dummy BuildStep for the test
1164         * buildbot/slave/commands.py (WaitCommand): same
1166         * docs/buildbot.texinfo (Loading the Config File): document the
1167         changes
1169         * buildbot/process/builder.py (SlaveBuilder): refactor. Allow the
1170         SlaveBuilder to have its parent Builder changed.
1171         (SlaveBuilder.isAvailable): new method to give access to state,
1172         which is now a private attribute
1173         (SlaveBuilder.buildStarted,buildFinished): new methods to inform
1174         the SlaveBuilder about how it is being used. These methods update
1175         its internal state. buildFinished() is now the place that invokes
1176         maybeStartBuild() on its parent Builder.
1177         (Builder.consumeTheSoulOfYourPredecessor): new method to allow a
1178         new Builder to take over for an old one, transferring state from
1179         the old one.
1180         (Buider): refactor the way that SlaveBuilders are used to match,
1181         giving them a bit more autonomy.
1182         (Builder.buildFinished): this no longer calls maybeStartBuild():
1183         instead the SlaveBuilder calls it on whoever its parent Builder is
1184         at the time. This way, when an old Builder is replaced by a new
1185         one, and there was a build in progress during the transition, when
1186         that build finishes, it will be the new Builder that is told about
1187         the newly available slave so it can start a new build.
1189         * buildbot/process/base.py (Build.startBuild._release_slave): when
1190         the Build finishes, tell the SlaveBuilder that they've been
1191         released.
1193         * buildbot/status/builder.py (SlaveStatus): add some new setter
1194         methods for use by BotPerspective, to keep some attributes more
1195         private
1197         * buildbot/slave/bot.py (Bot.remote_getDirs): this is no longer
1198         called by the buildmaster.
1199         (Bot.setBuilderList): instead, we locally announce any leftover
1200         directories based upon which Builders we were told about. The
1201         master doesn't really care; it's the local admin who may or may not
1202         wish to delete them.
1205         * contrib/svn_buildbot.py: use /usr/bin/python, not /usr/bin/env,
1206         to allow use of python2.4 or whatever. This tool still requires
1207         python2.3 or newer.
1209 2006-11-19  Brian Warner  <warner@lothar.com>
1211         * NEWS (IStatusLog.readlines): more news items
1213 2006-11-18  Brian Warner  <warner@lothar.com>
1215         * NEWS: start collecting items for the next release.
1217 2006-11-04  Brian Warner  <warner@lothar.com>
1219         * buildbot/changes/bonsaipoller.py: apply updates from Ben
1220         Hearsum. Closes SF#1590310.
1221         * buildbot/test/test_bonsaipoller.py: and tests
1223         * buildbot/status/tinderbox.py
1224         (TinderboxMailNotifier.buildMessage): send out a "testfailed"
1225         status when the build results in WARNINGS. Patch from Dave
1226         Liebreich. Closes SF#1587352.
1228         * buildbot/slave/commands.py (LogFileWatcher.poll): overcome a
1229         linux-vs-osx behavior difference w.r.t. reading from files that
1230         have reached EOF. This should fix LogFileWatcher on OS-X. Thanks
1231         to Mark Rowe for the patch.
1233 2006-10-15  Brian Warner  <warner@lothar.com>
1235         * buildbot/interfaces.py (IStatus.getURLForThing): oops, the
1236         method name was misspelled in the interface definition. Thanks to
1237         Roy Rapoport for the catch.
1239 2006-10-13  Brian Warner  <warner@lothar.com>
1241         * docs/buildbot.texinfo (Adding LogObservers): update sample code
1242         to match the great Steps renaming
1244         * buildbot/steps/transfer.py (FileUpload.start): Fix stupid error.
1245         Maybe I should run my own unit tests before recording a big
1246         change. Good thing I've got a buildbot to remind me.
1248 2006-10-12  Brian Warner  <warner@lothar.com>
1250         * buildbot/steps/transfer.py: rework __init__ and args setup
1251         * buildbot/slave/commands.py (SlaveFileDownloadCommand): minor
1252         docs improvements
1253         * buildbot/slave/commands.py (SlaveFileDownloadCommand.setup):
1254         when opening the target file, only catch IOError (to report via
1255         stderr/rc!=0), let the others be reported as normal exceptions
1257 2006-10-08  Brian Warner  <warner@lothar.com>
1259         * contrib/svn_watcher.py: fix security holes by using proper argv
1260         arrays and subprocess.Popen() rather than commands.getoutput().
1261         Thanks to Nick Mathewson for the patch. Note that svn_watcher.py
1262         is deprecated in favor of buildbot/changes/svnpoller.py, and will
1263         probably be removed by the next release.
1264         * CREDITS: add Nick
1266 2006-10-04  Brian Warner  <warner@lothar.com>
1268         * buildbot/steps/python.py (PyFlakes.createSummary): skip any
1269         initial lines that weren't emitted by pyflakes. When the pyflakes
1270         command is run under a Makefile, 'make' will echo the command it
1271         runs to stdio, and that was getting logged as a "misc" warning.
1272         * buildbot/test/test_steps.py (Python.testPyFlakes2): test it
1273         * buildbot/test/test_steps.py (testPyFlakes3): another test
1275 2006-10-01  Brian Warner  <warner@lothar.com>
1277         * buildbot/status/html.py (HtmlResource.render): if we get a
1278         unicode object from our content() method, encode it into utf-8
1279         like we've been claiming to all along. This allows the comments
1280         and author names from svnpoller.py to be delivered properly.
1282         * buildbot/changes/svnpoller.py (SvnSource.create_changes):
1283         de-unicodify filenames before creating the Change, because the
1284         rest of buildbot is unlikely to handle them well. Leave the 'who'
1285         field as a unicode object.. I don't think there's anything that
1286         will break very soon, and it will probably nudge us towards
1287         accepting unicode everywhere sooner or later. Stop using the
1288         "date" field that comes out of SVN, since it is using the
1289         repository's clock (and timezone) and what we care about is the
1290         buildmaster's (otherwise Changes from the future show up later
1291         than the builds they triggered).
1292         * buildbot/test/test_svnpoller.py (Everything.test1): match the
1293         change to .when
1295         * buildbot/changes/svnpoller.py (SvnSource): added Niklaus Giger's
1296         Suvbersion repository polling ChangeSource. I've hacked it up
1297         considerably: any bugs are entirely my own fault. Thank you
1298         Niklaus!
1299         * buildbot/test/test_svnpoller.py: tests for it
1300         * docs/buildbot.texinfo (SvnSource): document it
1302 2006-09-30  Brian Warner  <warner@lothar.com>
1304         * buildbot/scheduler.py (Periodic): submit a reason= to the
1305         BuildSet to indicate which Scheduler triggered the build. Thanks
1306         to Mateusz Loskot for the suggestion.
1307         (Nightly): same
1308         * buildbot/test/test_scheduler.py (Scheduling.testPeriodic1): test it
1310         * buildbot/changes/p4poller.py (P4Source): some minor stylistic
1311         changes: set self.loop in __init__, remove unused volatile=
1313         * docs/buildbot.texinfo (.buildbot config directory): add more
1314         docs on the .buildbot/options keys used by "buildbot try"
1315         * buildbot/scripts/tryclient.py (Try.createJob): remove dead code
1316         (Try.deliverJob): same
1318         * buildbot/changes/bonsaipoller.py (BonsaiParser): more updates
1319         from Robert Helmer
1320         (BonsaiPoller): same
1322         * buildbot/slave/commands.py (LogFileWatcher.stop): explicitly
1323         close the filehandle when we stop watching the file. Before, the
1324         filehandle was only closed when the LogFileWatcher was
1325         garbage-collected, which could be quite a while in the future. If
1326         it was still open by the time the next build started, windows will
1327         refuse to let the new build delete the old build/ directory. Fixes
1328         SF#1568415, thanks to <scmikes>, <FireMoth>, and <radix> on
1329         #twisted for the catch.
1331 2006-09-29  Brian Warner  <warner@lothar.com>
1333         * buildbot/status/tinderbox.py (TinderboxMailNotifier): updates
1334         from Robert Helmer
1336 2006-09-25  Brian Warner  <warner@lothar.com>
1338         * setup.py: the new buildbot.steps module wasn't being installed.
1339         Thanks to Jose Dapena Paz for the catch, fixes SF#1560631.
1340         (testmsgs): add the extra stuff from buildbot/test/* so you can
1341         run unit tests on an installed copy of buildbot, not just from
1342         the source tree.
1344         * contrib/svn_buildbot.py (ChangeSender.getChanges): the first *4*
1345         columns of 'svnlook changed' output contain status information, so
1346         strip [:4] instead of [:6]. Depending upon what the status flags
1347         were, this would sometimes lead to mangled filenames. Thanks to
1348         Riccardo Magliocchetti for the patch. Closes SF#1545146.
1350         * buildbot/steps/source.py (Monotone): initial Monotone support,
1351         contributed by Nathaniel Smith. Still needs docs and tests, but
1352         this code has been in use on the Monotone buildbot for a long
1353         time now.
1354         * buildbot/slave/commands.py (Monotone): slave-side support
1355         * buildbot/changes/monotone.py (MonotoneSource): polling change
1356         source
1358         * buildbot/changes/bonsaipoller.py (BonsaiPoller): Ben also
1359         contributed a Change Source that polls a Bonsai server (a
1360         kind of web-based viewcvs CGI script).
1362         * buildbot/status/tinderbox.py (TinderboxMailNotifier): Ben
1363         Hearsum contributed a status plugin which sends email in the same
1364         format that Tinderbox does: this allows a number of tinderbox
1365         tools to be driven by Buildbot instead. Thanks Ben!
1367 2006-09-24  Brian Warner  <warner@lothar.com>
1369         * buildbot/changes/mail.py (parseBonsaiMail): fix the parser.
1370         Thanks to Robert Helmer for the patch.
1372         * buildbot/process/base.py (Build.setupSlaveBuilder): tell our
1373         BuildStatus about the buildslave name at the *beginning* of the
1374         build, rather than at the end. Thanks to Alexander Lorenz for the
1375         patch.
1376         * buildbot/status/html.py (StatusResourceBuild.body): always
1377         include the slavename in the build page, not just when the build
1378         has finished.
1379         * buildbot/status/mail.py (MailNotifier.buildMessage): include the
1380         slavename in the email message
1382 2006-09-21  Brian Warner  <warner@lothar.com>
1384         * buildbot/scripts/sample.cfg: update to use new BuildStep classes
1385         from buildbot.steps
1386         * docs/examples/glib_master.cfg: same
1387         * docs/examples/hello.cfg: same
1388         * docs/examples/twisted_master.cfg: same, update to current usage
1390 2006-09-19  Brian Warner  <warner@lothar.com>
1392         * buildbot/steps/python.py (PyFlakes): refactor, add summary logs
1393         (PyFlakes.createSummary): make it compatible with python-2.2
1395         * buildbot/test/test_steps.py (Python.testPyFlakes): add a test
1396         for at least the output-parsing parts of PyFlakes
1398 2006-09-18  Brian Warner  <warner@lothar.com>
1400         * buildbot/steps/python.py: oops, fix import of StringIO
1402 2006-09-17  Brian Warner  <warner@lothar.com>
1404         * buildbot/test/test_vc.py (VCBase._do_vctest_update_retry_1): it
1405         turns out that SVN-1.4.0 doesn't fail to update once you've
1406         replaced a file with a directory, unlike older versions of SVN and
1407         pretty much every other VC tool we support. Since what we really
1408         care about is that the update succeeds anyway, stop checking that
1409         the tree got clobbered and just assert that the build succeeded.
1410         (VCBase.printLogs): add a utility function for debugging
1412         * buildbot/process/step.py: oops, added extra imports by mistake
1414         * buildbot/changes/p4poller.py (P4Source._process_describe): do an
1415         rstrip() on the first line coming out of the 'p4 describe'
1416         process, to remove the stray ^M that Wade Brainerd reports seeing
1417         in the 'when' field. Fixes SF#1555985.
1419         * buildbot/master.py (BuildMaster.loadConfig): improve the error
1420         message logged when c['schedulers'] is not right
1421         * buildbot/scheduler.py (Scheduler.__init__): improve error
1422         message when a Scheduler() is created with the wrong arguments
1423         * buildbot/test/test_config.py (ConfigTest.testSchedulerErrors):
1424         verify that these error messages are emitted
1426         * buildbot/process/buildstep.py: rename step.py to buildstep.py .
1427         The idea is that all the base classes (like BuildStep and
1428         RemoteCommand and LogObserver) live in b.p.buildstep, and b.p.step
1429         will be a leftover backwards-compatibility file that only contains
1430         aliases for the steps that were moved out to buildbot.steps.*
1431         * lots: change imports to match
1432         * buildbot/process/step.py: add a DeprecationWarning if it ever
1433         gets imported
1435 2006-09-12  Brian Warner  <warner@lothar.com>
1437         * buildbot/scheduler.py (Scheduler.__init__): make sure that
1438         builderNames= is actually a sequence, since if you happen to give
1439         it a single builder-specification dictionary instead, it won't get
1440         caught by the existing assert. Thanks to Brett Neely for the
1441         catch.
1443         * buildbot/steps/python.py (BuildEPYDoc, PyFlakes): add new steps. No
1444         tests yet, alas.
1445         * docs/buildbot.texinfo (Python BuildSteps): document them
1446         (sendchange): include a link to PBChangeSource, since you need one
1448         * buildbot/steps/shell.py: clean up test-case-name line, remove some
1449         unnecessary imports
1450         * buildbot/steps/dummy.py: same
1452 2006-09-08  Brian Warner  <warner@lothar.com>
1454         * buildbot/steps/transfer.py (FileUpload,FileDownload): new
1455         BuildStep which lets you transfer files from the master to the
1456         slave or vice versa. Thanks to Albert Hofkamp for the original
1457         patch. Fixes SF#1504631.
1458         * buildbot/slave/commands.py (SlaveFileUploadCommand): slave-side
1459         support for it
1460         (SlaveFileDownloadCommand): same
1461         * docs/buildbot.texinfo (Transferring Files): document it
1462         * buildbot/test/test_transfer.py: test it
1463         * buildbot/test/runutils.py (StepTester): new utility class for
1464         testing BuildSteps and RemoteCommands without Builds or Bots or PB
1465         * buildbot/test/test_steps.py (CheckStepTester): validate that the
1466         utility class works
1468         * buildbot/interfaces.py (IStatusLog.readlines): make it easier to
1469         walk through StatusLogs one line at a time, mostly for the benefit
1470         of ShellCommand.createSummary methods. You can either walk through
1471         STDOUT or STDERR, but the default is STDOUT.
1473         * buildbot/status/builder.py (LogFile.readlines): implement it.
1474         Note that this is not yet memory-efficient, it just pulls the
1475         whole file into RAM and then splits it up with a StringIO.
1476         Eventually this should be a generator that only pulls chunks from
1477         disk as necessary.
1478         * buildbot/test/test_status.py (Log.testReadlines): test it
1480         * docs/buildbot.texinfo: update to match changes
1481         * buildbot/process/factory.py: stop using old definitions
1482         * buildbot/process/process_twisted.py: same
1483         * buildbot/test/test_*.py: same
1485         * buildbot/process/step_twisted.py: move definition to..
1486         * buildbot/steps/python_twisted.py: .. here, unfortunately python's
1487         relative-import mechanisms prevent this from being named 'twisted'
1488         or 'python/twisted' as I would have preferred.
1490         * buildbot/process/maxq.py: move definition to..
1491         * buildbot/steps/maxq.py: .. here, leave a compatibility import
1493         * buildbot/process/step.py: split the user-visible BuildSteps into
1494         separate files, all under buildbot/steps/
1495         * buildbot/steps/source.py: this holds VC-checkout steps like SVN
1496         * buildbot/steps/shell.py: this holds ShellCommand and friends
1497         * buildbot/steps/dummy.py: this holds the testing steps like Dummy
1499 2006-09-05  Brian Warner  <warner@lothar.com>
1501         * lots: run pyflakes, removed a lot of unused imports, changed the
1502         form of some conditional imports to remove false pyflakes
1503         warnings. There are still a number of warnings left, mostly from
1504         imports that are done for their side-effects.
1505         * buildbot/test/test_vc.py: import twisted.python.failure, since it
1506         was missing
1508 2006-08-26  Brian Warner  <warner@lothar.com>
1510         * buildbot/test/test_locks.py (Unit.testLater): make the tests
1511         compatible with twisted-1.3.0, for some reason I just can't seem
1512         to let go of the past.
1514 2006-08-25  Brian Warner  <warner@lothar.com>
1516         * buildbot/status/mail.py (MailNotifier.__init__): fix typo in docs
1518         * buildbot/process/step.py (LoggingBuildStep.startCommand): set up
1519         all logfiles= in startCommand(), rather than in start() . This
1520         makes it easier to have the 'stdio' log come before any secondary
1521         logfiles, which I feel makes the waterfall display more
1522         understandable.
1523         (LoggingBuildStep.setupLogfiles): move the addLog/cmd.useLog code
1524         from ShellCommand up into LoggingBuildStep
1525         (LoggingBuildStep.__init__): move the handling of logfiles= from
1526         ShellCommand up to LoggingBuildStep, because startCommand is
1527         provided by LoggingBuildStep, whereas start() was specific to
1528         subclasses like ShellCommand and Source. This removes code
1529         duplication in those subclasses.
1530         (ShellCommand.__init__): same
1531         (ShellCommand.checkForOldSlaveAndLogfiles): split out the check
1532         for a slave that's too old to understand logfiles= into a separate
1533         method, so it can live in ShellCommand. The rest of
1534         setupLogfiles() can live in LoggingBuildStep.
1536 2006-08-24  Brian Warner  <warner@lothar.com>
1538         * buildbot/locks.py (BaseLock): you can now configure Locks to
1539         allow multiple simultaneous owners. They still default to
1540         maxCount=1. Fixes SF#1434997. Thanks to James Knight (foom) for
1541         the patch.
1542         * docs/buildbot.texinfo (Interlocks): document the new options
1543         * buildbot/test/test_locks.py: add a bunch of new unit tests
1544         * buildbot/process/base.py (Build.acquireLocks): locks now offer
1545         waitUntilMaybeAvailable, not waitUntilAvailable
1546         * buildbot/process/step.py (BuildStep.acquireLocks): same
1547         * buildbot/master.py (BotMaster.getLockByID): real locks now use
1548         the whole lockid in their constructor, not just the name. Also,
1549         keep track of which real locks we've handed out by the full
1550         lockid, not just class+name, otherwise changing just the maxCount=
1551         in the master.cfg file would not actually cause a behavioral
1552         change
1554 2006-08-23  Brian Warner  <warner@lothar.com>
1556         * buildbot/__init__.py (version): bump to 0.7.4+ while between
1557         releases
1558         * docs/buildbot.texinfo: same
1560 2006-08-23  Brian Warner  <warner@lothar.com>
1562         * buildbot/__init__.py (version): Releasing buildbot-0.7.4
1563         * docs/buildbot.texinfo: set version to match
1564         * NEWS: update for 0.7.4
1565         * buildbot/slave/commands.py (command_version): mention that this
1566         version (2.1) was released with buildbot-0.7.4
1568 2006-08-22  Brian Warner  <warner@lothar.com>
1570         * README: update
1572         * CREDITS: new file, list of people who have helped. Thanks!
1573         * MANIFEST.in: ship it
1575         * MANIFEST.in: stop shipping the old PyCon-2003 paper.. with the
1576         new diagrams, the user's manual is more informative than it was.
1577         Start shipping the .html user's manual (and generated .png
1578         images).
1579         * Makefile: update 'release' target to match
1581         * buildbot/test/test_web.py (GetURL.testBrokenStuff): delete this
1582         test.. I think the web-parts effort will render it pointless well
1583         before it ever actually starts to work.
1585 2006-08-20  Brian Warner  <warner@lothar.com>
1587         * buildbot/changes/pb.py (PBChangeSource): fix and simplify
1588         meaning of the prefix= argument. It is now just a string which is
1589         stripped from the beginning of the filename. If prefix= is set but
1590         not found on any given filename, that filename is ignored. If all
1591         filenames in a Change are ignored, the Change is dropped. This is
1592         much simpler than the previous sep= nonsense, and I should have
1593         implemented it this way from the beginning. Effectively resolves
1594         SF#1217699 and SF#1381867. Thanks to Gary Granger and Marius
1595         Gedminas for the catch and suggested fixes.
1596         (ChangePerspective.perspective_addChange): implement the actual
1597         prefix comparison
1598         * buildbot/test/test_changes.py (TestChangePerspective): test it
1599         * docs/buildbot.texinfo (PBChangeSource): document it, explain
1600         how to properly use prefix=
1601         * docs/examples/twisted_master.cfg (source): update prefix= by
1602         adding the trailing slash
1605         * docs/examples/twisted_master.cfg: update to actual practice
1607         * buildbot/test/test_web.py (WaterfallSteps.test_urls): oops,
1608         update test case to match new link text.. the HREF has both a
1609         class= setting and an enclosing [] pair that I didn't match in the
1610         test.
1612         * docs/buildbot.texinfo (ShellCommand.command=): explain why a
1613         list of strings is preferred over a single string with embedded
1614         spaces
1615         (ShellCommand.description=): explain that either single strings or
1616         a list of strings is acceptable, and why you might prefer one over
1617         the other. Add an example. Fixes SF#1524659, thanks to Paul
1618         Winkler for the catch.
1619         (Build Steps): update to use f.addStep() rather than using s()
1620         and the constructor list
1622         * buildbot/process/step.py (ShellCommand): accept either a single
1623         string or a list of strings in both description= and
1624         descriptionDone=
1625         * buildbot/test/test_steps.py (Steps.test_description): test it
1626         * buildbot/test/runutils.py (makeBuildStep): support for that test
1628         * contrib/CSS/*.css: add some contributed CSS stylesheets, to make
1629         the Waterfall display a bit less ugly. Thanks to John O'Duinn for
1630         collecting the files and creating the patch.
1632         * docs/buildbot.texinfo (BuildStep URLs): document new feature:
1633         per-step URLs that will be displayed on the waterfall display,
1634         for things like the HTML output of code-coverage tools, when
1635         the results are hosted elsewhere.
1636         * buildbot/interfaces.py (IBuildStepStatus.getURLs): document the
1637         way to retrieve these URLs
1638         * buildbot/status/builder.py (BuildStepStatus.getURLs): implement
1639         the method to retrieve these URLs. Also provide backwards
1640         compatibility for saved BuildStepStatus instances that didn't have
1641         the .urls attribute
1642         * buildbot/process/step.py (BuildStep.addURL): method to set these
1643         URLs from within a BuildStep
1644         * buildbot/status/html.py (StepBox.getBox): emit links to the URLs
1645         (StepBox.getBox): give these external links a distinct CSS class
1646         named "BuildStep external" so a .css file can display them
1647         differently
1649         * buildbot/test/test_web.py (WaterfallSteps): test that we really
1650         do emit those links
1651         * buildbot/test/test_steps.py (Steps): test that we can all the
1652         URLs. Also add a bunch of other tests on methods that can be
1653         called from within BuildSteps
1654         * buildbot/test/runutils.py (makeBuildStep): add utility function
1656 2006-08-13  Brian Warner  <warner@lothar.com>
1658         * docs/buildbot.texinfo (BuildStep LogFiles): document them
1660 2006-08-10  Brian Warner  <warner@lothar.com>
1662         * docs/buildbot.texinfo (Index of master.cfg keys): add another
1663         index, this one of things like c['sources'] and c['schedulers']
1664         (indices): it looks like my clever idea of putting the @fooindex
1665         commands in between the @node and the @subsection (to make the
1666         HREF anchor jump to slightly above the section title, which works
1667         much better in html) confused texinfo horribly, so I'm moving the
1668         index tags back to be just after the @subsection marker. I also
1669         added extra lines between the @node/@section paragraph and the
1670         index tags, since I think maybe texinfo wants to see these be
1671         separate paragraphs.
1673         * docs/Makefile (images): make sure images get built when
1674         rendering the manual
1675         * docs/images/Makefile: same
1677         * buildbot/scripts/runner.py: rename 'buildbot master' to
1678         'buildbot create-master', and 'buildbot slave' to 'buildbot
1679         create-slave'
1680         * docs/buildbot.texinfo: same
1681         * README: same
1683         * docs/buildbot.texinfo: reimplement the "useful classes" index
1684         with actual texinfo indices. The .info rendering is a bit
1685         weird-looking but it works well, and the HTML rendering is quite
1686         nice. This also puts the index targets in the regular flow of the
1687         text, which is easier to maintain.
1689 2006-08-06  Brian Warner  <warner@lothar.com>
1691         * buildbot/slave/commands.py (ShellCommand.__init__): patch from
1692         Kevin Turner to prefer the environ= argument be a list rather than
1693         a string. If it is a list, it will be joined with a platform-local
1694         os.pathsep delimiter, and then prepended to any existing
1695         $PYTHONPATH value. This works better in cross-platform (i.e.
1696         windows buildslaves) environments when you need to push multiple
1697         directories onto the front of the path.
1698         (SlaveShellCommand): documented the new magic
1699         * docs/buildbot.texinfo (ShellCommand): documented the new magic
1700         in a user-visible form
1702         * buildbot/test/test_vc.py (BaseHelper.dovc): patch from Kevin
1703         Turner to prefer lists over strings when creating/running VC
1704         commands during unit tests. This is clearly necessary to survive
1705         vcexe containing spaces, like "C:\Program Files\darcs.exe". I
1706         renamed the wq() function to qw() though, since that's how it's
1707         spelled in perl. Eventually I'd prefer all commands to be
1708         specified with lists.
1710         * buildbot/slave/commands.py (LogFileWatcher): handle logfiles
1711         which are deleted (or not yet created) correctly. Also add
1712         failsafe code to not explode if the file-watching poller doesn't
1713         get started. Thanks to JP Calderone for the catch and the poller
1714         patch.
1715         * buildbot/test/test_shell.py (SlaveSide._testLogFiles): add test
1716         for that case
1717         * buildbot/test/emitlogs.py: same
1719         * NEWS: summarize recent changes
1721         * docs/buildbot.texinfo (Debug options): suggest an .ssh/options
1722         clause to avoid the "host key mismatch" warning
1724         * buildbot/process/step_twisted.py (Trial.start): if the
1725         buildslave is too old to understand logfiles=, fall back to
1726         running 'cat _trial_temp/test.log' like before.
1727         (Trial.commandComplete): same. this takes advantage of the
1728         LoggingBuildStep refactoring to stall commandComplete long enough
1729         to run a second RemoteShellCommand.
1731         * buildbot/process/step.py (LoggingBuildStep.startCommand):
1732         refactor command-completion handling, to allow methods like
1733         commandComplete/createSummary/evaluateCommand to return Deferreds.
1734         (LoggingBuildStep._commandComplete): delete the refactored method
1735         (ShellCommand.setupLogfiles): if the buildslave is too old to
1736         understand logfiles=, put a warning message both into twistd.log
1737         and into the otherwise empty user-visible LogFiles.
1739         * buildbot/process/step.py (LoggedRemoteCommand.useLog): allow
1740         callers to provide the slave-side logfile name, rather than
1741         forcing it to come from the local name of the LogFile.
1742         (BuildStep.getSlaveName): new method
1744         * buildbot/process/base.py (Build.getSlaveName): new method, so
1745         steps can find out which buildslave they're running on
1747         * buildbot/test/test_steps.py (Version.checkCompare): oops, update
1748         to match the s/cvs_ver/command_version/ change
1750 2006-08-05  Brian Warner  <warner@lothar.com>
1752         * buildbot/slave/commands.py (command_version): replace the CVS
1753         auto-updated cvs_ver keyword with a manually-updated variable,
1754         since CVS is no longer the master repository. Add a description of
1755         the remote API change starting in this version (2.1), specifically
1756         the fact that SlaveShellCommand now accepts 'initial_stdin',
1757         'keep_stdin_open', and 'logfiles'.
1759 2006-07-31  Brian Warner  <warner@lothar.com>
1761         * docs/buildbot.texinfo (System Architecture): Finally add lots of
1762         diagrams to describe how the whole system fits together. The
1763         images themselves are kept in SVG files, with ascii-art versions
1764         in corresponding .txt files. Texinfo knows how to interpolate the
1765         text version into .info files, reference the .png versions from
1766         .html files, and include .eps versions in the .ps format.
1767         * docs/images/Makefile: tools to create .png and .eps
1768         * docs/images/*.svg: created pictures with Inkscape.
1769         * .darcs-boring: ignore the generated .eps and .png files
1771 2006-07-24  Brian Warner  <warner@lothar.com>
1773         * buildbot/master.py (BuildMaster.loadConfig): check for duplicate
1774         Scheduler names, since they cause setServiceParent to explode
1775         later.
1776         * buildbot/test/test_config.py (ConfigTest._testSchedulers_7): test it
1778 2006-07-20  Brian Warner  <warner@lothar.com>
1780         * buildbot/scripts/sample.cfg: simplify the sample BuildFactory,
1781         which runs the buildbot unit tests
1783         * docs/buildbot.texinfo (Index of Useful Classes): add a table of
1784         classes that are useful in master.cfg
1786 2006-07-15  Brian Warner  <warner@lothar.com>
1788         * Makefile (some-apidocs): new target to build only some epydocs
1790         * setup.py: minor comment.. does the classifiers= argument prevent
1791         the setup.py script from working on python2.2/2.3?
1793         * buildbot/scripts/sample.cfg: update manhole example, arrange into
1794         major sections
1796         * buildbot/twcompat.py: fix minor typo in comments
1798         * buildbot/manhole.py: move all Manhole-related code out to this
1799         module. Implement SSH-based manholes (with TwistedConch), and move
1800         to conch's nifty line-editing syntax-coloring REPL shell instead
1801         of the boring non-editing monochromatic (and deprecated) old
1802         'telnet' protocol.
1803         * buildbot/master.py: remove all Manhole-related code
1804         (BuildMaster.loadConfig._add): make sure the old manhole is
1805         removed before we add the new one
1806         * docs/buildbot.texinfo (Debug options): document new Manhole options
1808         * buildbot/twcompat.py (_which): fix some epydoc issues
1809         * buildbot/status/html.py (Waterfall.__init__): same
1811 2006-06-29  Brian Warner  <warner@lothar.com>
1813         * buildbot/interfaces.py: get Interface from b.twcompat to hush
1814         deprecation warnings under newer Twisteds (by using
1815         zope.interface.Interface instead of old twisted.python.components
1816         stuff)
1817         * buildbot/slave/interfaces.py: same
1819 2006-06-28  Brian Warner  <warner@lothar.com>
1821         * buildbot/slave/commands.py (SVN): add --non-interactive to all
1822         svn commands, so it will fail immediately instead of hanging while
1823         it waits for a username/password to be typed in.
1825         * buildbot/slave/bot.py (SlaveBuilder.commandComplete): add minor
1826         log message if the step was shut down
1828         * buildbot/scripts/runner.py (SlaveOptions.longdesc): remove
1829         obsolete reference to mktap.
1831 2006-06-20  Brian Warner  <warner@lothar.com>
1833         * buildbot/test/test_steps.py (BuildStep.testShellCommand1): update
1834         test to include new 'logfiles' argument sent from master to slave
1836 2006-06-19  Brian Warner  <warner@lothar.com>
1838         * buildbot/process/step_twisted.py (Trial): track Progress from
1839         _trial_temp/test.log too
1841         * buildbot/process/step.py (OutputProgressObserver): generalize
1842         the earlier StdioProgressObserver into an OutputProgressObserver
1843         that can track LogFiles other than stdio.
1844         (LoggingBuildStep.__init__): same
1846         * buildbot/process/step_twisted.py (Trial): use logfiles= to track
1847         _trial_temp/test.log, not a separate 'cat' command. TODO: this
1848         will fail under windows because of os.sep issues. It might have
1849         worked before if 'cat' was doing cygwin path conversion.
1851         * buildbot/slave/commands.py (LogFileWatcher.__init__): note the
1852         creation of LogFileWatchers
1853         (ShellCommand._startCommand): and record the files that were
1854         watched in the 'headers' section of the ShellCommand output
1856         * buildbot/process/step.py (RemoteShellCommand.__init__): duh, you
1857         need to actually pass it to the slave if you want it to work.
1858         (ShellCommand): document it a bit
1860         * buildbot/test/test_shell.py: new test to validate LogFiles
1861         * buildbot/test/runutils.py (SlaveCommandTestBase): updates to
1862         test LogFiles
1863         * buildbot/test/emitlogs.py: enhance to wait for a line on stdin
1864         before printing the last batch of lines, to test that the polling
1865         logic is working properly
1867         * buildbot/process/step.py (LoggedRemoteCommand): improve LogFile
1868         handling, making it possible to track multiple logs for a single
1869         RemoteCommand. The previous single logfile is now known as the
1870         'stdio' log.
1871         (LoggedRemoteCommand.remoteUpdate): accept key='log' updates
1872         (RemoteShellCommand.__init__): accept logfiles=
1873         (LoggingBuildStep.startCommand): stdio_log is now one of many
1874         (ShellCommand): added logfiles= argument, as well as a class-level
1875         .logfiles attribute, which will be merged together to figure out
1876         which logfiles should be tracked. The latter maybe be useful for
1877         subclasses of ShellCommand which know they will aways produce
1878         secondary logfiles in the same location.
1880         * buildbot/slave/commands.py (ShellCommandPP): add writeStdin()
1881         and closeStdin() methods, preparing to make it possible to write
1882         to a ShellCommand's stdin at any time, not just at startup. These
1883         writes are buffered if the child process hasn't started yet.
1884         (LogFileWatcher): new helper class to watch arbitrary logfiles
1885         while a ShellCommand runs. This class polls the file every two
1886         seconds, and sends back 10k chunks to the buildmaster.
1887         (ShellCommand): rename stdin= to initialStdin=, and add
1888         keepStdinOpen= and logfiles= to arguments. Set up LogFileWatchers
1889         at startup.
1890         (ShellCommand.addLogfile): LogFile text is sent in updates with a
1891         key of "log" and a value of (logname, data).
1892         (SlaveShellCommand): add 'initial_stdin', 'keep_stdin_open', and
1893         'logfiles' to the master-visible args dictionary.
1894         (SourceBase.doPatch): match s/stdin/initialStdin/ change
1895         (CVS.start): same
1896         (P4.doVCFull): same
1897         * buildbot/test/test_vc.py (Patch.testPatch): same
1900         * buildbot/test/emit.py: write to a logfile in the current
1901         directory. We use this to figure out what was used as a basedir
1902         rather than looking to see which copy of emit.py gets run, so that
1903         we can run the commands from inside _trial_temp rather than inside
1904         buildbot/test
1905         * buildbot/test/subdir/emit.py: same
1906         * buildbot/test/runutils.py (FakeSlaveBuilder): take a 'basedir'
1907         argument rather than running from buildbot/test/
1908         (SlaveCommandTestBase.setUpBuilder): explicitly set up the Builder
1909         rather than using an implicit setUp()
1910         * buildbot/test/test_slavecommand.py (ShellBase.setUp): same
1911         (ShellBase.testShell1, etc): use explicit path to emit.py instead
1912         of assuming that we're running in buildbot/test/ (and that '.' is
1913         on our $PATH)
1915         * buildbot/slave/commands.py (Command.doStart): refactor Command
1916         startup/completion a bit: now the SlaveBuilder calls doStart(),
1917         which is not meant for overridding by subclasses, and doStart()
1918         calls start(), which is. Likewise the SlaveBuilder calls
1919         doInterrupt(), and subclasses override interrupt(). This also puts
1920         responsibility for maintaining .running in Command rather than in
1921         SlaveBuilder.
1922         (Command.doInterrupt): same
1923         (Command.commandComplete): same, this is called when the deferred
1924         returned by start() completes.
1925         * buildbot/slave/bot.py (SlaveBuilder.remote_startCommand): same
1926         (SlaveBuilder.remote_interruptCommand): same
1927         (SlaveBuilder.stopCommand): same
1929 2006-06-16  Brian Warner  <warner@lothar.com>
1931         * buildbot/test/test_shell.py: new test file to contain everything
1932         relating to ShellCommand
1933         (SlaveSide.testLogFiles): (todo) test for the upcoming "watch
1934         multiple logfiles in realtime" feature, not yet implemented
1935         * buildbot/test/emitlogs.py: support file for testLogFiles
1936         * docs/buildbot.texinfo (ShellCommand): document the feature
1938         * buildbot/test/test_steps.py (BuildStep.setUp): rmtree refactoring
1940         * buildbot/test/runutils.py (SlaveCommandTestBase): utility class
1941         for tests which exercise SlaveCommands in isolation.
1943         * buildbot/test/test_slavecommand.py: Move some utilities like
1944         SignalMixin and FakeSlaveBuilder from here ..
1945         * buildbot/test/runutils.py: .. to here, so they can be used by
1946         other test classes too
1947         * buildbot/test/test_vc.py: more SignalMixin refactoring
1948         * buildbot/test/test_control.py: same
1949         * buildbot/test/test_run.py: and some rmtree refactoring
1951 2006-06-15  Brian Warner  <warner@lothar.com>
1953         * buildbot/test/test_vc.py (P4.testCheckoutBranch): rename from
1954         'testBranch' to match other VC tests and have the tests run in
1955         roughly increasing order of dependency
1957         * buildbot/test/test_steps.py (LogObserver): new test to verify
1958         LogObservers can be created at various times and still get
1959         connected up properly
1961         * buildbot/test/runutils.py (setupBuildStepStatus): utility method
1962         to create BuildStepStatus instances that actually work.
1964         * buildbot/process/step.py (LogObserver): add outReceived and
1965         errReceived base methods, to be overridden
1967         * buildbot/status/builder.py (BuildStatus.addStepWithName): change
1968         API to take a name instead of a step, reducing the coupling
1969         somewhat. This returns the BuildStepStatus object so it can be
1970         passed to the new Step, instead of jamming it directly into the
1971         Step.
1972         * buildbot/process/step.py (BuildStep.setStepStatus): add a setter
1973         method
1974         * buildbot/process/base.py (Build.setupBuild): use both methods
1975         * buildbot/test/test_web.py (Logfile.setUp): rearrange the setup
1976         process a bit to match
1978 2006-06-14  Brian Warner  <warner@lothar.com>
1980         * docs/buildbot.texinfo (Adding LogObservers): add some limited
1981         docs on writing new LogObserver classes
1982         (Writing New Status Plugins): brief docs on how Status Plugins fit
1983         together
1985         * buildbot/process/step_twisted.py (TrialTestCaseCounter):
1986         implement a LogObserver that counts how many unit tests have been
1987         run so far
1988         (Trial.__init__): wire it in
1989         * buildbot/test/test_twisted.py (Counter): unit test for it
1991         * buildbot/process/step_twisted.py (HLint.commandComplete): update
1992         to new cmd.logs['stdio'] scheme
1993         (Trial.commandComplete): same
1994         (BuildDebs.commandComplete): same
1996         * buildbot/process/step.py (LoggedRemoteCommand): use a dict of
1997         LogFiles, instead of just a single one. The old single logfile is
1998         now called "stdio". LoggedRemoteCommand no longer creates a
1999         LogFile for you (the code to do that was broken anyway). If you
2000         don't create a "stdio" LogFile, then stdout/stderr will be
2001         discarded.
2002         (LogObserver): implement "LogObservers", which a BuildStep can add
2003         to parse the output of a command in real-time. The primary use is
2004         to provide more useful information to the Progress code, allowing
2005         better ETA estimates.
2006         (LogLineObserver): utility subclass which feeds complete lines to
2007         the parser instead of bytes.
2008         (BuildStep.progressMetrics): this is safer as a tuple
2009         (BuildStep.setProgress): utility method, meant to be called by
2010         LogObservers
2011         (BuildStep.addLogObserver): new method, to be called at any time
2012         during the BuildStep (even before any LogFiles have been created),
2013         to attach (or schedule for eventual attachment) a LogObserver to a
2014         LogFile.
2015         (StdioProgressObserver): new LogObserver which replaces the old
2016         "output" progress gatherer
2017         (LoggingBuildStep.__init__): same
2018         (LoggingBuildStep.startCommand): set up the "stdio" LogFile
2019         (LoggingBuildStep._commandComplete): must use logs['stdio']
2020         instead of the old single ".log" attribute.
2021         * buildbot/status/builder.py (LogFile): remove old logProgressTo
2022         functionality, now subsumed into StdioProgressObserver
2023         * buildbot/test/test_status.py (Subscription._testSlave_2): the
2024         log name changed from "output" to "stdio".
2027         * buildbot/interfaces.py (ILogFile): add the Interface used from
2028         the BuildStep towards the LogFile
2029         (ILogObserver): and the one provided by a LogObserver
2030         * buildbot/status/builder.py (LogFile): implement it
2032         * buildbot/interfaces.py (LOG_CHANNEL_*): move STDOUT / STDERR /
2033         HEADER constants here ..
2034         * buildbot/status/builder.py (STDOUT): .. from here
2036 2006-06-13  Brian Warner  <warner@lothar.com>
2038         * buildbot/test/test_p4poller.py (TestP4Poller.failUnlessIn): fix
2039         compatibility with python2.2, which doesn't have the 'substr in
2040         str' feature.
2041         (TestP4Poller.makeTime): utility function to construct the
2042         timestamp using the same strptime() approach as p4poller does. It
2043         turns out that time.mktime() behaves slightly differently under
2044         python2.2, probably something to do with the DST flag, and that
2045         causes the test to fail under python2.2. (changing the mktime()
2046         arguments to have dst=0 instead of -1 caused it to fail under
2047         python2.3. Go figure.)
2048         (TestP4Poller._testCheck3): use our makeTime() instead of mktime()
2050 2006-06-12  Brian Warner  <warner@lothar.com>
2052         * buildbot/process/step.py (P4): merge in patch SF#1473939, adding
2053         proper Perforce (P4) support. Many many thanks to Scott Lamb for
2054         contributing such an excellent patch, including docs and unit
2055         tests! This makes it *so* much easier to apply. I had to update
2056         test_vc.py to handle some recent refactorings, but everything else
2057         applied smoothly. The only remaining thing I'd like to fix would
2058         be to remove the hard-wired port 1666 used by p4d, and allow it to
2059         claim any unused port. This would allow two copies of the test
2060         suite to run on the same host at the same time, as well as
2061         allowing the test suite to run while a real (production) p4d was
2062         running on the same host. Oh, and maybe we should add a warning to
2063         step.P4 that gets emitted if the slave is too old to provide the
2064         'p4' SlaveCommand. Otherwise it looks great. (closes: SF#1473939).
2065         * buildbot/slave/commands.py (P4): same
2066         (P4Sync): same, some minor updates
2067         * buildbot/changes/p4poller.py: same
2068         * docs/buildbot.texinfo: same
2069         * buildbot/test/test_p4poller.py: same
2070         * buildbot/test/test_vc.py (P4): same
2072         * setup.py: add Trove classifiers for PyPI
2074 2006-06-08  Brian Warner  <warner@allmydata.com>
2076         * buildbot/status/client.py
2077         (RemoteBuilder.remote_getCurrentBuilds): oops, I screwed up when
2078         changing this from getCurrentBuild() to getCurrentBuilds(). Each
2079         build needs to be IRemote'd separately, rather than IRemote'ing
2080         the whole list at once. I can't wait until newpb's serialization
2081         adapters make this unnecessary.
2083 2006-06-06  Brian Warner  <warner@lothar.com>
2085         * buildbot/process/step.py (WithProperties): make this inherit
2086         from ComparableMixin, so that reloading an unchanged config file
2087         doesn't cause us to spuriously reload any Builders which use them.
2088         * buildbot/test/test_config.py (ConfigTest.testWithProperties):
2089         add a test for it
2091 2006-06-03  Brian Warner  <warner@lothar.com>
2093         * contrib/windows/{setup.py, buildbot_service.py}: add support for
2094         running py2exe on windows, contributed by Mark Hammond. Addresses
2095         SF#1401121, but I think we still need to include
2096         buildbot/scripts/sample.cfg
2097         * setup.py: include buildbot_service.py as a script under windows
2098         * buildbot/status/html.py: when sys.frozen (i.e. we're running in
2099         a py2exe application), get the icon/css datafiles from a different
2100         place than usual.
2102         * buildbot/status/mail.py (MailNotifier.buildMessage): don't
2103         double-escape the build URL. Thanks to Olivier Bonnet for the
2104         patch. Fixes SF#1452801.
2106 2006-06-02  Brian Warner  <warner@lothar.com>
2108         * contrib/svn_buildbot.py (ChangeSender.getChanges): ignore the
2109         first six columns of 'svnlook' output, not just the first column,
2110         since property changes appear in the other five. Thanks to Olivier
2111         Bonnet for the patch. Fixes SF#1398174.
2113 2006-06-01  Brian Warner  <warner@lothar.com>
2115         * buildbot/test/test_web.py (Logfile.setUp): set the .reason on
2116         the fake build, so that title= has something to be set to
2118         * buildbot/status/html.py (BuildBox.getBox): set the 'title='
2119         attribute of the "Build #NN" link in the yellow start-the-build
2120         box to the build's reason. This means that you get a little
2121         tooltip explaining why the build was done when you hover over the
2122         yellow box. Thanks to Zandr Milewski for the suggestion.
2124         * buildbot/clients/gtkPanes.py (Box.setColor): ignore color=None
2125         (Box.setETA): handle ETA=None (by stopping the timer)
2126         (Box.update): make the [soon] text less different than the usual
2127         text, so the rest of the text doesn't flop around so much. It
2128         would be awfully nice to figure out how to center this stuff.
2129         (ThreeRowBuilder.stepETAUpdate): more debugging printouts
2131         * buildbot/process/step.py (ShellCommand): set flunkOnFailure=True
2132         by default, so that any ShellCommand which fails marks the overall
2133         build as a failure. I should have done this from the beginning.
2134         Add flunkOnFailure=False to the arguments if you want to turn off
2135         this behavior.
2137 2006-05-30  Brian Warner  <warner@lothar.com>
2139         * buildbot/clients/gtkPanes.py: add a third row: now it shows
2140         last-build/current-build/current-step. Show what step is currently
2141         running. Show ETA for both the overall build and the current step.
2142         Update GTK calls to modern non-deprecated forms. There's still a
2143         lot of dead code and debug noise to remove.
2145         * buildbot/process/step_twisted.py (Trial): set the step name, so it
2146         shows up properly in status displays
2148 2006-05-28  Brian Warner  <warner@lothar.com>
2150         * buildbot/test/test_properties.py (Run.testInterpolate): on the
2151         build we use to verify that WithProperties works:
2153         ** set flunkOnFailure=True so that build failures get noticed
2154         ** set workdir='.' so that the build succeeds, otherwise it is trying
2155             to touch 'build/something', and 'build/' doesn't exist because
2156             usually that's created by a Source step
2157         ** set timeout=10, because Twisted-1.3.0 has a race condition that
2158             this test somehow triggers, in which the 'touch' process becomes
2159             a zombie and we wait for th etimeout before giving up on it.
2161         * buildbot/test/runutils.py (RunMixin.logBuildResults): utility method
2162         to log the Build results and step logs to the twisted log.
2163         (RunMixin.failUnlessBuildSucceeded): use logBuildResults to record
2164         what went wrong if a build was expected to succeed but didn't.
2166         * buildbot/process/step_twisted.py (Trial): set the default
2167         trialMode to '--reporter=bwverbose', which specifies verbose
2168         black-and-white text. Back in twisted-1.3/2.0 days we had to use
2169         '-to', but those are completely missing in modern Twisteds.
2171         * buildbot/scripts/sample.cfg: make the sample Manhole config use
2172         a localhost-only port, to encourage better security
2174         * docs/buildbot.texinfo (Change Sources): mention
2175         darcs_buildbot.py
2177         * .darcs-boring: add a Darcs boringfile
2179         * README (REQUIREMENTS): stop claiming compatibility with
2180         Twisted-1.3.0
2182         * contrib/darcs_buildbot.py: write a darcs-commit-hook change
2183         sender
2185 2006-05-27  Brian Warner  <warner@lothar.com>
2187         * buildbot/__init__.py: bump to 0.7.3+ while between releases
2188         * docs/buildbot.texinfo: same
2190 2006-05-23  Brian Warner  <warner@lothar.com>
2192         * buildbot/__init__.py (version): Releasing buildbot-0.7.3
2193         * docs/buildbot.texinfo: set version to match
2194         * NEWS: update for 0.7.3
2196         * docs/buildbot.texinfo (Change Sources): mention hg_buildbot.py,
2197         give a quick mapping from VC system to possible ChangeSources
2198         (Build Properties): add 'buildername'
2200         * buildbot/process/base.py (Build.setupStatus): oops, set
2201         'buildername' and 'buildnumber' properties
2202         * buildbot/test/test_properties.py (Interpolate.testBuildNumber):
2203         test them
2205 2006-05-22  Brian Warner  <warner@lothar.com>
2207         * docs/buildbot.texinfo (Build Properties): explain the syntax of
2208         property interpolation better
2210         * README (INSTALLATION): remove old '-v' argument from recommended
2211         trial command line
2213         * docs/buildbot.texinfo (ShellCommand): add docs for description=
2214         and descriptionDone= arguments. Thanks to Niklaus Giger for the
2215         patch. SF#1475494.
2217         * buildbot/slave/commands.py (SVN.parseGotRevision._parse): use
2218         'svnversion' instead of grepping the output of 'svn info', much
2219         simpler and avoids CR/LF problems on windows. Thanks to Olivier
2220         Bonnet for the suggestion.
2221         (SVN.parseGotRevision): oops, older verisons of 'svnversion'
2222         require the WC_PATH argument, so run 'svnversion .' instead.
2224         * buildbot/interfaces.py (IChangeSource): methods in Interfaces
2225         aren't supposed to have 'self' in their argument list
2227 2006-05-21  Brian Warner  <warner@lothar.com>
2229         * buildbot/process/step.py (ShellCommand.start): make
2230         testInterpolate pass. I was passing the uninterpolated command to
2231         the RemoteShellCommand constructor
2232         (ShellCommand._interpolateProperties): oops, handle non-list
2233         commands (i.e. strings with multiple words separated by spaces in
2234         them) properly, instead of forgetting about them.
2236         * buildbot/test/test_properties.py (Run.testInterpolate): new test
2237         to actually try to use build properties in a real build. This test
2238         fails.
2239         * buildbot/test/runutils.py (RunMixin.requestBuild): utility methods
2240         to start and evaluate builds
2242         * buildbot/test/test__versions.py: add a pseudo-test to record
2243         what version of Twisted/Python/Buildbot are running. This should
2244         show up at the beginning of _trial_tmp/test.log, and exists to help
2245         debug other problems.
2247         * buildbot/status/html.py (Waterfall): add 'robots_txt=' argument,
2248         a filename to be served as 'robots.txt' to discourage web spiders.
2249         Adapted from a patch by Tobi Vollebregt, thanks!
2250         * buildbot/test/test_web.py (Waterfall._test_waterfall_5): test it
2251         (Waterfall.test_waterfall): tweak the way that filenames are put
2252         into the config file, to accomodate windows pathnames better.
2254         * docs/buildbot.texinfo (HTML Waterfall): document it
2256         * buildbot/process/process_twisted.py
2257         (QuickTwistedBuildFactory.__init__): recent versions of Twisted
2258         changed the build process. The new setup.py no longer takes the
2259         'all' argument.
2260         (FullTwistedBuildFactory.__init__): same
2261         (TwistedReactorsBuildFactory.__init__): same
2263         * contrib/hg_buildbot.py: wrote a commit script for mercurial, to
2264         be placed in the [hooks] section of the central repository (the
2265         one that everybody pushes changes to).
2267 2006-05-20  Brian Warner  <warner@lothar.com>
2269         * buildbot/slave/commands.py (Darcs.doVCFull): when writing the
2270         .darcs-context file, use binary mode. I think this was causing a
2271         Darcs failure under windows.
2273 2006-05-19  Brian Warner  <warner@lothar.com>
2275         * buildbot/scripts/tryclient.py (CVSExtractor.getBaseRevision):
2276         use a timezone string of +0000 and gmtime, since this timestamp is
2277         sent to a buildmaster and %z is broken.
2279         * buildbot/test/test_vc.py (CVSHelper.getdate): use no timezone
2280         string and localtime, since this timestamp will only be consumed
2281         locally, and %z is broken.
2283         * buildbot/slave/commands.py (CVS.parseGotRevision): use +0000 and
2284         gmtime, since this timestamp is returned to the buildmaster, and
2285         %z is broken.
2287 2006-05-18  Brian Warner  <warner@lothar.com>
2289         * NEWS: update in preparation for next release
2291         * buildbot/test/test_vc.py (VCS_Helper): factor out all the
2292         setup-repository and do-we-have-the-vc-tools code into a separate
2293         "helper" class, which sticks around in a single module-level
2294         object. This seems more likely to continue to work in the future
2295         than having it hide in the TestCase and hope that TestCases stick
2296         around for a long time.
2298         * buildbot/test/test_vc.py (MercurialSupport.vc_create): 'hg
2299         addremove' has been deprecated in recent versions of mercurial, so
2300         use 'hg add' instead
2302 2006-05-07  Brian Warner  <warner@lothar.com>
2304         * buildbot/scheduler.py (Try_Jobdir.messageReceived): when
2305         operating under windows, move the file before opening it, since
2306         you can't rename a file that somebody has open.
2308         * buildbot/process/base.py (Build.setupBuild): if something goes
2309         wrong while creating a Step, log the name and arguments, since the
2310         error message when you get the number of arguments wrong is really
2311         opaque.
2313 2006-05-06  Brian Warner  <warner@lothar.com>
2315         * buildbot/process/step_twisted.py (Trial.setupEnvironment): more
2316         bugs in twisted-specific code not covered by my unit tests, this
2317         time use 'cmd' argument instead of self.cmd
2319         * buildbot/process/process_twisted.py (TwistedBuild.isFileImportant):
2320         fix stupid braino: either use startwith or find()==0, not both.
2321         (TwistedReactorsBuildFactory.__init__): another dumb typo
2323         * buildbot/test/test_slavecommand.py (ShellBase.testInterrupt1): 
2324         mark this test as TODO under windows, since process-killing seems
2325         dodgy there. We'll come back to this later and try to fix it
2326         properly.
2328         * buildbot/test/test_vc.py (CVSSupport.getdate): use localtime,
2329         and don't include a timezone
2330         (CVSSupport.vc_try_checkout): stop trying to strip the timezone.
2331         This should avoid the windows-with-verbose-timezone-name problem
2332         altogether.
2333         (Patch.testPatch): add a test which runs 'patch' with less
2334         overhead than the full VCBase.do_patch sequence, to try to isolate
2335         a windows test failure. This one uses slave.commands.ShellCommand
2336         and 'patch', but none of the VC code.
2338         * buildbot/slave/commands.py (getCommand): use which() to find the
2339         executables for 'cvs', 'svn', etc. This ought to help under
2340         windows.
2342         * buildbot/test/test_vc.py (VCBase.do_getpatch): Delete the
2343         working directory before starting. If an earlier test failed, the
2344         leftover directory would mistakenly flunk a later test.
2345         (ArchCommon.registerRepository): fix some tla-vs-baz problems.
2346         Make sure that we use the right commandlines if which("tla") picks
2347         up "tla.exe" (as it does under windows).
2348         (TlaSupport.do_get): factor out this tla-vs-baz difference
2349         (TlaSupport.vc_create): more tla-vs-baz differences
2351         * buildbot/test/test_slavecommand.py
2352         (ShellBase.testShellMissingCommand): stop trying to assert
2353         anything about the error message: different shells on different
2354         OSes with different languages makes it hard, and it really isn't
2355         that interesting of a thing to test anyway.
2357         * buildbot/test/test_vc.py (CVSSupport.capable): skip CVS tests if
2358         we detect cvs-1.10 (which is the version shipped with OS-X 10.3
2359         "Panther"), because it has a bug which flunks a couple tests in
2360         weird ways. I've checked that cvs-1.12.9 (as shipped with debian)
2361         is ok. OS-X 10.4 "Tiger" ships with cvs-1.11, but I haven't been
2362         able to test that yet.
2364 2006-04-30  Brian Warner  <warner@lothar.com>
2366         * buildbot/test/test_vc.py (VCBase.runCommand): set $LC_ALL="C" to
2367         make sure child commands emit messages in english, so our regexps
2368         will match. Thanks to Nikaus Giger for identifying the problems.
2369         (VCBase._do_vctest_export_1): mode="export" is not responsible
2370         for setting the "got_revision" property, since in many cases it is
2371         not convenient to determine.
2372         (SVNSupport.capable): when running 'svn --version' to check for
2373         ra_local, we want error messages in english
2374         * buildbot/test/test_slavecommand.py 
2375         (ShellBase.testShellMissingCommand): set $LC_ALL="C" to get bash
2376         to emit the error message in english
2378         * buildbot/slave/commands.py (SourceBase.setup): stash a copy of
2379         the environment with $LC_ALL="C" so that Commands which need to
2380         parse the output of their child processes can obtain it in
2381         english.
2382         (SVN.parseGotRevision): call "svn info" afterwards instead of
2383         watching the output of the "svn update" or "svn checkout".
2384         (Darcs.parseGotRevision): use $LC_ALL="C" when running the command
2385         (Arch.parseGotRevision): same
2386         (Bazaar.parseGotRevision): same
2387         (Mercurial.parseGotRevision): same
2389         * buildbot/scripts/tryclient.py (SourceStampExtractor.dovc): set
2390         $LC_ALL="C" when running commands under 'buildbot try', too
2392         * buildbot/test/__init__.py: remove the global os.environ()
2393         setting, instead we do it just for the tests that run commands and
2394         need to parse their output.
2396         * buildbot/test/test_scheduler.py (Scheduling.testTryJobdir):
2397         remove the overly-short .timeout on this test, because non-DNotify
2398         platforms must fall back to polling which happens at 10 second
2399         intervals, so a 5 second timeout would never succeed.
2401 2006-04-24  Brian Warner  <warner@lothar.com>
2403         * docs/buildbot.texinfo (Installing the code): update trial
2404         invocation, SF#1469116 by Niklaus Giger.
2405         (Attributes of Changes): updated branch-name examples to be
2406         a bit more realistic, SF#1475240 by Stephen Davis.
2408         * contrib/windows/buildbot2.bat: utility wrapper for windows
2409         developers, contributed by Nick Trout (after a year of neglect..
2410         sorry!). SF#1194231.
2412         * buildbot/test/test_vc.py (*.capable): store the actual VC
2413         binary's pathname in VCS[vcname], so it can be retrieved later
2414         (CVSSupport.vc_try_checkout): incorporate Niklaus Giger's patch to
2415         strip out non-numeric timezone information, specifically the funky
2416         German string that his system produced that confuses CVS.
2417         (DarcsSupport.vc_create): use dovc() instead of vc(), this should
2418         allow Darcs tests to work on windows
2419         * buildbot/scripts/tryclient.py (SourceStampExtractor): use
2420         procutils.which() everywhere, to allow tryclient to work under
2421         windows. Also from Niklaus Giger, SF#1463394.
2423         * buildbot/twcompat.py (which): move the replacement for a missing
2424         twisted.python.procutils.which from test_vc.py to here, so it can
2425         be used in other places too (specifically tryclient.py)
2427 2006-04-23  Brian Warner  <warner@lothar.com>
2429         * buildbot/status/html.py (StatusResourceBuild.body): replace the
2430         bare buildbotURL/projectName line with a proper DIV, along with a
2431         CSS class of "title", from Stefan Seefeld (SF#1461675).
2432         (WaterfallStatusResource.body0): remove the redundant 'table'
2433         class from the table
2434         (WaterfallStatusResource.body): same. Also add class="LastBuild"
2435         to the top-row TR, and class="Activity" to the second-row TR,
2436         rather than putting them in the individual TD nodes.
2438         * buildbot/test/test_vc.py (VCBase.checkGotRevision): test
2439         'got_revision' build property for all VC systems that implement
2440         accurate ones: SVN, Darcs, Arch, Bazaar, Mercurial.
2442         * buildbot/slave/commands.py (SourceBase._handleGotRevision): try
2443         to determine which revision we actually obtained
2444         (CVS.parseGotRevision): implement this for CVS, which just means
2445         to grab a timestamp. Not ideal, and it depends upon the buildslave
2446         having a clock that is reasonably well syncronized with the server,
2447         but it's better than nothing.
2448         (SVN.parseGotRevision): implement it for SVN, which is accurate
2449         (Darcs.parseGotRevision): same
2450         (Arch.parseGotRevision): same
2451         (Bazaar.parseGotRevision): same
2452         (Mercurial.parseGotRevision): same
2454         * buildbot/process/step.py (LoggedRemoteCommand.remoteUpdate):
2455         keep a record of all non-stdout/stderr/header/rc status updates,
2456         for the benefit of RemoteCommands that send other useful things,
2457         like got_revision
2458         (Source.commandComplete): put any 'got_revision' status values
2459         into a build property of the same name
2462         * buildbot/process/step_twisted.py (Trial): update to deal with
2463         new ShellCommand refactoring
2465         * docs/buildbot.texinfo (Build Properties): document new feature
2466         that allows BuildSteps to get/set Build-wide properties like which
2467         revision was requested and/or checked out.
2469         * buildbot/interfaces.py (IBuildStatus.getProperty): new method
2470         * buildbot/status/builder.py (BuildStatus.getProperty): implement
2471         it. Note that this bumps the persistenceVersion of the saved Build
2472         object, so add the necessary upgrade-old-version logic to include
2473         an empty properties dict.
2475         * buildbot/process/base.py (Build.setProperty): implement it
2476         (Build.getProperty): same
2477         (Build.startBuild): change build startup to set 'branch',
2478         'revision', and 'slavename' properties at the right time
2480         * buildbot/process/step.py (BuildStep.__init__): change setup to
2481         require 'build' argument in a better way
2482         (LoggingBuildStep): split ShellCommand into two pieces, for better
2483         subclassing elsewhere. LoggingBuildStep is a BuildStep which runs
2484         a single RemoteCommand that sends stdout/stderr status text. It
2485         also provides the usual commandComplete / createSummary /
2486         evaluateCommand / getText methods to be overridden...
2487         (ShellCommand): .. whereas ShellCommand is specifically for
2488         running RemoteShellCommands. Other shell-like BuildSteps (like
2489         Source) can inherit from LoggingBuildStep instead of ShellCommand
2490         (WithProperties): marker class to do build-property interpolation
2491         (Source): inherit from LoggingBuildStep instead of ShellCommand
2492         (RemoteDummy): same
2494         * buildbot/test/test_properties.py: test new functionality
2496 2006-04-21  Brian Warner  <warner@lothar.com>
2498         * buildbot/test/test_vc.py: rename testBranch to
2499         testCheckoutBranch to keep the tests in about the right
2500         alphabetical order
2502 2006-04-18  Brian Warner  <warner@lothar.com>
2504         * docs/buildbot.texinfo (PBListener): improve cross-references
2505         between PBListener and 'buildbot statusgui', thanks to John Pye
2506         for the suggestion.
2508 2006-04-17  Brian Warner  <warner@lothar.com>
2510         * buildbot/twcompat.py (maybeWait): handle SkipTest properly when
2511         running under Twisted-1.3.0, otherwise skipped tests are reported
2512         as errors.
2514         * all: use isinstance() instead of 'type(x) is foo', suggested by
2515         Neal Norwitz
2517         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
2518         oops, fix a brain-fade from the other week, when making the
2519         addStep changes. I changed all the __init__ upcalls to use the
2520         wrong superclass name.
2521         (FullTwistedBuildFactory.__init__): same
2522         (TwistedDebsBuildFactory.__init__): same
2523         (TwistedReactorsBuildFactory.__init__): same
2524         (TwistedBuild.isFileImportant): use .startswith for clarity,
2525         thanks to Neal Norwitz for the suggestions.
2527         * contrib/viewcvspoll.py: script to poll a viewcvs database for
2528         changes, then deliver them over PB to a remote buildmaster.
2530         * contrib/svnpoller.py: added script by John Pye to poll a remote
2531         SVN repository (by running 'svn log') from a cronjob, and run
2532         'buildbot sendchange' to deliver the changes to a remote
2533         buildmaster.
2534         * contrib/svn_watcher.py: added script by Niklaus Giger (a
2535         modification of svnpoller.py), same purpose, but this one loops
2536         internally (rather than expecting to run from a cronjob) and works
2537         under windows.
2538         * contrib/README.txt: same
2540 2006-04-11  Brian Warner  <warner@lothar.com>
2542         * all: fix a number of incorrect names and missing imports, thanks
2543         to Anthony Baxter for the patch.
2544         * buildbot/status/html.py (WaterfallStatusResource.statusToHTML): 
2545         remove unused buggy method.
2546         * buildbot/status/builder.py (BuildStatus.saveYourself): rmtree
2547         comes from shutil, not "shutils"
2548         * buildbot/process/step.py (TreeSize.evaluateCommand): fix bad name
2549         (Arch.checkSlaveVersion): same
2550         * buildbot/process/step_twisted.py (Trial.commandComplete): same, in
2551         some disabled code
2552         * buildbot/process/step_twisted2.py: add some missing imports
2553         * buildbot/twcompat.py (_deferGenerator): fix cut-and-paste error,
2554         this code used to live in twisted.internet.defer
2556 2006-04-10  Brian Warner  <warner@lothar.com>
2558         * buildbot/process/step.py (Mercurial): add Mercurial support
2559         * buildbot/slave/commands.py (Mercurial): same
2560         * buildbot/scripts/tryclient.py (MercurialExtractor): same
2561         * buildbot/test/test_vc.py (Mercurial): same, checkout over HTTP is
2562         not yet tested, but 'try' support *is* covered
2563         * docs/buildbot.texinfo (Mercurial): document it
2565         * buildbot/process/step.py (LoggedRemoteCommand.remoteUpdate): add
2566         some debugging messages (turned off)
2567         * buildbot/test/test_vc.py: improve debug messages
2569 2006-04-07  Brian Warner  <warner@lothar.com>
2571         * buildbot/test/test_vc.py (which): define our own which() in case
2572         we can't import twisted.python.procutils, because procutils doesn't
2573         exist in Twisted-1.3
2575         * docs/buildbot.texinfo (Interlocks): fix some typos, mention use
2576         of SlaveLocks for performance tests
2578         * docs/examples/twisted_master.cfg: update to match current usage
2580         * buildbot/changes/p4poller.py (P4Source): add new arguments:
2581         password, p4 binary, pollinterval, maximum history to check.
2582         Patch from an anonymous sf.net contributor, SF#1219384.
2583         * buildbot/process/step.py (P4Sync.__init__): add username,
2584         password, and client arguments.
2585         * buildbot/slave/commands.py (P4Sync): same
2587 2006-04-05  Brian Warner  <warner@lothar.com>
2589         * buildbot/process/factory.py (BuildFactory.addStep): new method
2590         to add steps to a BuildFactory. Use it instead of f.steps.append,
2591         and you can probably avoid using the s() convenience function.
2592         Patch from Neal Norwitz, sf.net #1412605.
2593         (other): update all factories to use addStep
2594         * buildbot/process/process_twisted.py: update all factories to use
2595         addStep.
2597 2006-04-03  Brian Warner  <warner@lothar.com>
2599         * buildbot/test/test_vc.py: modified find-the-VC-command logic to
2600         work under windows too. Adapted from a patch by Niklaus Giger,
2601         addresses SF#1463399.
2603         * buildbot/test/__init__.py: set $LANG to 'C', to insure that
2604         spawned commands emit parseable results in english and not some
2605         other language. Patch from Niklaus Giger, SF#1463395.
2607         * README (INSTALLATION): discourage users from running unit tests on
2608         a "network drive", patch from Niklaus Giger, SF#1463394.
2610 2006-03-22  Brian Warner  <warner@lothar.com>
2612         * contrib/svn_buildbot.py: rearrange, add an easy-to-change
2613         function to turn a repository-relative pathname into a (branch,
2614         branch-relative-filename) tuple. Change this function to handle
2615         the branch naming policy used by your Subversion repository.
2616         Thanks to AllMyData.com for sponsoring this work.
2618 2006-03-16  Brian Warner  <warner@lothar.com>
2620         * buildbot/scripts/sample.cfg: add python-mode declaration for
2621         vim. Thanks to John Pye for the patch.
2623         * docs/buildbot.texinfo (Launching the daemons): fix @reboot job
2624         command line, mention the importance of running 'crontab' as the
2625         buildmaster/buildslave user. Thanks to John Pye for the catch.
2627 2006-03-13  Brian Warner  <warner@lothar.com>
2629         * buildbot/status/words.py (IRC): add an optional password=
2630         argument, which will be sent to Nickserv in an IDENTIFY message at
2631         login, to claim the nickname. freenode requires this before the
2632         bot can sent (or reply to) private messages. Thanks to Clement
2633         Stenac for the patch.
2634         * docs/buildbot.texinfo (IRC Bot): document it
2636         * buildbot/status/builder.py (LogFile.merge): don't write chunks
2637         larger than chunkSize. Fixes SF#1349253.
2638         * buildbot/test/test_status.py (Log.testLargeSummary): test it
2639         (Log.testConsumer): update to match new internal chunking behavior
2641 2006-03-12  Brian Warner  <warner@lothar.com>
2643         * buildbot/test/test_vc.py: remove the last use of waitForDeferred
2645         * buildbot/test/test_maildir.py (MaildirTest): rename the
2646         'timeout' method, as it collides with trial's internals
2648         * buildbot/scripts/runner.py: add 'buildbot restart' command
2649         (stop): don't sys.exit() out of here, otherwise restart can't work
2650         * docs/buildbot.texinfo (Shutdown): document it
2652         * buildbot/buildset.py (BuildSet.__init__): clean up docstring
2653         * buildbot/status/html.py (Waterfall.__init__): same
2654         * buildbot/process/builder.py (Builder.startBuild): same
2655         * buildbot/process/base.py (BuildRequest): same
2656         * buildbot/sourcestamp.py (SourceStamp): same
2657         * buildbot/scheduler.py (Nightly): same
2659         * buildbot/__init__.py (version): bump to 0.7.2+ while between
2660         releases
2661         * docs/buildbot.texinfo: same
2663 2006-02-17  Brian Warner  <warner@lothar.com>
2665         * buildbot/__init__.py (version): Releasing buildbot-0.7.2
2666         * docs/buildbot.texinfo: set version number to match
2667         * NEWS: update for 0.7.2
2669 2006-02-16  Brian Warner  <warner@lothar.com>
2671         * docs/buildbot.texinfo (Build Dependencies): add cindex tag
2673 2006-02-09  Brian Warner  <warner@lothar.com>
2675         * docs/buildbot.texinfo (How Different VC Systems Specify Sources):
2676         add text to explain per-build branch parameters
2677         * NEWS: mention --umask
2679 2006-02-08  Brian Warner  <warner@lothar.com>
2681         * buildbot/scripts/runner.py (Maker.makeSlaveTAC): remove unused
2682         method
2683         (SlaveOptions.optParameters): add --umask, to make it possible to
2684         make buildslave-generated files (including build products) be
2685         world-readable
2686         (slaveTAC): same
2687         * buildbot/slave/bot.py (BuildSlave.startService): same
2689 2006-01-23  Brian Warner  <warner@lothar.com>
2691         * buildbot/status/builder.py: urllib.quote() all URLs that include
2692         Builder names, so that builders can include characters like '/'
2693         and ' ' without completely breaking the resulting HTML. Thanks to
2694         Kevin Turner for the patch.
2695         * buildbot/status/html.py: same
2696         * buildbot/test/test_web.py (GetURL.testBuild): match changes
2698         * NEWS: update in preparation for upcoming release
2700 2006-01-18  Brian Warner  <warner@lothar.com>
2702         * docs/examples/twisted_master.cfg: update to match the Twisted
2703         buildbot: remove python2.2, switch to exarkun's buildslaves,
2704         disable the .deb builder until we figure out how to build twisted
2705         .debs from SVN, add some ktrace debugging to the OS-X build
2706         process and remove the qt build, remove threadless builders,
2707         change freebsd builder to use landonf's buildslave.
2709 2006-01-12  Brian Warner  <warner@lothar.com>
2711         * buildbot/master.py (Manhole.__init__): let port= be a strports
2712         specification string, but handle a regular int for backwards
2713         compatibility. This allows "tcp:12345:interface=127.0.0.1" to be
2714         used in master.cfg to limit connections to just the local host.
2715         (BuildMaster.loadConfig): same for c['slavePortnum']
2716         * buildbot/scheduler.py (Try_Userpass.__init__): same
2717         * buildbot/status/client.py (PBListener.__init__): same
2718         * buildbot/status/html.py (Waterfall.__init__): same, for both
2719         http_port and distrib_port. Include backwards-compatibility checks
2720         so distrib_port can be a filename string and still mean unix:/foo
2721         * docs/buildbot.texinfo (Setting the slaveport): document it
2722         (Debug options): same
2723         (HTML Waterfall): same
2724         (PBListener): same
2725         (try): same
2726         * buildbot/test/test_config.py (ConfigTest): test it
2728         * buildbot/master.py (BuildMaster.loadConfig): wait for the
2729         slaveport's disownServiceParent deferred to fire before opening
2730         the new one. Fixes an annoying bug in the unit tests.
2732 2006-01-03  Brian Warner  <warner@lothar.com>
2734         * buildbot/master.py (BuildMaster): remove the .schedulers
2735         attribute, replacing it with an allSchedulers() method that looks
2736         for all IService children that implement IScheduler. Having only
2737         one parent/child relationship means fewer opportunities for bugs.
2738         (BuildMaster.allSchedulers): new method
2739         (BuildMaster.loadConfig_Schedulers): update to use allSchedulers,
2740         also fix ugly bug that caused any config-file reload to
2741         half-forget about the earlier Schedulers, causing an exception
2742         when a Change arrived and was handed to a half-connected
2743         Scheduler. The exception was in scheduler.py line 54ish:
2744           self.parent.submitBuildSet(bs)
2745           exceptions.AttributeError: 'NoneType' object has no attribute
2746           'submitBuildSet'
2747         (BuildMaster.addChange): update to use allSchedulers()
2749         * buildbot/scheduler.py (BaseScheduler.__implements__): fix this
2750         to work properly with twisted-1.3.0, where you must explicitly
2751         include the __implements__ from parent classes
2752         (BaseScheduler.__repr__): make it easier to distinguish distinct
2753         instances
2754         (BaseUpstreamScheduler.__implements__): same
2756         * buildbot/status/builder.py (Status.getSchedulers): update to
2757         use allSchedulers()
2758         * buildbot/test/test_run.py (Run.testMaster): same
2759         * buildbot/test/test_dependencies.py (Dependencies.findScheduler): same
2760         * buildbot/test/test_config.py (ConfigTest.testSchedulers): same,
2761         make sure Scheduler instances are left alone when an identical
2762         config file is reloaded
2763         (ConfigElements.testSchedulers): make sure Schedulers are properly
2764         comparable
2766         * Makefile (TRIALARGS): my local default Twisted version is now
2767         2.1.0, update the trial arguments accordingly
2769 2005-12-22  Brian Warner  <warner@lothar.com>
2771         * docs/examples/twisted_master.cfg: merge changes from pyr: add
2772         new win32 builders
2774         * buildbot/scheduler.py (BaseScheduler.addChange): include a dummy
2775         addChange in the parent class, although I suspect this should be
2776         fixed better in the future.
2778 2005-11-26  Brian Warner  <warner@lothar.com>
2780         * buildbot/scheduler.py (AnyBranchScheduler.addChange): don't
2781         explode when branch==None, thanks to Kevin Turner for the catch
2782         * buildbot/test/test_scheduler.py (Scheduling.testAnyBranch): test
2783         it
2785         * buildbot/__init__.py (version): bump to 0.7.1+ while between
2786         releases
2787         * docs/buildbot.texinfo: same
2789 2005-11-26  Brian Warner  <warner@lothar.com>
2791         * buildbot/__init__.py (version): Releasing buildbot-0.7.1
2792         * docs/buildbot.texinfo: set version number to match
2794 2005-11-26  Brian Warner  <warner@lothar.com>
2796         * NEWS: update for 0.7.1
2798         * buildbot/status/builder.py (BuildStepStatus.unsubscribe): make
2799         sure that unsubscribe works even if we never sent an ETA update.
2800         Also, don't explode on duplicate unsubscribe.
2801         (BuildStepStatus.addLog): make the convenience "return self"-added
2802         watcher automatically unsubscribe when the Step finishes.
2803         (BuildStatus.unsubscribe): same handle-duplicate-unsubscribe
2804         (BuildStatus.stepStarted): same auto-unsubscribe
2805         (BuilderStatus.buildStarted): same auto-unsubscribe
2807         * buildbot/interfaces.py (IStatusReceiver.buildStarted): document
2808         auto-unsubscribe
2809         (IStatusReceiver.stepStarted): same
2810         (IStatusReceiver.logStarted): same
2812         * buildbot/test/test_run.py (Status): move the Status test..
2813         * buildbot/test/test_status.py (Subscription): .. to here
2815 2005-11-25  Brian Warner  <warner@lothar.com>
2817         * NEWS: more updates
2819         * buildbot/locks.py: fix the problem in which loading a master.cfg
2820         file that changes some Builders (but not all of them) can result
2821         in having multiple copies of the same Lock. Now, the real Locks
2822         are kept in a table inside the BotMaster, and the Builders/Steps
2823         use "LockIDs", which are still instances of MasterLock and
2824         SlaveLock. The real Locks are instances of the new RealMasterLock
2825         and RealSlaveLock classes.
2826         * buildbot/master.py (BotMaster.getLockByID): new method to
2827         convert LockIDs into real Locks.
2828         * buildbot/process/base.py (Build.startBuild): convert LockIDs
2829         into real Locks before building
2830         * buildbot/process/step.py (BuildStep.startStep): same
2831         * buildbot/test/test_locks.py (Locks.testLock1a): add a test which
2832         exercises the problem
2835         * docs/buildbot.texinfo (Scheduler Types): give a few hints about
2836         what Schedulers are available
2838         * buildbot/scheduler.py (Nightly): add new Scheduler based upon
2839         work by Dobes Vandermeer and hacked mercilessly by me. This offers
2840         'cron'-style build scheduling at certain times of day, week,
2841         month, or year.
2842         * buildbot/test/test_scheduler.py (Scheduling.testNightly): test it
2844         * buildbot/scheduler.py (Scheduler): change fileIsImportant
2845         handling: treat self.fileIsImportant more as an attribute that
2846         contains a callable than as a method. If the attribute is None,
2847         don't call it and assume all filenames are important. It is still
2848         possible to provide a fileIsImportant method in a subclass,
2849         however.
2850         (AnyBranchScheduler): handle fileIsImportant=None, previously it
2851         was broken
2852         * buildbot/test/test_scheduler.py (Scheduling.testAnyBranch2):
2853         test using AnyBranchScheduler with fileIsImportant=None
2855 2005-11-24  Brian Warner  <warner@lothar.com>
2857         * buildbot/test/test_config.py (StartService): don't claim a fixed
2858         port number, instead set slavePort=0 on the first pass, figure out
2859         what port was allocated, then switch to a config file that uses
2860         the allocated port.
2862         * buildbot/master.py (BuildMaster.loadConfig): close the old
2863         slaveport before opening the new one, because unit tests might
2864         replace slavePort=0 with the same allocated portnumber, and if we
2865         don't wait for the old port to close first, we get a "port already
2866         in use" error. There is a tiny race condition here, but the only
2867         threat is from other programs that bind (statically) to the same
2868         port number we happened to be allocated, and only if those
2869         programs use SO_REUSEADDR, and only if they get control in between
2870         reactor turns.
2872         * Makefile (TRIALARGS): update to handle Twisted > 2.1.0
2874         * buildbot/master.py (BuildMaster.loadConfig_Sources): remove all
2875         deleted ChangeSources before adding any new ones
2876         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): fix
2877         compare_attrs, to make sure that a config-file reload does not
2878         unnecessarily replace an unmodified ChangeSource instance
2879         * buildbot/test/test_config.py (ConfigTest.testSources): update
2881         * buildbot/scheduler.py (AnyBranchScheduler): fix branches=[] to
2882         mean "don't build anything", and add a warning if it gets used
2883         because it isn't actually useful.
2885         * contrib/svn_buildbot.py: update example usage to match the port
2886         number that gets used by the PBChangeSource
2887         * buildbot/scripts/sample.cfg: add example of PBChangeSource
2889 2005-11-22  Brian Warner  <warner@lothar.com>
2891         * NEWS: start collecting items for next release
2893         * buildbot/process/step.py (SVN.computeSourceRevision): assume
2894         revisions are strings
2895         (P4Sync.computeSourceRevision): same
2897         * buildbot/status/html.py (StatusResourceBuild.body): add a link
2898         to the Buildbot's overall status page
2899         (StatusResourceBuilder.body): same
2901 2005-11-15  Brian Warner  <warner@lothar.com>
2903         * buildbot/master.py (BuildMaster.loadConfig): serialize the
2904         config-file loading, specifically to make sure old StatusTargets
2905         are finished shutting down before new ones start up (thus
2906         resolving a bug in which changing the Waterfall object would fail
2907         because both new and old instances were claiming the same
2908         listening port). Also load new Schedulers after all the new
2909         Builders are set up, in case they fire off a new build right away.
2910         * buildbot/test/test_config.py (StartService): test it
2912         * buildbot/status/mail.py (MailNotifier.buildMessage): oops, add
2913         the branch name to the mail body
2915         * buildbot/changes/pb.py (PBChangeSource.compare_attrs): add this.
2916         Without it, a config-file reload fails to update an existing
2917         PBChangeSource.
2918         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): add
2919         username/passwd to compare_attrs, for the same reason
2920         * buildbot/status/html.py (Waterfall): add favicon to
2921         compare_attrs, same reason
2923 2005-11-05  Brian Warner  <warner@lothar.com>
2925         * buildbot/scripts/tryclient.py (createJobfile): stringify the
2926         baserev before stuffing it in the jobfile. This resolves problems
2927         under SVN (and probably Arch) where revisions are expressed as
2928         numbers. I'm inclined to use string-based revisions everywhere in
2929         the future, but this fix should be safe for now. Thanks to Steven
2930         Walter for the patch.
2932         * buildbot/changes/changes.py (ChangeMaster.saveYourself): use
2933         binary mode when opening pickle files, to make windows work
2934         better. Thanks to Dobes Vandermeer for the catch.
2935         * buildbot/status/builder.py (BuildStatus.saveYourself): same
2936         (BuilderStatus.getBuildByNumber): same
2937         (Status.builderAdded): same
2938         * buildbot/master.py (BuildMaster.loadChanges): same
2940         * buildbot/util.py (Swappable): delete unused leftover code
2942         * buildbot/process/step.py (SVN): when building on a non-default
2943         branch, add the word "[branch]" to the VC step's description, so
2944         it is obvious that we're not building the usual stuff. Likewise,
2945         when we are building a specific revision, add the text "rNNN" to
2946         indicate what that revision number is. Thanks to Brad Hards and
2947         Nathaniel Smith for the suggestion.
2948         (Darcs.startVC): same
2949         (Arch.startVC): same
2950         (Bazaar.startVC): same
2952         * buildbot/process/factory.py (GNUAutoconf.__init__): fix a silly
2953         typo, caught by Mark Dillavou, closes SF#1216636.
2955         * buildbot/test/test_status.py (Log.TODO_testDuplicate): add notes
2956         about a test to add some day
2958         * docs/examples/twisted_master.cfg: update: bot1 can now handle
2959         the 'full-2.3' build, and the 'reactors' build is now run under
2960         python-2.4 because the buildslave no longer has gtk/etc bindings
2961         for earlier versions.
2963 2005-11-03  Brian Warner  <warner@lothar.com>
2965         * buildbot/interfaces.py (IBuilderControl.resubmitBuild): new
2966         method, takes an IBuildStatus and rebuilds it. It might make more
2967         sense to add this to IBuildControl instead, but that instance goes
2968         away completely once the build has finished, and resubmitting
2969         builds can take place weeks later.
2970         * buildbot/process/builder.py (BuilderControl.resubmitBuild): same
2971         * buildbot/status/html.py (StatusResourceBuild): also stash an
2972         IBuilderControl so we can use resubmitBuild.
2973         (StatusResourceBuild.body): render "resubmit" button if we can.
2974         Also add hrefs for each BuildStep
2975         (StatusResourceBuild.rebuild): add action for "resubmit" button
2976         (StatusResourceBuilder.getChild): give it an IBuilderControl
2978         * buildbot/status/builder.py (Status.getURLForThing): change the
2979         URL for BuildSteps to have a "step-" prefix, so the magic URLs
2980         that live as targets of buttons like "stop" and "rebuild" can't
2981         collide with them.
2982         * buildbot/status/builder.py (Status.getURLForThing): same
2983         * buildbot/status/html.py (StatusResourceBuild.getChild): same
2984         (StepBox.getBox): same
2985         * buildbot/test/test_web.py (GetURL): same
2986         (Logfile): same
2988         * buildbot/process/step.py (SVN.__init__): put svnurl/baseURL
2989         exclusivity checks after Source.__init__ upcall, so misspelled
2990         arguments will be reported more usefully
2991         (Darcs.__init__): same
2993 2005-10-29  Brian Warner  <warner@lothar.com>
2995         * docs/examples/twisted_master.cfg: don't double-fire the 'quick'
2996         builder. Move the Try scheduler off to a separate port.
2998 2005-10-27  Brian Warner  <warner@lothar.com>
3000         * buildbot/clients/gtkPanes.py
3001         (TwoRowClient.remote_builderRemoved): disappearing Builders used
3002         to cause the app to crash, now they don't.
3004         * buildbot/clients/debug.py: display the buildmaster's location
3005         in the window's title bar
3007 2005-10-26  Brian Warner  <warner@lothar.com>
3009         * buildbot/status/mail.py (MailNotifier): urllib.escape the URLs
3010         in case they have spaces or whatnot. Patch from Dobes Vandermeer.
3011         * buildbot/test/test_status.py (MyStatus.getURLForThing): fix it
3013         * buildbot/status/html.py (td): put a single non-breaking space
3014         inside otherwise empty <td> elements, as a workaround for buggy
3015         browsers which would optimize them away (along with any associated
3016         styles, like the kind that create the waterfall grid borders).
3017         Patch from Frerich Raabe.
3019         * buildbot/process/step_twisted.py (Trial): expose the trialMode=
3020         argv-list as an argument, defaulting to ["-to"], which is
3021         appropriate for the Trial that comes with Twisted-2.1.0 and
3022         earlier. The Trial in current Twisted SVN wants
3023         ["--reporter=bwverbose"] instead. Also expose trialArgs=, which
3024         defaults to an empty list.
3025         * buildbot/process/process_twisted.py (TwistedTrial.trialMode):
3026         match it, now that trialMode= is a list instead of a single string
3028         * buildbot/__init__.py (version): bump to 0.7.0+ while between
3029         releases
3030         * docs/buildbot.texinfo: same
3032 2005-10-24  Brian Warner  <warner@lothar.com>
3034         * buildbot/__init__.py (version): Releasing buildbot-0.7.0
3035         * docs/buildbot.texinfo: set version number to match
3037 2005-10-24  Brian Warner  <warner@lothar.com>
3039         * README: update for 0.7.0
3040         * NEWS: same
3041         * docs/buildbot.texinfo: move the freshcvs stuff out of the README
3043         * buildbot/clients/debug.glade: add 'branch' box to fake-commit
3044         * buildbot/clients/debug.py (DebugWidget.do_commit): same. Don't
3045         send the branch= argument unless the user really provided one, to
3046         retain compatibility with older buildmasters that don't accept
3047         that argument.
3048         * buildbot/master.py (DebugPerspective.perspective_fakeChange):
3049         same
3051         * docs/buildbot.texinfo: update lots of stuff
3053         * buildbot/scripts/runner.py (sendchange): add a --branch argument
3054         to the 'buildbot sendchange' command
3055         * buildbot/clients/sendchange.py (Sender.send): same
3056         * buildbot/changes/pb.py (ChangePerspective): same
3057         * buildbot/test/test_changes.py (Sender.testSender): test it
3059         * buildbot/process/step.py (SVN.__init__): change 'base_url' and
3060         'default_branch' argument names to 'baseURL' and 'defaultBranch',
3061         for consistency with other BuildStep arguments that use camelCase.
3062         Well, at least more of them use camelCase (like flunkOnWarnings)
3063         than don't.. I wish I'd picked one style and stuck with it
3064         earlier. Annoying, but it's best done before the release, since
3065         these arguments didn't exist at all in 0.6.6 .
3066         (Darcs): same
3067         * buildbot/test/test_vc.py (SVN.testCheckout): same
3068         (Darcs.testPatch): same
3069         * docs/buildbot.texinfo (SVN): document the change
3070         (Darcs): same, add some build-on-branch docs
3071         * docs/examples/twisted_master.cfg: match change
3073         * buildbot/process/step.py (BuildStep): rename
3074         slaveVersionNewEnough to slaveVersionIsOlderThan, because that's
3075         how it is normally used.
3076         * buildbot/test/test_steps.py (Version.checkCompare): same
3078         * buildbot/process/step.py (CVS.startVC): refuse to build
3079         update/copy -style builds on a non-default branch with an old
3080         buildslave (<=0.6.6) that doesn't know how to do it properly. The
3081         concern is that it will do a VC 'update' in an existing tree when
3082         it is supposed to be switching branches (and therefore clobbering
3083         the tree to do a full checkout), thus building the wrong source.
3084         This used to be a warning, but I think the confusion it is likely
3085         to cause warrants making it an error.
3086         (SVN.startVC): same, also make mode=export on old slaves an error
3087         (Darcs.startVC): same
3088         (Git.startVC): improve error message for non-Git-enabled slaves
3089         (Arch.checkSlaveVersion): same. continue to emit a warning when a
3090         specific revision is built on a slave that doesn't pay attention
3091         to args['revision'], because for slowly-changing trees it will
3092         probably do the right thing, and because we have no way to tell
3093         whether we're asking it to build the most recent version or not.
3094         * buildbot/interfaces.py (BuildSlaveTooOldError): new exception
3096         * buildbot/scripts/runner.py (SlaveOptions.postOptions): assert
3097         that 'master' is in host:portnum format, to catch errors sooner
3099 2005-10-23  Brian Warner  <warner@lothar.com>
3101         * buildbot/process/step_twisted.py (ProcessDocs.createSummary):
3102         when creating the list of warning messages, include the line
3103         immediately after each WARNING: line, since that's usually where
3104         the file and line number wind up.
3106         * docs/examples/twisted_master.cfg: OS-X slave now does QT, add a
3107         TryScheduler
3109         * NEWS: update
3111 2005-10-22  Brian Warner  <warner@lothar.com>
3113         * buildbot/status/html.py (HtmlResource): incorporate valid-HTML
3114         patch from Brad Hards
3115         * buildbot/status/classic.css: same
3116         * buildbot/test/test_web.py (Waterfall): match changes
3118         * buildbot/test/test_steps.py (BuildStep.setUp): set
3119         nextBuildNumber so the test passes
3120         * buildbot/test/test_status.py (MyBuilder): same
3122         * buildbot/status/html.py (StatusResourceBuild.body): revision
3123         might be numeric, so stringify it before html-escapifying it
3124         (CurrentBox.getBox): add a "waiting" state, and show a countdown
3125         timer for the upcoming build
3126         * buildbot/status/classic.css: add background-color attributes for
3127         offline/waiting/building classes
3129         * buildbot/status/builder.py (BuildStatus): derive from
3130         styles.Versioned, fix upgrade of .sourceStamp attribute. Also set
3131         the default (i.e. unknown) .slavename to "???" instead of None,
3132         since even unknown slavenames need to be printed eventually.
3133         (BuilderStatus): also derive from styles.Versioned . More
3134         importantly, determine .nextBuildNumber at creation/unpickling
3135         time by scanning the directory of saved BuildStatus instances and
3136         choosing one larger than the highest-numbered one found. This
3137         should fix the problem where random errors during upgrades cause
3138         the buildbot to forget about earlier builds. .nextBuildNumber is
3139         no longer stored in the pickle.
3140         (Status.builderAdded): if we can't unpickle the BuilderStatus,
3141         at least log the error. Also call Builder.determineNextBuildNumber
3142         once the basedir is set.
3144         * buildbot/master.py (BuildMaster.loadChanges): do
3145         styles.doUpgrade afterwards, in case I decide to make Changes
3146         derived from styles.Versioned some day and forget to make this
3147         change later.
3150         * buildbot/test/test_runner.py (Options.testForceOptions): skip
3151         when running under older pythons (<2.3) in which the shlex module
3152         doesn't have a 'split' function.
3154         * buildbot/process/step.py (ShellCommand.start): make
3155         errorMessages= be a list of strings to stuff in the log before the
3156         command actually starts. This makes it easier to flag multiple
3157         warning messages, e.g. when the Source steps have to deal with an
3158         old buildslave.
3159         (CVS.startVC): handle slaves that don't handle multiple branches
3160         by switching into 'clobber' mode
3161         (SVN.startVC): same. Also reject branches without base_url
3162         (Darcs.startVC): same. Also reject revision= in older slaves
3163         (Arch.checkSlaveVersion): same (just the multiple-branches stuff)
3164         (Bazaar.startVC): same, and test for baz separately than for arch
3166         * buildbot/slave/commands.py (cvs_ver): document new features
3168         * buildbot/process/step.py (BuildStep.slaveVersion): document it
3169         (BuildStep.slaveVersionNewEnough): more useful utility method
3170         * buildbot/test/test_steps.py (Version): start testing it
3172         * buildbot/status/words.py (IrcStatusBot.command_FORCE): note that
3173         the 'force' command requires python2.3, for the shlex.split method
3175         * docs/examples/twisted_master.cfg: remove old freshcvs stuff,
3176         since we don't use it anymore. The Twisted buildbot uses a
3177         PBChangeSource now.
3179 2005-10-21  Brian Warner  <warner@lothar.com>
3181         * buildbot/process/process_twisted.py: rework all BuildFactory
3182         classes to take a 'source' step as an argument, instead of
3183         building up the SVN instance in the factory.
3184         * docs/examples/twisted_master.cfg: enable build-on-branch by
3185         providing a base_url and default_branch
3187         * buildbot/status/words.py (IrcStatusBot.command_FORCE): add
3188         control over --branch and --revision, not that they are always
3189         legal to provide
3190         * buildbot/status/html.py (StatusResourceBuilder.force): same
3191         (StatusResourceBuild.body): display SourceStamp components
3193         * buildbot/scripts/runner.py (ForceOptions): option parser for the
3194         IRC 'force' command, so it can be shared with an eventual
3195         command-line-tool 'buildbot force' mode.
3196         * buildbot/test/test_runner.py (Options.testForceOptions): test it
3198 2005-10-20  Brian Warner  <warner@lothar.com>
3200         * buildbot/status/mail.py (MailNotifier.buildMessage): reformat
3202         * docs/examples/twisted_master.cfg: update to use Schedulers
3204         * buildbot/scripts/sample.cfg: update with Schedulers
3206         * buildbot/interfaces.py (IBuilderControl.requestBuildSoon): new
3207         method specifically for use by HTML "force build" button and the
3208         IRC "force" command. Raises an immediate error if there are no
3209         slaves available.
3210         (IBuilderControl.requestBuild): make this just submit a build, not
3211         try to check for existing slaves or set up any when-finished
3212         Deferreds or anything.
3213         * buildbot/process/builder.py (BuilderControl): same
3214         * buildbot/status/html.py (StatusResourceBuilder.force): same
3215         * buildbot/status/words.py (IrcStatusBot.command_FORCE): same
3216         * buildbot/test/test_slaves.py: same
3217         * buildbot/test/test_web.py: same
3219 2005-10-19  Brian Warner  <warner@lothar.com>
3221         * docs/examples/twisted_master.cfg: re-sync with reality: bring
3222         back python2.2 tests, turn off OS-X threadedselect-reactor tests
3224 2005-10-18  Brian Warner  <warner@lothar.com>
3226         * buildbot/status/html.py: provide 'status' argument to most
3227         StatusResourceFOO objects
3228         (StatusResourceBuild.body): href-ify the Builder name, add "Steps
3229         and Logfiles" section to make the Build page into a more-or-less
3230         comprehensive source of status information about the build
3232         * buildbot/status/mail.py (MailNotifier): include the Build's URL
3233         * buildbot/status/words.py (IrcStatusBot.buildFinished): same
3235 2005-10-17  Brian Warner  <warner@lothar.com>
3237         * buildbot/process/process_twisted.py (TwistedTrial): update Trial
3238         arguments to accomodate Twisted >=2.1.0 . I will have to figure
3239         out what to do about other projects: the correct options for
3240         recent Twisteds will not work for older ones.
3242 2005-10-15  Brian Warner  <warner@lothar.com>
3244         * buildbot/status/builder.py (Status.getURLForThing): add method
3245         to provide a URL for arbitrary IStatusFoo objects. The idea is to
3246         use this in email/IRC status clients to make them more useful, by
3247         providing the end user with hints on where to learn more about the
3248         object being reported on.
3249         * buildbot/test/test_web.py (GetURL): tests for it
3251 2005-10-14  Brian Warner  <warner@lothar.com>
3253         * buildbot/test/test_config.py (ConfigTest._testSources_1): oops,
3254         fix bug resulting from deferredResult changes
3256 2005-10-13  Brian Warner  <warner@lothar.com>
3258         * buildbot/test/test_changes.py: remove use of deferredResult
3259         * buildbot/test/test_config.py: same
3260         * buildbot/test/test_control.py: same
3261         * buildbot/test/test_status.py: same
3262         * buildbot/test/test_vc.py: this is the only remaining use, since
3263         it gets used at module level. This needs to be replaced by some
3264         sort of class-level run-once routine.
3266         * buildbot/status/words.py (IrcStatusBot.command_WATCH): fix typo
3268         * lots: implement multiple slaves per Builder, which means multiple
3269         current builds per Builder. Some highlights:
3270         * buildbot/interfaces.py (IBuilderStatus.getState): return a tuple
3271         of (state,currentBuilds) instead of (state,currentBuild)
3272         (IBuilderStatus.getCurrentBuilds): replace getCurrentBuild()
3273         (IBuildStatus.getSlavename): new method, so you can tell which
3274         slave got used. This only gets set when the build completes.
3275         (IBuildRequestStatus.getBuilds): new method
3277         * buildbot/process/builder.py (SlaveBuilder): add a .state
3278         attribute to track things like ATTACHING and IDLE and BUILDING,
3279         instead of..
3280         (Builder): .. the .slaves attribute here, which has been turned
3281         into a simple list of available slaves. Added a separate
3282         attaching_slaves list to track ones that are not yet ready for
3283         builds.
3284         (Builder.fireTestEvent): put off the test-event callback for a
3285         reactor turn, to make tests a bit more consistent.
3286         (Ping): cleaned up the slaveping a bit, now it disconnects if the
3287         ping fails due to an exception. This needs work, I'm worried that
3288         a code error could lead to a constantly re-connecting slave.
3289         Especially since I'm trying to move to a distinct remote_ping
3290         method, separate from the remote_print that we currently use.
3291         (BuilderControl.requestBuild): return a convenience Deferred that
3292         provides an IBuildStatus when the build finishes.
3293         (BuilderControl.ping): ping all connected slaves, only return True
3294         if they all respond.
3296         * buildbot/slave/bot.py (BuildSlave.stopService): stop trying to
3297         reconnect when we shut down.
3299         * buildbot/status/builder.py: implement new methods, convert
3300         one-build-at-a-time methods to handle multiple builds
3301         * buildbot/status/*.py: do the same in all default status targets
3302         * buildbot/status/html.py: report the build's slavename in the
3303         per-Build page, report all buildslaves on the per-Builder page
3305         * buildbot/test/test_run.py: update/create tests
3306         * buildbot/test/test_slaves.py: same
3307         * buildbot/test/test_scheduler.py: remove stale test
3309         * docs/buildbot.texinfo: document the new builder-specification
3310         'slavenames' parameter
3312 2005-10-12  Brian Warner  <warner@lothar.com>
3314         * buildbot/buildset.py (BuildSet): fix bug where BuildSet did not
3315         report failure correctly, causing Dependent builds to run when
3316         they shouldn't have.
3317         * buildbot/status/builder.py (BuildSetStatus): same
3318         * buildbot/test/test_buildreq.py (Set.testBuildSet): verify it
3319         (Set.testSuccess): test the both-pass case too
3320         * buildbot/test/test_dependencies.py (Dependencies.testRun_Fail):
3321         fix this test: it was ending too early, masking the failure before
3322         (Logger): specialized StatusReceiver to make sure the dependent
3323         builds aren't even started, much less completed.
3325 2005-10-07  Brian Warner  <warner@lothar.com>
3327         * buildbot/slave/bot.py (SlaveBuilder.activity): survive
3328         bot.SlaveBuilder being disowned in the middle of a build
3330         * buildbot/status/base.py (StatusReceiverMultiService): oops, make
3331         this inherit from StatusReceiver. Also upcall in __init__. This
3332         fixes the embarrasing crash when the new buildSetSubmitted method
3333         is invoked and Waterfall/etc don't implement their own.
3334         * buildbot/test/test_run.py: add a TODO note about a test to catch
3335         just this sort of thing.
3337         * buildbot/process/builder.py (Builder.attached): remove the
3338         already-attached warning, this situation is normal. Add some
3339         comments explaining it.
3341 2005-10-02  Brian Warner  <warner@lothar.com>
3343         * buildbot/changes/maildir.py (Maildir.start): Tolerate
3344         OverflowError when setting up dnotify, because some 64-bit systems
3345         have problems with signed-vs-unsigned constants and trip up on the
3346         DN_MULTISHOT flag. Patch from Brad Hards.
3348 2005-09-06  Fred Drake  <fdrake@users.sourceforge.net>
3350         * buildbot/process/step.py (BuildStep, ShellCommand): Add
3351         progressMetrics, description, descriptionDone to the 'parms' list,
3352         and make use the 'parms' list from the implementation class
3353         instead of only BuildStep to initialize the parameters.  This
3354         allows buildbot.process.factory.s() to initialize all the parms,
3355         not just those defined in directly by BuildStep.
3357 2005-09-03  Brian Warner  <warner@lothar.com>
3359         * NEWS: start adding items for the next release
3361         * docs/examples/twisted_master.cfg: (sync with reality) turn off
3362         python2.2 tests, change 'Quick' builder to only use python2.3
3364 2005-09-02  Fred Drake  <fdrake@users.sourceforge.net>
3366         * buildbot/status/html.py (StatusResourceBuilder.body): only show
3367         the "Ping Builder" button if the build control is available; the
3368         user sees an exception otherwise
3370         * docs/buildbot.texinfo (PBChangeSource): fix a typo
3372 2005-09-01  Brian Warner  <warner@lothar.com>
3374         * buildbot/interfaces.py (IBuilderStatus.getState): update
3375         signature, point out that 'build' can be None
3376         (IBuildStatus.getETA): point out ETA can be none
3378         * buildbot/status/html.py (CurrentBox.getBox): tolerate build/ETA
3379         being None
3380         * buildbot/status/words.py (IrcStatusBot.emit_status): same
3382 2005-08-31  Brian Warner  <warner@lothar.com>
3384         * buildbot/status/base.py (StatusReceiver.builderChangedState):
3385         update to match correct signature: removed 'eta' argument
3386         * buildbot/status/mail.py (MailNotifier.builderChangedState): same
3388 2005-08-30  Brian Warner  <warner@lothar.com>
3390         * buildbot/status/builder.py (LogFile): remove the assertion that
3391         blows up when you try to overwrite an existing logfile, instead
3392         just emit a warning. This case gets hit when the buildmaster is
3393         killed and doesn't get a chance to write out the serialized
3394         BuilderStatus object, so the .nextBuildNumber attribute gets out
3395         of date.
3397         * buildbot/scripts/runner.py (sendchange): add --revision_file to
3398         the 'buildbot sendchange' arguments, for the Darcs context file
3399         * docs/buildbot.texinfo (sendchange): document it
3401         * buildbot/status/html.py: add pending/upcoming builds to CurrentBox
3402         * buildbot/interfaces.py (IScheduler.getPendingBuildTimes): new method
3403         (IStatus.getSchedulers): new method
3404         * buildbot/status/builder.py (BuilderStatus): track pendingBuilds
3405         (Status.getSchedulers): implement
3406         * buildbot/process/builder.py (Builder): maintain
3407         BuilderStatus.pendingBuilds
3408         * buildbot/scheduler.py (Scheduler.getPendingBuildTimes): new method
3409         (TryBase.addChange): Try schedulers should ignore Changes
3411         * buildbot/scripts/tryclient.py (getTopdir): implement getTopdir
3412         for 'try' on CVS/SVN
3413         * buildbot/test/test_runner.py (Try.testGetTopdir): test case
3415         * buildbot/scripts/tryclient.py (Try): make jobdir-style 'try'
3416         report status properly.
3417         (Try.createJob): implement unique buildset IDs
3419         * buildbot/status/client.py (StatusClientPerspective): add a
3420         perspective_getBuildSets method for the benefit of jobdir-style
3421         'try'.
3422         * docs/buildbot.texinfo (try): more docs
3423         * buildbot/test/test_scheduler.py (Scheduling.testGetBuildSets):
3424         new test case
3426 2005-08-18  Brian Warner  <warner@lothar.com>
3428         * buildbot/scripts/tryclient.py (Try): make 'try' status reporting
3429         actually work. It's functional but still kind of clunky. Also, it
3430         only works with the pb-style.. needs to be made to work with the
3431         jobdir-style too.
3433         * buildbot/status/client.py (RemoteBuildSet): new class
3434         (RemoteBuildRequest): same
3435         (RemoteBuild.remote_waitUntilFinished): return the RemoteBuild
3436         object, not the internal BuildStatus object.
3437         (RemoteBuild.remote_subscribe): new method to subscribe to builds
3438         outside of the usual buildStarted() return value.
3439         (BuildSubscriber): support class for RemoteBuild.remote_subscribe
3441         * buildbot/scheduler.py (Try_Jobdir): convey buildsetID properly
3442         (Try_Userpass_Perspective.perspective_try): return a remotely
3443         usable BuildSetStatus object
3445         * buildbot/interfaces.py (IBuildStatus): remove obsolete
3446         isStarted()/waitUntilStarted()
3448 2005-08-16  Brian Warner  <warner@lothar.com>
3450         * buildbot/status/builder.py: implement IBuildSetStatus and
3451         IBuildRequestStatus, wire them into place.
3452         * buildbot/buildset.py: same. Add ID, move wait-until-finished
3453         methods into the BuildSetStatus object.
3454         * buildbot/interfaces.py: same
3455         (IStatus.getBuildSets): new method to get pending BuildSets
3456         (IStatusReceiver.buildsetSubmitted): new method which hears about
3457         new BuildSets
3458         * buildbot/master.py (BuildMaster.submitBuildSet): same
3459         * buildbot/process/base.py (BuildRequest): same, replace
3460         waitUntilStarted with subscribe/unsubscribe
3461         * buildbot/process/builder.py (BuilderControl.forceBuild): use
3462         subscribe instead of waitUntilStarted
3463         * buildbot/status/base.py (StatusReceiver.buildsetSubmitted): stub
3464         for new method
3465         * buildbot/status/client.py (StatusClientPerspective.builderRemoved): 
3466         same
3467         * buildbot/test/test_buildreq.py: update for new code
3468         * buildbot/test/test_control.py (Force.testRequest): same
3471         * buildbot/slave/commands.py (Darcs.doVCFull): fix get-revision
3472         for Darcs to not use the tempfile module, so it works under
3473         python-2.2 too. We really didn't need the full cleverness of that
3474         module, since the slave has exclusive control of its own builddir.
3476 2005-08-15  Brian Warner  <warner@lothar.com>
3478         * buildbot/scripts/tryclient.py (CVSExtractor): implement 'try'
3479         for CVS trees. It doesn't work for non-trunk branches,
3480         unfortunately.
3481         * buildbot/test/test_vc.py (CVS.testTry): test it, but skip the
3482         branch test
3484         * Makefile: make it easier to test against python2.2
3486         * buildbot/test/test_vc.py (VCBase.tearDown): provide for
3487         tearDown2, so things like Arch can unregister archives as they're
3488         shutting down. The previous subclass-override-tearDown technique
3489         resulted in a nested maybeWait() and test failures under
3490         Twisted-1.3.0
3492         * buildbot/scripts/tryclient.py (getSourceStamp): extract branches
3493         where we can (Arch), add a branch= argument to set the branch used
3494         when we can't
3495         (BazExtractor): extract the branch too
3496         (TlaExtractor): same
3497         * buildbot/scripts/runner.py (TryOptions): add --branch
3498         * docs/buildbot.texinfo (try): document --branch/try_branch
3500         * buildbot/slave/commands.py (Darcs): implement get-revision for
3501         Darcs, so that 'try' will work. This requires the tempfile module
3502         from python-2.3 .
3504         * buildbot/test/test_vc.py: rewrite tests, getting better coverage
3505         of revisions, branches, and 'try' in the process.
3507 2005-08-11  Brian Warner  <warner@lothar.com>
3509         * buildbot/master.py (DebugPerspective.perspective_pokeIRC): fix
3510         this, it got broken at some point in the last few releases
3511         * buildbot/status/words.py (IrcBuildRequest): reply was broken
3512         (IrcStatusBot.emit_status): handle new IBuilderStatus.getState,
3513         specifically the removal of ETA information from the tuple
3515         * buildbot/locks.py: use %d for id() instead of %x, avoid a silly
3516         warning message
3518         * docs/buildbot.texinfo (try): document both --builder and
3519         'try_builders' in .buildbot/options
3520         * buildbot/scripts/runner.py (TryOptions): add --builder,
3521         accumulate the values into opts['builders']
3522         * buildbot/scripts/tryclient.py (Try.__init__): set builders
3523         * buildbot/test/test_runner.py (Try): add some quick tests to make
3524         sure 'buildbot try --options' and .buildbot/options get parsed
3525         * buildbot/test/test_scheduler.py (Scheduling.testTryUserpass):
3526         use --builder control
3528         * docs/buildbot.texinfo (try): add --port argument to PB style
3530         * buildbot/scripts/tryclient.py (SourceStampExtractor): return an
3531         actual SourceStamp. Still need to extract a branch name, somehow.
3532         (Try): finish implementing the try client side, still need a UI
3533         for specifying which builders to use
3534         (Try.getopt): factor our options/config-file reading
3535         * buildbot/test/test_scheduler.py (Scheduling.testTryUserpass):
3536         test it
3537         * buildbot/test/test_vc.py: match SourceStampExtractor change
3539         * buildbot/scripts/runner.py (Options.opt_verbose): --verbose
3540         causes the twisted log to be sent to stderr
3542         * buildbot/scheduler.py (Try_Userpass): implement the PB style
3544 2005-08-10  Brian Warner  <warner@lothar.com>
3546         * buildbot/scripts/runner.py: Add 'buildbot try' command, jobdir
3547         style is 90% done, still missing status reporting or waiting for
3548         the buildsets to finish, and it is completely untested.
3550         * buildbot/trybuild.py: delete file, move contents to ..
3551         * buildbot/scripts/tryclient.py (getSourceStamp): .. here
3552         * buildbot/test/test_vc.py: match the move
3554         * buildbot/scheduler.py (Try_Jobdir): implement the jobdir style
3555         of the TryScheduler, no buildsetID or status-tracking support yet
3556         * buildbot/test/test_scheduler.py (Scheduling.testTryJobdir): test it
3558         * buildbot/changes/maildir.py (Maildir.setBasedir): make it
3559         possible to set the basedir after __init__ time, so it is easier
3560         to use as a Service-child of the BuildMaster instance
3562         * buildbot/changes/maildirtwisted.py (MaildirService): make a form
3563         that delivers messages to its Service parent instead of requiring
3564         a subclass to be useful. This turns out to be much easier to build
3565         unit tests around.
3567         * buildbot/scripts/tryclient.py (createJob): utility code to
3568         create jobfiles, will eventually be used by 'buildbot try'
3570 2005-08-08  Brian Warner  <warner@lothar.com>
3572         * docs/buildbot.texinfo (try): add docs on the
3573         as-yet-unimplemented Try scheduler
3575         * buildbot/test/test_buildreq.py: move Scheduling tests out to ..
3576         * buildbot/test/test_scheduler.py: .. here
3577         (Scheduling.testTryJobdir): add placeholder test for 'try'
3579         * buildbot/test/test_status.py (Log.testMerge3): update to match new
3580         addEntry merging (>=chunkSize) behavior
3581         (Log.testConsumer): update to handle new callLater(0) behavior
3583         * buildbot/test/test_web.py: rearrange tests a bit, add test for
3584         both the MAX_LENGTH bugfix and the resumeProducing hang.
3586         * buildbot/status/builder.py (LogFileProducer.resumeProducing):
3587         put off the actual resumeProducing for a moment with
3588         reactor.callLater(0). This works around a twisted-1.3.0 bug which
3589         causes large logfiles to hang midway through.
3591         * buildbot/process/step.py (BuildStep.addCompleteLog): break the
3592         logfile up into chunks, both to avoid NetstringReceiver.MAX_LENGTH
3593         and to improve memory usage when streaming the file out to a web
3594         browser.
3595         * buildbot/status/builder.py (LogFile.addEntry): change > to >= to
3596         make this work cleanly
3598 2005-08-03  Brian Warner  <warner@lothar.com>
3600         * buildbot/trybuild.py: new file for 'try' utilities
3601         (getSourceStamp): run in a tree, find out the baserev+patch
3602         * buildbot/test/test_vc.py (VCBase.do_getpatch): test it,
3603         implemented for SVN and Darcs, still working on Arch. I don't know
3604         how to make CVS work yet.
3606         * docs/buildbot.texinfo: document the 'buildbot' command-line
3607         tool, including the not-yet-implemented 'try' feature, and the
3608         in-flux .buildbot/ options directory.
3610 2005-07-20  Brian Warner  <warner@lothar.com>
3612         * buildbot/locks.py: added temporary id() numbers to Lock
3613         descriptions, to track down a not-really-sharing-the-Lock bug
3615         * buildbot/test/runutils.py: must import errno, cut-and-paste bug
3617         * buildbot/test/test_slavecommand.py (ShellBase.failUnlessIn):
3618         needed for python2.2 compatibility
3619         * buildbot/test/test_vc.py: python2.2 compatibility: generators
3620         are from the __future__
3622 2005-07-19  Brian Warner  <warner@lothar.com>
3624         * buildbot/master.py (BuildMaster.loadConfig): give a better error
3625         message when schedulers use unknown builders
3627         * buildbot/process/builder.py (Builder.compareToSetup): make sure
3628         SlaveLock('name') and MasterLock('name') are distinct
3630         * buildbot/master.py (BuildMaster.loadConfig): oops, sanity-check
3631         c['schedulers'] in such a way that we can actually accept
3632         Dependent instances
3633         * buildbot/test/test_config.py: check it
3635         * buildbot/scheduler.py (Dependent.listBuilderNames): oops, add
3636         utility method to *all* the Schedulers
3637         (Periodic.listBuilderNames): same
3639         * docs/buildbot.texinfo (Interlocks): update chapter to match
3640         reality
3642         * buildbot/master.py (BuildMaster.loadConfig): Add sanity checks
3643         to make sure that c['sources'], c['schedulers'], and c['status']
3644         are all lists of the appropriate objects, and that the Schedulers
3645         all point to real Builders
3646         * buildbot/interfaces.py (IScheduler, IUpstreamScheduler): add
3647         'listBuilderNames' utility method to support this
3648         * buildbot/scheduler.py: implement the utility method
3649         * buildbot/test/test_config.py (ConfigTest.testSchedulers): test it
3651         * docs/buildbot.texinfo: add some @cindex entries
3653         * buildbot/test/test_vc.py (Arch.createRepository): set the tla ID
3654         if it wasn't already set: most tla commands will fail unless one
3655         has been set.
3656         (Arch.createRepository): and disable bazaar's revision cache, since
3657         they cause test failures (the multiple repositories we create all
3658         interfere with each other through the cache)
3660         * buildbot/test/test_web.py (WebTest): remove use of deferredResult,
3661         bring it properly up to date with twisted-2.0 test guidelines
3663         * buildbot/master.py (BuildMaster): remove references to old
3664         'interlock' module, this caused a bunch of post-merge test
3665         failures
3666         * buildbot/test/test_config.py: same
3667         * buildbot/process/base.py (Build): same
3669         * buildbot/test/test_slaves.py: stubs for new test case
3671         * buildbot/scheduler.py: add test-case-name tag
3672         * buildbot/test/test_buildreq.py: same
3674         * buildbot/slave/bot.py (SlaveBuilder.__init__): remove some
3675         unnecessary init code
3676         (Bot.remote_setBuilderList): match it
3678         * docs/buildbot.texinfo (@settitle): don't claim version 1.0
3680         * buildbot/changes/mail.py (parseSyncmail): update comment
3682         * buildbot/test/test_slavecommand.py: disable Shell tests on
3683         platforms that don't suport IReactorProcess
3685         * buildbot/status/builder.py (LogFile): remove the 't' mode from
3686         all places where we open logfiles. It causes OS-X to open the file
3687         in some weird mode that that prevents us from mixing reads and
3688         writes to the same filehandle, which we depend upon to implement
3689         _generateChunks properly. This change doesn't appear to break
3690         win32, on which "b" and "t" are treated differently but a missing
3691         flag seems to be interpreted as "t".
3693 2005-07-18  Brian Warner  <warner@lothar.com>
3695         * buildbot/slave/commands.py (ShellCommand): overhaul
3696         error-handling code, to try and make timeout/interrupt work
3697         properly, and make win32 happier
3698         * buildbot/test/test_slavecommand.py: clean up, stop using
3699         reactor.iterate, add tests for timeout and interrupt
3700         * buildbot/test/sleep.py: utility for a new timeout test
3702         * buildbot/twcompat.py: copy over twisted 1.3/2.0 compatibility
3703         code from the local-usebranches branch
3705 2005-07-17  Brian Warner  <warner@lothar.com>
3707         * buildbot/process/process_twisted.py
3708         (TwistedReactorsBuildFactory): change the treeStableTimer to 5
3709         minutes, to match the other twisted BuildFactories, and don't
3710         excuse failures in c/qt/win32 reactors any more.
3712         * docs/examples/twisted_master.cfg: turn off the 'threadless' and
3713         'freebsd' builders, since the buildslaves have been unavailable
3714         for quite a while
3716 2005-07-13  Brian Warner  <warner@lothar.com>
3718         * buildbot/test/test_vc.py (VCBase.do_branch): test the new
3719         build-on-branch feature
3721         * buildbot/process/step.py (Darcs.__init__): add base_url and
3722         default_branch arguments, just like SVN
3723         (Arch.__init__): note that the version= argument is really the
3724         default branch name
3726         * buildbot/slave/commands.py (SourceBase): keep track of the
3727         repository+branch that was used for the last checkout in
3728         SRCDIR/.buildbot-sourcedata . If the contents of this file do not
3729         match, we clobber the directory and perform a fresh checkout
3730         rather than trying to do an in-place update. This should protect
3731         us against trying to get to branch B by doing an update in a tree
3732         obtained from branch A.
3733         (CVS.setup): add CVS-specific sourcedata: root, module, and branch
3734         (SVN.setup): same, just the svnurl
3735         (Darcs.setup): same, just the repourl
3736         (Arch.setup): same, arch coordinates (url), version, and
3737         buildconfig. Also pull the buildconfig from the args dictionary,
3738         which we weren't doing before, so the build-config was effectively
3739         disabled.
3740         (Arch.sourcedirIsUpdateable): don't try to update when we're
3741         moving to a specific revision: arch can't go backwards, so it is
3742         safer to just clobber the tree and checkout a new one at the
3743         desired revision.
3744         (Bazaar.setup): same sourcedata as Arch
3746         * buildbot/test/test_dependencies.py (Dependencies.testRun_Fail):
3747         use maybeWait, to work with twisted-1.3.0 and twcompat
3748         (Dependencies.testRun_Pass): same
3750         * buildbot/test/test_vc.py: rearrange, cleanup
3752         * buildbot/twcompat.py: add defer.waitForDeferred and
3753         utils.getProcessOutputAndValue, so test_vc.py (which uses them)
3754         can work under twisted-1.3.0 .
3756         * buildbot/test/test_vc.py: rewrite. The sample repositories are
3757         now created at setUp time. This increases the runtime of the test
3758         suite considerably (from 91 seconds to 151), but it removes the
3759         need for an offline tarball, which should solve a problem I've
3760         seen where the test host has a different version of svn than the
3761         tarball build host. The new code also validates that mode=update
3762         really picks up recent commits. This approach will also make it
3763         easier to test out branches, because the code which creates the VC
3764         branches is next to the code which uses them. It will also make it
3765         possible to test some change-notification hooks, by actually
3766         performing a VC commit and watching to see the ChangeSource get
3767         notified.
3769 2005-07-12  Brian Warner  <warner@lothar.com>
3771         * docs/buildbot.texinfo (SVN): add branches example
3772         * docs/Makefile (buildbot.ps): add target for postscript manual
3774         * buildbot/test/test_dependencies.py: s/test_interlocks/test_locks/ 
3775         * buildbot/test/test_locks.py: same
3777         * buildbot/process/step.py (Darcs): comment about default branches
3779         * buildbot/master.py (BuildMaster.loadConfig): don't look for
3780         c['interlocks'] in the config file, complain if it is present.
3781         Scan all locks in c['builders'] to make sure the Locks they use
3782         are uniquely named.
3783         * buildbot/test/test_config.py: remove old c['interlocks'] test,
3784         add some tests to check for non-uniquely-named Locks
3785         * buildbot/test/test_vc.py (Patch.doPatch): fix factory.steps,
3786         since the unique-Lock validation code requires it now
3788         * buildbot/locks.py: fix test-case-name
3790         * buildbot/interlock.py: remove old file
3792 2005-07-11  Brian Warner  <warner@lothar.com>
3794         * buildbot/test/test_interlock.py: rename to..
3795         * buildbot/test/test_locks.py: .. something shorter
3797         * buildbot/slave/bot.py (BuildSlave.stopService): newer Twisted
3798         versions (after 2.0.1) changed internet.TCPClient to shut down the
3799         connection in stopService. Change the code to handle this
3800         gracefully.
3802         * buildbot/process/base.py (Build): handle whole-Build locks
3803         * buildbot/process/builder.py (Builder.compareToSetup): same
3804         * buildbot/test/test_interlock.py: make tests work
3806         * buildbot/process/step.py (BuildStep.startStep): complain if a
3807         Step tries to claim a lock that's owned by its own Build
3808         (BuildStep.releaseLocks): typo
3810         * buildbot/locks.py (MasterLock): use ComparableMixin so config
3811         file reloads don't replace unchanged Builders
3812         (SlaveLock): same
3813         * buildbot/test/test_config.py (ConfigTest.testInterlocks):
3814         rewrite to cover new Locks instead of old c['interlocks']
3815         * buildbot/test/runutils.py (RunMixin.connectSlaves): remember
3816         slave2 too
3819         * buildbot/test/test_dependencies.py (Dependencies.setUp): always
3820         start the master and connect the buildslave
3822         * buildbot/process/step.py (FailingDummy.done): finish with a
3823         FAILURE status rather than raising an exception
3825         * buildbot/process/base.py (BuildRequest.mergeReasons): don't try to
3826         stringify a BuildRequest.reason that is None
3828         * buildbot/scheduler.py (BaseUpstreamScheduler.buildSetFinished):
3829         minor fix
3830         * buildbot/status/builder.py (BuildSetStatus): implement enough to
3831         allow scheduler.Dependent to work
3832         * buildbot/buildset.py (BuildSet): set .reason and .results
3834         * buildbot/test/test_interlock.py (Locks.setUp): connect both
3835         slaves, to make the test stop hanging. It still fails, of course,
3836         because I haven't even started to implement Locks.
3838         * buildbot/test/runutils.py (RunMixin.connectSlaves): new utility
3840         * docs/buildbot.texinfo (Build-Dependencies): redesign the feature
3841         * buildbot/interfaces.py (IUpstreamScheduler): new Interface
3842         * buildbot/scheduler.py (BaseScheduler): factor out common stuff
3843         (Dependent): new class for downstream build dependencies
3844         * buildbot/test/test_dependencies.py: tests (still failing)
3846         * buildbot/buildset.py (BuildSet.waitUntilSuccess): minor notes
3848 2005-07-07  Brian Warner  <warner@lothar.com>
3850         * buildbot/test/runutils.py (RunMixin): factored this class out..
3851         * buildbot/test/test_run.py: .. from here
3852         * buildbot/test/test_interlock.py: removed old c['interlock'] tests,
3853         added new buildbot.locks tests (which all hang right now)
3854         * buildbot/locks.py (SlaveLock, MasterLock): implement Locks
3855         * buildbot/process/step.py: claim/release per-BuildStep locks
3857         * docs/Makefile: add 'buildbot.html' target
3859         * buildbot/process/step.py (CVS.__init__): allow branch=None to be
3860         interpreted as "HEAD", so that all VC steps can accept branch=None
3861         and have it mean the "default branch".
3863         * docs/buildbot.texinfo: add Schedulers, Dependencies, and Locks
3865 2005-07-07  Brian Warner  <warner@lothar.com>
3867         * docs/examples/twisted_master.cfg: update to match current usage
3869         * docs/buildbot.texinfo (System Architecture): comment out the
3870         image, it doesn't exist yet and just screws up the HTML manual.
3872 2005-07-05  Brian Warner  <warner@lothar.com>
3874         * debian/.cvsignore: oops, missed one. Removing leftover file.
3876 2005-06-17  Brian Warner  <warner@lothar.com>
3878         * buildbot/test/test_vc.py (VCSupport.__init__): svn --version
3879         changed its output in 1.2.0, don't mistakenly think that the
3880         subversion we find isn't capable of supporting our tests.
3882         * debian/*: remove the debian/ directory and its contents, to make
3883         life easier for the proper Debian maintainer
3884         * MANIFEST.in: same
3885         * Makefile (release): same
3887 2005-06-07  Brian Warner  <warner@lothar.com>
3889         * everything: create a distinct SourceStamp class to replace the
3890         ungainly 4-tuple, let it handle merging instead of BuildRequest.
3891         Changed the signature of Source.startVC to include the revision
3892         information (instead of passing it through self.args). Implement
3893         branches for SVN (now only Darcs/Git is missing support). Add more
3894         Scheduler tests.
3896 2005-06-06  Brian Warner  <warner@lothar.com>
3898         * everything: rearrange build scheduling. Create a new Scheduler
3899         object (configured in c['schedulers'], which submit BuildSets to a
3900         set of Builders. Builders can now use multiple slaves. Builds can
3901         be run on alternate branches, either requested manually or driven
3902         by changes. This changed some of the Status classes. Interlocks
3903         are out of service until they've been properly split into Locks
3904         and Dependencies. treeStableTimer, isFileImportant, and
3905         periodicBuild have all been moved from the Builder to the
3906         Scheduler.
3907         (BuilderStatus.currentBigState): removed the 'waiting' and
3908         'interlocked' states, removed the 'ETA' argument.
3910 2005-05-24  Brian Warner  <warner@lothar.com>
3912         * buildbot/pbutil.py (ReconnectingPBClientFactory): Twisted-1.3
3913         erroneously abandons the connection (in clientConnectionFailed)
3914         for non-UserErrors, which means that if we lose the connection due
3915         to a network problem or a timeout, we'll never try to reconnect.
3916         Fix this by not upcalling to the buggy parent method. Note:
3917         twisted-2.0 fixes this, but the function only has 3 lines so it
3918         makes more sense to copy it than to try and detect the buggyness
3919         of the parent class. Fixes SF#1207588.
3921         * buildbot/changes/changes.py (Change.branch): doh! Add a
3922         class-level attribute to accomodate old Change instances that were
3923         pickled before 0.6.5 (where .branch was added for new Changes).
3924         This fixes the exception that occurs when you try to look at an
3925         old Change (through asHTML).
3927         * buildbot/__init__.py (version): bump to 0.6.6+ while between
3928         releases
3930 2005-05-23  Brian Warner  <warner@lothar.com>
3932         * buildbot/__init__.py (version): release 0.6.6
3934 2005-05-23  Brian Warner  <warner@lothar.com>
3936         * NEWS: update for 0.6.6 release
3937         * debian/changelog: same
3939         * buildbot/scripts/runner.py (start): put the basedir in sys.path
3940         before starting: this was done by twistd back when we spawned it,
3941         now that we're importing the pieces and running them in the
3942         current process, we have to do it ourselves. This allows
3943         master.cfg to import files from the same directory without
3944         explicitly manipulating PYTHONPATH. Thanks to Thomas Vander
3945         Stichele for the catch.
3946         (Options.opt_version): Add a --version command (actually, just make
3947         the existing --version command emit Buildbot's version too)
3949         * buildbot/status/builder.py (HTMLLogFile.upgrade): oops! second
3950         fix to make this behave like other LogFiles, this time to handle
3951         existing LogFiles on disk. (add the missing .upgrade method)
3952         * buildbot/test/test_status.py (Log.testHTMLUpgrade): test it
3954 2005-05-21  Brian Warner  <warner@lothar.com>
3956         * buildbot/test/test_runner.py (Create.testMaster): match the
3957         rawstring change in runner.py:masterTAC
3959         * buildbot/test/test_config.py (ConfigTest.testIRC): skip unless
3960         TwistedWords is installed
3961         * buildbot/test/test_status.py: same, with TwistedMail
3963         * buildbot/master.py: remove old IRC/Waterfall imports (used by
3964         some old, deprecated, and removed config keys). This should enable
3965         you to use the base buildbot functionality with Twisted-2.0.0 when
3966         you don't also have TwistedWeb and TwistedWords installed
3968 2005-05-20  Brian Warner  <warner@lothar.com>
3970         * buildbot/scripts/runner.py (run): call sendchange(), not
3971         do_sendchange(): thus 'buildbot sendchange' was broken in 0.6.5
3972         (run): call stop("HUP"), not "-HUP", 'buildbot stop' was broken.
3973         (stop): don't wait for process to die when sending SIGHUP
3974         (masterTAC): use a rawstring for basedir=, otherwise '\' in the
3975         directory name gets interpreted, which you don't want
3976         (slaveTAC): same
3978         * buildbot/__init__.py (version): bump to 0.6.5+ while between
3979         releases
3981 2005-05-18  Brian Warner  <warner@lothar.com>
3983         * buildbot/__init__.py (version): Releasing buildbot-0.6.5
3985 2005-05-18  Brian Warner  <warner@lothar.com>
3987         * README: update for 0.6.5
3988         * debian/changelog: same
3990         * buildbot/changes/changes.py: rename tag= to branch=, since
3991         that's how we're using it, and my design for the upcoming "build a
3992         specific branch" feature wants it. also, tag= was too CVS-centric
3993         * buildbot/changes/mail.py (parseSyncmail): same
3994         * buildbot/process/base.py (Build.isBranchImportant): same
3995         * buildbot/test/test_mailparse.py (Test3.testMsgS4): same
3996         * docs/buildbot.texinfo (Attributes of Changes): same
3998         * NEWS: update tag=, update for upcoming release
4000 2005-05-17  Brian Warner  <warner@lothar.com>
4002         * buildbot/scripts/runner.py (stop): actually poll once per
4003         second, instead of re-killing the poor daemon once per second.
4004         Sleep briefly (0.1s) before the first poll, since there's a good
4005         chance we can avoid waiting the full second if the daemon shuts
4006         down quickly. Also remove the sys.exit() at the end.
4007         (start): remove the unneighborly sys.exit()
4009         * Makefile: improve permission-setting to not kick Arch so badly
4011         * buildbot/scripts/runner.py (SlaveOptions.optParameters): set a
4012         default --keepalive=600, since it doesn't hurt very much, and it's
4013         a hassle to discover that you need it.
4014         * buildbot/test/test_runner.py (Create.testSlave): test it
4016         * buildbot/status/words.py (IrcStatusBot.buildFinished): Teach the
4017         IRC bot about EXCEPTION
4019         * buildbot/status/client.py (PBListener): upcall more correctly
4021         * buildbot/process/base.py (Build.allStepsDone): if a step caused
4022         an exception mark the overall build with EXCEPTION, not SUCCESS
4024         * buildbot/scripts/runner.py (makefile_sample): remove the leading
4025         newline
4026         * buildbot/status/mail.py (MailNotifier): oops, forgot to upcall
4027         * Makefile: update some release-related stuff
4029         * buildbot/slave/commands.py (ShellCommand.kill): if somehow this
4030         gets called when there isn't actually an active process, just end
4031         the Command instead of blowing up. I don't know how it gets into
4032         this state, but the twisted win32 buildslave will sometimes hang,
4033         and when it shakes its head and comes back, it thinks it's still
4034         running a Command. The next build causes this command to be
4035         interrupted, but the lack of self.process.pid breaks the interrupt
4036         attempt.
4038         * NEWS: document changes since the last release
4040         * buildbot/scripts/runner.py (start): change 'buildbot start' to
4041         look for Makefile.buildbot instead of a bare Makefile . The
4042         'buildbot start' does not install this file, so you have to
4043         manually copy it if you want to customize startup behavior.
4044         (createMaster): change 'buildbot master' command to create
4045         Makefile.sample instead of Makefile, to create master.cfg.sample
4046         instead of master.cfg (requiring you to copy it before the
4047         buildmaster can be started). Both sample files are kept up to
4048         date, i.e. they are overwritten if they have been changed. The
4049         'buildbot.tac' file is *not* overwritten, but if the new contents
4050         don't match the old, a 'buildbot.tac.new' file is created and the
4051         user is warned. This seems to be a much more sane way to handle
4052         startup files. Also, don't sys.exit(0) when done, so we can run
4053         unit tests against it.
4054         (createSlave): same. Don't overwrite the sample info/ files.
4055         * buildbot/scripts/sample.mk: remove. the contents were pulled
4056         into runner.py, since they need to match the behavior of start()
4057         * setup.py: same
4058         * MANIFEST.in: same
4060         * docs/buildbot.texinfo (Launching the daemons): document it
4061         * buildbot/test/test_runner.py (Create): test it
4063         * buildbot/test/test_vc.py (SetupMixin.failUnlessIn): Add a
4064         version that can handle string-in-string tests, because otherwise
4065         python-2.2 fails the tests. It'd be tremendous if Trial's test
4066         took two strings under 2.2 too.
4068         * everything: fixed all deprecation warnings when running against
4069         Twisted-2.0 . (at least all the ones in buildbot code, there are a
4070         few that come from Twisted itself). This involved putting most of
4071         the Twisted-version specific code in the new buildbot.twcompat
4072         module, and creating some abstract base classes in
4073         buildbot.changes.base and buildbot.status.base (which might be
4074         useful anyway). __implements__ is a nuisance and requires an ugly
4075         'if' clause everywhere.
4077         * buildbot/test/test_status.py (Mail.testMail): add a 0.1 second
4078         delay before finishing the test: it seems that smtp.sendmail
4079         doesn't hang up on the server, so we must wait a moment so it can
4080         hang up on us. This removes the trial warning about an unclean
4081         reactor.
4083 2005-05-16  Brian Warner  <warner@lothar.com>
4085         * buildbot/process/step.py (Source): add 'retry' argument. It is a
4086         tuple of (delay, repeats).
4087         * buildbot/test/test_vc.py (Retry): test it
4088         * docs/buildbot.texinfo (Source Checkout): document it
4089         * buildbot/slave/commands.py (SourceBase): add 'retry' parameter.
4090         (SourceBase.maybeDoVCRetry): If 'retry' is set, failures in
4091         doVCFull() are handled by re-trying the checkout (after a delay)
4092         some number of times.
4093         (ShellCommand._startCommand): make header lines easier to read
4095         * buildbot/test/test_web.py (WebTest.tearDown): factor out master
4096         shutdown
4097         (WebTest.test_logfile): make sure master gets shut down, silences
4098         some "unclean reactor" test errors
4100         * buildbot/test/test_changes.py (Sender.tearDown): spin the
4101         reactor once after shutdown, something in certain versions of
4102         Twisted trigger a test failure. 1.3.0 is ok, 2.0.0 fails, 2.0.1pre
4103         fails, svn-trunk is ok.
4105         * buildbot/test/test_slavecommand.py (Shell.testShellZ): add a
4106         second win32 error message
4108         * buildbot/test/test_run.py (Status.testSlave): be smarter about
4109         validating the ETA, so the tests don't fail on slow systems
4111 2005-05-15  Brian Warner  <warner@lothar.com>
4113         * buildbot/status/builder.py (HTMLLogFile): make this behave like
4114         the new LogFile class, so upgrading works properly
4115         (LogFileProducer.resumeProducing): survive resumeProducing after
4116         we've exhausted the chunkGenerator
4118         * buildbot/test/test_web.py (WebTest.test_logfile): validate HTML
4119         logs too
4120         * buildbot/test/test_status.py (Log.testAdd): validate hasContents
4121         (Log.testUpgrade): same
4123         * docs/buildbot.texinfo (Maintenance): describe how to delete old
4124         Builds and logs with a cron job.
4126         * buildbot/status/builder.py (LogFile): revamp LogFiles. Got rid
4127         of the old non-offline LogFile, added code to upgrade these to
4128         new-style contents-live-on-disk instances at load time (in a way
4129         that doesn't invalidate the old Build pickles, so upgrading to
4130         0.6.5 is not a one-way operation). Got rid of everything related
4131         to 'stub' builds.
4132         (LogFile.__init__): create LogFiles with the parent step status,
4133         the log's name, and a builder-relative filename where it can keep
4134         the contents on disk.
4135         (LogFile.hasContents): new method, clients are advised to call it
4136         before getText or getChunks and friends. If it returns False, the
4137         log's contents have been deleted and getText() will raise an
4138         error.
4139         (LogFile.getChunks): made it a generator
4140         (LogFile.subscribeConsumer): new method, takes a Twisted-style
4141         Consumer (except one that takes chunks instead of strings). This
4142         enables streaming of very large logfiles without storing the whole
4143         thing in memory.
4144         (BuildStatus.generateLogfileName): create names like
4145         12-log-compile-output, with a _0 suffix if required to be unique
4146         (BuildStatus.upgradeLogfiles): transform any old-style (from 0.6.4
4147         or earlier) logfiles into new-style ones
4148         (BuilderStatus): remove everything related to 'stub' builds. There
4149         is now only one build cache, and we don't strip logs from old
4150         builds anymore.
4151         (BuilderStatus.getBuildByNumber): check self.currentBuild too,
4152         since we no longer fight to keep it in the cache
4154         * buildbot/status/html.py (TextLog.render_GET): use a
4155         ChunkConsumer to stream the log entries efficiently.
4156         (ChunkConsumer): wrapper which consumes chunks and writes
4157         formatted HTML.
4159         * buildbot/test/test_twisted.py (Parse.testParse): use a
4160         LogFile-like object instead of a real one
4162         * buildbot/test/test_status.py (MyLog): handle new LogFile code
4163         (Log.testMerge3): validate more merge behavior
4164         (Log.testChunks): validate LogFile.getChunks
4165         (Log.testUpgrade): validate old-style LogFile upgrading
4166         (Log.testSubscribe): validate LogFile.subscribe
4167         (Log.testConsumer): validate LogFile.subscribeConsumer
4169         * buildbot/interfaces.py (IStatusLogStub): remove
4170         (IStatusLog.subscribeConsumer): new method
4171         (IStatusLog.hasContents): new method
4172         (IStatusLogConsumer): describes things passed to subscribeConsumer
4174         * buildbot/status/html.py (StepBox.getBox): Don't offer an href to
4175         the log contents if it does not have any contents.
4176         (StatusResourceBuildStep.body): same
4177         (StatusResourceBuildStep.getChild): give a 404 for empty logs
4179 2005-05-14  Brian Warner  <warner@lothar.com>
4181         * buildbot/test/test_web.py (WebTest.test_logfile): add 5-second
4182         timeouts to try and make the windows metabuildslave not hang
4184 2005-05-13  Mike Taylor  <bear@code-bear.com>
4186         * buildbot/slave/commands.py (rmdirRecursive): added a check
4187         to ensure the path passed into rmdirRecursive actually exists.
4188         On win32 a non-existant path would generate an exception.
4190 2005-05-13  Brian Warner  <warner@lothar.com>
4192         * buildbot/slave/commands.py (rmdirRecursive): replacement for
4193         shutil.rmtree which behaves correctly on windows in the face of
4194         files that you have to chmod before deleting. Thanks to Bear at
4195         the OSAF for the routine.
4196         (SourceBase.doClobber): use rmdirRecursive
4198 2005-05-12  Brian Warner  <warner@lothar.com>
4200         * buildbot/status/builder.py (OfflineLogFile.getChunks): have this
4201         method generate chunks instead of returning a big list. This
4202         allows the same method to be used for both old LogFile and new
4203         OfflineLogFile.
4204         (OfflineLogFile.getText): use the generator
4205         (OfflineLogFile.subscribe): same
4206         * buildbot/status/html.py (TextLog.resumeProducing): same
4207         * buildbot/interfaces.py (IStatusLog.getChunks): document it
4209         * buildbot/test/test_web.py (WebTest.test_logfile): Add a test to
4210         point out that OfflineLogFile does not currently work with
4211         html.Waterfall . Fixing this is high-priority.
4213         * buildbot/scripts/runner.py (start): add --logfile=twistd.log, since
4214         apparently windows defaults to using stdout
4216         * buildbot/test/test_slavecommand.py (Shell.testShellZ): log a
4217         better message on failure so I can figure out the win32 problem
4219         * buildbot/slave/commands.py (ShellCommand._startCommand): update
4220         log messages to include more useful copies of the command being
4221         run, the argv array, and the child command's environment.
4222         (Git.doVCFull): update cg-close usage, patch from Brandon Philips.
4224 2005-05-11  Brian Warner  <warner@lothar.com>
4226         * setup.py: oops, install debug.glade so 'buildbot debugclient'
4227         will actually work
4228         * Makefile: update the deb-snapshot version
4230         * docs/buildbot.texinfo: move all .xhtml docs into a new
4231         .texinfo-format document, adding a lot of material in the process.
4232         This is starting to look like a real user's manual. Removed all
4233         the Lore-related files: *.xhtml, *.css, template.tpl .
4234         * docs/Makefile: simple makefile to run 'makeinfo'
4235         * buildbot/scripts/sample.cfg: rearrange slightly
4236         * MANIFEST.in: include .info and .textinfo, don't include *.xhtml
4238 2005-05-10  Brian Warner  <warner@lothar.com>
4240         * buildbot/scripts/runner.py (start): Twisted-1.3.0 used a
4241         different name for the internal twistw module, handle it.
4243         * MANIFEST.in: we deleted plugins.tml, so stop shipping it
4244         * setup.py: .. and stop trying to install it
4246         * buildbot/process/step.py (Git): added support for 'cogito' (aka
4247         'git'), the new linux kernel VC system (http://kernel.org/git/).
4248         Thanks to Brandon Philips for the patch.
4249         * buildbot/slave/commands.py (Git): same
4251 2005-05-06  Brian Warner  <warner@lothar.com>
4253         * buildbot/status/builder.py (OfflineLogFile): replace the default
4254         LogFile with a form that appends its new contents to a disk file
4255         as they arrive. The complete log data is never kept in RAM. This
4256         is the first step towards handling very large (100MB+) logfiles
4257         without choking quite so badly. (The other half is
4258         producer/consumer on the HTML pages).
4259         (BuildStepStatus.addLog): use OfflineLogFile by default
4260         (BuildStatus.getLogfileName): helper code to give the
4261         OfflineLogFile a filename to work with
4263         * buildbot/test/test_status.py (Results.testAddResults): update
4264         tests to handle new asserts
4265         * buildbot/test/test_vc.py (Patch.doPatch): same
4266         * buildbot/test/test_steps.py (BuildStep.setUp): same
4268 2005-05-05  Brian Warner  <warner@lothar.com>
4270         * buildbot/scripts/runner.py (start): if there is no Makefile,
4271         launch the app by importing twistd's internals and calling run(),
4272         rather than spawning a new twistd process. This stands a much
4273         better chance of working under windows.
4274         (stop): kill the process with os.kill instead of spawning
4275         /bin/kill, again to reduce the number of external programs which
4276         windows might not have in the PATH. Also wait up to 5 seconds for
4277         the process to go away, allowing things like 'buildbot stop;
4278         buildbot start' to be reliable in the face of slow shutdowns.
4280         * buildbot/master.py (Dispatcher.__getstate__): remove old
4281         .tap-related methods
4282         (BuildMaster.__getstate__): same
4283         (makeService): same
4284         * buildbot/slave/bot.py (makeService): same
4285         (Options.longdesc): same
4286         * buildbot/scripts/runner.py: copy over some old mktap option text
4288         * buildbot/scripts/runner.py (masterTAC): stop using mktap.
4289         'buildbot master' now creates a buildbot.tac file, so there is no
4290         longer a create-instance/save/reload sequence. mktap is dead, long
4291         live twistd -y.
4292         * buildbot/scripts/sample.mk: use twistd -y, not -f
4293         * buildbot/test/test_config.py: remove mktap-based test
4294         * buildbot/bb_tap.py, buildbot/plugins.tml: delete old files
4295         * README: don't reference mktap
4297         * docs/source.xhtml: document some of the attributes that Changes
4298         might have
4300         * docs/steps.xhtml (Bazaar): document the Bazaar checkout step
4302         * general: merge in Change(tag=) patch from Thomas Vander Stichele.
4303         [org.apestaart@thomas--buildbot/buildbot--cvstag--0-dev--patch-2]
4304         * buildbot/changes/changes.py (Change)
4305         * buildbot/changes/mail.py (parseSyncmail)
4306         * buildbot/test/test_mailparse.py (Test3.getNoPrefix)
4307         (Test3.testMsgS5)
4308         * buildbot/process/base.py (Build.isTagImportant)
4309         (Build.addChange)
4312 2005-05-04  Brian Warner  <warner@lothar.com>
4314         * buildbot/clients/sendchange.py (Sender.send): tear down the PB
4315         connection after sending the change, so that unit tests don't
4316         complain about sockets being left around
4318         * buildbot/status/html.py (WaterfallStatusResource.body): fix
4319         exception in phase=0 rendering
4320         * buildbot/test/test_web.py (WebTest.test_waterfall): test it
4322         * buildbot/changes/dnotify.py (DNotify.__init__): remove debug msg
4324         * buildbot/master.py (BuildMaster.loadConfig): finally remove
4325         deprecated config keys: webPortnum, webPathname, irc, manholePort,
4326         and configuring builders with tuples.
4327         * buildbot/test/test_config.py: stop testing compatibility with
4328         deprecated config keys
4329         * buildbot/test/test_run.py: same
4331 2005-05-03  Brian Warner  <warner@lothar.com>
4333         * contrib/arch_buildbot.py: survive if there are no logfiles
4334         (username): just use a string, os.getlogin isn't reliable
4336         * buildbot/scripts/runner.py (sendchange): oops, fix the command
4337         so 'buildbot sendchange' actually works. The earlier test only
4338         covered the internal (non-reactor-running) form.
4340         * contrib/arch_buildbot.py: utility that can run as an Arch hook
4341         script to notify the buildmaster about changes
4343         * buildbot/scripts/runner.py (sendchange): new command to send a
4344         change to a buildbot.changes.pb.PBChangeSource receiver.
4345         * buildbot/test/test_changes.py (Sender): test it
4347         * buildbot/master.py (BuildMaster.startService): mark .readConfig
4348         after any reading of the config file, not just when we do it in
4349         startService. This makes some tests a bit cleaner.
4351         * buildbot/changes/pb.py: add some log messages
4353         * buildbot/process/base.py (Build.startBuild): fix a bug that
4354         caused an exception when the build terminated in the very first
4355         step.
4356         (Build.stepDone): let steps return a status of EXCEPTION. This
4357         terminates the build right away, and sets the build's overall
4358         status to EXCEPTION too.
4359         * buildbot/process/step.py (BuildStep.failed): return a status of
4360         EXCEPTION when that is what has happened.
4362         * buildbot/process/step.py (Arch.computeSourceRevision): finally
4363         implement this, allowing Arch-based projects to get precise
4364         checkouts instead of always using the latest code
4365         (Bazaar): create variant of Arch to let folks use baz instead of
4366         tla. Requires a new buildslave too.
4367         * buildbot/slave/commands.py (Arch): add 'revision' argument
4368         (Bazaar): create variant of Arch that uses baz instead of tla.
4369         Remove the code that extracts the archive name from the
4370         register-archive output, since baz doesn't provide it, and require
4371         the user provide both the archive name and its location.
4372         * buildbot/test/test_vc.py (VC.testBazaar): added tests
4374 2005-05-02  Brian Warner  <warner@lothar.com>
4376         * buildbot/scripts/sample.cfg: improve docs for c['buildbotURL'],
4377         thanks to Nick Trout.
4379         * buildbot/scripts/runner.py (Maker.makefile): chmod before edit,
4380         deals better with source Makefile coming from a read-only CVS
4381         checkout. Thanks to Nick Trout for the catch.
4383         * buildbot/__init__.py (version): bump to 0.6.4+ while between
4384         releases
4386 2005-04-28  Brian Warner  <warner@lothar.com>
4388         * buildbot/__init__.py (version): Releasing buildbot-0.6.4
4390         * debian/changelog: update for 0.6.4
4392 2005-04-28  Brian Warner  <warner@lothar.com>
4394         * README.w32: add a checklist of steps for getting buildbot
4395         running on windows.
4396         * MANIFEST.in: include it in the tarball
4398         * NEWS: update
4400         * buildbot/master.py (BuildMaster.upgradeToVersion3): deal with
4401         broken .tap files from 0.6.3 by getting rid of .services,
4402         .namedServices, and .change_svc at load time.
4404 2005-04-27  Brian Warner  <warner@lothar.com>
4406         * NEWS: update in preparation for new release
4408         * buildbot/test/test_config.py (Save.testSave): don't pull in
4409         twisted.scripts.twistd, we don't need it and it isn't for windows
4410         anyway.
4412         * buildbot/changes/changes.py (ChangeMaster.saveYourself):
4413         accomodate win32 which can't do atomic-rename
4415 2005-04-27  Brian Warner  <warner@lothar.com>
4417         * buildbot/test/test_run.py (Disconnect.testBuild2): crank up some
4418         timeouts to help the slow metabuildbot not flunk them so much
4419         (Disconnect.testBuild3): same
4420         (Disconnect.testBuild4): same
4421         (Disconnect.testInterrupt): same
4423         * buildbot/master.py (BuildMaster.loadChanges): fix change_svc
4424         setup, it was completely broken for new buildmasters (those which
4425         did not have a 'change.pck' already saved. Thanks to Paul Warren
4426         for catching this (embarrassing!) bug.
4427         (Dispatcher.__getstate__): don't save our registered avatar
4428         factories, since they'll be re-populated when the config file is
4429         re-read.
4430         (BuildMaster.__init__): add a dummy ChangeMaster, used only by
4431         tests (since the real mktap-generated BuildMaster doesn't save
4432         this attribute).
4433         (BuildMaster.__getstate__): don't save any service children,
4434         they'll all be re-populated when the config file is re-read.
4435         * buildbot/test/test_config.py (Save.testSave): test for this
4437 2005-04-26  Brian Warner  <warner@lothar.com>
4439         * buildbot/buildbot.png: use a new, smaller (16x16) icon image,
4440         rendered with Blender.. looks a bit nicer.
4441         * buildbot/docs/images/icon.blend: add the Blender file for it
4443         * buildbot/slave/commands.py (ShellCommand._startCommand): prepend
4444         'cmd.exe' (or rather os.environ['COMSPEC']) to the argv list when
4445         running under windows. This appears to be the best way to allow
4446         BuildSteps to do something normal like 'trial -v buildbot.test' or
4447         'make foo' and still expect it to work. The idea is to make the
4448         BuildSteps look as much like what a developer would type when
4449         compiling or testing the tree by hand. This approach probably has
4450         problems when there are spaces in the arguments, so if you've got
4451         windows buildslaves, you'll need to pay close attention to your
4452         commands.
4454         * buildbot/status/html.py (WaterfallStatusResource.body): add the
4455         timezone to the timestamp column.
4456         * buildbot/test/test_web.py (WebTest.test_waterfall): test it
4458         * buildbot/scripts/runner.py (loadOptions): do something sane for
4459         windows, I think. We use %APPDATA%/buildbot instead of
4460         ~/.buildbot, but we still search everywhere from the current
4461         directory up to the root for a .buildbot/ subdir. The "is it under
4462         $HOME" security test was replaced with "is it owned by the current
4463         user", which is only performed under posix.
4464         * buildbot/test/test_runner.py (Options.testFindOptions): update
4465         tests to match. The "is it owned by the current user" check is
4466         untested. The test has been re-enabled for windows.
4468         * buildbot/test/test_slavecommand.py (Shell.checkOutput): replace
4469         any "\n" in the expected output with the platform-specific line
4470         separator. Make this separator "\r\n" on PTYs under unix, they
4471         seem to do that and I don't know why
4473         * buildbot/test/test_runner.py (Options.optionsFile): disable on
4474         windows for now, I don't know what ~/.buildbot/ should mean there.
4476         * buildbot/test/test_run.py (BuilderNames.testGetBuilderNames):
4477         win32 compatibility, don't use "/tmp"
4478         (Basedir.testChangeBuilddir): remove more unixisms
4480 2005-04-26  Brian Warner  <warner@lothar.com>
4482         * buildbot/test/test_control.py (Force.rmtree): python2.2
4483         compatibility, apparently its shutil.rmtree ignore_errors=
4484         argument is ignored.
4485         * buildbot/test/test_run.py (Run.rmtree): same
4486         (RunMixin.setUp): same
4488         * buildbot/test/test_runner.py (make): python2.2 has os.sep but
4489         not os.path.sep
4491         * buildbot/test/test_twisted.py (Parse.failUnlessIn): 2.2 has no
4492         'substring in string' operator, must use string.find(substr)!=-1
4493         * buildbot/test/test_vc.py (Patch.failUnlessIn): same
4494         * buildbot/test/test_web.py (WebTest.failUnlessIn): same
4496         * buildbot/scripts/runner.py (loadOptions): add code to search for
4497         ~/.buildbot/, a directory with things like 'options', containing
4498         defaults for various 'buildbot' subcommands. .buildbot/ can be in
4499         the current directory, your $HOME directory, or anywhere
4500         inbetween, as long as you're somewhere inside your home directory.
4501         (debugclient): look in ~/.buildbot/options for master and passwd
4502         (statuslog): look in ~/.buildbot/options for 'masterstatus'
4503         * buildbot/test/test_runner.py (Options.testFindOptions): test it
4505         * buildbot/status/client.py (makeRemote): new approach to making
4506         IRemote(None) be None, which works under Twisted-2.0
4507         * buildbot/test/test_status.py (Client.testAdaptation): test it
4509         * buildbot/status/builder.py (Status.builderAdded): when loading a
4510         pickled BuilderStatus in from disk, set its name after loading.
4511         The config file might have changed its name (but not its
4512         directory) while it wasn't looking.
4513         
4514         * buildbot/process/builder.py (Builder.attached): always return a
4515         Deferred, even if the builder was already attached
4516         * buildbot/test/test_run.py (Basedir.testChangeBuilddir): test it
4518 2005-04-25  Brian Warner  <warner@lothar.com>
4520         * buildbot/status/words.py (IrcStatusBot.buildFinished): fix a
4521         category-related exception when announcing a build has finished
4523         * buildbot/status/html.py (StatusResourceChanges.body): oops, don't
4524         reference no-longer-existent changemaster.sources
4525         * buildbot/test/test_web.py (WebTest.test_waterfall): test for it
4527         * buildbot/__init__.py (version): bump to 0.6.3+ while between
4528         releases
4530 2005-04-25  Brian Warner  <warner@lothar.com>
4532         * buildbot/__init__.py (version): Releasing buildbot-0.6.3
4534         * debian/changelog: update for 0.6.3
4536 2005-04-25  Brian Warner  <warner@lothar.com>
4538         * MANIFEST.in: make sure debug.glade is in the tarball
4540         * README (REQUIREMENTS): list necessary Twisted-2.0 packages
4542         * NEWS: update for the imminent 0.6.3 release
4544         * buildbot/status/html.py (HtmlResource.content): make the
4545         stylesheet <link> always point at "buildbot.css".
4546         (StatusResource.getChild): map "buildbot.css" to a static.File
4547         containing whatever css= argument was provided to Waterfall()
4548         (Waterfall): provide the "classic" css as the default.
4549         * docs/waterfall.classic.css: move default CSS from here ..
4550         * buildbot/status/classic.css: .. to here
4552         * MANIFEST.in: make sure classic.css is included in the tarball
4553         * setup.py: and that it is installed too, under buildbot/status/
4555         * buildbot/master.py (BuildMaster): oops, set .change_svc=None at
4556         the module level, because buildbot.tap files from 0.6.2 don't have
4557         it in their attribute dictionary.
4559         * buildbot/slave/bot.py (Bot.startService): make sure the basedir
4560         really exists at startup, might save some confusion somewhere.
4562 2005-04-24  Thomas Vander Stichele  <thomas at apestaart dot org>
4564         * docs/waterfall.classic.css:
4565           add a stylesheet that's almost the same as the "classic"
4566           buildbot style
4568         * buildbot/status/builder.py:
4569           add EXCEPTION as a result - this is a problem for the bot
4570           maintainer, not a build problem for the changers
4571         * buildbot/process/step.py:
4572           use EXCEPTION instead of FAILURE for exceptions
4573         * buildbot/status/html.py:
4574           add build_get_class to get a class out of a build/buildstep
4575           finish naming the classes
4576           split out sourceNames to changeNames and builderNames so we
4577           can style them separately
4578         * docs/config.xhtml:
4579           finish documenting classes as they are right now
4581         * buildbot/status/html.py:
4582           name the classes as we agreed on IRC
4583         * docs/config.xhtml:
4584           and document them
4586         * buildbot/status/html.py:
4587           same for cssclass->class_
4589         * buildbot/status/html.py:
4590           as decided on IRC, use class_ for the "class" attribute to not
4591           conflict with the class keyword, and clean up the messy **{} stuff.
4593         * buildbot/status/mail.py:
4594           put back "builders" argument, and fix docstring, because the
4595           code *ignores* builders listed in this argument
4597         * buildbot/process/builder.py:
4598           remove FIXME notes - category is now indeed a cvar of BuilderStatus
4600         * docs/config.xhtml:
4601           describe the category argument for builders
4603         * buildbot/status/builder.py:
4604           Fix a silly bug due to merging
4606         * buildbot/process/builder.py:
4607           remove category from the process Builder ...
4608         * buildbot/status/builder.py:
4609           ... and add it to BuilderStatus instead.
4610           Set category on unpickled builder statuses, they might not have it.
4611         * buildbot/master.py:
4612           include category when doing builderAdded
4613         * buildbot/status/mail.py:
4614           return None instead of self for builders we are not interested in.
4615         * buildbot/test/test_run.py:
4616           fix a bug due to only doing deferredResult on "dummy" waiting
4617         * buildbot/test/test_status.py:
4618           add checks for the Mail IStatusReceiver returning None or self
4620         * buildbot/status/html.py:
4621           fix testsuite by prefixing page title with BuildBot
4623         * buildbot/status/builder.py:
4624           have .category in builder status ...
4625         * buildbot/process/builder.py:
4626           ... and set it from Builder
4627         * buildbot/status/html.py:
4628           make .css a class variable 
4629         * buildbot/test/test_status.py:
4630           write more tests to cover our categories stuff ...
4631         * buildbot/status/mail.py:
4632           ... and fix the bug that this uncovered
4634         * buildbot/changes/mail.py:
4635         * buildbot/changes/pb.py:
4636         * buildbot/master.py:
4637         * buildbot/process/base.py:
4638         * buildbot/process/factory.py:
4639         * buildbot/process/interlock.py:
4640         * buildbot/process/step.py:
4641         * buildbot/process/step_twisted.py:
4642         * buildbot/slave/commands.py:
4643         * buildbot/status/builder.py:
4644         * buildbot/status/client.py:
4645         * buildbot/status/html.py:
4646         * buildbot/status/mail.py:
4647         * buildbot/status/progress.py:
4648         * buildbot/test/test_changes.py:
4649         * buildbot/test/test_config.py:
4650         * buildbot/test/test_control.py:
4651         * buildbot/test/test_interlock.py:
4652         * buildbot/test/test_maildir.py:
4653         * buildbot/test/test_mailparse.py:
4654         * buildbot/test/test_run.py:
4655         * buildbot/test/test_slavecommand.py:
4656         * buildbot/test/test_status.py:
4657         * buildbot/test/test_steps.py:
4658         * buildbot/test/test_twisted.py:
4659         * buildbot/test/test_util.py:
4660         * buildbot/test/test_vc.py:
4661         * buildbot/test/test_web.py:
4662         * buildbot/util.py:
4663           add test-case-name at the top of a whole set of files
4665         * buildbot/status/builder.py:
4666           keep order of addition when getting builder names
4667         * buildbot/status/words.py:
4668         * buildbot/test/test_run.py:
4669           add test for getBuilderNames
4671         * buildbot/process/base.py:
4672         * buildbot/process/step.py:
4673         * buildbot/status/builder.py:
4674         * buildbot/status/html.py:
4675           make buildbot css-able
4676           replace the color code for purple with purple, don't understand
4677           why it wasn't purple to start with
4679         * buildbot/status/words.py:
4680           ok, so it doesn't look like BuilderStatus.remote is still valid.
4681           Use what waterfall uses instead.
4683         * buildbot/interfaces.py:
4684         * buildbot/status/builder.py:
4685         * buildbot/status/html.py:
4686         * buildbot/status/mail.py:
4687         * buildbot/status/words.py:
4688         * buildbot/test/test_run.py:
4689           use categories everywhere and make it be a list.  More sensible
4690           for the future.  Also make words actually respect this in
4691           buildFinished.
4693         * buildbot/interfaces.py:
4694           add category argument to getBuilderNames
4695         * buildbot/process/builder.py:
4696         * buildbot/status/builder.py:
4697         * buildbot/status/html.py:
4698         * buildbot/status/mail.py:
4699         * buildbot/status/words.py:
4700         * buildbot/test/test_run.py:
4701           move from specifying builders by name to specifying the category
4703         * buildbot/status/html.py:
4704         * buildbot/status/words.py:
4705           add "builders=" to __init__ of status clients so they can
4706           limit themselves to the given list of builders to report on
4708         * buildbot/status/html.py: set the title to the product name
4710 2005-04-23  Thomas Vander Stichele  <thomas at apestaart dot org>
4712         * buildbot/interfaces.py:
4713         * buildbot/status/builder.py:
4714           more documentation.  Hm, not sure if ChangeLog entries make sense
4715           here...
4717 2005-04-23  Brian Warner  <warner@lothar.com>
4719         * buildbot/test/test_vc.py (SetupMixin.do_vc): increase timeouts
4721         * buildbot/test/test_slavecommand.py (Shell): increase timeouts
4723         * buildbot/scripts/runner.py: make 'statuslog' and 'statusgui' be
4724         the sub-commands that log buildmaster status to stdout and to a
4725         GUI window, respectively.
4727         * buildbot/clients/gtkPanes.py: overhaul. basic two-row
4728         functionality is working again, but all the step-status and ETA
4729         stuff is missing. Commented out a lot of code pending more
4730         overhaul work.
4732         * buildbot/status/client.py: make sure that IRemote(None) is None
4734         * buildbot/changes/changes.py: import defer, oops
4735         (ChangeMaster): remove the .sources list, rely upon the fact that
4736         MultiServices can be treated as sequences of their children. This
4737         cleans up the add/remove ChangeSource routines a lot, as we keep
4738         exactly one list of the current sources instead of three.
4740         * buildbot/master.py (BuildMaster.__init__): remove .sources, set
4741         up an empty ChangeMaster at init time.
4742         (BuildMaster.loadChanges): if there are changes to be had from
4743         disk, replace self.change_svc with the new ones. If not, keep
4744         using the empty ChangeMaster set up in __init__.
4745         (BuildMaster.loadConfig_Sources): use list(self.change_svc)
4746         instead of a separate list, makes the code a bit cleaner.
4747         * buildbot/test/test_config.py (ConfigTest.testSimple): match it
4748         (ConfigTest.testSources): same, also wait for loadConfig to finish.
4749         Extend the test to make sure we can get rid of the sources when
4750         we're done.
4752 2005-04-22  Brian Warner  <warner@lothar.com>
4754         * buildbot/scripts/runner.py (Maker.mkinfo): create the info/admin
4755         and info/host files when making the slave directory
4757         * buildbot/test/test_run.py (RunMixin.shutdownSlave): remove the
4758         whendone= argument, just return the Deferred and let the caller do
4759         what they want with it.
4760         (Disconnect.testBuild1): wait for shutdownSlave
4761         (Basedir.testChangeBuilddir): new test to make sure changes to the
4762         builddir actually get propagated to the slave
4764         * buildbot/slave/bot.py (SlaveBuilder.setBuilddir): use an
4765         explicit method, rather than passing the builddir in __init__ .
4766         Make sure to update self.basedir too, this was broken before.
4767         (Bot.remote_setBuilderList): use b.setBuilddir for both new
4768         builders and for ones that have just had their builddir changed.
4769         (BotFactory): add a class-level .perspective attribute, so
4770         BuildSlave.waitUntilDisconnected won't get upset when the
4771         connection hasn't yet been established
4772         (BuildSlave.__init__): keep track of the bot.Bot instance, so
4773         tests can reach through it to inspect the SlaveBuilders
4775         * buildbot/process/base.py (Build.buildException): explain the
4776         log.err with a log.msg
4777         * buildbot/process/builder.py (Builder.startBuild): same
4778         (Builder._startBuildFailed): improve error message
4780         * buildbot/pbutil.py (RBCP.failedToGetPerspective): if the failure
4781         occurred because we lost the brand-new connection, retry instead
4782         of giving up. If not, it's probably an authorization failure, and
4783         it makes sense to stop trying. Make sure we log.msg the reason
4784         that we're log.err'ing the failure, otherwise test failures are
4785         really hard to figure out.
4787         * buildbot/master.py: change loadConfig() to return a Deferred
4788         that doesn't fire until the change has been fully implemented.
4789         This means any connected slaves have been updated with the new
4790         builddir. This change makes it easier to test the code which
4791         actually implements this builddir-updating.
4792         (BotPerspective.addBuilder): return Deferred
4793         (BotPerspective.removeBuilder): same
4794         (BotPerspective.attached): same
4795         (BotPerspective._attached): same. finish with remote_print before
4796         starting the getSlaveInfo, instead of doing them in parallel
4797         (BotPerspective.list_done): same
4798         (BotMaster.removeSlave): same. Fix the typo that meant we weren't
4799         actually calling slave.disconnect()
4800         (BotMaster.addBuilder): same
4801         (BotMaster.removeBuilder): same
4802         (BuildMaster.loadConfig): same
4803         (BuildMaster.loadConfig_Slaves): same
4804         (BuildMaster.loadConfig_Sources): same
4805         (BuildMaster.loadConfig_Builders): same
4806         (BuildMaster.loadConfig_status): same
4808         * buildbot/changes/changes.py (ChangeMaster.removeSource): return
4809         a Deferred that fires when the source is finally removed
4811         * buildbot/slave/commands.py (SourceBase.doClobber): when removing
4812         the previous tree on win32, where we have to do it synchronously,
4813         make sure we return a Deferred anyway.
4814         (SourceBase.doCopy): same
4816         * buildbot/scripts/runner.py (statusgui): use the text client for
4817         now, while I rewrite the Gtk one
4818         * buildbot/clients/base.py: strip out old code, leaving just the
4819         basic print-message-on-event functionality. I also remove the
4820         ReconnectingPBClientFactory, but it does at least quit when it
4821         loses the connection instead of going silent
4823 2005-04-21  Brian Warner  <warner@lothar.com>
4825         * Makefile: minor tweaks
4827         * NEWS: point out deprecation warnings, new features for
4828         /usr/bin/buildbot
4830         * buildbot/master.py (BuildMaster.loadConfig): emit
4831         DeprecationWarnings for Builders defined with tuples. Rearrange
4832         code to facility removal of deprecated configuration keys in the
4833         next release.
4835         * buildbot/scripts/runner.py (createMaster,createSlave): rewrite
4836         'buildbot' command to put a little Makefile in the target that
4837         helps you re-create the buildbot.tap file, start or stop the
4838         master/slave, and reconfigure (i.e. SIGHUP) the master. Also chmod
4839         all the files 0600, since they contain passwords.
4840         (start): if there is a Makefile, and /usr/bin/make exists, use
4841         'make start' in preference to a raw twistd command. This lets
4842         slave admins put things like PYTHONPATH variables in their
4843         Makefiles and have them still work when the slave is started with
4844         'buildbot start ~/slave/foo'. The test is a bit clunky, it would
4845         be nice to first try the 'make' command and only fall back to
4846         twistd if it fails. TODO: the Makefile's "start" command does not
4847         add the --reactor=win32 argument when running under windows.
4848         (Options.debugclient, Options.statusgui): add sub-commands to launch
4849         the debug client (formerly in contrib/debugclient.py) and the
4850         Gtk status application (currently broken)
4851         * buildbot/clients/debug.py: move from contrib/debugclient.py
4852         * buildbot/clients/debug.glade: same
4854         * buildbot/test/test_trial.py: remove it. This requires some
4855         functionality out of Twisted that isn't there yet, and until then
4856         having it around just confuses things.
4858         * buildbot/test/test_slavecommand.py (Shell): test both with and
4859         without PTYs, and make sure that command output is properly
4860         interleaved in the with-PTY case. I think the without-PTY test
4861         should pass on windows, where we never use PTYs anyway.
4863 2005-04-20  Brian Warner  <warner@lothar.com>
4865         * README (REQUIREMENTS): mention Twisted-2.0.0 compatibility
4867         * MANIFEST.in: add epyrun, gen-reference, buildbot.png
4869         * NEWS: start creating entries for the next release
4871         * buildbot/slave/commands.py (ShellCommand.__init__): use os.pathsep
4873         * buildbot/test/test_web.py (WebTest.test_webPortnum): add timeout
4874         (WebTest.test_webPathname): same
4875         (WebTest.test_webPathname_port): same
4876         (WebTest.test_waterfall): use the default favicon rather than
4877         rooting around the filesystem for it. Open the expected-icon file
4878         in binary mode, to make win32 tests happier (thanks to Nick Trout
4879         for the catch)
4880         * buildbot/status/html.py (buildbot_icon): win32 portability
4882         * buildbot/test/test_slavecommand.py (SlaveCommandTestCase.testShellZ):
4883         win32-compatibility fixes from Nick Trout, the "file not found" message
4884         is different under windows
4885         (FakeSlaveBuilder.__init__): clean up setup a bit
4886         * buildbot/test/test_vc.py (VCSupport.__init__): win32: use os.pathsep
4888 2005-04-19  Brian Warner  <warner@lothar.com>
4890         * buildbot/test/test_vc.py (SetupMixin.setUpClass): fix the
4891         skip-if-repositories-are-unavailable test to not kill the trial
4892         that comes with Twisted-1.3.0
4894         * setup.py: install buildbot.png icon file when installing code
4896         * buildbot/slave/commands.py (ShellCommand._startCommand): log the
4897         environment used by the command, at least on the child side.
4899         * buildbot/status/html.py (TextLog.pauseProducing): add a note,
4900         this method needs to be added and implemented because it gets
4901         called under heavy load. I don't quite understand the
4902         producer/consumer API enough to write it.
4903         (StatusResource.getChild): add a resource for /favicon.ico
4904         (Waterfall.__init__): add favicon= argument
4905         * buildbot/test/test_web.py (WebTest.test_waterfall): test it
4906         (WebTest.test_webPortnum): stop using deprecated 'webPortnum'
4907         (WebTest.test_webPathname): same
4908         (WebTest.test_webPathname_port): same
4909         * docs/config.xhtml: mention favicon=
4910         * buildbot/buildbot.png: add a default icon, dorky as it is
4912 2005-04-18  Thomas Vander Stichele  <thomas at apestaart dot org>
4914         * buildbot/master.py:
4915         * buildbot/process/base.py:
4916         * buildbot/process/builder.py:
4917         * buildbot/process/interlock.py:
4918         * buildbot/status/builder.py:
4919         * buildbot/status/html.py:
4920         * buildbot/status/mail.py:
4921         * buildbot/status/words.py:
4922           new documentation while digging through the code
4924 2005-04-17  Brian Warner  <warner@lothar.com>
4926         * general: try to fix file modes on all .py files: a+r, a-x,
4927         but let buildbot/clients/*.py be +x since they're tools
4929         * docs/epyrun (addMod): when an import fails, say why
4931         * Makefile: Add a 'docs' target, hack on the PYTHONPATH stuff
4933 2005-04-17  Thomas Vander Stichele  <thomas at apestaart dot org>
4935         * buildbot/process/base.py:
4936         * buildbot/process/builder.py:
4937         * buildbot/status/builder.py:
4938           new documentation while digging through the code
4940 2005-04-17  Thomas Vander Stichele  <thomas at apestaart dot org>
4942         * buildbot/changes/changes.py:
4943         * buildbot/changes/p4poller.py:
4944         * buildbot/interfaces.py:
4945         * buildbot/process/base.py:
4946         * buildbot/process/builder.py:
4947         * buildbot/process/step.py:
4948         * buildbot/process/step_twisted.py:
4949         * buildbot/slave/bot.py:
4950         * buildbot/slave/commands.py:
4951         * buildbot/status/builder.py:
4952           fix all docstrings to make epydoc happy.  In the process of fixing
4953           some, I also moved pieces of docs, and removed some deprecated
4954           documentation
4956 2005-04-17  Thomas Vander Stichele  <thomas at apestaart dot org>
4958         * buildbot/process/builder.py:
4959         * buildbot/process/interlock.py:
4960         * buildbot/process/process_twisted.py:
4961         * buildbot/process/step.py:
4962           BuildProcess -> Build, as it looks like that's what happened
4963         * buildbot/process/base.py:
4964         * buildbot/process/factory.py:
4965           update epydoc stuff
4967 2005-04-17  Brian Warner  <warner@lothar.com>
4969         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
4970         update compile command to accomodate the Twisted split.. now
4971         instead of './setup.py build_ext -i', you do './setup.py all
4972         build_ext -i', to run build_ext over all sub-projects.
4973         (FullTwistedBuildFactory): same
4974         (TwistedReactorsBuildFactory): same
4976         * buildbot/status/html.py (TextLog.finished): null out self.req
4977         when we're done, otherwise the reference cycle of TextLog to .req
4978         to .notifications to a Deferred to TextLog.stop keeps them from
4979         being collected, and consumes a huge (610MB on pyramid at last
4980         check) amount of memory.
4982 2005-04-11  Brian Warner  <warner@lothar.com>
4984         * buildbot/test/test_vc.py (VCSupport.__init__): use abspath() to
4985         normalize the VC-repository location.. makes SVN happier with
4986         certain test environments.
4988         * buildbot/process/step.py (RemoteShellCommand.__init__): let each
4989         RemoteShellCommand gets its own .env dictionary, so that code in
4990         start() doesn't mutate the original. I think this should fix the
4991         step_twisted.Trial problem where multiple identical components
4992         kept getting added to PYTHONPATH= over and over again.
4994         * general: merge org.apestaart@thomas/buildbot--doc--0--patch-3,
4995         adding epydoc-format docstrings to many classes. Thanks to Thomas
4996         Vander Stichele for the patches.
4997         * docs/epyrun, docs/gen-reference: add epydoc-generating tools
4998         * buildbot/status/mail.py, buildbot/process/step_twisted.py: same
4999         * buildbot/slave/bot.py, commands.py, registry.py: same
5001 2005-04-05  Brian Warner  <warner@lothar.com>
5003         * buildbot/slave/commands.py (SourceBase.doCopy): use cp -p to
5004         preserve timestamps, helps incremental builds of large trees.
5005         Patch from Rene Rivera.
5007         * buildbot/slave/bot.py (SlaveBuilder.commandComplete): oops, log
5008         'failure' and not the non-existent 'why'. Thanks to Rene Rivera
5009         for the catch.
5011 2005-04-03  Brian Warner  <warner@lothar.com>
5013         * buildbot/master.py (BuildMaster.loadConfig): only call exec()
5014         with one dict, apparently exec has some scoping bugs when used
5015         with both global/local dicts. Thanks to Nathaniel Smith for the
5016         catch.
5018 2005-04-02  Brian Warner  <warner@lothar.com>
5020         * buildbot/process/step_twisted.py (countFailedTests): the new
5021         trial in Twisted-2.0 emits a slightly different status line than
5022         old trial ("PASSED.." instead of "OK.."). Handle it so we don't
5023         mistakenly think the test count is unparseable.
5024         (Trial.start): note that for some reason each build causes another
5025         copy of self.testpath to be prepended to PYTHONPATH. This needs to
5026         be fixed but I'm not sure quite where the problem is.
5028 2005-04-01  Brian Warner  <warner@lothar.com>
5030         * buildbot/test/test_run.py (Run.testMaster): change some uses of
5031         deferredResult to avoid hangs/warnings under twisted-2.0
5032         (RunMixin.tearDown): same
5033         (RunMixin.shutdownSlave): same
5034         (Disconnect.testIdle1): same
5035         (Disconnect.testBuild2): same: wait one second after the build
5036         finishes for test to really be done.. this should be cleaned up to
5037         avoid wasting that second. Builder.detach uses a callLater(0),
5038         either that should be done in-line (something else needed that
5039         behavior), or it should return a Deferred that fires when the
5040         builder is really offline.
5041         (Disconnect.testBuild3): same
5042         (Disconnect.testDisappear): same
5044         * buildbot/test/test_web.py: rearrange server-setup and teardown
5045         code to remove unclean-reactor warnings from twisted-2.0
5047         * buildbot/test/test_vc.py: rearrange probe-for-VC-program routine
5048         so the tests don't hang under twisted-2.0
5050 2005-03-31  Brian Warner  <warner@lothar.com>
5052         * buildbot/slave/bot.py (Bot.remote_setBuilderList): fix typo that
5053         caused a warning each time the master changed our set of builders
5055         * buildbot/status/builder.py (BuildStatus.saveYourself): under
5056         w32, don't unlink the file unless it already exists. Thanks to
5057         Baptiste Lepilleur for the catch.
5058         (BuilderStatus.saveYourself): same
5060 2005-02-01  Brian Warner  <warner@lothar.com>
5062         * buildbot/status/html.py (TextLog.getChild): use a /text child
5063         URL, such as http://foo.com/svn-hello/builds/1/test/0/text instead
5064         of http://foo.com/svn-hello/builds/1/test/0 , to retrieve the
5065         logfile as text/plain (no markup, no headers). This replaces the
5066         previous scheme (which used an ?text=1 argument), and gets us back
5067         to a relative link (which works better when the buildbot lives
5068         behind another web server, such as Apache configured as a reverse
5069         proxy). Thanks to Gerald Combs for spotting the problem.
5071         * buildbot/__init__.py (version): bump to 0.6.2+ while between
5072         releases
5074 2004-12-13  Brian Warner  <warner@lothar.com>
5076         * buildbot/__init__.py (version): Releasing buildbot-0.6.2
5078         * debian/changelog: update for 0.6.2
5079         * NEWS: finalize for 0.6.2
5081 2004-12-11  Brian Warner  <warner@lothar.com>
5083         * NEWS: bring it up to date
5085         * buildbot/slave/bot.py (BotFactory): revamp keepalive/lost-master
5086         detection code. Require some sign of life from the buildmaster
5087         every BotFactory.keepaliveInterval seconds. Provoke this
5088         indication at BotFactory.keepaliveTimeout seconds before the
5089         deadline by sending a keepalive request. We don't actually care if
5090         that request is answered in a timely fashion, what we care about
5091         is that .activity() is called before the deadline. .activity() is
5092         triggered by any PB message from the master (including an ack to
5093         one of the slave's status-update messages). With this new scheme,
5094         large status messages over slow pipes are OK, as long as any given
5095         message can be sent (and thus acked) within .keepaliveTimeout
5096         seconds (which defaults to 30).
5097         (SlaveBuilder.remote_startCommand): record activity
5098         (SlaveBuilder.ackUpdate): same
5099         (SlaveBuilder.ackComplete): same
5100         (BotFactory.gotPerspective): same
5101         * buildbot/test/test_run.py (Disconnect.testSlaveTimeout): test it
5103 2004-12-09  Brian Warner  <warner@lothar.com>
5105         * buildbot/status/html.py (StatusResourceBuilder.getChild): remove
5106         debug message
5108         * buildbot/process/step_twisted.py (Trial._commandComplete):
5109         update self.cmd when we start the 'cat test.log' transfer. Without
5110         this, we cannot interrupt the correct RemoteCommand when we lose
5111         the connection.
5113         * buildbot/process/step.py (RemoteCommand.interrupt): don't bother
5114         trying to tell the slave to stop the command if we're already
5115         inactive, or if we no longer have a .remote
5117         * buildbot/process/builder.py (Builder._detached): don't let an
5118         exception in currentBuild.stopBuild() prevent the builder from
5119         being marked offline
5121 2004-12-07  Brian Warner  <warner@lothar.com>
5123         * buildbot/status/words.py (IrcStatusBot.getBuilder): catch the
5124         KeyError that happens when you ask for a non-existent Builder, and
5125         translate it into a UsageError.
5127         * buildbot/test/test_run.py (Disconnect.testBuild4): validate that
5128         losing the slave in the middle of a remote step is handled too
5130         * buildbot/process/step.py (ShellCommand.interrupt): 'reason' can
5131         be a Failure, so be sure to stringify it before using it as the
5132         contents of the 'interrupt' logfile
5133         (RemoteCommand.interrupt): use stringified 'why' in
5134         remote_interruptCommand too, just in case
5136 2004-12-06  Brian Warner  <warner@lothar.com>
5138         * buildbot/slave/commands.py (Arch.doVCUpdate): use 'tla replay'
5139         instead of 'tla update', which is more efficient in case we've
5140         missed a couple of patches since the last update.
5142         * debian/changelog: update for previous (0.6.1) release. Obviously
5143         this needs to be handled better.
5145 2004-12-05  Brian Warner  <warner@lothar.com>
5147         * NEWS: update for stuff since last release
5149         * buildbot/master.py (DebugPerspective.attached): return 'self', to
5150         match the maybeDeferred change in Dispatcher.requestAvatar
5151         * buildbot/changes/pb.py (ChangePerspective.attached): same
5152         * buildbot/status/client.py (StatusClientPerspective.attached): same
5153         * buildbot/process/builder.py (Builder._attached3): same
5154         * buildbot/pbutil.py (NewCredPerspective.attached): same
5156         * buildbot/status/html.py (WaterfallStatusResource.phase2): Add
5157         the date to the top-most box, if it is not the same as today's
5158         date.
5160         * docs/slave.xhtml: provide a buildslave setup checklist
5162         * docs/source.xhtml (Arch): correct terminology
5164 2004-12-04  Brian Warner  <warner@lothar.com>
5166         * buildbot/test/test_slavecommand.py: use sys.executable instead
5167         of hard-coding 'python' for child commands, might help portability
5169         * docs/examples/twisted_master.cfg: update to current usage
5171         * buildbot/status/words.py (IrcStatusBot.command_STOP): add a
5172         'stop build' command to the IRC bot
5174         * buildbot/master.py (Dispatcher.requestAvatar): remove debug
5175         message that broke PBChangeSource
5177         * buildbot/slave/bot.py: clean up shutdown/lose-master code
5178         (SlaveBuilder): make some attributes class-level, remove the old
5179         "update queue" which existed to support resuming a build after the
5180         master connection was lost. Try to reimplement that feature later.
5181         (SlaveBuilder.stopCommand): clear self.command when the
5182         SlaveCommand finishes, so that we don't try to kill a leftover one
5183         at shutdown time.
5184         (SlaveBuilder.commandComplete): same, merge with commandFailed and
5185         .finishCommand
5187         * buildbot/slave/commands.py (SourceBase): set self.command for
5188         all VC commands, so they can be interrupted.
5190 2004-12-03  Brian Warner  <warner@lothar.com>
5192         * buildbot/master.py: clean up slave-handling code, to handle
5193         slave-disconnect and multiple-connect better
5194         (BotPerspective): make these long-lasting, exactly one per bot
5195         listed in the config file.
5196         (BotPerspective.attached): if a slave connects while an existing
5197         one appears to still be connected, disconnect the old one first.
5198         (BotPerspective.disconnect): new method to forcibly disconnect a
5199         buildslave. Use some hacks to empty the transmit buffer quickly to
5200         avoid the long (20-min?) TCP timeout that could occur if the old
5201         slave has dropped off the net.
5202         (BotMaster): Keep persistent BotPerspectives in .slaves, let them
5203         own their own SlaveStatus objects. Remove .attached/.detached, add
5204         .addSlave/.removeSlave, treat slaves like Builders (config file
5205         parsing sends deltas to the BotMaster). Inform the slave
5206         instances, i.e. the BotPerspective, about addBuilder and
5207         removeBuilder.
5208         (BotMaster.getPerspective): turns into a single dict lookup
5209         (Dispatcher.requestAvatar): allow .attached to return a Deferred,
5210         which gives BotPerspective.attached a chance to disconnect the old
5211         slave first.
5212         (BuildMaster.loadConfig): add code (disabled) to validate that all
5213         builders use known slaves (listed in c['bots']). The check won't
5214         work with tuple-specified builders, which are deprecated but not
5215         yet invalid, so the check is disabled for now.
5216         (BuildMaster.loadConfig_Slaves): move slave-config into a separate
5217         routine, do the add/changed/removed dance with them like we do
5218         with builders.
5219         (BuildMaster.loadConfig_Sources): move source-config into a
5220         separate routine too
5222         * buildbot/status/builder.py (Status.getSlave): get the
5223         SlaveStatus object from the BotPerspective, not the BotMaster.
5225         * buildbot/test/test_run.py: bunch of new tests for losing the
5226         buildslave at various points in the build, handling a slave that
5227         connects multiple times, and making sure we can interrupt a
5228         running build
5230         * buildbot/slave/bot.py (BuildSlave): make it possible to use
5231         something other than 'Bot' for the Bot object, to make certain
5232         test cases easier to write.
5233         (BuildSlave.waitUntilDisconnected): utility method for testing
5235 2004-11-30  Brian Warner  <warner@lothar.com>
5237         * buildbot/test/test_run.py (RunMixin): refactor, remove debug msg
5239         * buildbot/interfaces.py (IBuilderControl.ping): add timeout=
5240         argument, return a Deferred that always fires with True or False.
5241         I don't use an errback to indicate 'ping failed' so that callers
5242         are free to ignore the deferred without causing spurious errors in
5243         the logs.
5244         * buildbot/process/builder.py (BuilderControl.ping): implement it
5246         * buildbot/test/test_run.py (Status.testDisappear): test ping
5247         (Status.disappearSlave): fix it
5249 2004-11-30  Brian Warner  <warner@lothar.com>
5251         * buildbot/interfaces.py (IBuildControl): add .stopBuild
5252         (IBuilderControl): add .getBuild(num), only works for the current
5253         build, of course, although it might be interesting to offer
5254         something for builds in the .waiting or .interlocked state.
5256         * buildbot/process/base.py (Build): have .stopBuild just do the
5257         interrupt, then let the build die by itself.
5258         (BuildControl): add .stopBuild, and add a point-event named
5259         'interrupt' just after the build so status viewers can tell that
5260         someone killed it.
5261         (BuilderControl): add .getBuild
5263         * buildbot/process/step.py (Dummy): use haltOnFailure so it really
5264         stops when you kill it, good for testing
5265         (ShellCommand.interrupt): add a logfile named 'interrupt' which
5266         contains the 'reason' text.
5268         * buildbot/status/html.py: Add Stop Build button, if the build can
5269         still be stopped. Send a Redirect (to the top page) one second
5270         later, hopefully long enough for the interrupt to have an effect.
5271         Move make_row() up to top-level to share it between Stop Build and
5272         Force Build.
5274         * buildbot/slave/commands.py: only kill the child process once
5276         * buildbot/test/test_run.py: add testInterrupt
5278 2004-11-29  Brian Warner  <warner@lothar.com>
5280         * buildbot/process/base.py: Refactor command interruption. The
5281         Build is now responsible for noticing that the slave has gone
5282         away: Build.lostRemote() interrupts the current step and makes
5283         sure that no further ones will be started.
5284         
5285         * buildbot/process/builder.py: When the initial remote_startBuild
5286         message fails, log it: this usually indicates that the slave has
5287         gone away, but we don't really start paying attention until they
5288         fail to respond to the first step's command.
5290         * buildbot/process/step.py (RemoteCommand): Does *not* watch for
5291         slave disconnect. Now sports a new interrupt() method. Error
5292         handling was simplified a lot by chaining deferreds, so
5293         remoteFailed/remoteComplete were merged into a single
5294         remoteComplete method (which can now get a Failure object).
5295         Likewise failed/finished were merged into just _finished.
5296         (BuildStep): Add interrupt(why) method, and if why is a
5297         ConnectionLost Failure then the step is failed with some useful
5298         error text.
5300         * buildbot/slave/bot.py: stop the current command when the remote
5301         Step reference is lost, and when the slave is shut down.
5302         (Bot): make it a MultiService, so it can have children. Use
5303         stopService to tell when the slave is shutting down.
5304         (SlaveBuilder): make it a Service, and a child of the Bot. Add
5305         remote_interruptCommand (which asks the current SlaveCommand to
5306         stop but allows it to keep emitting status messages), and
5307         stopCommand (which tells it to shut up and die).
5309         * buildbot/slave/commands.py: make commands interruptible
5310         (ShellCommand.kill): factor out os.kill logic
5311         (Command): factor out setup()
5312         (Command.sendStatus): don't send status if .running is false, this
5313         happens when the command has been halted.
5314         (Command.interrupt): new method, used to tell the command to die
5315         (SlaveShellCommand): implement .interrupt
5316         (DummyCommand): implement .interrupt
5317         (SourceBase, etc): factor out setup(), don't continue substeps if
5318         .interrupted is set
5320         * buildbot/status/builder.py: fix all waitUntilFinished() methods
5321         so they can be called after finishing
5323         * buildbot/test/test_run.py: new tests for disconnect behavior,
5324         refactor slave-shutdown routines, add different kinds of
5325         slave-shutdown
5327 2004-11-27  Brian Warner  <warner@lothar.com>
5329         * buildbot/status/words.py (IrcStatusBot.convertTime): utility
5330         method to express ETA time like "2m45s" instead of "165 seconds"
5332 2004-11-24  Brian Warner  <warner@lothar.com>
5334         * buildbot/test/test_vc.py (VC.testArch): unregister the test
5335         archive after the test completes, to avoid cluttering the user's
5336         'tla archives' listing with a bogus entry. Arch doesn't happen to
5337         provide any way to override the use of ~/.arch-params/, so there
5338         isn't a convenient way to avoid touching the setup of the user who
5339         runs the test.
5340         (VC_HTTP.testArchHTTP): same
5342 2004-11-23  Brian Warner  <warner@lothar.com>
5344         * buildbot/status/html.py (TextLog): split render() up into
5345         render_HEAD and render_GET. Use a Producer when sending log
5346         chunks, to reduce memory requirements and avoid sending huge
5347         non-Banana-able strings over web.distrib connections. Requires
5348         peeking under the covers of IStatusLog.
5349         (TextLog.resumeProducing): fix the "as text" link, handle client
5350         disconnects that occur while we're still sending old chunks.
5352         * buildbot/status/builder.py (HTMLLogFile.waitUntilFinished): oops,
5353         use defer.succeed, not the non-existent defer.success
5354         (LogFile.waitUntilFinished): same
5355         (LogFile.subscribe): don't add watchers to a finished logfile
5357         * buildbot/__init__.py (version): bump to 0.6.1+ while between
5358         releases
5360 2004-11-23  Brian Warner  <warner@lothar.com>
5362         * buildbot/__init__.py (version): Releasing buildbot-0.6.1
5364 2004-11-23  Brian Warner  <warner@lothar.com>
5366         * NEWS: update for the 0.6.1 release
5367         * MANIFEST.in: add new files
5369         * README (INSTALLATION): explain how to enable the extra VC tests
5371         * buildbot/status/builder.py (LogFile): add .runEntries at the class
5372         level to, so old pickled builds can be displayed ok
5374 2004-11-22  Brian Warner  <warner@lothar.com>
5376         * NEWS: summarize updates since last release
5378         * README (SLAVE): fix usage of 'buildbot slave' command. Thanks to
5379         Yoz Grahame. Closes SF#1050138.
5381         * docs/changes.xhtml (FreshCVSSourceNewcred): fix typo. Closes
5382         SF#1042563.
5384         * buildbot/process/step_twisted.py (Trial): update docs a bit
5386         * docs/factories.xhtml: fix Trial factory docs to match reality.
5387         Closes: SF#1049758.
5389         * buildbot/process/factory.py (Trial.__init__): add args for
5390         randomly= and recurse=, making them available to instantiators
5391         instead of only to subclassers. Closes: SF#1049759.
5393 2004-11-15  Brian Warner  <warner@lothar.com>
5395         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
5396         try to teach the Quick factory to use multiple versions of python
5398 2004-11-12  Brian Warner  <warner@lothar.com>
5400         * buildbot/status/builder.py (BuilderStatus.saveYourself): use a
5401         safer w32-compatible approach, and only use it on windows
5402         (BuildStatus.saveYourself): same
5404 2004-11-11  Brian Warner  <warner@lothar.com>
5406         * buildbot/status/builder.py (LogFile.addEntry): smarter way to do
5407         it: one string merge per chunk. There are now separate .entries
5408         and .runEntries lists: when enumerating over all chunks, make sure
5409         to look at both.
5410         * buildbot/test/test_status.py (Log): more tests
5412         * buildbot/status/builder.py (LogFile.addEntry): Merge string
5413         chunks together, up to 10kb per chunk. This ought to cut down on
5414         the CPU-burning overhead of large log files. Thanks to Alexander
5415         Staubo for spotting the problem.
5416         * buildbot/test/test_status.py (Log): tests for same
5418 2004-11-10  Brian Warner  <warner@lothar.com>
5420         * buildbot/status/mail.py (MailNotifier.buildMessage): add a Date
5421         header to outbound mail
5422         * buildbot/test/test_status.py (Mail.testBuild1): test for same
5424 2004-11-08  Brian Warner  <warner@lothar.com>
5426         * buildbot/status/builder.py (BuilderStatus.saveYourself): w32
5427         can't do os.rename() onto an existing file, so catch the exception
5428         and unlink the target file first. This introduces a slight window
5429         where the existing file could be lost, but the main failure case
5430         (disk full) should still be handled safely.
5431         (BuildStatus.saveYourself): same
5433         * buildbot/changes/pb.py (ChangePerspective): use a configurable
5434         separator character instead of os.sep, because the filenames being
5435         split here are coming from the VC system, which can have a
5436         different pathname convention than the local host. This should
5437         help a buildmaster running on windows that uses a CVS repository
5438         which runs under unix.
5439         * buildbot/changes/mail.py (MaildirSource): same, for all parsers
5441         * buildbot/process/step_twisted.py (Trial.createSummary): survive
5442         when there are no test failures to be parsed
5444         * buildbot/scripts/runner.py (createMaster): use shutil.copy()
5445         instead of the unix-specific os.system("cp"), thanks to Elliot
5446         Murphy for this and the other buildbot-vs-windows catches.
5447         * buildbot/test/test_maildir.py (MaildirTest.deliverMail): same
5449         * contrib/windows/buildbot.bat: prefix a '@', apparently to not
5450         echo the command as it is run
5452         * setup.py: install sample.mk too, not just sample.cfg
5453         (scripts): install contrib/windows/buildbot.bat on windows
5455 2004-11-07  Brian Warner  <warner@lothar.com>
5457         * buildbot/process/builder.py (Builder._detached): clear the
5458         self.currentBuild reference, otherwise the next build will be
5459         skipped because we think the Builder is already in use.
5461         * docs/examples/twisted_master.cfg: update to match current usage
5462         on the Twisted buildbot
5464 2004-10-29  Brian Warner  <warner@lothar.com>
5466         * buildbot/status/mail.py (MailNotifier): fix typo in docs
5468 2004-10-28  Brian Warner  <warner@lothar.com>
5470         * buildbot/slave/commands.py (SourceBase): refactor subclasses to
5471         have separate doVCUpdate/doVCFull methods. Catch an update failure
5472         and respond by clobbering the source directory and re-trying. This
5473         will handle local changes (like replacing a file with a directory)
5474         that will cause CVS and SVN updates to fail.
5475         * buildbot/test/test_vc.py (SetupMixin.do_vc): test the same
5477         * buildbot/process/step.py (LoggedRemoteCommand.__repr__): avoid a
5478         python-2.4 warning
5480 2004-10-19  Brian Warner  <warner@lothar.com>
5482         * buildbot/process/step_twisted.py (Trial.createSummary): bugfixes
5484         * buildbot/status/html.py (StatusResourceTestResults): display any
5485         TestResults that the Build might have
5486         (StatusResourceTestResult): and the logs for each TestResult
5487         (StatusResourceBuild): add link from the per-build page
5489 2004-10-15  Brian Warner  <warner@lothar.com>
5491         * buildbot/process/step_twisted.py (Trial.createSummary): parse
5492         the 'problems' portion of stdout, add TestResults to our build
5493         * buildbot/test/test_twisted.py (Parse.testParse): test it
5495         * buildbot/interfaces.py (IBuildStatus.getTestResults): new method
5496         to retrieve a dict of accumulated test results
5497         (ITestResult): define what a single test result can do
5498         * buildbot/status/builder.py (TestResult): implement ITestResult
5499         (BuildStatus.getTestResults): retrieve dict of TestResults
5500         (BuildStatus.addTestResult): add TestResults
5501         * buildbot/test/test_status.py (Results.testAddResults): test it
5503 2004-10-14  Brian Warner  <warner@lothar.com>
5505         * buildbot/test/test_maildir.py (MaildirTest): use shutil.rmtree
5506         instead of os.system("rm -rf") for win32 portability
5508         * buildbot/test/test_slavecommand.py (SlaveCommandTestCase): use
5509         SignalMixin instead of starting/stopping the reactor, which is
5510         likely to cause problems with other tests
5512         * buildbot/slave/commands.py (SourceBase.doCopy): remove leftover
5513         self.copyComplete() call. Yoz Grahame makes the catch.
5515         * contrib/windows/buildbot.bat: helper script to deal with path
5516         issues. Thanks to Yoz Grahame.
5518         * buildbot/master.py (BuildMaster.startService): don't register a
5519         SIGHUP handler if the signal module has no SIGHUP attribute.
5520         Apparently win32 does this.
5522         * buildbot/scripts/runner.py (start): add --reactor=win32 on win32
5524         * buildbot/test/test_web.py (WebTest.test_webPathname): skip the
5525         test if the reactor can't offer UNIX sockets
5527         * buildbot/status/html.py (StatusResourceBuild.body): fix syntax
5528         error introduced in the last commit. We really need that
5529         metabuildbot :).
5531 2004-10-12  Brian Warner  <warner@lothar.com>
5533         * buildbot/changes/mail.py (MaildirSource.describe): fix exception
5534         when describing a maildir source. Thanks to Stephen Davis.
5536         * buildbot/status/words.py (IrcStatusBot.command_WATCH): round off
5537         ETA seconds
5539         * buildbot/scripts/runner.py (createMaster): install Makefile too
5540         (start): add --no_save to 'start' command
5541         * buildbot/scripts/sample.mk: simple convenience Makefile with 
5542         start/stop/reload targets
5544         * buildbot/__init__.py (version): bump to 0.6.0+ while between
5545         releases
5547 2004-09-30  Brian Warner  <warner@lothar.com>
5549         * setup.py: Releasing buildbot-0.6.0
5551 2004-09-30  Brian Warner  <warner@lothar.com>
5553         * MANIFEST.in: add debian/*, sample.cfg, more docs files. Remove
5554         test_trial.py from the source tarball until support is complete.
5556         * NEWS: update for 0.6.0 release
5557         * buildbot/__init__.py (version): same
5558         * README: same
5560         * buildbot/status/words.py (IrcStatusBot.command_SOURCE): add
5561         'source' command to tell users where to get the Buildbot source
5563         * docs/examples/*.cfg: update to modern standards
5565         * NEWS: update for release
5567         * buildbot/scripts/runner.py (createMaster): remove the
5568         -shutdown.tap stuff now that it isn't necessary
5569         (createSlave): same
5570         (start): launch buildbot.tap, not buildbot-shutdown.tap
5573         * buildbot/status/mail.py (Domain): shorten class name
5574         (MailNotifier): if lookup= is a string, pass it to Domain()
5575         * buildbot/test/test_status.py (Mail.testBuild1): new class name
5576         (Mail.testBuild2): test the string-to-Domain shortcut
5577         (Mail.testMail): fix test
5580         * buildbot/scripts/sample.cfg: improve the build-the-buildbot
5581         example config file
5583         * buildbot/status/builder.py (BuildStatus.__setstate__): re-set
5584         more attributes on load
5585         (BuilderStatus.stubBuildCacheSize): bump to 30, this was too low
5586         to accomodate the whole waterfall page at once, and the thrashing
5587         results in a lot of unnecessary loads
5588         (BuildStatus.saveYourself): use binary pickles, not fluffy text
5589         (BuilderStatus.saveYourself): same
5590         (BuilderStatus.eventGenerator): stop generating on the first missing
5591         build. We assume that saved builds are deleted oldest-first.
5592         (BuildStepStatus.__getstate__): .progress might not exist
5594         * buildbot/changes/changes.py (ChangeMaster): make it
5595         serializable, in $masterdir/changes.pck
5596         (ChangeMaster.stopService): save on shutdown
5597         * buildbot/master.py (BuildMaster.loadChanges): load at startup
5598         * buildbot/test/test_config.py: load Changes before config file
5601         * buildbot/slave/commands.py (ShellCommand.doTimeout): put the
5602         "Oh my god, you killed the command" header on a separate line
5604         * buildbot/status/builder.py (BuilderStatus.getStubBuildByNumber):
5605         skip over corrupted build pickles
5606         (BuilderStatus.getFullBuildByNumber): same
5607         (BuilderStatus.eventGenerator): skip over unavailable builds
5608         (BuildStatus.saveYourself): save builds to a .tmp file first, then
5609         do an atomic rename. This prevents a corrupted pickle when some
5610         internal serialization error occurs.
5611         (BuilderStatus.saveYourself): same
5613         * buildbot/slave/commands.py (SlaveShellCommand): oops, restore
5614         the timeout for shell commands, it got lost somehow
5616         * buildbot/status/builder.py (BuilderStatus.eventGenerator): if we
5617         run out of build steps, return the rest of the builder events
5619         * buildbot/interfaces.py (IBuilderControl.ping): add method
5621         * buildbot/process/builder.py (BuilderControl.ping): move
5622         slave-ping to BuilderControl, and fix the failure case in the
5623         process (Event.finish() is the verb, Event.finished is the noun).
5625         * buildbot/status/html.py (StatusResourceBuilder.ping): ping
5626         through the BuilderControl instead of the BuilderStatus
5627         (EventBox): add adapter for builder.Event, allowing builder events to
5628         be displayed in the waterfall display
5630         * buildbot/master.py (BotMaster.stopService): add a 'master
5631         shutdown' event to the builder's log
5632         (BuildMaster.startService): and a 'master started' on startup
5634         * buildbot/status/builder.py (BuilderStatus.eventGenerator): merge
5635         builder events into the BuildStep event stream
5636         (Status.builderAdded): add a 'builder created' event
5639         * buildbot/status/words.py (IrcStatusBot.command_WATCH): new
5640         command to announce the completion of a running build
5641         (IrcStatusBot.command_FORCE): announce when the build finishes
5643         * buildbot/status/builder.py (BuilderStatus.addFullBuildToCache):
5644         don't evict unfinished builds from the cache: they must stay in
5645         the full-cache until their logfiles have stopped changing. Make
5646         sure the eviction loop terminates if an unfinished build was hit.
5647         (HTMLLogFile.getTextWithHeaders): return HTML as if it were text.
5648         This lets exceptions be dumped in an email status message. Really
5649         we need LogFiles which contain both text and HTML, instead of two
5650         separate classes.
5651         (BuildStatus.__getstate__): handle self.finished=False
5652         (Status.builderAdded): if the pickle is corrupted, abandon the
5653         history and create a new BuilderStatus object.
5655         * buildbot/process/base.py (Build.stopBuild): tolerate lack of a
5656         self.progress attribute, helped one test which doesn't fully set
5657         up the Build object.
5659         * buildbot/interfaces.py (IStatusLogStub): split out some of the
5660         IStatusLog methods into an Interface that is implemented by "stub"
5661         logs, for which all the actual text chunks are on disk (in the
5662         pickled Build instance). To show the log contents, you must first
5663         adapt the stub log to a full IStatusLog object.
5665         * buildbot/status/builder.py (LogFileStub): create separate stub
5666         log objects, which can be upgraded to a real one if necessary.
5667         (LogFile): make them persistable, and let them stubify themselves
5668         (HTMLLogFile): same
5669         (BuildStepStatus): same
5670         (BuildStatus): same
5671         (BuildStatus.saveYourself): save the whole build out to disk
5672         (BuilderStatus): make it persistable
5673         (BuilderStatus.saveYourself): save the builder to disk
5674         (BuilderStatus.addFullBuildToCache): implement two caches which
5675         hold Build objects: a small one which holds full Builds, and a
5676         larger one which holds "stubbed" Builds (ones with their LogFiles
5677         turned into LogFileStubs). This reduces memory usage by the
5678         buildmaster by not keeping more than a few (default is 2) whole
5679         build logs in RAM all the time.
5680         (BuilderStatus.getBuild): rewrite to pull from disk (through the
5681         cache)
5682         (BuilderStatus.eventGenerator): rewrite since .builds went away
5683         (BuilderStatus.buildStarted): remove the .builds array. Add the
5684         build to the "full" cache when it starts.
5685         (BuilderStatus._buildFinished): save the build to disk when it
5686         finishes
5687         (Status): give it a basedir (same as the BuildMaster's basedir)
5688         where the builder pickles can be saved
5689         (Status.builderAdded): create the BuilderStatus ourselves, by
5690         loading a pickle from disk (or creating a new instance if there
5691         was none on disk). Return the BuilderStatus so the master can glue
5692         it into the new Builder object.
5694         * buildbot/master.py (BotMaster.stopService): on shutdown, tell
5695         all BuilderStatuses to save themselves out to disk. This is in
5696         lieu of saving anything important in the main Application pickle
5697          (the -shutdown.tap file).
5698         (BuildMaster.__init__): give Status() a basedir for its files
5699         (BuildMaster.loadConfig_Builders): do status.builderAdded first,
5700         to get the BuilderStatus, then give it to the Builder (instead of
5701         doing it the other way around). It's ok if the status announces
5702         the new Builder before it's really ready, as the outside world can
5703         only see the BuilderStatus object anyway (and it is ready before
5704         builderAdded returns). Use the builder's "builddir" (which
5705         normally specifies where the slave will run the builder) as the
5706         master's basedir (for saving serialized builds).
5708         * buildbot/status/html.py (StatusResourceBuildStep.getChild):
5709         coerce the logfile to IStatusLog before trying to get the text
5710         chunks out of it. This will pull the full (non-stubified) Build in
5711         from disk if necessary.
5712         (TextLog): fix the adapter registration
5714         * buildbot/test/test_control.py (Force.setUp): create the basedir
5715         * buildbot/test/test_web.py: same
5716         * buildbot/test/test_vc.py (SetupMixin.setUp): same
5717         * buildbot/test/test_status.py (Mail.makeBuild): match new setup
5718         * buildbot/test/test_run.py (Run.testMaster): same
5719         (Status.setUp): same
5721 2004-09-29  Fred L. Drake, Jr.  <fdrake@acm.org>
5723         * buildbot/status/html.py (Waterfall.__init__): store actual
5724         allowForce flag passed in rather than using True for everyone;
5725         make sure setting it to False doesn't cause a NameError
5726         (Waterfall.setup).
5727         (StatusResourceBuilder.__init__) add the builder name to the page
5728         title.
5729         (StatusResourceBuilder.body) move HTML generation for a name/value
5730         row into a helper method (StatusResourceBuilder.make_row); only
5731         generate the "Force Build" form if allowForce was True and the
5732         slave is connected.  Use class attributes in the generated HTML to
5733         spread a little CSS-joy.
5735 2004-09-28  Brian Warner  <warner@lothar.com>
5737         * buildbot/process/step_twisted.py (Trial.createSummary): fix
5738         warning-scanner to not ignore things like
5739         'ComponentsDeprecationWarning' and 'exceptions.RuntimeWarning'
5741         * buildbot/status/html.py (StatusResource.control): add some
5742         class-level values for .control in an attempt to make upgrading
5743         smoother
5745         * buildbot/util.py (ComparableMixin): survive missing attributes,
5746         such as when a class is modified and we're comparing old instances
5747         against new ones
5749         * buildbot/status/words.py (IrcStatusBot.privmsg): clean up
5750         failure handling, remove a redundant try/except block. Don't
5751         return the full traceback to the IRC channel.
5752         (IrcStatusBot.command_FORCE): catch new exceptions, return useful
5753         error messages. Get ETA properly.
5755         * buildbot/status/html.py (StatusResourceBuild.body): html.escape
5756         the reason, since (at least) IRC message will have <> in them.
5757         (StatusResourceBuilder.__init__): take an IBuilderControl
5758         (StatusResourceBuilder.force): use the IBuilderControl we get in
5759         the constructor instead of trying to make our own. Catch the
5760         new exceptions and ignore them for now (until we make an
5761         intermediate web page where we could show the error message)
5762         (StatusResource): create with an IControl, use it to give an
5763         IBuilderControl to all children
5764         (Waterfall): take an allowForce= option, pass an IControl object
5765         to StatusResource if it is True
5767         * buildbot/test/test_web.py (ConfiguredMaster): handle IControl
5769         * buildbot/master.py (BotPerspective.perspective_forceBuild):
5770         catch new exceptions and return string forms
5772         * buildbot/interfaces.py: add NoSlaveError, BuilderInUseError
5773         * buildbot/process/builder.py (Builder.forceBuild): raise them
5774         * buildbot/test/test_control.py (Force.testNoSlave): new test
5775         (Force.testBuilderInUse): same
5778         * buildbot/status/words.py (IrcStatusBot): enable build-forcing
5780         * buildbot/test/test_run.py: use IControl
5781         * buildbot/test/test_vc.py: same
5783         * buildbot/status/html.py (StatusResourceBuilder.force): rewrite
5784         to use IControl. Still offline.
5785         * buildbot/status/words.py (IrcStatusBot.command_FORCE): same
5787         * buildbot/process/builder.py (Builder.doPeriodicBuild): set
5788         who=None so periodic builds don't send out status mail
5789         (Builder.forceBuild): include reason in the log message
5790         (BuilderControl.forceBuild): rename 'name' to 'who'
5792         * buildbot/master.py (BotPerspective.perspective_forceBuild): add
5793         'who' parameter, but make it None by default so builds forced by
5794         slave admins don't cause status mail to be sent to anybody
5795         (BotMaster.forceBuild): same. this method is deprecated.
5796         (DebugPerspective.perspective_forceBuild): same, use IControl.
5797         (DebugPerspective.perspective_fakeChange): use IControl..
5798         (Dispatcher.requestAvatar): .. so don't set .changemaster
5800         * buildbot/interfaces.py (IBuilderControl.forceBuild): rename 'who'
5801         parameter to avoid confusion with the name of the builder
5804         * buildbot/status/mail.py: refine comment about needing 2.3
5806         * buildbot/status/html.py: move all imports to the top
5808         * buildbot/test/test_control.py: test new interfaces
5809         * buildbot/test/test_run.py (Status): handle new interfaces
5810         * buildbot/test/test_vc.py (SetupMixin.doBuild): same
5812         * buildbot/process/base.py (BuildControl): implement IBuildControl
5813         and its lonely getStatus() method
5815         * buildbot/process/builder.py (BuilderControl): implement
5816         IBuilderControl, obtained by adapting the Builder instance
5817         (Builder.startBuild): return a BuilderControl instead of a
5818         Deferred. The caller can use bc.getStatus().waitUntilFinished() to
5819         accomplish the same thing.
5821         * buildbot/master.py: move all import statements to the top
5822         (Control): implement IControl, obtained by adapting the
5823         BuildMaster instance.
5825         * buildbot/interfaces.py: add IControl, IBuilderControl, and
5826         IBuildControl. These are used to force builds. Eventually they
5827         will provide ways to reconfigure the Builders, pause or abandon a
5828         Build, and perhaps control the BuildMaster itself.
5830 2004-09-26  Brian Warner  <warner@lothar.com>
5832         * buildbot/util.py (ComparableMixin): survive twisted>1.3.0 which
5833         ends up comparing us against something without a .__class__
5835 2004-09-24  Brian Warner  <warner@lothar.com>
5837         * buildbot/scripts/runner.py: rearrange option parsing a lot, to get
5838         usage text right.
5840         * Makefile: add 'deb-snapshot' target, to create a timestamped
5841         .deb package
5843         * debian/rules (binary-indep): skip CVS/ files in dh_installexamples
5845 2004-09-23  Brian Warner  <warner@lothar.com>
5847         * buildbot/__init__.py (version): move version string here
5848         * setup.py: get version string from buildbot.version
5849         * buildbot/status/html.py (WaterfallStatusResource.body): add
5850         buildbot version to the page footer
5851         * buildbot/status/words.py (IrcStatusBot.command_VERSION): provide
5852         version when asked
5854         * buildbot/master.py (BotMaster.getPerspective): detect duplicate
5855         slaves, let the second know where the first one is coming from
5856         (BuildMaster.__init__): turn on .unsafeTracebacks so the slave can
5857         see our exceptions. It would be nice if there were a way to just
5858         send them the exception type and value, not the full traceback.
5861         * buildbot/status/mail.py (MailNotifier): add a new argument
5862         sendToInterestedUsers=, which can be set to False to disable the
5863         usual send-to-blamelist behavior.
5864         (top): handle python-2.2 which has no email.MIMEMultipart
5865         (MailNotifier.buildMessage): don't send logs without MIMEMultipart
5866         (MailNotifier.disownServiceParent): unsubscribe on removal
5868         * buildbot/test/test_status.py (Mail.testBuild2): test it
5871         * buildbot/status/progress.py (Expectations.wavg): tolerate
5872         current=None, which happens when steps start failing badly
5873         * buildbot/test/test_status.py (Progress.testWavg): test for it
5875         * buildbot/process/step.py (SVN.startVC): when the (old) slave
5876         doesn't understand args['revision'], emit a warning instead of
5877         bailing completely. Updating to -rHEAD is probably close enough.
5879         * buildbot/process/step_twisted.py (Trial.start): fix sanity-check
5881         * buildbot/test/test_status.py: at least import bb.status.client
5882         even if we don't have any test coverage for it yet
5884         * contrib/svn_buildbot.py: don't require python2.3
5885         (main): wait, do require it (for sets.py), but explain how to
5886         make it work under python2.2
5888 2004-09-23  Brian Warner  <warner@lothar.com>
5890         * contrib/svn_buildbot.py: include the revision number in the Change
5892         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): use when=,
5893         using util.now() because FreshCVS is a realtime service
5895         * buildbot/status/event.py: delete dead code
5896         * buildbot/process/step.py: don't import dead Event class
5897         * buildbot/process/step_twisted.py: same
5898         * buildbot/status/builder.py: same
5899         * buildbot/status/client.py: same
5901         * buildbot/test/test_process.py: kill buggy out-of-date disabled test
5903         * buildbot/changes/changes.py (Change): set .when from an __init__
5904         argument (which defaults to now()), rather than having
5905         ChangeMaster.addChange set it later.
5906         (ChangeMaster.addChange): same
5908         * buildbot/changes/mail.py (parseFreshCVSMail): pass in when=
5909         (parseSyncmail): same. Just use util.now() for now.
5910         (parseBonsaiMail): parse the timestamp field for when=
5912         * buildbot/test/test_vc.py (SourceStamp.addChange): page in when=
5913         instead of setting .when after the fact
5915 2004-09-22  slyphon
5917         * buildbot/slave/trial.py: new SlaveCommand to machine-parse test
5918         results when the target project uses retrial. Still under
5919         development.
5920         * buildbot/test/test_trial.py: same
5922 2004-09-21  Brian Warner  <warner@lothar.com>
5924         * buildbot/status/mail.py (MailNotifier.__init__): include
5925         success/warnings/failure in the Subject line
5926         (MailNotifier.buildMessage): add the buildbot's URL to the body,
5927         use step.logname for the addLogs=True attachment filenames
5928         * buildbot/test/test_status.py (Mail): test Subject lines
5929         (Mail.testLogs): test attachment filenames
5931         * buildbot/master.py (DebugPerspective.perspective_fakeChange):
5932         accept a 'who' argument from the debug tool
5933         * contrib/debugclient.py (DebugWidget.do_commit): send 'who'
5934         * contrib/debug.glade: add text box to set 'who'
5936         * buildbot/interfaces.py (IBuildStatus.getBuilder): replace
5937         .getBuilderName with .getBuilder().getName(), more flexible
5938         (IStatusLog.getName): logs have short names, but you can prefix
5939         them with log.getStep().getName() to make them more useful
5940         * buildbot/status/builder.py: same
5941         * buildbot/status/client.py: same
5942         * buildbot/status/html.py: same
5943         * buildbot/test/test_run.py (Status.testSlave): same
5944         * buildbot/process/step.py: tweak logfile names
5946         * buildbot/status/mail.py (MailNotifier): add lookup, change
5947         argument to extraRecipients. The notifier is now aimed at sending
5948         mail to the people involved in a particular build, with additional
5949         constant recipients as a secondary function.
5951         * buildbot/test/test_status.py: add coverage for IEmailLookup,
5952         including slow-lookup and failing-lookup. Make sure the blamelist
5953         members are included.
5955         * buildbot/interfaces.py: new interfaces IEmailSender+IEmailLookup
5956         (IBuildStatus.getResponsibleUsers): rename from getBlamelist
5957         (IBuildStatus.getInterestedUsers): new method
5958         * buildbot/status/builder.py (BuildStatus.getResponsibleUsers): same
5959         * buildbot/status/client.py (remote_getResponsibleUsers): same
5960         * buildbot/status/html.py (StatusResourceBuild.body): same
5961         * buildbot/test/test_run.py (Status.testSlave): same
5963 2004-09-20  Brian Warner  <warner@lothar.com>
5965         * docs/users.xhtml: update concepts
5967         * Makefile: add a convenience makefile, for things like 'make
5968         test'. It is not included in the source tarball.
5970 2004-09-16  Brian Warner  <warner@lothar.com>
5972         * NEWS: mention /usr/bin/buildbot, debian/*
5974         * debian/*: add preliminary debian packaging. Many thanks to
5975         Kirill Lapshin (and Kevin Turner) for the hard work. I've mangled
5976         it considerably since it left their hands, I am responsible for
5977         all breakage that's resulted.
5979         * bin/buildbot: create a top-level 'buildbot' command, to be
5980         installed in /usr/bin/buildbot . For now it's just a simple
5981         frontend to mktap/twistd/kill, but eventually it will be the entry
5982         point to the 'try' command and also a status client. It is also
5983         intended to support the upcoming debian-packaging init.d scripts.
5984         * buildbot/scripts/runner.py: the real work is done here
5985         * buildbot/scripts/__init__.py: need this too
5986         * buildbot/scripts/sample.cfg: this is installed in new
5987         buildmaster directories
5988         * setup.py: install new stuff
5990 2004-09-15  Brian Warner  <warner@lothar.com>
5992         * buildbot/test/test_vc.py: skip SVN tests if svn can't handle the
5993         'file:' schema (the version shipped with OS-X was built without the
5994         ra_local plugin).
5995         (SetupMixin.tearDown): stop the goofy twisted.web timer which
5996         updates the log-timestamp, to make sure it isn't still running after
5997         the test finishes
5999         * docs/config.xhtml: Add projectName, projectURL, buildbotURL
6000         values to the config file.
6001         * docs/examples/hello.cfg: add examples
6002         * buildbot/interfaces.py (IStatus.getBuildbotURL): define accessors
6003         * buildbot/status/builder.py (Status.getProjectURL): implement them
6004         * buildbot/master.py (BuildMaster.loadConfig): set them from config
6005         * buildbot/test/test_config.py (ConfigTest.testSimple): test them
6006         * buildbot/status/html.py (WaterfallStatusResource): display them
6009         * buildbot/test/test_vc.py (FakeBuilder.name): add attribute so
6010         certain error cases don't suffer a secondary exception.
6011         (top): Skip tests if the corresponding VC tool is not installed.
6013         * buildbot/process/factory.py (Trial): introduce separate
6014         'buildpython' and 'trialpython' lists, since trialpython=[] is
6015         what you want to invoke /usr/bin/python, whereas ./setup.py is
6016         less likely to be executable. Add env= parameter to pass options
6017         to test cases (which is how I usually write tests, I don't know if
6018         anyone else does it this way).
6020         * buildbot/process/step_twisted.py (Trial): handle python=None.
6021         Require 'testpath' be a string, not a list. Fix tests= typo.
6022         (Trial.start): sanity-check any PYTHONPATH value for stringness.
6024         * buildbot/process/step.py (RemoteCommand._remoteFailed): goofy
6025         way to deal with the possibility of removing the disconnect notify
6026         twice.
6027         (CVS): add a 'login' parameter to give a password to 'cvs login',
6028         commonly used with pserver methods (where pw="" or pw="guest")
6030         * buildbot/slave/commands.py (SourceBase): move common args
6031         extraction and setup() to __init__, so everything is ready by the
6032         time setup() is called
6033         (CVS.start): call 'cvs login' if a password was supplied
6034         (ShellCommand): special-case PYTHONPATH: prepend the master's
6035         value to any existing slave-local value.
6037         * buildbot/process/builder.py (Builder.updateBigStatus): if we
6038         don't have a remote, mark the builder as Offline. This whole
6039         function should probably go away and be replaced by individual
6040         deltas.
6041         (Builder.buildFinished): return the results to the build-finished
6042         deferred callback, helps with testing
6044 2004-09-14  Brian Warner  <warner@lothar.com>
6046         * buildbot/test/test_vc.py: put all the repositories needed to run
6047         the complete tests into a single small (1.3MB) tarball, so I can
6048         make that tarball available on the buildbot web site. Test HTTP
6049         access (for Arch and Darcs) by spawning a temporary web server
6050         while the test runs.
6052         * docs/users.xhtml: new document, describe Buildbot's limited
6053         understanding of different human users
6055         * buildbot/test/test_vc.py: rearrange test cases a bit
6057         * buildbot/process/step_twisted.py (Trial): handle testpath=
6058         * buildbot/process/factory.py (Trial): update to use step.Trial
6060         * buildbot/slave/commands.py (ShellCommandPP): fix fatal typo
6062         * buildbot/status/builder.py (BuildStatus.getText): add text2 to
6063         the overall build text (which gives you 'failed 2 tests' rather
6064         than just 'failed')
6065         (BuildStepStatus.text2): default to [], not None
6067         * buildbot/process/step_twisted.py (Trial.commandComplete): text2
6068         must be a list
6070 2004-09-12  Brian Warner  <warner@lothar.com>
6072         * buildbot/master.py (BotPerspective._commandsUnavailable): don't
6073         log the whole exception if it's just an AttributeError (old slave)
6075         * buildbot/process/step.py (ShellCommand.__init__): stash .workdir
6076         so (e.g.) sub-commands can be run in the right directory.
6077         (ShellCommand.start): accept an optional errorMessage= argument
6078         to make life easier for SVN.start
6079         (SVN.startVC): put the "can't do mode=export" warning in the LogFile
6080         headers
6081         (ShellCommand.start): move ['dir'] compatibility hack..
6082         (RemoteShellCommand.start): .. to here so everyone can use it
6084         * buildbot/process/step_twisted.py (Trial): use .workdir
6086         * buildbot/process/step_twisted.py (BuildDebs.getText): fix the
6087         text displayed when debuild fails completely
6088         (Trial): snarf _trial_temp/test.log from the slave and display it
6090 2004-09-11  Brian Warner  <warner@lothar.com>
6092         * buildbot/process/step_twisted.py (ProcessDocs.getText): typo
6094         * buildbot/process/process_twisted.py (TwistedTrial.tests): oops,
6095         set to 'twisted', so --recurse can find twisted/web/test/*, etc
6097         * buildbot/process/step.py (ShellCommand): call .createSummary
6098         before .evaluateCommand instead of the other way around. This
6099         makes it slightly easier to count warnings and then use that to
6100         set results=WARNINGS
6101         * buildbot/process/step_twisted.py: cosmetic, swap the methods
6103         * buildbot/process/base.py (Build.buildFinished): update status
6104         before doing progress. It's embarrassing for the build to be stuck
6105         in the "building" state when an exceptions occurs elsewhere..
6107         * buildbot/status/progress.py (Expectations.expectedBuildTime):
6108         python2.2 doesn't have 'sum'
6110         * buildbot/status/builder.py (Status.getBuilderNames): return a copy,
6111         to prevent clients from accidentally sorting it
6113         * buildbot/master.py (Manhole): add username/password
6114         (BuildMaster.loadConfig): use c['manhole']=Manhole() rather than
6115         c['manholePort'], deprecate old usage
6116         * docs/config.xhtml: document c['manhole']
6117         * docs/examples/hello.cfg: show example of using a Manhole
6120         * buildbot/test/test_steps.py (FakeBuilder.getSlaveCommandVersion):
6121         pretend the slave is up to date
6123         * buildbot/status/builder.py (BuildStepStatus.stepFinished): 'log',
6124         the module, overlaps with 'log', the local variable
6126         * buildbot/status/html.py: oops, 2.2 needs __future__ for generators
6128         * buildbot/process/builder.py (Builder.getSlaveCommandVersion):
6129         new method to let Steps find out the version of their
6130         corresponding SlaveCommand.
6131         * buildbot/process/step.py (BuildStep.slaveVersion): utility method
6132         (ShellCommand.start): add 'dir' argument for <=0.5.0 slaves
6133         (CVS.startVC): backwards compatibility for <=0.5.0 slaves
6134         (SVN.startVC): same
6135         (Darcs.startVC): detect old slaves (missing the 'darcs' command)
6136         (Arch.startVC): same
6137         (P4Sync.startVC): same
6139         * buildbot/process/step.py (LoggedRemoteCommand.start): return the
6140         Deferred so we can catch errors in remote_startCommand
6141         (RemoteShellCommand.start): same
6143         * docs/examples/twisted_master.cfg: update sample config file
6145         * buildbot/slave/commands.py (ShellCommandPP): write to stdin
6146         after connectionMade() is called, not before. Close stdin at that
6147         point too.
6149         * buildbot/process/process_twisted.py: update to use Trial, clean
6150         up argument passing (move to argv arrays instead of string
6151         commands)
6153         * buildbot/process/step_twisted.py (Trial): new step to replace
6154         RunUnitTests, usable by any trial-using project (not just
6155         Twisted). Arguments have changed, see the docstring for details.
6157         * buildbot/process/base.py (Build.startBuild): this now returns a
6158         Deferred. Exceptions that occur during setupBuild are now
6159         caught better and lead to fewer build_status weirdnesses, like
6160         finishing a build that was never started.
6161         (Build.buildFinished): fire the Deferred instead of calling
6162         builder.buildFinished directly. The callback argument is this
6163         Build, everything else can be extracted from it, including the
6164         new build.results attribute.
6165         * buildbot/process/builder.py (Builder.startBuild): same
6166         (Builder.buildFinished): same, extract results from build
6168         * buildbot/process/step.py (ShellCommands): remove dead code
6170 2004-09-08  Brian Warner  <warner@lothar.com>
6172         * buildbot/test/test_vc.py (VC.doPatch): verify that a new build
6173         doesn't try to use the leftover patched workdir
6174         (SourceStamp): test source-stamp computation for CVS and SVN
6176         * buildbot/slave/commands.py (SourceBase.doPatch): mark the
6177         patched workdir ('touch .buildbot-patched') so we don't try to
6178         update it later
6179         (SourceBase.start): add ['revision'] for all Source steps
6180         (CVS): change args: use ['branch'] for -r, remove ['files']
6181         (CVS.buildVC): fix revision/branch stuff
6182         (SVN): add revision stuff
6184         * buildbot/process/step.py (BuildStep.__init__): reject unknown
6185         kwargs (except 'workdir') to avoid silent spelling errors
6186         (ShellCommand.__init__): same
6187         (Source): new base class for CVS/SVN/etc. Factor out everything
6188         common, add revision computation (perform the checkout with a -D
6189         DATE or -r REVISION that gets exactly the sources described by the
6190         last Change), overridable with step.alwaysUseLatest. Add patch
6191         handling (build.getSourceStamp can trigger the use of a base
6192         revision and a patch).
6193         (CVS, SVN, Darcs, Arch, P4Sync): refactor, remove leftover arguments
6194         * docs/steps.xhtml: update docs
6195         * docs/source.xhtml: mention .checkoutDelay
6196         * docs/examples/hello.cfg: show use of checkoutDelay, alwaysUseLatest
6198         * buildbot/process/base.py (Build.setSourceStamp): add a
6199         .sourceStamp attribute to each Build. If set, this indicates that
6200         the build should be done with something other than the most
6201         recent source tree. This will be used to implement "try" builds.
6202         (Build.allChanges): new support method
6203         (Build.lastChangeTime): remove, functionality moved to Source steps
6204         (Build.setupBuild): copy the Step args before adding ['workdir'],
6205         to avoid modifying the BuildFactory (and thus triggering spurious
6206         config changes)
6209         * buildbot/status/html.py: rename s/commits/changes/
6210         (StatusResourceChanges): same
6211         (CommitBox.getBox): same, update URL
6212         (WaterfallStatusResource): same
6213         (StatusResource.getChild): same
6215         * contrib/debugclient.py (DebugWidget.do_commit): send .revision
6216         * contrib/debug.glade: add optional 'revision' to the fakeChange
6218         * buildbot/changes/changes.py (html_tmpl): display .revision
6219         (ChangeMaster.addChange): note .revision in log
6220         * buildbot/changes/pb.py (ChangePerspective.perspective_addChange):
6221         accept a ['revision'] attribute
6223         * buildbot/process/factory.py (BuildFactory): use ComparableMixin
6225         * buildbot/master.py (BotMaster.getPerspective): update the
6226         .connected flag in SlaveStatus when it connects
6227         (BotMaster.detach): and when it disconnects
6228         (DebugPerspective.perspective_fakeChange): take a 'revision' attr
6229         (BuildMaster.loadConfig_Builders): walk old list correctly
6231         * buildbot/test/test_config.py: fix prefix= usage
6233 2004-09-06  Brian Warner  <warner@lothar.com>
6235         * NEWS: mention P4
6237         * buildbot/changes/p4poller.py (P4Source): New ChangeSource to
6238         poll a P4 depot looking for recent changes. Thanks to Dave
6239         Peticolas for the contribution. Probably needs some testing after
6240         I mangled it.
6242         * buildbot/process/step.py (P4Sync): simple P4 source-updater,
6243         requires manual client setup for each buildslave. Rather
6244         experimental. Thanks again to Dave Peticolas.
6245         * buildbot/slave/commands.py (P4Sync): slave-side source-updater
6247         * buildbot/changes/changes.py (Change): add a .revision attribute,
6248         which will eventually be used to generate source-stamp values.
6250         * buildbot/process/step.py (RemoteCommand.start): use
6251         notifyOnDisconnect to notice when we lose the slave, then treat it
6252         like an exception. This allows LogFiles to be closed and the build
6253         to be wrapped up normally. Be sure to remove the disconnect
6254         notification when the step completes so we don't accumulate a
6255         bazillion such notifications which will fire weeks later (when the
6256         slave finally disconnects normally). Fixes SF#915807, thanks to
6257         spiv (Andrew Bennetts) for the report.
6258         (LoggedRemoteCommand): move __init__ code to RemoteCommand, since it
6259         really isn't Logged- specific
6260         (LoggedRemoteCommand.remoteFailed): Add an extra newline to the
6261         header, since it's almost always going to be appended to an
6262         incomplete line
6263         * buildbot/test/test_steps.py (BuildStep.testShellCommand1):
6264         update test to handle use of notifyOnDisconnect
6266         * buildbot/status/builder.py (BuilderStatus.currentlyOffline):
6267         don't clear .ETA and .currentBuild when going offline, let the
6268         current build clean up after itself
6270         * buildbot/process/builder.py (Builder.detached): wait a moment
6271         before doing things like stopping the current build, because the
6272         current step will probably notice the disconnect and cleanup the
6273         build by itself
6274         * buildbot/test/test_run.py (Status.tearDown): update test to
6275         handle asynchronous build-detachment
6277         * buildbot/process/base.py (Build.stopBuild): minor shuffles
6279         * buildbot/status/html.py (WaterfallStatusResource.buildGrid):
6280         hush a debug message
6282 2004-09-05  Brian Warner  <warner@lothar.com>
6284         * buildbot/changes/maildir.py (Maildir.start): catch an IOError
6285         when the dnotify fcntl() fails and fall back to polling. Linux 2.2
6286         kernels do this: the fcntl module has the F_NOTIFY constant, but
6287         the kernel itself doesn't support the operation. Thanks to Olly
6288         Betts for spotting the problem.
6290         * buildbot/process/step.py (Darcs): new source-checkout command
6291         (Arch): new source-checkout command
6292         (todo_P4): fix constructor syntax, still just a placeholder
6293         * buildbot/test/test_vc.py (VC.testDarcs): test it
6294         (VC.testDarcsHTTP): same, via localhost HTTP
6295         (VC.testArch): same
6296         (VC.testArchHTTP): same
6297         * NEWS: mention new features
6299         * buildbot/slave/commands.py (ShellCommand): add .keepStdout,
6300         which tells the step to stash stdout text locally (in .stdout).
6301         Slave-side Commands can use this to make decisions based upon the
6302         output of the the ShellCommand (not just the exit code).
6303         (Darcs): New source-checkout command
6304         (Arch): New source-checkout command, uses .keepStdout in one place
6305         where it needs to discover the archive's default name.
6307         * docs/steps.xhtml: Document options taken by Darcs and Arch.
6308         * docs/source.xhtml: add brief descriptions of Darcs and Arch
6309         * docs/examples/hello.cfg: add examples of Darcs and Arch checkout
6311         * buildbot/process/step.py (ShellCommand.describe): add an
6312         alternate .descriptionDone attribute which provides descriptive
6313         text when the step is complete. .description can be ["compiling"],
6314         for use while the step is running, then .descriptionDone can be
6315         ["compile"], used alone when the step succeeds or with "failed" when
6316         it does not. Updated other steps to use the new text.
6317         * buildbot/process/step_twisted.py: same
6318         * buildbot/test/test_run.py: update tests to match
6320 2004-08-30  Brian Warner  <warner@lothar.com>
6322         * buildbot/process/step.py (ShellCommand.createSummary): fix docs
6323         (CVS.__init__): send 'patch' argument to slave
6324         (CVS.start): don't create the LoggedRemoteCommand until start(),
6325         so we can catch a .patch added after __init__
6326         (SVN.__init__): add 'patch' to SVN too
6327         (SVN.start): same
6329         * buildbot/slave/commands.py (ShellCommand): add a 'stdin'
6330         argument, to let commands push data into the process' stdin pipe.
6331         Move usePTY to a per-instance attribute, and clear it if 'stdin'
6332         is in use, since closing a PTY doesn't really affect the process
6333         in the right way (in particular, I couldn't run /usr/bin/patch
6334         under a pty).
6335         (SourceBase.doPatch): handle 'patch' argument
6337         * buildbot/test/test_vc.py (VC.doPatch): test 'patch' argument for
6338         both CVS and SVN
6340         * buildbot/slave/commands.py (cvs_ver): fix version-parsing goo
6341         * buildbot/slave/bot.py (Bot.remote_getCommands): send command
6342         versions to master
6343         * buildbot/master.py (BotPerspective.got_commands): get command
6344         versions from slave, give to each builder
6345         * buildbot/process/builder.py (Builder.attached): stash slave
6346         command versions in .remoteCommands
6348         * docs/steps.xhtml: bring docs in-line with reality
6350         * buildbot/process/step.py (CVS.__init__): more brutal
6351         compatibility code removal
6352         (SVN.__init__): same
6354         * buildbot/slave/commands.py (SlaveShellCommand): update docs
6355         (SlaveShellCommand.start): require ['workdir'] argument, remove
6356         the ['dir'] fallback (compatibility will come later)
6357         (SourceBase): update docs
6358         (SourceBase.start): remove ['directory'] fallback
6359         (CVS): update docs
6360         (SVN): update docs
6361         * buildbot/test/test_config.py (ConfigTest.testBuilders): update test
6362         * buildbot/test/test_steps.py (BuildStep.testShellCommand1): same
6363         * buildbot/test/test_slavecommand.py (SlaveCommandTestCase): same
6365         * buildbot/process/step.py (RemoteShellCommand.__init__): add
6366         want_stdout/want_stderr. remove old 'dir' keyword (to simplify the
6367         code.. I will figure out 0.5.0-compatibility hooks later)
6369 2004-08-30  Brian Warner  <warner@lothar.com>
6371         * buildbot/process/process_twisted.py: rewrite in terms of new
6372         BuildFactory base class. It got significantly shorter. Yay
6373         negative code days.
6375         * buildbot/process/step_twisted.py (HLint.start): fix to make it
6376         work with the new "self.build isn't nailed down until we call
6377         step.start()" scheme: specifically, __init__ is called before the
6378         build has decided on which Changes are going in, so we don't scan
6379         build.allFiles() for .xhtml files until start()
6380         (HLint.commandComplete): use getText(), not getStdout()
6381         (RunUnitTests.start): same: don't use .build until start()
6382         (RunUnitTests.describe): oops, don't report (None) when using
6383         the default reactor
6384         (RunUnitTests.commandComplete): use getText()
6385         (RunUnitTests.createSummary): same
6386         (BuildDebs.commandComplete): same
6388         * buildbot/process/step.py (RemoteShellCommand.__init__): don't
6389         set args['command'] until start(), since our BuildStep is allowed
6390         to change their mind up until that point
6391         (TreeSize.commandComplete): use getText(), not getStdout()
6393         * docs/examples/twisted_master.cfg: update to current standards
6395         * docs/factories.xhtml: update
6396         * buildbot/process/factory.py: implement all the common factories
6397         described in the docs. The Trial factory doesn't work yet, and
6398         I've probably broken all the process_twisted.py factories in the
6399         process. There are compatibility classes left in for things like
6400         the old BasicBuildFactory, but subclasses of them are unlikely to
6401         work.
6402         * docs/examples/glib_master.cfg: use new BuildFactories
6403         * docs/examples/hello.cfg: same
6405         * buildbot/test/test_config.py (ConfigTest.testBuilders): remove
6406         explicit 'workdir' args
6408         * buildbot/process/base.py (BuildFactory): move factories to ..
6409         * buildbot/process/factory.py (BuildFactory): .. here
6410         * buildbot/process/process_twisted.py: handle move
6411         * buildbot/test/test_config.py: same
6412         * buildbot/test/test_run.py: same
6413         * buildbot/test/test_steps.py: same
6414         * buildbot/test/test_vc.py: same
6415         * docs/factories.xhtml: same
6417         * NEWS: mention config changes that require updating master.cfg
6419         * buildbot/process/base.py (Build.setupBuild): add a 'workdir'
6420         argument to all steps that weren't given one already, pointing at
6421         the "build/" directory.
6423         * docs/examples/hello.cfg: remove explicit 'workdir' args
6425         * docs/factories.xhtml: document standard BuildFactory clases,
6426         including a bunch which are have not yet been written
6428 2004-08-29  Brian Warner  <warner@lothar.com>
6430         * buildbot/interfaces.py (IBuildStepStatus.getResults): move
6431         result constants (SUCCESS, WARNINGS, FAILURE, SKIPPED) to
6432         buildbot.status.builder so they aren't quite so internal
6433         * buildbot/process/base.py, buildbot/process/builder.py: same
6434         * buildbot/process/maxq.py, buildbot/process/step.py: same
6435         * buildbot/process/step_twisted.py, buildbot/status/builder.py: same
6436         * buildbot/status/mail.py, buildbot/test/test_run.py: same
6437         * buildbot/test/test_status.py, buildbot/test/test_vc.py: same
6439         * buildbot/status/html.py (StatusResourceBuildStep): oops, update
6440         to handle new getLogs()-returns-list behavior
6441         (StatusResourceBuildStep.getChild): same
6442         (StepBox.getBox): same
6443         (WaterfallStatusResource.phase0): same
6445         * docs/source.xhtml: document how Buildbot uses version-control
6446         systems (output side: how we get source trees)
6447         * docs/changes.xhtml: rename from sources.xhtml, documents VC
6448         systems (input side: how we learn about Changes)
6450         * buildbot/master.py (Manhole): use ComparableMixin
6451         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): same
6452         * buildbot/changes/mail.py (MaildirSource): same
6453         * buildbot/status/client.py (PBListener): same
6454         * buildbot/status/html.py (Waterfall): same
6455         * buildbot/status/words.py (IRC): same
6457         * NEWS: start describing new features
6459         * buildbot/status/mail.py (MailNotifier): finish implementation.
6460         The message body is still a bit sparse.
6461         * buildbot/test/test_status.py (Mail): test it
6463         * buildbot/util.py (ComparableMixin): class to provide the __cmp__
6464         and __hash__ methods I wind up adding everywhere. Specifically
6465         intended to support the buildbot config-file update scheme where
6466         we compare, say, the old list of IStatusTargets against the new
6467         one and don't touch something which shows up on both lists.
6468         * buildbot/test/test_util.py (Compare): test case for it
6470         * buildbot/interfaces.py (IBuildStatus): change .getLogs() to
6471         return a list instead of a dict
6472         (IBuildStepStatus.getLogs): same. The idea is that steps create
6473         logs with vaguely unique names (although their uniqueness is not
6474         guaranteed). Thus a compilation step should create its sole
6475         logfile with the name 'compile', and contribute it to the
6476         BuildStatus. If a step has two logfiles, try to create them with
6477         different names (like 'test.log' and 'test.summary'), and only
6478         contribute the important ones to the overall BuildStatus.
6479         * buildbot/status/builder.py (Event.getLogs): same
6480         (BuildStepStatus): fix default .text and .results
6481         (BuildStepStatus.addLog): switch to list-like .getLogs()
6482         (BuildStepStatus.stepFinished): same
6483         (BuildStatus.text): fix default .text
6484         (BuildStatus.getLogs): temporary hack to return all logs (from all
6485         child BuildStepStatus objects). Needs to be fixed to only report
6486         the significant ones (as contributed by the steps themselves)
6487         * buildbot/test/test_run.py: handle list-like .getLogs()
6488         * buildbot/test/test_steps.py (BuildStep.testShellCommand1): same
6490 2004-08-28  Brian Warner  <warner@lothar.com>
6492         * buildbot/process/builder.py (Builder.attached): serialize the
6493         attachment process, so the attach-watcher isn't called until the
6494         slave is really available. Add detached watchers too, which makes
6495         testing easier.
6497         * buildbot/test/test_vc.py: test VC modes (clobber/update/etc)
6499         * buildbot/test/test_swap.py: remove dead code
6501         * buildbot/slave/commands.py (ShellCommandPP): add debug messages
6502         (ShellCommand.start): treat errors in _startCommand/spawnProcess
6503         sort of as if the command being run exited with a -1. There may
6504         still be some holes in this scheme.
6505         (CVSCommand): add 'revision' tag to the VC commands, make sure the
6506         -r option appears before the module list
6507         * buildbot/process/step.py (CVS): add 'revision' argument
6509         * buildbot/slave/bot.py (SlaveBuilder._ackFailed): catch failures
6510         when sending updates or stepComplete messages to the master, since
6511         we don't currently care whether they arrive or not. When we revamp
6512         the master/slave protocol to really resume interrupted builds,
6513         this will need revisiting.
6514         (lostRemote): remove spurious print
6516         * buildbot/master.py (BotPerspective.attached): serialize the
6517         new-builder interrogation process, to make testing easier
6518         (BotMaster.waitUntilBuilderDetached): convenience function
6520         * buildbot/status/builder.py (BuilderStatus): prune old builds
6521         (BuildStatus.pruneSteps): .. and steps
6522         (BuildStepStatus.pruneLogs): .. and logs
6523         (BuilderStatus.getBuild): handle missing builds
6524         * buildbot/status/html.py (StatusResourceBuild.body): display build
6525         status in the per-build page
6526         (BuildBox.getBox): color finished builds in the per-build box
6528 2004-08-27  Brian Warner  <warner@lothar.com>
6530         * buildbot/status/mail.py (MailNotifier): new notification class,
6531         not yet finished
6533         * buildbot/slave/commands.py (SourceBase): refactor SVN and CVS into
6534         variants of a common base class which handles all the mode= logic
6536         * buildbot/interfaces.py (IBuildStatus.getPreviousBuild): add
6537         convenience method
6538         * buildbot/status/builder.py (BuildStatus.getPreviousBuild): same
6540 2004-08-26  Brian Warner  <warner@lothar.com>
6542         * buildbot/test/test_slavecommand.py: accomodate new slavecommand
6543         interfaces
6545         * buildbot/test/test_run.py: update to new Logfile interface, new
6546         buildbot.slave modules
6547         * buildbot/test/test_steps.py: same, remove Swappable, add timeouts
6549         * MANIFEST.in: new sample config file
6550         * docs/examples/hello.cfg: same
6552         * buildbot/process/step_twisted.py: remove dead import
6554         * buildbot/process/step.py (RemoteCommand.run): catch errors
6555         during .start
6556         (RemoteCommand.remote_update): ignore updates that arrive after
6557         we've shut down
6558         (RemoteCommand.remote_complete): ignore duplicate complete msgs
6559         (RemoteCommand._remoteComplete): cleanup failure handling, reduce
6560         the responsibilities of the subclass's methods
6561         (BuildStep.failed): catch errors during failure processing
6562         (BuildStep.addHTMLLog): provide all-HTML logfiles (from Failures)
6563         (CVS): move to a mode= argument (described in docstring), rather
6564         than the ungainly clobber=/export=/copydir= combination.
6565         (SVN): add mode= functionality to SVN too
6566         (todo_Darcs, todo_Arch, todo_P4): placeholders for future work
6568         * buildbot/process/base.py (Build.startNextStep): catch errors
6569         during s.startStep()
6571         * buildbot/clients/base.py: update to new PB client interface.
6572         gtkPanes is still broken
6574         * buildbot/bot.py, buildbot/slavecommand.py: move to..
6575         * buildbot/slave/bot.py, buildbot/slave/commands.py: .. new directory
6576         * setup.py: add buildbot.slave module
6577         * buildbot/bb_tap.py: handle move
6578         * buildbot/slave/registry.py: place to register commands, w/versions
6579         * buildbot/slave/bot.py: major simplifications
6580         (SlaveBuilder.remote_startCommand): use registry for slave commands,
6581         instead of a fixed table. Eventually this will make the slave more
6582         extensible. Use 'start' method on the command, not .startCommand.
6583         Fix unsafeTracebacks handling (I think).
6584         * buildbot/slave/commands.py: major cleanup. ShellCommand is now a
6585         helper class with a .start method that returns a Deferred.
6586         SlaveShellCommand is the form reached by the buildmaster. Commands
6587         which use multiple ShellCommands can just chain them as Deferreds,
6588         with some helper methods in Command (_abandonOnFailure and
6589         _checkAbandoned) to bail on rc!=0.
6590         (CVSCommand): prefer new mode= argument
6591         (SVNFetch): add mode= argument
6593         * buildbot/master.py (DebugPerspective.perspective_forceBuild):
6594         put a useful reason string on the build
6596         * buildbot/status/builder.py (LogFile): do LogFile right: move the
6597         core functionality into an IStatusLog object
6598         (BuildStatus.sendETAUpdate): don't send empty build-eta messages
6599         * buildbot/status/html.py (TextLog): HTML-rendering goes here
6600         (StatusResourceBuild.body): use proper accessor methods
6601         * buildbot/status/client.py (RemoteLog): PB-access goes here
6602         (StatusClientPerspective.perspective_subscribe): add "full" mode,
6603         which delivers log contents too
6604         (PBListener.__cmp__): make PBListeners comparable, thus removeable
6605         * buildbot/status/event.py: remove old Logfile completely
6607         * buildbot/interfaces.py (IStatusLog.subscribe): make the
6608         subscription interface for IStatusLog subscriptions just like all
6609         other the status subscriptions
6610         (IStatusReceiver.logChunk): method called on subscribers
6612 2004-08-24  Brian Warner  <warner@lothar.com>
6614         * buildbot/process/builder.py (Builder._pong): oops, ping response
6615         includes a result (the implicit None returned by remote_print).
6616         Accept it so the _pong method handles the response correctly.
6618 2004-08-06  Brian Warner  <warner@lothar.com>
6620         * buildbot/test/test_config.py: update IRC, PBListener tests
6622         * buildbot/status/client.py (StatusClientPerspective): total
6623         rewrite to match new IStatus interfaces. New subscription scheme.
6624         There are still a few optimizations to make (sending down extra
6625         information with event messages so the client doesn't have to do a
6626         round trip). The logfile-retrieval code is probably still broken.
6627         Moved the PB service into its own port, you can no longer share a
6628         TCP socket between a PBListener and, say, the slaveport (this
6629         should be fixed eventually).
6630         * buildbot/clients/base.py (Client): revamp to match. still needs
6631         a lot of work, but basic event reporting works fine. gtkPanes is
6632         completely broken.
6634         * buildbot/status/words.py (IRC): move to c['status']. Each IRC
6635         instance talks to a single irc server. Threw out all the old
6636         multi-server handling code. Still need to add back in
6637         builder-control (i.e. "force build")
6639         * buildbot/status/html.py (StatusResourceBuildStep.body): add some
6640         more random text to the as-yet-unreachable per-step page
6642         * buildbot/status/builder.py (BuildStepStatus.sendETAUpdate):
6643         rename to stepETAUpdate
6644         (BuildStatus.subscribe): add build-wide ETA updates
6645         (BuilderStatus.getState): remove more cruft
6646         (BuilderStatus.getCurrentBuild): remove more cruft
6647         (BuilderStatus.buildStarted): really handle tuple-subscription
6648         * buildbot/test/test_run.py (Status.testSlave): handle the
6649         stepETAUpdate rename
6651         * buildbot/master.py (BuildMaster): don't add a default
6652         StatusClientService. Don't add a default IrcStatusFactory. Both
6653         are now added through c['status'] in the config file. c['irc'] is
6654         accepted for backwards compatibility, the only quirk is you cannot
6655         use c['irc'] to specify IRC servers on ports other than 6667.
6657         * buildbot/interfaces.py (IBuildStatus.getCurrentStep): add method
6658         (IStatusReceiver.buildStarted): allow update-interval on subscribe
6659         (IStatusReceiver.buildETAUpdate): send build-wide ETA updates
6660         (IStatusReceiver.stepETAUpdate): rename since it's step-specific
6663         * buildbot/master.py (BuildMaster.startService): SIGHUP now causes
6664         the buildmaster to re-read its config file
6667         * buildbot/test/test_web.py (test_webPortnum): need a new hack to
6668         find out the port our server is running on
6669         (WebTest.test_webPathname_port): same
6671         * buildbot/test/test_config.py (testWebPortnum): test it
6672         (testWebPathname): ditto
6674         * docs/config.xhtml: document new c['status'] configuration option
6676         * buildbot/status/html.py (Waterfall): new top-level class which
6677         can be added to c['status']. This creates the Site as well as the
6678         necessary TCPServer/UNIXServer. It goes through the BuildMaster,
6679         reachable as .parent, for everything.
6681         * buildbot/master.py (Manhole): make it a normal service Child
6682         (BuildMaster.loadConfig_status): c['status'] replaces webPortnum and
6683         webPathname. It will eventually replace c['irc'] and the implicit
6684         PB listener as well. c['webPortnum'] and c['webPathname'] are left
6685         in as (deprecated) backward compatibility hooks for now.
6688         * buildbot/process/builder.py (Builder.buildFinished): don't
6689         inform out builder_status about a finished build, as it finds out
6690         through its child BuildStatus object
6692         * buildbot/status/html.py: extensive revamp. Use adapters to make
6693         Boxes out of BuildStepStatus and friends. Acknowledge that Steps
6694         have both starting and finishing times and adjust the waterfall
6695         display accordingly, using spacers if necessary. Use SlaveStatus
6696         to get buildslave info.
6697         (StatusResourceBuildStep): new just-one-step resource, used to get
6698         logfiles. No actual href to it yet.
6700         * buildbot/status/event.py (Logfile.doSwap): disable Swappable for
6701         the time being, until I get the file-naming scheme right
6703         * buildbot/status/builder.py (Event): clean started/finished names
6704         (BuildStatus.isFinished): .finished is not None is the right test
6705         (BuildStatus.buildStarted): track started/finished times ourselves
6706         (BuilderStatus.getSlave): provide access to SlaveStatus object
6707         (BuilderStatus.getLastFinishedBuild): all builds are now in
6708         .builds, even the currently-running one. Accomodate this change.
6709         (BuilderStatus.eventGenerator): new per-builder event generator.
6710         Returns BuildStepStatus and BuildStatus objects, since they can
6711         both be adapted as necessary.
6712         (BuilderStatus.addEvent): clean up started/finished attributes
6713         (BuilderStatus.startBuild,finishBuild): remove dead code
6714         (SlaveStatus): new object to provide ISlaveStatus
6716         * buildbot/process/step.py (ShellCommand.getColor): actually
6717         return the color instead of setting it ourselves
6718         (CVS.__init__): pull .timeout and .workdir options out of
6719         **kwargs, since BuildStep will ignore them. Without this neither
6720         will be sent to the slave correctly.
6721         (SVN.__init__): same
6723         * buildbot/process/builder.py (Builder): move flags to class-level
6724         attributes
6725         (Builder.attached): remove .remoteInfo, let the BotPerspective and
6726         SlaveStatus handle that
6728         * buildbot/process/base.py (Build.firstEvent): remove dead code
6729         (Build.stopBuild): bugfix
6731         * buildbot/changes/pb.py (PBChangeSource.describe): add method
6733         * buildbot/changes/changes.py (Change): add IStatusEvent methods
6734         (ChangeMaster.eventGenerator): yield Changes, since there are now
6735         Adapters to turn them into HTML boxes
6737         * buildbot/master.py (BotMaster): track SlaveStatus from BotMaster
6738         (BotPerspective.attached): feed a SlaveStatus object
6739         (BuildMaster.loadConfig): add a manhole port (debug over telnet)
6740         (BuildMaster.loadConfig_Builders): give BuilderStatus a parent
6742         * buildbot/interfaces.py: API additions
6743         (ISlaveStatus): place to get slave status
6745 2004-08-04  Brian Warner  <warner@lothar.com>
6747         * buildbot/slavecommand.py (DummyCommand.finished): send rc=0 when
6748         the delay finishes, so the step is marked as SUCCESS
6750         * buildbot/test/test_run.py (Status.testSlave): cover more of
6751         IBuildStatus and IBuildStepStatus
6753         * buildbot/status/progress.py (StepProgress): move some flags to
6754         class-level attributes
6755         (StepProgress.remaining): if there are no other progress metrics
6756         to go by, fall back to elapsed time
6757         (StepProgress.setExpectations): take a dict of metrics instead of
6758         a list
6759         (BuildProgress.setExpectationsFrom): pull expectations from the
6760         Expectations, instead of having it push them to the BuildProgress
6761         (Expectations): move some flags to class-level attributes
6762         (Expectations.__init__): copy per-step times from the
6763         BuildProgress too
6764         (Expectations.expectedBuildTime): new method for per-build ETA
6766         * buildbot/status/event.py (Logfile): move some flags to
6767         class-level attributes
6768         (Logfile.logProgressTo): better method name, let step set the
6769         progress axis name (instead of always being "output")
6771         * buildbot/status/builder.py (BuildStepStatus.getTimes): track the
6772         times directly, rather than depending upon the (possibly missing)
6773         .progress object. Use 'None' to indicate "not started/finished
6774         yet"
6775         (BuildStepStatus.getExpectations): oops, return the full list of
6776         expectations
6777         (BuilderStatus._buildFinished): append finished builds to .builds
6779         * buildbot/process/step.py (BuildStep): add separate .useProgress
6780         flag, since empty .progressMetrics[] still implies that time is a
6781         useful predictor
6782         (CVS): set up the cmd in __init__, instead of waiting for start()
6784         * buildbot/process/base.py (Build.startBuild): disable the 'when'
6785         calculation, this will eventually turn into a proper sourceStamp
6786         (Build.setupBuild): tell the Progress to load from the Expectations,
6787         instead of having the Expectations stuff things into the Progress
6788         (Build.buildException): add a build-level errback to make sure the
6789         build's Deferred fires even in case of exceptions
6791         * buildbot/master.py (BotMaster.forceBuild): convey the reason into
6792         the forced build
6793         * buildbot/process/builder.py (Builder.forceBuild): convey the
6794         reason instead of creating a fake Change
6796         * docs/examples/twisted_master.cfg: update to match reality
6798         * buildbot/test/test_config.py, buildbot/test/test_process.py:
6799         * buildbot/test/test_run.py, buildbot/test/test_steps.py:
6800         fix or remove broken/breaking tests
6802         * buildbot/status/event.py (Logfile.__len__): remove evil method
6804         * buildbot/status/builder.py (BuildStepStatus.stepStarted): tolerate
6805         missing .build, for test convenience
6807         * buildbot/process/step_twisted.py: import fixes
6809         * buildbot/process/step.py (BuildStep.failed): exception is FAILURE
6811         * buildbot/master.py (BuildMaster.loadConfig_Builders): leftover
6812         .statusbag reference
6814         * buildbot/bot.py (BuildSlave.stopService): tear down the TCP
6815         connection at shutdown, and stop it from reconnecting
6817         * buildbot/test/test_run.py (Run.testSlave): use a RemoteDummy to
6818         chase down remote-execution bugs
6820         * buildbot/process/step.py: more fixes, remove
6821         BuildStep.setStatus()
6822         * buildbot/status/builder.py: move setStatus() functionality into
6823         BuildStatus.addStep
6824         * buildbot/status/event.py: minor fixes
6826 2004-08-03  Brian Warner  <warner@lothar.com>
6828         * buildbot/process/base.py, buildbot/process/builder.py
6829         * buildbot/process/step.py, buildbot/status/builder.py
6830         * buildbot/status/event.py, buildbot/test/test_run.py:
6831         fix status delivery, get a basic test case working
6832         * buildbot/master.py: finish implementing basic status delivery,
6833         temporarily disable HTML/IRC/PB status sources
6835         * buildbot/bot.py (Bot.remote_setBuilderList): remove debug noise
6837         * buildbot/status/progress.py (BuildProgress): remove dead code
6839         * buildbot/interfaces.py
6840         * buildbot/process/base.py, buildbot/process/builder.py
6841         * buildbot/process/step.py, buildbot/process/step_twisted.py
6842         * buildbot/status/builder.py: Complete overhaul of the all
6843         status-delivery code, unifying all types of status clients (HTML,
6844         IRC, PB). See interfaces.IBuildStatus for an idea of what it will
6845         look like. This commit is a checkpointing of the work-in-progress:
6846         the input side is mostly done (Builders/Builds sending status
6847         to the BuilderStatus/BuildStatus objects), but the output side has
6848         not yet been started (HTML resources querying BuilderStatus
6849         objects). Things are probably very broken right now and may remain
6850         so for several weeks, I apologize for the disruption.
6852         * buildbot/status/event.py: add a setHTML method to use pre-rendered
6853         HTML as the log's contents. Currently used for exception tracebacks.
6854         * buildbot/status/progress.py: minor spelling changes
6856 2004-08-02  Brian Warner  <warner@lothar.com>
6858         * docs/config.xhtml: XHTML fixes, makes raw .xhtml files viewable
6859         in mozilla. Also added stylesheets copied from Twisted's docs.
6860         Remember that these files are meant to be run through Lore first.
6861         Thanks to Philipp Frauenfelder for the fixes.
6862         * docs/factories.xhtml, docs/sources.xhtml, docs/steps.xhtml: same
6863         * docs/stylesheet-unprocessed.css, docs/stylesheet.css: same
6864         * docs/template.tpl: added a Lore template
6866 2004-07-29  Brian Warner  <warner@lothar.com>
6868         * buildbot/interfaces.py: revamp status delivery. This is the
6869         preview: these are the Interfaces that will be provided by new
6870         Builder code, and to which the current HTML/IRC/PB status
6871         displayers will be adapted.
6873         * buildbot/slavecommand.py (ShellCommand.start): look for .usePTY
6874         on the SlaveBuilder, not the Bot.
6875         * buildbot/bot.py (Bot.remote_setBuilderList): copy Bot.usePTY to
6876         SlaveBuilder.usePTY
6877         * buildbot/test/test_slavecommand.py (FakeSlaveBuilder.usePTY):
6878         set .usePTY on the FakeSlaveBuilder
6880 2004-07-25  Brian Warner  <warner@lothar.com>
6882         * buildbot/changes/freshcvs.py: add some debug log messages
6883         (FreshCVSConnectionFactory.gotPerspective): pre-emptively fix the
6884         disabled 'setFilter' syntax
6885         (FreshCVSSourceNewcred.__init__): warn about prefix= values that
6886         don't end with a slash
6888         * buildbot/process/base.py (Builder._pong_failed): add TODO note
6890         * setup.py: bump to 0.5.0+ while between releases
6892 2004-07-23  Brian Warner  <warner@lothar.com>
6894         * setup.py (version): Releasing buildbot-0.5.0
6896 2004-07-23  Brian Warner  <warner@lothar.com>
6898         * README: update for 0.5.0 release
6900         * NEWS: update for 0.5.0 release
6902 2004-07-22  Brian Warner  <warner@lothar.com>
6904         * buildbot/slavecommand.py (ShellCommand): make usePTY a
6905         mktap-time configuration flag (--usepty=1, --usepty=0)
6906         * buildbot/bot.py: same
6908         * buildbot/master.py (BotPerspective.got_dirs): don't complain about
6909         an 'info' directory being unwanted
6911         * buildbot/changes/freshcvs.py (FreshCVSSource): flip the
6912         newcred/oldcred switch. Newcred (for CVSToys-1.0.10 and later) is now
6913         the default. To communicate with an oldcred daemond (CVSToys-1.0.9
6914         and earlier), use a FreshCVSSourceOldcred instead.
6915         (test): simple test routine: connect to server, print changes
6917         * buildbot/changes/changes.py (Change.getTime): make it possible
6918         to print un-timestamped changes
6920         * buildbot/master.py (makeApp): delete ancient dead code
6921         (BuildMaster.loadTheConfigFile): make "master.cfg" name configurable
6922         * buildbot/test/test_config.py (testFindConfigFile): test it
6924         * docs/examples/twisted_master.cfg (b22w32): use iocp reactor
6925         instead of win32 one
6928         * buildbot/master.py (BuildMaster.loadConfig_Builders): config file
6929         now takes a dictionary instead of a tuple. See docs/config.xhtml for
6930         details.
6932         * buildbot/process/base.py (Builder.__init__): change constructor
6933         to accept a dictionary of config data, rather than discrete
6934         name/slave/builddir/factory arguments
6936         * docs/examples/twisted_master.cfg: update to new syntax
6937         * docs/examples/glib_master.cfg: same
6938         * buildbot/test/test_config.py (ConfigTest.testBuilders): some
6939         rough tests of the new syntax
6941         
6942         * buildbot/master.py (BuildMaster.loadConfig): allow webPathname
6943         to be an int, which means "run a web.distrib sub-server on a TCP
6944         port". This lets you publish the buildbot status page to a remote
6945         twisted.web server (using distrib.ResourceSubscription). Also
6946         rename the local attributes used to hold these web things so
6947         they're more in touch with reality.
6948         * buildbot/test/test_web.py: test webPortnum and webPathname
6949         * docs/config.xhtml: document this new use of webPathname
6951         * docs/config.xhtml: new document, slightly ahead of reality
6952         
6953         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred.notify): fix
6954         'prefix' handling: treat it as a simple string to check with
6955         .startswith, instead of treating it as a directory. This allows
6956         sub-directories to be used. If you use prefix=, you should give it
6957         a string that starts just below the CVSROOT and ends with a slash.
6958         This prefix will be stripped from all filenames, and filenames
6959         which do not start with it will be ignored.
6961 2004-07-20  Cory Dodt  <corydodt@twistedmatrix.com>
6963         * contrib/svn_buildbot.py: Add --include (synonym for --filter)
6964         and --exclude (inverse of --include).  SVN post-commit hooks
6965         now have total control over which changes get sent to buildbot and which
6966         do not.
6968 2004-07-10  Brian Warner  <warner@lothar.com>
6970         * buildbot/test/test_twisted.py (Case1.testCountFailedTests): fix
6971         test case to match new API
6973         * buildbot/status/event.py (Logfile.getEntries): fix silly bug
6974         which crashed HTML display when self.entries=[] (needed to
6975         distinguish between [], which means "no entries yet", and None,
6976         which means "the entries have been swapped out to disk, go fetch
6977         them").
6979 2004-07-04  Brian Warner  <warner@lothar.com>
6981         * buildbot/process/step_twisted.py (countFailedTests): Count
6982         skips, expectedFailures, and unexpectedSuccesses. Start scanning
6983         10kb from the end because any import errors are wedged there and
6984         they would make us think the test log was unparseable.
6985         (RunUnitTests.finishStatus): add skip/todo counts to the event box
6987 2004-06-26  Brian Warner  <warner@lothar.com>
6989         * buildbot/process/step_twisted.py (RemovePYCs): turn the
6990         delete-*.pyc command into an actual BuildStep, so we can label it
6991         nicely
6992         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
6993         (FullTwistedBuildFactory): same
6995 2004-06-25  Cory Dodt  <corydodt@twistedmatrix.com>
6997         * contrib/fakechange.py: Add an errback when sending the fake 
6998         change, so we know it didn't work.
7000 2004-06-25  Christopher Armstrong  <radix@twistedmatrix.com>
7002         * buildbot/process/step_twisted.py: Delete *.pyc files before
7003         calling trial, so it doesn't catch any old .pyc files whose .py
7004         files have been moved or deleted.
7006         * buildbot/process/step_twisted.py (RunUnitTests): 1) Add a new
7007         parameter, 'recurse', that passes -R to trial. 2) have 'runAll'
7008         imply 'recurse'. 3) Make the default 'allTests' be ["twisted"]
7009         instead of ["twisted.test"], so that the end result is "trial -R
7010         twisted".
7012         * contrib/svn_buildbot.py: Add a --filter parameter that accepts a
7013         regular expression to match filenames that should be ignored when
7014         changed. Also add a --revision parameter that specifies the
7015         revision to examine, which is useful for debugging.
7017 2004-06-25  Brian Warner  <warner@lothar.com>
7019         * buildbot/process/step_twisted.py (trialTextSummarizer): create a
7020         summary of warnings (like DeprecationWarnings), next to the
7021         "summary" file
7023 2004-05-13  Brian Warner  <warner@lothar.com>
7025         * docs/examples/twisted_master.cfg: enable the win32 builder, as
7026         we now have a w32 build slave courtesy of Mike Taylor.
7028         * buildbot/process/base.py (Build.checkInterlocks): OMG this was
7029         so broken. Fixed a race condition that tripped up interlocked
7030         builds and caused the status to be stuck at "Interlocked" forever.
7031         The twisted buildbot's one interlocked build just so happened to
7032         never hit this case until recently (the feeding builds both pass
7033         before the interlocked build is attempted.. usually it has to wait
7034         a while).
7035         (Builder._pong_failed): fix method signature
7037         * setup.py: bump to 0.4.3+ while between releases
7039 2004-04-30  Brian Warner  <warner@lothar.com>
7041         * setup.py (version): Releasing buildbot-0.4.3
7043 2004-04-30  Brian Warner  <warner@lothar.com>
7045         * MANIFEST.in: add the doc fragments in  docs/*.xhtml
7047         * README: update for 0.4.3 release
7049         * NEWS: update for 0.4.3 release
7051         * buildbot/master.py (BuildMaster.__getstate__): make sure
7052         Versioned.__getstate__ is invoked, for upgrade from 0.4.2
7054         * buildbot/process/step_twisted.py (RunUnitTests.trial): add
7055         .trial as a class attribute, for upgrade from 0.4.2
7057         * buildbot/changes/changes.py (Change.links): add .links for
7058         upgrade from 0.4.2
7060         * buildbot/status/event.py (Logfile.__getstate__): get rid of both
7061         .textWatchers and .htmlWatchers at save time, since they are both
7062         volatile, should allow smooth 0.4.2 upgrade
7064         * buildbot/process/step.py (CVS.finishStatus): catch failed
7065         CVS/SVN commands so we can make the status box red
7067 2004-04-29  Brian Warner  <warner@lothar.com>
7069         * buildbot/changes/freshcvs.py
7070         (FreshCVSConnectionFactory.gotPerspective): add (commented-out)
7071         code to do setFilter(), which tells the freshcvs daemon to not
7072         send us stuff that we're not interested in. I will uncomment it
7073         when a new version of CVSToys is available in which setFilter()
7074         actually works, and I get a chance to test it better.
7076         * docs/examples/twisted_master.cfg: start using a PBChangeSource
7078         * buildbot/master.py (Dispatcher): use a registration scheme
7079         instead of hardwired service names
7080         (BuildMaster): keep track of the Dispatcher to support
7081         registration
7083         * buildbot/changes/changes.py (ChangeMaster): create a distinct
7084         PBChangeSource class instead of having it be an undocumented
7085         internal feature of the ChangeMaster. Split out the code into a
7086         new file.
7087         * buildbot/changes/pb.py (PBChangeSource): same
7088         * buildbot/test/test_changes.py: a few tests for PBChangeSource
7090         * docs/{factories|sources|steps}.xhtml: document some pieces
7092         * docs/examples/twisted_master.cfg: use SVN instead of CVS, stop
7093         using FCMaildirSource
7094         (f23osx): update OS-X builder to use python2.3, since the slave
7095         was updated to Panther (10.3.3)
7097 2004-03-21  Brian Warner  <warner@lothar.com>
7099         * buildbot/process/process_twisted.py: factor out doCheckout, change
7100         to use SVN instead of CVS
7102         * buildbot/process/base.py (BasicBuildFactory): refactor to make
7103         an SVN subclass easier
7104         (BasicSVN): subclass which uses Subversion instead of CVS
7106 2004-03-15  Christopher Armstrong  <radix@twistedmatrix.com>
7108         * buildbot/slavecommand.py (ShellCommand.start): use COMSPEC instead
7109         of /bin/sh on win32
7110         (CVSCommand.cvsComplete): don't assume chdir worked on win32
7112 2004-02-25  Brian Warner  <warner@lothar.com>
7114         * buildbot/slavecommand.py (ShellCommand): ['commands'] argument
7115         is now either a list (which is passed to spawnProcess directly) or
7116         a string (which gets passed to /bin/sh -c). This removes the useSH
7117         flag and the ArgslistCommand class. Also send status header at the
7118         start and end of each command, instead of having the master-side
7119         code do that.
7120         (CVSCommand): fix the doUpdate command, it failed to do the 'cp
7121         -r'. Update to use list-based arguments.
7122         (SVNFetch): use list-based arguments, use ['dir'] argument to
7123         simplify code.
7124         * buildbot/test/test_steps.py (Commands): match changes
7126         * buildbot/process/step.py (InternalShellCommand.words): handle
7127         command lists
7128         (SVN): inherit from CVS, cleanup
7130         * buildbot/status/event.py (Logfile.content): render in HTML, with
7131         stderr in red and headers (like the name of the command we're
7132         about to run) in blue. Add link to a second URL (url + "?text=1")
7133         to get just stdout/stderr in text/plain without markup. There is
7134         still a problem with .entries=None causing a crash, it seems to occur
7135         when the logfile is read before it is finished.
7137         * buildbot/bot.py (BotFactory.doKeepalive): add a 30-second
7138         timeout to the keepalives, and use it to explicitly do a
7139         loseConnection instead of waiting for TCP to notice the loss. This
7140         ought to clear up the silent-lossage problem.
7141         (unsafeTracebacks): pass exception tracebacks back to the master,
7142         makes it much easier to debug problems
7144 2004-02-23  Brian Warner  <warner@lothar.com>
7146         * buildbot/slavecommand.py (ShellCommand): add useSH flag to pass
7147         the whole command to /bin/sh instead of execve [Johan Dahlin]
7148         (CVSCommand): drop '-r BRANCH' if BRANCH==None instead of usiing
7149         '-r HEAD' [Johan Dahlin]
7150         (CVSCommand.start2): fix cvsdir calculation [Johan Dahlin]
7152         * buildbot/changes/changes.py (Change): add links= argument, add
7153         asHTML method [Johan Dahlin]. Modified to make a bit more
7154         XHTMLish. Still not sure how to best use links= .
7156         * buildbot/status/html.py (StatusResourceCommits.getChild): use 
7157         Change.asHTML to display the change, not asText
7159         * buildbot/status/html.py (StatusResourceBuilder): web button to
7160         ping slave
7162         * buildbot/test/test_run.py: test to actually start a buildmaster
7163         and poke at it
7165         * MANIFEST.in: bring back accidentally-dropped test helper files
7167         * buildbot/test/test_config.py (ConfigTest.testSources): skip tests
7168         that require cvstoys if it is not installed
7170         * buildbot/process/step_twisted.py (RunUnitTests): allow other
7171         values of "bin/trial" [Dave Peticolas]
7172         (RunUnitTests.finishStatus): say "no tests run" instead of "0
7173         tests passed" when we didn't happen to run any tests
7175         * buildbot/process/step.py (Compile): use haltOnFailure instead of
7176         flunkOnFailure [Johan Dahlin]
7178         * buildbot/process/base.py (ConfigurableBuild.setSteps): allow
7179         multiple instances of the same Step class by suffixing "_2", etc,
7180         to the name until it is unique. This name needs to be unique
7181         because it is used as a key in the dictionary that tracks build
7182         progress.
7183         * buildbot/test/test_steps.py (Steps.testMultipleStepInstances):
7184         add test for it
7186         * buildbot/process/base.py (Builder.ping): add "ping slave" command
7188 2004-01-14  Brian Warner  <warner@lothar.com>
7190         * buildbot/status/words.py (IrcStatusBot): when we leave or get
7191         kicked from a channel, log it
7193         * buildbot/master.py (Dispatcher): add "poke IRC" command to say
7194         something over whatever IRC channels the buildmaster is currently
7195         connected to. Added to try and track down a problem in which the
7196         master thinks it is still connected but the IRCd doesn't see it. I
7197         used a styles.Versioned this time, so hopefully users won't have
7198         to rebuild their .tap files this time.
7199         * contrib/debug.glade: add a "Poke IRC" button
7200         * contrib/debugclient.py: same
7202         * setup.py: bump to 0.4.2+ while between releases
7204 2004-01-08  Brian Warner  <warner@lothar.com>
7206         * setup.py (version): Releasing buildbot-0.4.2
7208 2004-01-08  Brian Warner  <warner@lothar.com>
7210         * NEWS: update for 0.4.2 release
7212         * README: document how to run the tests, now that they all pass
7214         * buildbot/changes/maildir.py (Maildir.poll): minor comment
7216         * buildbot/process/step.py (CVS): add a global_options= argument,
7217         which lets you set CVS global options for the command like "-r"
7218         for read-only checkout, or "-R" to avoid writing in the
7219         repository.
7220         * buildbot/slavecommand.py (CVSCommand): same
7222         * buildbot/status/event.py (Logfile): add a .doSwap switch to make
7223         testing easier (it is turned off when testing, to avoid the
7224         leftover timer)
7226         * buildbot/process/step.py (InternalBuildStep): shuffle code a bit
7227         to make it easier to test: break generateStepID() out to a
7228         separate function, only update statusbag if it exists.
7229         (ShellCommands): create useful text for dict-based commands too.
7231         * test/*, buildbot/test/*: move unit tests under the buildbot/
7232         directory
7233         * setup.py (packages): install buildbot.test too
7235         * buildbot/test/test_slavecommand.py: fix it, tests pass now
7236         * buildbot/test/test_steps.py: fix it, tests pass now
7238 2004-01-06  Brian Warner  <warner@lothar.com>
7240         * buildbot/changes/mail.py (parseFreshCVSMail): looks like new
7241         freshcvs mail uses a slightly different syntax for new
7242         directories. Update parser to handle either.
7243         * test/test_mailparse.py (Test1.testMsg9): test for same
7245 2003-12-21  Brian Warner  <warner@lothar.com>
7247         * buildbot/process/process_twisted.py (TwistedDebsBuildFactory): set
7248         'warnOnWarnings' so that lintian errors mark the build orange
7250 2003-12-17  Brian Warner  <warner@lothar.com>
7252         * buildbot/changes/mail.py (parseBonsaiMail): parser for commit
7253         messages emitted by Bonsai, contributed by Stephen Davis.
7255         * test/*: moved all tests to use trial instead of unittest. Some
7256         still fail (test_steps, test_slavecommand, and test_process).
7258         * setup.py (version): bump to 0.4.1+ while between releases
7260 2003-12-09  Brian Warner  <warner@lothar.com>
7262         * setup.py (version): Releasing buildbot-0.4.1
7264 2003-12-09  Brian Warner  <warner@lothar.com>
7266         * NEWS: update for 0.4.1 release
7268         * docs/examples/twisted_master.cfg: add netbsd builder, shuffle
7269         freebsd builder code a little bit
7271         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred.__cmp__):
7272         don't try to compare attributes of different classes
7273         * buildbot/changes/mail.py (MaildirSource.__cmp__): same
7274         (MaildirSource.messageReceived): fix Change delivery
7276         * buildbot/master.py (BuildMaster.loadConfig): insert 'basedir'
7277         into the config file's namespace before loading it, like the
7278         documentation claims it does
7279         * docs/examples/twisted_master.cfg: remove explicit 'basedir'
7280         (useFreshCVS): switch to using a maildir until Twisted's freshcvs
7281         daemon comes back online
7283 2003-12-08  Brian Warner  <warner@lothar.com>
7285         * docs/examples/twisted_master.cfg: provide an explicit 'basedir'
7286         so the example will work with online=0 as well
7288         * buildbot/changes/mail.py (FCMaildirSource, SyncmailMaildirSource):
7289         fix the __implements__ line
7291         * buildbot/changes/maildirtwisted.py (MaildirTwisted): make this
7292         class a twisted.application.service.Service, use startService to
7293         get it moving.
7295         * buildbot/changes/dnotify.py (DNotify): use os.open to get the
7296         directory fd instead of simple open(). I'm sure this used to work,
7297         but the current version of python refuses to open directories with
7298         open().
7300 2003-12-05  Brian Warner  <warner@lothar.com>
7302         * setup.py (version): bump to 0.4.0+ while between releases
7304 2003-12-05  Brian Warner  <warner@lothar.com>
7306         * setup.py (version): Releasing buildbot-0.4.0
7308 2003-12-05  Brian Warner  <warner@lothar.com>
7310         * docs/examples/glib_master.cfg: replace old sample scripts with
7311         new-style config files
7312         * MANIFEST.in: include .cfg files in distribution tarball
7314         * buildbot/changes/freshcvs.py (FreshCVSListener.remote_goodbye):
7315         implement a dummy method to avoid the exception that occurs when
7316         freshcvs sends this to us.
7318         * buildbot/pbutil.py (ReconnectingPBClientFactory.stopFactory):
7319         removed the method, as it broke reconnection. Apparently
7320         stopFactory is called each time the connection attempt fails. Must
7321         rethink this.
7322         (ReconnectingPBClientFactory.__getstate__): squash the _callID
7323         attribute before serialization, since without stopFactory the
7324         reconnect timer may still be active and they aren't serializable.
7326         * test/test_mailparse.py (ParseTest): test with 'self' argument
7328         * buildbot/changes/mail.py (parseFreshCVSMail): add (silly) 'self'
7329         argument, as these "functions" are invoked like methods from class
7330         attributes and therefore always get an instance as the first
7331         argument.
7333         * buildbot/changes/maildir.py (Maildir.start): fix error in error
7334         message: thanks to Stephen Davis for the catch
7336 2003-12-04  Brian Warner  <warner@lothar.com>
7338         * buildbot/pbutil.py: complete rewrite using PBClientFactory and
7339         twisted's standard ReconnectingClientFactory. Handles both oldcred
7340         and newcred connections. Also has a bug-workaround for
7341         ReconnectingClientFactory serializing its connector when it
7342         shouldn't.
7344         * buildbot/bot.py (BotFactory): rewrite connection layer with new
7345         pbutil. Replace makeApp stuff with proper newcred/mktap
7346         makeService(). Don't serialize Ephemerals on shutdown.
7348         * buildbot/changes/changes.py (ChangeMaster): make it a
7349         MultiService and add the sources as children, to get startService
7350         and stopService for free. This also gets rid of the .running flag.
7352         * buildbot/changes/freshcvs.py (FreshCVSSource): rewrite to use
7353         new pbutil, turn into a TCPClient at the same time (to get
7354         startService for free). Two variants exist: FreshCVSSourceOldcred
7355         and FreshCVSSourceNewcred (CVSToys doesn't actualy support newcred
7356         yet, but when it does, we'll be ready).
7357         (FreshCVSSource.notify): handle paths which are empty after the
7358         prefix is stripped. This only happens when the top-level (prefix)
7359         directory is added, at the very beginning of a Repository's life.
7361         * buildbot/clients/base.py: use new pbutil, clean up startup code.
7362         Now the only reconnecting code is in the factory where it belongs.
7363         (Builder.unsubscribe): unregister the disconnect callback when we
7364         delete the builder on command from the master (i.e. when the
7365         buildmaster is reconfigured and that builder goes away). This
7366         fixes a multiple-delete exception when the status client is shut
7367         down afterwards.
7368         * buildbot/clients/gtkPanes.py (GtkClient): cleanup, match the
7369         base Client. 
7371         * buildbot/status/words.py (IrcStatusBot): add some more sillyness
7372         (IrcStatusBot.getBuilderStatus): fix minor exception in error message
7374 2003-10-20  Christopher Armstrong  <radix@twistedmatrix.com>
7376         * contrib/run_maxq.py: Accept a testdir as an argument rather than
7377         a list of globs (ugh). The testdir will be searched for files
7378         named *.tests and run the tests in the order specified in each of
7379         those files. This allows for "dependancies" between tests to be
7380         codified.
7382         * buildbot/process/maxq.py (MaxQ.__init__): Accept a testdir
7383         argument to pass to run_maxq.py, instead of a glob.
7385 2003-10-17  Brian Warner  <warner@lothar.com>
7387         * buildbot/process/step_twisted.py (HLint.start): ignore .xhtml
7388         files that live in the sandbox
7390 2003-10-15  Brian Warner  <warner@lothar.com>
7392         * buildbot/process/step_twisted.py (ProcessDocs.finished): fix
7393         spelling error in "docs" count-warnings output
7394         (HLint.start): stupid thinko meant .xhtml files were ignored
7396         * docs/examples/twisted_master.cfg (reactors): disable cReactor
7397         tests now that cReactor is banished to the sandbox
7399 2003-10-10  Brian Warner  <warner@lothar.com>
7401         * buildbot/process/step_twisted.py (ProcessDocs, HLint): new Twisted
7402         scheme: now .xhtml are sources and .html are generated
7404 2003-10-08  Brian Warner  <warner@lothar.com>
7406         * buildbot/process/step_twisted.py (RunUnitTests.__init__): oops,
7407         we were ignoring the 'randomly' parameter.
7409 2003-10-01  Brian Warner  <warner@lothar.com>
7411         * buildbot/slavecommand.py (ShellCommand.start): set usePTY=1 on
7412         posix, to kill sub-children of aborted slavecommands.
7414         * buildbot/status/builder.py: rename Builder to BuilderStatus.
7415         Clean up initialization: lastBuildStatus remains None until the
7416         first build has been completed.
7418         * buildbot/status/html.py (WaterfallStatusResource.body): handle
7419         None as a lastBuildStatus
7420         * buildbot/clients/gtkPanes.py: same
7422         * buildbot/status/client.py (StatusClientService): keep
7423         BuilderStatus objects in self.statusbags . These objects now live
7424         here in the StatusClientService and are referenced by the Builder
7425         object, rather than the other way around.
7426         * buildbot/status/words.py (IrcStatusBot.getBuilderStatus): same
7427         * buildbot/process/base.py (Builder): same
7428         * test/test_config.py (ConfigTest.testBuilders): same
7430         * buildbot/master.py (BuildMaster.loadConfig_Builders): when modifying
7431         an existing builder, leave the statusbag alone. This will preserve the
7432         event history.
7434         * buildbot/pbutil.py (ReconnectingPB.connect): add initial newcred
7435         hook. This will probably go away in favor of a class in upcoming
7436         Twisted versions.
7438         * buildbot/changes/freshcvs.py (FreshCVSSource.start): Remove old
7439         serviceName from newcred FreshCVSNotifiee setup
7441 2003-09-29  Brian Warner  <warner@lothar.com>
7443         * buildbot/process/process_twisted.py: switch to new reactor
7444         abbreviations
7445         * docs/examples/twisted_master.cfg: same
7447         * README (REQUIREMENTS): mention twisted-1.0.8a3 requirement
7449         * buildbot/status/words.py (IrcStatusBot.getBuilder): use the
7450         botmaster reference instead of the oldapp service lookup
7452         * buildbot/master.py (BuildMaster.__init__): give the
7453         StatusClientService a reference to the botmaster to make it easier to
7454         force builds
7456 2003-09-24  Christopher Armstrong  <radix@twistedmatrix.com>
7458         * buildbot/status/html.py (Box.td): escape hreffy things so you
7459         can have spaces in things like builder names
7460         (StatusResourceBuilder.body)
7461         (WaterfallStatusResource.body)
7462         (WaterfallStatusResource.body0): same
7464 2003-09-25  Brian Warner  <warner@lothar.com>
7466         * buildbot/master.py (BuildMaster.loadConfig_Builders): don't
7467         rearrange the builder list when adding or removing builders: keep
7468         them in the order the user requested.
7469         * test/test_config.py (ConfigTest.testBuilders): verify it
7471         * contrib/debug.glade: give the debug window a name
7473         * buildbot/process/base.py (Builder.buildTimerFired): builders can
7474         now wait on multiple interlocks. Fix code relating to that.
7475         (Builder.checkInterlocks): same
7476         * buildbot/status/builder.py (Builder.currentlyInterlocked): same
7478         * buildbot/master.py (BuildMaster.loadConfig): move from
7479         deprecated pb.BrokerFactory to new pb.PBServerFactory
7480         * test/test_config.py (ConfigTest.testWebPathname): same
7482         * docs/examples/twisted_master.cfg: fix interlock declaration
7484         * buildbot/master.py (BotMaster.addInterlock): move code to attach
7485         Interlocks to their Builders into interlock.py .
7486         (BuildMaster.loadConfig_Interlocks): fix interlock handling
7488         * test/test_config.py (ConfigTest.testInterlocks): validate
7489         interlock handling
7491         * buildbot/process/base.py (Builder.__init__): better comments
7492         * buildbot/process/interlock.py (Interlock.__repr__): same
7493         (Interlock.deactivate): add .active flag, move the code that
7494         attaches/detaches builders into the Interlock
7496 2003-09-24  Christopher Armstrong  <radix@twistedmatrix.com>
7498         * buildbot/process/maxq.py (MaxQ): support for running a set of MaxQ
7499         tests using the new run_maxq.py script, and reporting failures by
7500         parsing its output.
7502         * contrib/run_maxq.py: Hacky little script for running a set of maxq
7503         tests, reporting their success or failure in a buildbot-friendly 
7504         manner.
7506 2003-09-24  Brian Warner  <warner@lothar.com>
7508         * docs/examples/twisted_master.cfg: example of a new-style config
7509         file. This lives in the buildmaster base directory as
7510         "master.cfg".
7512         * contrib/debugclient.py (DebugWidget.do_rebuild): add 'reload'
7513         button to make the master re-read its config file
7515         * buildbot/master.py (BuildMaster.loadConfig): new code to load
7516         buildmaster configuration from a file. This file can be re-read
7517         later, and the buildmaster will update itself to match the new
7518         desired configuration. Also use new Twisted Application class.
7519         * test/Makefile, test/test_config.py: unit tests for same
7521         * buildbot/changes/freshcvs.py (FreshCVSSource.__cmp__): make
7522         FreshCVSSources comparable, to support reload.
7523         * buildbot/changes/mail.py (MaildirSource.__cmp__): same
7525         * buildbot/process/base.py (Builder): make them comparable, make
7526         Interlocks easier to attach, to support reload. Handle
7527         re-attachment of remote slaves.
7528         * buildbot/process/interlock.py (Interlock): same
7530         * buildbot/bot.py, bb_tap.py, changes/changes.py: move to
7531         Twisted's new Application class. Requires Twisted >= 1.0.8 .
7532         buildmaster taps are now constructed with mktap.
7533         * buildbot/status/client.py (StatusClientService): same
7535         * buildbot/status/words.py: move to new Services, add support to
7536         connect to multiple networks, add reload support, allow nickname
7537         to be configured on a per-network basis
7539 2003-09-20  Brian Warner  <warner@lothar.com>
7541         * docs/examples/twisted_master.py (twisted_app): use python2.3 for
7542         the freebsd builder, now that the machine has been upgraded and no
7543         longer has python2.2
7545         * setup.py (version): bump to 0.3.5+ while between releases
7547 2003-09-19  Brian Warner  <warner@lothar.com>
7549         * setup.py (version): Releasing buildbot-0.3.5
7551 2003-09-19  Brian Warner  <warner@lothar.com>
7553         * NEWS: add post-0.3.4 notes
7555         * README (REQUIREMENTS): note twisted-1.0.7 requirement
7557         * MANIFEST.in: add contrib/*
7559         * docs/examples/twisted_master.py (twisted_app): all build slaves must
7560         use a remote root now: cvs.twistedmatrix.com
7562         * buildbot/changes/freshcvs.py (FreshCVSNotifiee.connect): update
7563         to newcred
7564         (FreshCVSNotifieeOldcred): but retain a class that uses oldcred for
7565         compatibility with old servers
7566         (FreshCVSSource.start): and provide a way to use it
7567         (FreshCVSNotifiee.disconnect): handle unconnected notifiee
7569         * docs/examples/twisted_master.py (twisted_app): update to new
7570         makeApp interface.
7571         (twisted_app): listen on new ~buildbot socket
7572         (twisted_app): Twisted CVS has moved to cvs.twistedmatrix.com
7574         * buildbot/process/process_twisted.py: Use 'copydir' on CVS steps
7575         to reduce cvs bandwidth (update instead of full checkout)
7577 2003-09-11  Brian Warner  <warner@lothar.com>
7579         * contrib/fakechange.py: demo how to connect to the changemaster
7580         port. You can use this technique to submit changes to the
7581         buildmaster from source control systems that offer a hook to run a
7582         script when changes are committed.
7584         * contrib/debugclient.py: tool to connect to the debug port. You
7585         can use it to force builds, submit fake changes, and wiggle the
7586         builder state
7588         * buildbot/master.py: the Big NewCred Reorganization. Use a single
7589         'Dispatcher' realm to handle all the different kinds of
7590         connections and Perspectives: buildslaves, the changemaster port,
7591         the debug port, and the status client port. NewCredPerspectives
7592         now have .attached/.detached methods called with the remote 'mind'
7593         reference, much like old perspectives did. All the pb.Services
7594         turned into ordinary app.ApplicationServices .
7595         (DebugService): went away, DebugPerspectives are now created
7596         directly by the Dispatcher.
7597         (makeApp): changed interface a little bit
7599         * buildbot/changes/changes.py: newcred
7600         * buildbot/status/client.py: newcred
7602         * buildbot/clients/base.py: newcred client side changes
7603         * buildbot/bot.py: ditto
7605         * docs/examples/glib_master.py: handle new makeApp() interface
7606         * docs/examples/twisted_master.py: ditto
7608         * buildbot/pbutil.py (NewCredPerspective): add a helper class to
7609         base newcred Perspectives on. This should go away once Twisted
7610         itself provides something sensible.
7613 2003-09-11  Christopher Armstrong  <radix@twistedmatrix.com>
7615         * contrib/svn_buildbot.py: A program that you can call from your
7616         SVNREPO/hooks/post-commit file that will notify a BuildBot master
7617         when a change in an SVN repository has happened. See the top of
7618         the file for some minimal usage info.
7620 2003-09-10  Christopher Armstrong  <radix@twistedmatrix.com>
7622         * buildbot/slavecommand.py (ArglistCommand): Add new
7623         ArglistCommand that takes an argument list rather than a string as
7624         a parameter. Using a st.split() for argv is very bad.
7626         * buildbot/slavecommand.py (SVNFetch): Now has the ability to
7627         update to a particular revision rather than always checking out
7628         (still not very smart about it, there may be cases where the
7629         checkout becomes inconsistent).
7631 2003-09-10  Christopher Armstrong  <radix@twistedmatrix.com>
7633         * buildbot/{bot.py,slavecommand.py,process/step.py}: Rudimentary
7634         SVN fetch support. It can checkout (not update!) a specified
7635         revision from a specified repository to a specified directory.
7637         * buildbot/status/progress.py (Expectations.update): Fix an
7638         obvious bug (apparently created by the change described in the
7639         previous ChangeLog message) by moving a check to *after* the
7640         variable it checks is defined.
7643 2003-09-08  Brian Warner  <warner@lothar.com>
7645         * buildbot/status/progress.py (Expectations.update): hack to catch
7646         an exception TTimo sees: sometimes the update() method seems to
7647         get called before the step has actually finished, so the .stopTime
7648         is not set, so no totalTime() is available and we average None
7649         with the previous value. Catch this and just don't update the
7650         metrics, and emit a log message.
7652 2003-08-24  Brian Warner  <warner@lothar.com>
7654         * buildbot/process/base.py (BasicBuildFactory): accept 'cvsCopy'
7655         parameter to set copydir='original' in CVS commands.
7657         * buildbot/process/step.py (CVS): accept 'copydir' parameter.
7659         * buildbot/slavecommand.py (CVSCommand): add 'copydir' parameter,
7660         which tells the command to maintain a separate original-source CVS
7661         workspace. For each build, this workspace will be updated, then
7662         the tree copied into a new workdir. This reduces CVS bandwidth
7663         (from a full checkout to a mere update) while doubling the local
7664         disk usage (to keep two copies of the tree).
7666 2003-08-21  Brian Warner  <warner@lothar.com>
7668         * buildbot/status/event.py (Logfile.addEntry): if the master web
7669         server dies while we're serving a page, request.write raises
7670         pb.DeadReferenceError . Catch this and treat it like a
7671         notifyFinish event by dropping the request.
7673 2003-08-18  Brian Warner  <warner@lothar.com>
7675         * buildbot/status/words.py (IrcStatusBot.command_FORCE): complain
7676         (instead of blowing up) if a force-build command is given without
7677         a reason field
7679         * buildbot/changes/changes.py (ChangeMaster.getChangeNumbered):
7680         don't blow up if there aren't yet any Changes in the list
7682 2003-08-02  Brian Warner  <warner@lothar.com>
7684         * buildbot/bot.py (updateApplication): don't set the .tap name,
7685         since we shouldn't assume we own the whole .tap file
7687         * buildbot/bb_tap.py (updateApplication): clean up code, detect
7688         'mktap buildbot' (without a subcommand) better
7690 2003-07-29  Brian Warner  <warner@lothar.com>
7692         * buildbot/status/words.py
7693         (IrcStatusFactory.clientConnectionLost): when we lose the
7694         connection to the IRC server, schedule a reconnection attempt.
7696         * buildbot/slavecommand.py (CVSCommand.doClobber): on non-posix,
7697         use shutil.rmtree instead of forking off an "rm -rf" command.
7698         rmtree may take a while and will block until it finishes, so we
7699         use "rm -rf" if available.
7701         * docs/examples/twisted_master.py: turn off kqreactor, it hangs
7702         freebsd buildslave badly
7704         * setup.py (version): bump to 0.3.4+ while between releases
7706 2003-07-28  Brian Warner  <warner@lothar.com>
7708         * setup.py (version): Releasing buildbot-0.3.4
7710 2003-07-28  Brian Warner  <warner@lothar.com>
7712         * NEWS: update in preparation for release
7714         * buildbot/slavecommand.py (ShellCommand.doTimeout): use
7715         process.signalProcess instead of os.kill, to improve w32
7716         portability
7718         * docs/examples/twisted_master.py (twisted_app): turn off
7719         win32eventreactor: the tests hang the buildslave badly
7721         * buildbot/process/base.py (Build.buildFinished): update ETA even on
7722         failed builds, since usually the failures are consistent
7724         * buildbot/process/process_twisted.py (TwistedReactorsBuildFactory):
7725         add compileOpts/compileOpts2 to reactors build
7727         * docs/examples/twisted_master.py (twisted_app): add "-c mingw32"
7728         (twisted_app): use both default and win32eventreactor on w32 build.
7729         Use both default and kqreactor on freebsd build.
7731         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
7732         add compileOpts2, which is put after the build_ext argument. w32
7733         needs "-c mingw32" here.
7735         * buildbot/status/html.py (StatusResourceBuilder.getChild): don't
7736         touch .acqpath, it goes away in recent Twisted releases
7738         * docs/examples/twisted_master.py (twisted_app): use "python" for
7739         the w32 buildslave, not "python2.2"
7741         * buildbot/bot.py (Bot.remote_getSlaveInfo): only look in info/ if
7742         the directory exists.. should hush an exception under w32
7744         * buildbot/slavecommand.py (ShellCommandPP.processEnded): use
7745         ProcessTerminated -provided values for signal and exitCode rather
7746         than parsing the unix status code directly. This should remove one
7747         more roadblock for a w32-hosted buildslave.
7749         * test/test_mailparse.py: add test cases for Syncmail parser
7751         * Buildbot/changes/freshcvsmail.py: remove leftover code, leave a
7752         temporary compatibility import. Note! Start importing
7753         FCMaildirSource from changes.mail instead of changes.freshcvsmail
7755         * buildbot/changes/mail.py (parseSyncmail): finish Syncmail parser
7757 2003-07-27  Brian Warner  <warner@lothar.com>
7759         * NEWS: started adding new features
7761         * buildbot/changes/mail.py: start work on Syncmail parser, move
7762         mail sources into their own file
7764         * buildbot/changes/freshcvs.py (FreshCVSNotifiee): mark the class
7765         as implementing IChangeSource
7766         * buildbot/changes/freshcvsmail.py (FCMaildirSource): ditto
7768         * buildbot/interfaces.py: define the IChangeSource interface
7770 2003-07-26  Brian Warner  <warner@lothar.com>
7772         * buildbot/master.py (makeApp): docstring (thanks to Kevin Turner)
7774 2003-06-25  Brian Warner  <warner@lothar.com>
7776         * buildbot/status/words.py (IrcStatusBot.emit_last): round off
7777         seconds display
7779 2003-06-17  Brian Warner  <warner@lothar.com>
7781         * buildbot/status/words.py: clean up method usage to avoid error
7782         in silly IRC command
7783         (IrcStatusBot.emit_status): round off seconds display
7785         * buildbot/process/base.py (Build): delete the timer when saving
7786         to the .tap file, and restore it (if it should still be running)
7787         upon restore. This should fix the "next build in -34 seconds"
7788         messages that result when the master is restarted while builds are
7789         sitting in the .waiting slot. If the time for the build has
7790         already passed, start it very soon (in 1 second).
7792         * buildbot/status/words.py: more silly commands
7794         * README (REQUIREMENTS): add URLs to all required software
7796         * buildbot/status/words.py ('last'): mention results of, and time
7797         since last build
7799 2003-05-28  Brian Warner  <warner@lothar.com>
7801         * buildbot/status/words.py: add 'last' command
7802         (IrcStatusBot.emit_status): add current-small text to 'status' output
7804         * docs/examples/twisted_master.py (twisted_app): turn on IRC bot
7805         (twisted_app): remove spaces from OS-X builder name
7807         * buildbot/master.py (makeApp): add knob to turn on IRC bot
7808         * buildbot/status/words.py: IRC bot should actually be useful now
7810 2003-05-23  Brian Warner  <warner@lothar.com>
7812         * buildbot/bot.py (Bot.remote_getSlaveInfo): add routines to get
7813         "slave information" from $(slavedir)/info/* . These files are
7814         maintained by the slave administrator, and describe the
7815         machine/environment that is hosting the slave. Information from
7816         them is put into the "Builder" HTML page. Still need to establish
7817         a set of well-known filenames and meanings for this data: at the
7818         moment, *all* info/* files are sent to the master, but only
7819         'admin' and 'host' are used on that end.
7820         * buildbot/status/html.py (StatusResourceBuilder.body): ditto
7821         * buildbot/process/base.py (Builder.setRemoteInfo):  ditto
7822         * buildbot/master.py (BotPerspective.got_info):  ditto
7824 2003-05-22  Brian Warner  <warner@lothar.com>
7826         * setup.py (version): bump version to 0.3.3+ while between releases
7828 2003-05-21  Brian Warner  <warner@lothar.com>
7830         * setup.py: Releasing buildbot-0.3.3
7832 2003-05-21  Brian Warner  <warner@lothar.com>
7834         * NEWS: 0.3.3 news items
7836         * README: describe --keepalive and life behind a NAT box
7838         * buildbot/bot.py (Bot.connected): implement application-level
7839         keepalives to deal with NAT timeouts, turn them on with
7840         --keepalive option or when SO_KEEPALIVE doesn't work.
7842         * buildbot/master.py (BotPerspective): accept keepalives silently
7844         * buildbot/process/base.py (Build.buildException): CopiedFailures
7845         don't carry as much information as local ones, so don't try to
7846         create a big HTMLized version of them.
7848         * buildbot/process/step.py (InternalShellCommand.stepFailed): close
7849         log file when step fails due to an exception, such as when the slave
7850         becomes unreachable
7852         * buildbot/process/step_twisted.py (RunUnitTests): use trial's new
7853         --testmodule argument instead of grepping for test-case-name tags
7854         ourselves. Remove FindUnitTests code.
7855         * buildbot/slavecommand.py, buildbot/bot.py: remove old code
7857         * MANIFEST.in: Add docs/examples, files under test/ . Oops!
7859 2003-05-16  Brian Warner  <warner@lothar.com>
7861         * buildbot/process/base.py (BasicBuildFactory): add 'configureEnv'
7862         argument to allow things like CFLAGS=-O0 to be passed without relying
7863         upon /bin/sh processing on the slave.
7865         * buildbot/process/step.py (InternalShellCommand.start): send
7866         'env' dict to slave
7867         * buildbot/slavecommand.py (ShellCommand.start): create argv with
7868         'split' instead of letting /bin/sh do it. This should also remove
7869         the need for /bin/sh on the buildslave, making it more likely to
7870         work with win32.
7872         * buildbot/status/html.py: html-escape text in blamelist.
7873         Add "force build" button to the Builder page.
7875         * buildbot/process/step_twisted.py (countFailedTests): look at
7876         last 1000 characters for status line, as import errors can put it
7877         before the -200 point.
7879 2003-05-15  Brian Warner  <warner@lothar.com>
7881         * docs/examples/twisted_master.py: use clobber=0 for remote builds
7883         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
7884         make 'clobber' a parameter, so it is possible to have builds which
7885         do full tests but do a cvs update instead of hammering the CVS
7886         server with a full checkout each build
7888         * buildbot/process/step.py (InternalShellCommand): bump default
7889         timeout to 20 minutes
7891         * buildbot/bot.py (Bot.debug_forceBuild): utility method to ask
7892         the master to trigger a build. Run it via manhole.
7894         * buildbot/master.py (BotPerspective.perspective_forceBuild):
7895         allow slaves to trigger any build that they host, to make life
7896         easier for slave admins who are testing out new build processes
7898         * buildbot/process/process_twisted.py (TwistedReactorsBuildFactory):
7899         don't flunk cReactor or qtreactor on failure, since they fail alot
7900         these days. Do warnOnFailure instead.
7902         * buildbot/process/base.py: change Builder.buildable from a list
7903         into a single slot. When we don't have a slave, new builds (once
7904         they make it past the timeout) are now merged into an existing
7905         buildable one instead of being queued. With this change, a slave
7906         which has been away for a while doesn't get pounded with all the
7907         builds it missed, but instead just does a single build.
7909 2003-05-07  Brian Warner  <warner@lothar.com>
7911         * setup.py (version): bump version to 0.3.2+ while between releases
7913 2003-05-07  Brian Warner  <warner@lothar.com>
7915         * setup.py: Releasing buildbot-0.3.2
7917 2003-05-07  Brian Warner  <warner@lothar.com>
7919         * setup.py: fix major packaging error: include subdirectories!
7920         
7921         * NEWS: add changes since last release
7923         * README (REQUIREMENTS): update twisted/python dependencies
7925         * buildbot/status/builder.py (Builder.startBuild): change
7926         BuildProcess API: now they should call startBuild/finishBuild
7927         instead of pushing firstEvent / setLastBuildStatus. Moving towards
7928         keeping a list of builds in the statusbag, to support other kinds of
7929         status delivery.
7930         (Builder.addClient): send current-activity-small to new clients
7931         * buildbot/process/base.py (Build.startBuild, .buildFinished): use
7932         new API
7934         * buildbot/status/client.py: drop RemoteReferences at shutdown
7936         * buildbot/status/event.py (Event.stoppedObserving): oops, add it
7938         * buildbot/status/progress.py (BuildProgress.remote_subscribe):
7939         more debug messages for remote status client
7941         * buildbot/process/step.py (InternalBuildStep.stepComplete)
7942         (.stepFailed): only fire the Deferred once, even if both
7943         stepComplete and stepFailed are called. I think this can happen if
7944         an exception occurs at a weird time.
7946         * buildbot/status/words.py: work-in-progress: IRC status delivery
7948 2003-05-05  Brian Warner  <warner@lothar.com>
7950         * docs/examples/twisted_master.py (twisted_app): hush internal
7951         python2.3 distutils deprecation warnings
7952         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
7953         add compileOpts= argument which inserts extra args before the
7954         "setup.py build_ext" command. This can be used to give -Wignore
7955         warnings, to hush some internal python-2.3 deprecation messages.
7957         * buildbot/process/step_twisted.py (RunUnitTests): parameterize
7958         the ['twisted.test'] default test case to make it easier to change
7959         in subclasses
7961         * buildbot/clients/base.py: switch to pb.Cacheable-style Events
7962         * buildbot/clients/gtkPanes.py: ditto
7964         * buildbot/process/step_twisted.py (RunUnitTests): use randomly=
7965         arg to collapse RunUnitTestsRandomly into RunUnitTests
7966         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
7967         use RunUnitTests(randomly=1) instead of RunUnitTestsRandomly
7969         * buildbot/status/html.py (StatusResource): shuffle Resources
7970         around to fix a bug: both 'http://foo:8080' and 'http://foo:8080/'
7971         would serve the waterfall display, but the internal links were
7972         only valid on the trailing-slash version. The correct behavior is
7973         for the non-slashed one to serve a Redirect to the slashed one.
7974         This only shows up when the buildbot page is hanging off another
7975         server, like a Twisted-Web distributed server.
7977         * buildbot/status/event.py (Event, RemoteEvent): make Events
7978         pb.Cacheable, with RemoteEvent as the cached version. This removes
7979         a lot of explicit send-an-update code.
7980         * buildbot/status/builder.py (Builder): remove send-update code
7981         * buildbot/status/client.py (ClientBuilder): remove send-update
7982         code, and log errors that occur during callRemote (mostly to catch
7983         InsecureJelly exceptions)
7985         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
7986         run Lore with the same python used in the rest of the build
7988         * buildbot/process/step_twisted2.py (RunUnitTestsJelly): moved
7990         * buildbot/process/step_twisted.py (HLint): accept 'python'
7991         argument. Catch rc!=0 and mark the step as failed. This marks the
7992         build orange ("has warnings").
7993         (RunUnitTestsJelly): move out to step_twisted2.py
7995         * buildbot/util.py (ignoreStaleRefs): add utility function
7997         * buildbot/master.py (DebugPerspective.perspective_setCurrentState):
7998         don't fake ETA object, it's too hard to get right
8000 2003-05-02  Brian Warner  <warner@lothar.com>
8002         * docs/examples/twisted_master.py (twisted_app): add FreeBSD builder
8004 2003-05-01  Brian Warner  <warner@lothar.com>
8006         * buildbot/status/html.py (StatusResource.body): oops, I was
8007         missing a <tr>, causing the waterfall page to be misrendered in
8008         everything except Galeon.
8010 2003-04-29  Brian Warner  <warner@lothar.com>
8012         * docs/examples/twisted_master.py: make debuild use python-2.2
8013         explicitly, now that Twisted stopped supporting 2.1
8015         * buildbot/process/step_twisted.py (BuildDebs.finishStatus): oops,
8016         handle tuple results too. I keep forgetting this, which suggests
8017         it needs to be rethought.
8019         * setup.py (setup): bump version to 0.3.1+ while between releases
8020         
8021 2003-04-29  Brian Warner  <warner@lothar.com>
8023         * setup.py: Releasing buildbot-0.3.1
8025 2003-04-29  Brian Warner  <warner@lothar.com>
8027         * README (SUPPORT): add plea to send questions to the mailing list
8029         * NEWS, MANIFEST.in: add description of recent changes
8031         * docs/examples/twisted_master.py: add the code used to create the
8032         Twisted buildmaster, with passwords and such removed out to a
8033         separate file.
8035         * buildbot/changes/changes.py, freshcvs.py, freshcvsmail.py: split
8036         out cvstoys-using bits from generic changes.py, to allow non-cvstoys
8037         buildmasters to not require CVSToys be installed.
8038         * README, docs/examples/glib_master: update to match the change
8040         * buildbot/clients/base.py, buildbot/bot.py,
8041         buildbot/changes/changes.py, buildbot/pbutil.py: copy
8042         ReconnectingPB from CVSToys distribution to remove CVSToys
8043         dependency for build slaves and status clients. Buildmasters which
8044         use FreshCVSSources still require cvstoys be installed, of course.
8046 2003-04-25  Brian Warner  <warner@lothar.com>
8048         * buildbot/process/process_twisted.py (FullTwistedBuildFactory): add
8049         runTestsRandomly arg to turn on trial -z
8051         * buildbot/process/step_twisted.py (TwistedJellyTestResults):
8052         experimental code to use trial's machine-parseable output to get
8053         more detailed test results. Still has some major issues.
8054         (RunUnitTestsRandomly): subclass to add "-z 0" option, runs tests
8055         in random sequence
8057         * buildbot/status/builder.py (Builder.setCurrentBuild):
8058         anticipating moving build history into statusbag, not used yet
8060         * buildbot/status/tests.py: code to centralize test results,
8061         doesn't work quite yet
8063         * buildbot/status/event.py (Event): use hasattr("setName") instead
8064         of isinstance for now.. need better long-term solution
8066         * buildbot/status/html.py: Remove old imports
8068 2003-04-24  Brian Warner  <warner@lothar.com>
8070         * buildbot/process/process_twisted.py (TwistedBuild.isFileImportant):
8071         ignore changes under doc/fun/ and sandbox/
8073         * buildbot/process/step_twisted.py: update pushEvent and friends.
8075         * buildbot/status/html.py (Box.td): replace event.buildername with
8076         event.parent.getSwappableName(). Needs more thought.
8078         * buildbot/status/builder.py (Builder): Replace pushEvent and
8079         getLastEvent with {set|update|addFileTo|finish}CurrentActivity.
8080         Tell events they are being pruned with event.delete().
8082         * buildbot/process/base.py (Build): Remove Builder status-handling
8083         methods. s/pushEvent/setCurrentActivity/.
8085         * buildbot/process/step.py (BuildStep): clean up status delivery.
8086         Gouse builder.statusbag methods instead of intermediate builder
8087         methods. s/updateLastEvent/updateCurrentActivity/.
8088         s/finalizeLastEvent/finishCurrentActivity/. Use
8089         addFileToCurrentActivity for summaryFunction.
8091         * buildbot/status/event.py (Logfile): put data in a Swappable when
8092         .finish is called.
8093         (Event): add more setter methods. Remove .buildername, use .parent
8094         and getSwappableName instead (needs more thought).
8096         * buildbot/util.py (Swappable):
8097         * test/test_swap.py: don't bother setting filename at __init__
8098         time, do it later. Change setFilename args to take parent first,
8099         since it provides the most significant part of the filename.
8101 2003-04-23  Brian Warner  <warner@lothar.com>
8103         * buildbot/status/event.py (Logfile.addEntry): append to previous
8104         entry, if possible
8106         * buildbot/process/step.py (BuildStep.finalizeLastEvent):
8107         anticipating Swappable
8108         (InternalShellCommand.remoteUpdate): split out various log-adding
8109         methods so subclasses can snarf stdout separately
8111         * buildbot/process/base.py (Builder.finalizeLastEvent): more code
8112         in anticipation of Swappable build logs
8113         (Builder.testsFinished): anticipating TestResults, still disabled
8115         * buildbot/status/builder.py (Builder.pruneEvents): only keep the
8116         last 100 events
8118         * buildbot/status/event.py (Logfile): add (disabled) support for
8119         Swappable, not ready for use yet
8121         * buildbot/util.py (Swappable): object which is swapped out to
8122         disk after some period of no use.
8123         * test/test_swap.py: test buildbot.utils.Swappable
8125 2003-04-14  Brian Warner  <warner@lothar.com>
8127         * buildbot/process/base.py (Builder.doPeriodicBuild): add simple
8128         periodic-build timer. Set the .periodicBuildTime on a builder
8129         instance to some number of seconds to activate it.
8131         * buildbot/master.py (BotMaster.forceBuild): change forceBuild API
8133         * buildbot/process/step.py (ShellCommand.finishStatus): use log.msg in
8134         a way that survives result tuples
8136 2003-04-12  Brian Warner  <warner@lothar.com>
8138         * buildbot/process/step.py (ShellCommand.finishStatusSummary):
8139         return a dict instead of a tuple: allow summarizers to provide
8140         multiple summaries if they want
8141         * buildbot/process/step_twisted.py (trialTextSummarizer): return dict
8142         (debuildSummarizer): summarize lintian warnings/errors
8144 2003-04-10  Brian Warner  <warner@lothar.com>
8146         * README (REQUIREMENTS): slave requires twisted-1.0.4a2
8148 2003-04-09  Brian Warner  <warner@lothar.com>
8150         * buildbot/process/step_twisted.py (trialTextSummarizer): Don't create
8151         empty summaries: happens when the tests fail so hard they don't emit
8152         a parseable summary line.
8154         * buildbot/process/step.py (ShellCommand.finishStatusSummary):
8155         Allow summaryFunction to return None to indicate no summary should
8156         be added.
8158         * buildbot/status/event.py (Logfile.removeHtmlWatcher): avoid
8159         writing to stale HTTP requests: notice when they disconnect and
8160         remove the request from the list. Also add CacheToFile from
8161         moshez, will be used later.
8163 2003-04-08  Brian Warner  <warner@lothar.com>
8165         * buildbot/process/step_twisted.py (ProcessDocs.finished): warnings
8166         should be an int, not a list of strings
8168         * buildbot/changes/changes.py (FreshCVSSource.stop): don't disconnect
8169         if we weren't actually connected
8171         * buildbot/process/step_twisted.py (trialTextSummarizer): function
8172         to show the tail end of the trial text output
8174         * buildbot/process/step.py (ShellCommand.finishStatusSummary): add
8175         hook to summarize the results of a ShellCommand
8177 2003-04-07  Brian Warner  <warner@lothar.com>
8179         * buildbot/process/step_twisted.py (RunUnitTests): consolidate all
8180         twisted test suite code into a single class.
8181         * buildbot/process/process_twisted.py: same
8183 2003-04-04  Brian Warner  <warner@lothar.com>
8185         * setup.py, MANIFEST.in: hack to make sure plugins.tml gets installed
8187         * README (SLAVE): document use of mktap to create slave .tap file
8188         (REQUIREMENTS): describe dependencies
8190         * buildbot/bb_tap.py, buildbot/plugins.tml:
8191         * buildbot/bot.py (updateApplication): Add mktap support for creating
8192         buildslave .tap files
8194 2003-03-28  Brian Warner  <warner@lothar.com>
8196         * buildbot/process/step.py (InternalShellCommand.finished): handle
8197         new tuple result values (fix embarrasing bug that appeared during
8198         PyCon demo)
8200 2003-03-27  Brian Warner  <warner@lothar.com>
8202         * docs/examples/glib_master.py, README: add sample buildmaster.tap
8203         -making program
8205 2003-03-25  Brian Warner  <warner@lothar.com>
8207         * buildbot/process/step.py (CVS, ShellCommand): add reason for failure
8208         to overall build status
8209         * buildbot/clients/base.py (Builder): improve event printing
8210         * buildbot/process/base.py (BasicBuildFactory): use specific steps
8211         instead of generic ShellCommand
8212         (Build): Add .stopBuild, use it when slave is detached
8214         * buildbot/process/step.py (Configure,Test): give the steps their
8215         own names and status strings
8217         * buildbot/status/html.py (StatusResource): add "show" argument,
8218         lets you limit the set of Builders being displayed.
8220 2003-03-20  Brian Warner  <warner@lothar.com>
8222         * buildbot/process/basic.py: removed
8224 2003-03-19  Brian Warner  <warner@lothar.com>
8226         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
8227         turn off process-docs by default
8229         * buildbot/process/base.py (Builder.getBuildNumbered): Don't blow up
8230         when displaying build information without anything in allBuilds[]
8232         * buildbot/bot.py (makeApp): really take password from sys.argv
8234 2003-03-18  Brian Warner  <warner@lothar.com>
8236         * buildbot/bot.py (buildApp): take password from sys.argv
8238         * README: replace with more useful text
8240         * setup.py: add a real one
8241         * MANIFEST.in, .cvsignore: more distutils packaging stuff
8242         
8243         * docs/PyCon-2003/: added sources for PyCon paper.
8245         * buildbot/process/base.py, step.py: revamp. BuildProcess is gone,
8246         now Build objects control the process and Builder only handles
8247         slave stuff and distribution of changes/status. A new BuildFactory
8248         class creates Build objects on demand.
8250         Created ConfigurableBuild which takes a list of steps to run. This
8251         makes it a lot easier to set up a new kind of build and moves us
8252         closer to being able to configure a build from a web page.
8254         * buildbot/process/step_twisted.py, process_twisted.py: move to
8255         new model. A lot of code went away.
8256         
8257         * buildbot/status/progress.py (BuildProgress.newProgress): Don't
8258         send lots of empty progress messages to the client.
8260         * buildbot/master.py (makeApp): enforce builder-name uniqueness
8262 2003-02-20  Brian Warner  <warner@lothar.com>
8264         * buildbot/process/step_twisted.py (BuildDebs): count lintian hits
8266         * buildbot/slavecommand.py (ShellCommand): back to usePTY=0. The
8267         Twisted bug that prevented non-pty processes from working just got
8268         fixed, and the bug that leaks ptys is still being investigated.
8270         * buildbot/process/step.py (CVS): send timeout arg to slave
8272         * buildbot/clients/gtkPanes.py: add connection-status row, handle
8273         builders coming and going
8274         * buildbot/clients/base.py: clean up protocol, move to ReconnectingPB
8275         from CVSToys, handle lost-buildmaster
8277         * buildbot/status/client.py (StatusClientService.removeBuilder):
8278         Clean up status client protocol: send builders (with references)
8279         as they are created, rather than sending a list and requiring the
8280         client to figure out which ones are new.
8281         * buildbot/master.py (BotMaster.forceBuild): Log debugclient
8282         attempts to force a build on an unknown builder
8284 2003-02-19  Brian Warner  <warner@lothar.com>
8286         * buildbot/slavecommand.py (CVSCommand): add timeout to sub-commands
8287         * buildbot/slavecommand.py (ShellCommand.start): stop using PTYs until
8288         Twisted stops leaking them.
8289         * buildbot/clients/gtkPanes.py (CompactBuilder): forget ETA when the
8290         builder goes to an idle state.
8292         * buildbot/slavecommand.py (ShellCommand.start): bring back PTYs until
8293         I figure out why CVS commands hang without them, and/or I fix the
8294         hung-command timeout
8296 2003-02-16  Brian Warner  <warner@lothar.com>
8298         * buildbot/process/step_twisted.py: bin/hlint went away, replace
8299         with 'bin/lore --output lint'. Use 'bin/trial -o' to remove
8300         ansi-color markup. Remove GenerateLore step. Count hlint warnings in
8301         GenerateDocs now that they are prefixed with WARNING:.
8303         * buildbot/status/html.py (StatusResource.body): Fix Builder link,
8304         use manual href target instead of request.childLink
8306         * buildbot/clients/gtkPanes.py: Fix progress countdown: update the
8307         display every second, but update the ETA every 5 seconds (or
8308         whenever) as remote_progress messages arrive.
8311 2003-02-12  Brian Warner  <warner@lothar.com>
8313         * *: import current sources from home CVS repository
8314         
8316 # Local Variables:
8317 # add-log-time-format: add-log-iso8601-time-string
8318 # End: