test_p4poller: fix python2.2 compatibility
[buildbot.git] / ChangeLog
blob7cfa6a6a7ec0d0415067c98826cf4545cfa30743
1 2006-06-13  Brian Warner  <warner@lothar.com>
3         * buildbot/test/test_p4poller.py (TestP4Poller.failUnlessIn): fix
4         compatibility with python2.2, which doesn't have the 'substr in
5         str' feature.
6         (TestP4Poller.makeTime): utility function to construct the
7         timestamp using the same strptime() approach as p4poller does. It
8         turns out that time.mktime() behaves slightly differently under
9         python2.2, probably something to do with the DST flag, and that
10         causes the test to fail under python2.2. (changing the mktime()
11         arguments to have dst=0 instead of -1 caused it to fail under
12         python2.3. Go figure.)
13         (TestP4Poller._testCheck3): use our makeTime() instead of mktime()
15 2006-06-12  Brian Warner  <warner@lothar.com>
17         * buildbot/process/step.py (P4): merge in patch SF#1473939, adding
18         proper Perforce (P4) support. Many many thanks to Scott Lamb for
19         contributing such an excellent patch, including docs and unit
20         tests! This makes it *so* much easier to apply. I had to update
21         test_vc.py to handle some recent refactorings, but everything else
22         applied smoothly. The only remaining thing I'd like to fix would
23         be to remove the hard-wired port 1666 used by p4d, and allow it to
24         claim any unused port. This would allow two copies of the test
25         suite to run on the same host at the same time, as well as
26         allowing the test suite to run while a real (production) p4d was
27         running on the same host. Oh, and maybe we should add a warning to
28         step.P4 that gets emitted if the slave is too old to provide the
29         'p4' SlaveCommand. Otherwise it looks great. (closes: SF#1473939).
30         * buildbot/slave/commands.py (P4): same
31         (P4Sync): same, some minor updates
32         * buildbot/changes/p4poller.py: same
33         * docs/buildbot.texinfo: same
34         * buildbot/test/test_p4poller.py: same
35         * buildbot/test/test_vc.py (P4): same
37         * setup.py: add Trove classifiers for PyPI
39 2006-06-08  Brian Warner  <warner@allmydata.com>
41         * buildbot/status/client.py
42         (RemoteBuilder.remote_getCurrentBuilds): oops, I screwed up when
43         changing this from getCurrentBuild() to getCurrentBuilds(). Each
44         build needs to be IRemote'd separately, rather than IRemote'ing
45         the whole list at once. I can't wait until newpb's serialization
46         adapters make this unnecessary.
48 2006-06-06  Brian Warner  <warner@lothar.com>
50         * buildbot/process/step.py (WithProperties): make this inherit
51         from ComparableMixin, so that reloading an unchanged config file
52         doesn't cause us to spuriously reload any Builders which use them.
53         * buildbot/test/test_config.py (ConfigTest.testWithProperties):
54         add a test for it
56 2006-06-03  Brian Warner  <warner@lothar.com>
58         * contrib/windows/{setup.py, buildbot_service.py}: add support for
59         running py2exe on windows, contributed by Mark Hammond. Addresses
60         SF#1401121, but I think we still need to include
61         buildbot/scripts/sample.cfg
62         * setup.py: include buildbot_service.py as a script under windows
63         * buildbot/status/html.py: when sys.frozen (i.e. we're running in
64         a py2exe application), get the icon/css datafiles from a different
65         place than usual.
67         * buildbot/status/mail.py (MailNotifier.buildMessage): don't
68         double-escape the build URL. Thanks to Olivier Bonnet for the
69         patch. Fixes SF#1452801.
71 2006-06-02  Brian Warner  <warner@lothar.com>
73         * contrib/svn_buildbot.py (ChangeSender.getChanges): ignore the
74         first six columns of 'svnlook' output, not just the first column,
75         since property changes appear in the other five. Thanks to Olivier
76         Bonnet for the patch. Fixes SF#1398174.
78 2006-06-01  Brian Warner  <warner@lothar.com>
80         * buildbot/test/test_web.py (Logfile.setUp): set the .reason on
81         the fake build, so that title= has something to be set to
83         * buildbot/status/html.py (BuildBox.getBox): set the 'title='
84         attribute of the "Build #NN" link in the yellow start-the-build
85         box to the build's reason. This means that you get a little
86         tooltip explaining why the build was done when you hover over the
87         yellow box. Thanks to Zandr Milewski for the suggestion.
89         * buildbot/clients/gtkPanes.py (Box.setColor): ignore color=None
90         (Box.setETA): handle ETA=None (by stopping the timer)
91         (Box.update): make the [soon] text less different than the usual
92         text, so the rest of the text doesn't flop around so much. It
93         would be awfully nice to figure out how to center this stuff.
94         (ThreeRowBuilder.stepETAUpdate): more debugging printouts
96         * buildbot/process/step.py (ShellCommand): set flunkOnFailure=True
97         by default, so that any ShellCommand which fails marks the overall
98         build as a failure. I should have done this from the beginning.
99         Add flunkOnFailure=False to the arguments if you want to turn off
100         this behavior.
102 2006-05-30  Brian Warner  <warner@lothar.com>
104         * buildbot/clients/gtkPanes.py: add a third row: now it shows
105         last-build/current-build/current-step. Show what step is currently
106         running. Show ETA for both the overall build and the current step.
107         Update GTK calls to modern non-deprecated forms. There's still a
108         lot of dead code and debug noise to remove.
110         * buildbot/process/step_twisted.py (Trial): set the step name, so it
111         shows up properly in status displays
113 2006-05-28  Brian Warner  <warner@lothar.com>
115         * buildbot/test/test_properties.py (Run.testInterpolate): on the
116         build we use to verify that WithProperties works:
118         ** set flunkOnFailure=True so that build failures get noticed
119         ** set workdir='.' so that the build succeeds, otherwise it is trying
120             to touch 'build/something', and 'build/' doesn't exist because
121             usually that's created by a Source step
122         ** set timeout=10, because Twisted-1.3.0 has a race condition that
123             this test somehow triggers, in which the 'touch' process becomes
124             a zombie and we wait for th etimeout before giving up on it.
126         * buildbot/test/runutils.py (RunMixin.logBuildResults): utility method
127         to log the Build results and step logs to the twisted log.
128         (RunMixin.failUnlessBuildSucceeded): use logBuildResults to record
129         what went wrong if a build was expected to succeed but didn't.
131         * buildbot/process/step_twisted.py (Trial): set the default
132         trialMode to '--reporter=bwverbose', which specifies verbose
133         black-and-white text. Back in twisted-1.3/2.0 days we had to use
134         '-to', but those are completely missing in modern Twisteds.
136         * buildbot/scripts/sample.cfg: make the sample Manhole config use
137         a localhost-only port, to encourage better security
139         * docs/buildbot.texinfo (Change Sources): mention
140         darcs_buildbot.py
142         * .darcs-boring: add a Darcs boringfile
144         * README (REQUIREMENTS): stop claiming compatibility with
145         Twisted-1.3.0
147         * contrib/darcs_buildbot.py: write a darcs-commit-hook change
148         sender
150 2006-05-27  Brian Warner  <warner@lothar.com>
152         * buildbot/__init__.py: bump to 0.7.3+ while between releases
153         * docs/buildbot.texinfo: same
155 2006-05-23  Brian Warner  <warner@lothar.com>
157         * buildbot/__init__.py (version): Releasing buildbot-0.7.3
158         * docs/buildbot.texinfo: set version to match
159         * NEWS: update for 0.7.3
161         * docs/buildbot.texinfo (Change Sources): mention hg_buildbot.py,
162         give a quick mapping from VC system to possible ChangeSources
163         (Build Properties): add 'buildername'
165         * buildbot/process/base.py (Build.setupStatus): oops, set
166         'buildername' and 'buildnumber' properties
167         * buildbot/test/test_properties.py (Interpolate.testBuildNumber):
168         test them
170 2006-05-22  Brian Warner  <warner@lothar.com>
172         * docs/buildbot.texinfo (Build Properties): explain the syntax of
173         property interpolation better
175         * README (INSTALLATION): remove old '-v' argument from recommended
176         trial command line
178         * docs/buildbot.texinfo (ShellCommand): add docs for description=
179         and descriptionDone= arguments. Thanks to Niklaus Giger for the
180         patch. SF#1475494.
182         * buildbot/slave/commands.py (SVN.parseGotRevision._parse): use
183         'svnversion' instead of grepping the output of 'svn info', much
184         simpler and avoids CR/LF problems on windows. Thanks to Olivier
185         Bonnet for the suggestion.
186         (SVN.parseGotRevision): oops, older verisons of 'svnversion'
187         require the WC_PATH argument, so run 'svnversion .' instead.
189         * buildbot/interfaces.py (IChangeSource): methods in Interfaces
190         aren't supposed to have 'self' in their argument list
192 2006-05-21  Brian Warner  <warner@lothar.com>
194         * buildbot/process/step.py (ShellCommand.start): make
195         testInterpolate pass. I was passing the uninterpolated command to
196         the RemoteShellCommand constructor
197         (ShellCommand._interpolateProperties): oops, handle non-list
198         commands (i.e. strings with multiple words separated by spaces in
199         them) properly, instead of forgetting about them.
201         * buildbot/test/test_properties.py (Run.testInterpolate): new test
202         to actually try to use build properties in a real build. This test
203         fails.
204         * buildbot/test/runutils.py (RunMixin.requestBuild): utility methods
205         to start and evaluate builds
207         * buildbot/test/test__versions.py: add a pseudo-test to record
208         what version of Twisted/Python/Buildbot are running. This should
209         show up at the beginning of _trial_tmp/test.log, and exists to help
210         debug other problems.
212         * buildbot/status/html.py (Waterfall): add 'robots_txt=' argument,
213         a filename to be served as 'robots.txt' to discourage web spiders.
214         Adapted from a patch by Tobi Vollebregt, thanks!
215         * buildbot/test/test_web.py (Waterfall._test_waterfall_5): test it
216         (Waterfall.test_waterfall): tweak the way that filenames are put
217         into the config file, to accomodate windows pathnames better.
219         * docs/buildbot.texinfo (HTML Waterfall): document it
221         * buildbot/process/process_twisted.py
222         (QuickTwistedBuildFactory.__init__): recent versions of Twisted
223         changed the build process. The new setup.py no longer takes the
224         'all' argument.
225         (FullTwistedBuildFactory.__init__): same
226         (TwistedReactorsBuildFactory.__init__): same
228         * contrib/hg_buildbot.py: wrote a commit script for mercurial, to
229         be placed in the [hooks] section of the central repository (the
230         one that everybody pushes changes to).
232 2006-05-20  Brian Warner  <warner@lothar.com>
234         * buildbot/slave/commands.py (Darcs.doVCFull): when writing the
235         .darcs-context file, use binary mode. I think this was causing a
236         Darcs failure under windows.
238 2006-05-19  Brian Warner  <warner@lothar.com>
240         * buildbot/scripts/tryclient.py (CVSExtractor.getBaseRevision):
241         use a timezone string of +0000 and gmtime, since this timestamp is
242         sent to a buildmaster and %z is broken.
244         * buildbot/test/test_vc.py (CVSHelper.getdate): use no timezone
245         string and localtime, since this timestamp will only be consumed
246         locally, and %z is broken.
248         * buildbot/slave/commands.py (CVS.parseGotRevision): use +0000 and
249         gmtime, since this timestamp is returned to the buildmaster, and
250         %z is broken.
252 2006-05-18  Brian Warner  <warner@lothar.com>
254         * NEWS: update in preparation for next release
256         * buildbot/test/test_vc.py (VCS_Helper): factor out all the
257         setup-repository and do-we-have-the-vc-tools code into a separate
258         "helper" class, which sticks around in a single module-level
259         object. This seems more likely to continue to work in the future
260         than having it hide in the TestCase and hope that TestCases stick
261         around for a long time.
263         * buildbot/test/test_vc.py (MercurialSupport.vc_create): 'hg
264         addremove' has been deprecated in recent versions of mercurial, so
265         use 'hg add' instead
267 2006-05-07  Brian Warner  <warner@lothar.com>
269         * buildbot/scheduler.py (Try_Jobdir.messageReceived): when
270         operating under windows, move the file before opening it, since
271         you can't rename a file that somebody has open.
273         * buildbot/process/base.py (Build.setupBuild): if something goes
274         wrong while creating a Step, log the name and arguments, since the
275         error message when you get the number of arguments wrong is really
276         opaque.
278 2006-05-06  Brian Warner  <warner@lothar.com>
280         * buildbot/process/step_twisted.py (Trial.setupEnvironment): more
281         bugs in twisted-specific code not covered by my unit tests, this
282         time use 'cmd' argument instead of self.cmd
284         * buildbot/process/process_twisted.py (TwistedBuild.isFileImportant):
285         fix stupid braino: either use startwith or find()==0, not both.
286         (TwistedReactorsBuildFactory.__init__): another dumb typo
288         * buildbot/test/test_slavecommand.py (ShellBase.testInterrupt1): 
289         mark this test as TODO under windows, since process-killing seems
290         dodgy there. We'll come back to this later and try to fix it
291         properly.
293         * buildbot/test/test_vc.py (CVSSupport.getdate): use localtime,
294         and don't include a timezone
295         (CVSSupport.vc_try_checkout): stop trying to strip the timezone.
296         This should avoid the windows-with-verbose-timezone-name problem
297         altogether.
298         (Patch.testPatch): add a test which runs 'patch' with less
299         overhead than the full VCBase.do_patch sequence, to try to isolate
300         a windows test failure. This one uses slave.commands.ShellCommand
301         and 'patch', but none of the VC code.
303         * buildbot/slave/commands.py (getCommand): use which() to find the
304         executables for 'cvs', 'svn', etc. This ought to help under
305         windows.
307         * buildbot/test/test_vc.py (VCBase.do_getpatch): Delete the
308         working directory before starting. If an earlier test failed, the
309         leftover directory would mistakenly flunk a later test.
310         (ArchCommon.registerRepository): fix some tla-vs-baz problems.
311         Make sure that we use the right commandlines if which("tla") picks
312         up "tla.exe" (as it does under windows).
313         (TlaSupport.do_get): factor out this tla-vs-baz difference
314         (TlaSupport.vc_create): more tla-vs-baz differences
316         * buildbot/test/test_slavecommand.py
317         (ShellBase.testShellMissingCommand): stop trying to assert
318         anything about the error message: different shells on different
319         OSes with different languages makes it hard, and it really isn't
320         that interesting of a thing to test anyway.
322         * buildbot/test/test_vc.py (CVSSupport.capable): skip CVS tests if
323         we detect cvs-1.10 (which is the version shipped with OS-X 10.3
324         "Panther"), because it has a bug which flunks a couple tests in
325         weird ways. I've checked that cvs-1.12.9 (as shipped with debian)
326         is ok. OS-X 10.4 "Tiger" ships with cvs-1.11, but I haven't been
327         able to test that yet.
329 2006-04-30  Brian Warner  <warner@lothar.com>
331         * buildbot/test/test_vc.py (VCBase.runCommand): set $LC_ALL="C" to
332         make sure child commands emit messages in english, so our regexps
333         will match. Thanks to Nikaus Giger for identifying the problems.
334         (VCBase._do_vctest_export_1): mode="export" is not responsible
335         for setting the "got_revision" property, since in many cases it is
336         not convenient to determine.
337         (SVNSupport.capable): when running 'svn --version' to check for
338         ra_local, we want error messages in english
339         * buildbot/test/test_slavecommand.py 
340         (ShellBase.testShellMissingCommand): set $LC_ALL="C" to get bash
341         to emit the error message in english
343         * buildbot/slave/commands.py (SourceBase.setup): stash a copy of
344         the environment with $LC_ALL="C" so that Commands which need to
345         parse the output of their child processes can obtain it in
346         english.
347         (SVN.parseGotRevision): call "svn info" afterwards instead of
348         watching the output of the "svn update" or "svn checkout".
349         (Darcs.parseGotRevision): use $LC_ALL="C" when running the command
350         (Arch.parseGotRevision): same
351         (Bazaar.parseGotRevision): same
352         (Mercurial.parseGotRevision): same
354         * buildbot/scripts/tryclient.py (SourceStampExtractor.dovc): set
355         $LC_ALL="C" when running commands under 'buildbot try', too
357         * buildbot/test/__init__.py: remove the global os.environ()
358         setting, instead we do it just for the tests that run commands and
359         need to parse their output.
361         * buildbot/test/test_scheduler.py (Scheduling.testTryJobdir):
362         remove the overly-short .timeout on this test, because non-DNotify
363         platforms must fall back to polling which happens at 10 second
364         intervals, so a 5 second timeout would never succeed.
366 2006-04-24  Brian Warner  <warner@lothar.com>
368         * docs/buildbot.texinfo (Installing the code): update trial
369         invocation, SF#1469116 by Niklaus Giger.
370         (Attributes of Changes): updated branch-name examples to be
371         a bit more realistic, SF#1475240 by Stephen Davis.
373         * contrib/windows/buildbot2.bat: utility wrapper for windows
374         developers, contributed by Nick Trout (after a year of neglect..
375         sorry!). SF#1194231.
377         * buildbot/test/test_vc.py (*.capable): store the actual VC
378         binary's pathname in VCS[vcname], so it can be retrieved later
379         (CVSSupport.vc_try_checkout): incorporate Niklaus Giger's patch to
380         strip out non-numeric timezone information, specifically the funky
381         German string that his system produced that confuses CVS.
382         (DarcsSupport.vc_create): use dovc() instead of vc(), this should
383         allow Darcs tests to work on windows
384         * buildbot/scripts/tryclient.py (SourceStampExtractor): use
385         procutils.which() everywhere, to allow tryclient to work under
386         windows. Also from Niklaus Giger, SF#1463394.
388         * buildbot/twcompat.py (which): move the replacement for a missing
389         twisted.python.procutils.which from test_vc.py to here, so it can
390         be used in other places too (specifically tryclient.py)
392 2006-04-23  Brian Warner  <warner@lothar.com>
394         * buildbot/status/html.py (StatusResourceBuild.body): replace the
395         bare buildbotURL/projectName line with a proper DIV, along with a
396         CSS class of "title", from Stefan Seefeld (SF#1461675).
397         (WaterfallStatusResource.body0): remove the redundant 'table'
398         class from the table
399         (WaterfallStatusResource.body): same. Also add class="LastBuild"
400         to the top-row TR, and class="Activity" to the second-row TR,
401         rather than putting them in the individual TD nodes.
403         * buildbot/test/test_vc.py (VCBase.checkGotRevision): test
404         'got_revision' build property for all VC systems that implement
405         accurate ones: SVN, Darcs, Arch, Bazaar, Mercurial.
407         * buildbot/slave/commands.py (SourceBase._handleGotRevision): try
408         to determine which revision we actually obtained
409         (CVS.parseGotRevision): implement this for CVS, which just means
410         to grab a timestamp. Not ideal, and it depends upon the buildslave
411         having a clock that is reasonably well syncronized with the server,
412         but it's better than nothing.
413         (SVN.parseGotRevision): implement it for SVN, which is accurate
414         (Darcs.parseGotRevision): same
415         (Arch.parseGotRevision): same
416         (Bazaar.parseGotRevision): same
417         (Mercurial.parseGotRevision): same
419         * buildbot/process/step.py (LoggedRemoteCommand.remoteUpdate):
420         keep a record of all non-stdout/stderr/header/rc status updates,
421         for the benefit of RemoteCommands that send other useful things,
422         like got_revision
423         (Source.commandComplete): put any 'got_revision' status values
424         into a build property of the same name
427         * buildbot/process/step_twisted.py (Trial): update to deal with
428         new ShellCommand refactoring
430         * docs/buildbot.texinfo (Build Properties): document new feature
431         that allows BuildSteps to get/set Build-wide properties like which
432         revision was requested and/or checked out.
434         * buildbot/interfaces.py (IBuildStatus.getProperty): new method
435         * buildbot/status/builder.py (BuildStatus.getProperty): implement
436         it. Note that this bumps the persistenceVersion of the saved Build
437         object, so add the necessary upgrade-old-version logic to include
438         an empty properties dict.
440         * buildbot/process/base.py (Build.setProperty): implement it
441         (Build.getProperty): same
442         (Build.startBuild): change build startup to set 'branch',
443         'revision', and 'slavename' properties at the right time
445         * buildbot/process/step.py (BuildStep.__init__): change setup to
446         require 'build' argument in a better way
447         (LoggingBuildStep): split ShellCommand into two pieces, for better
448         subclassing elsewhere. LoggingBuildStep is a BuildStep which runs
449         a single RemoteCommand that sends stdout/stderr status text. It
450         also provides the usual commandComplete / createSummary /
451         evaluateCommand / getText methods to be overridden...
452         (ShellCommand): .. whereas ShellCommand is specifically for
453         running RemoteShellCommands. Other shell-like BuildSteps (like
454         Source) can inherit from LoggingBuildStep instead of ShellCommand
455         (WithProperties): marker class to do build-property interpolation
456         (Source): inherit from LoggingBuildStep instead of ShellCommand
457         (RemoteDummy): same
459         * buildbot/test/test_properties.py: test new functionality
461 2006-04-21  Brian Warner  <warner@lothar.com>
463         * buildbot/test/test_vc.py: rename testBranch to
464         testCheckoutBranch to keep the tests in about the right
465         alphabetical order
467 2006-04-18  Brian Warner  <warner@lothar.com>
469         * docs/buildbot.texinfo (PBListener): improve cross-references
470         between PBListener and 'buildbot statusgui', thanks to John Pye
471         for the suggestion.
473 2006-04-17  Brian Warner  <warner@lothar.com>
475         * buildbot/twcompat.py (maybeWait): handle SkipTest properly when
476         running under Twisted-1.3.0, otherwise skipped tests are reported
477         as errors.
479         * all: use isinstance() instead of 'type(x) is foo', suggested by
480         Neal Norwitz
482         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
483         oops, fix a brain-fade from the other week, when making the
484         addStep changes. I changed all the __init__ upcalls to use the
485         wrong superclass name.
486         (FullTwistedBuildFactory.__init__): same
487         (TwistedDebsBuildFactory.__init__): same
488         (TwistedReactorsBuildFactory.__init__): same
489         (TwistedBuild.isFileImportant): use .startswith for clarity,
490         thanks to Neal Norwitz for the suggestions.
492         * contrib/viewcvspoll.py: script to poll a viewcvs database for
493         changes, then deliver them over PB to a remote buildmaster.
495         * contrib/svnpoller.py: added script by John Pye to poll a remote
496         SVN repository (by running 'svn log') from a cronjob, and run
497         'buildbot sendchange' to deliver the changes to a remote
498         buildmaster.
499         * contrib/svn_watcher.py: added script by Niklaus Giger (a
500         modification of svnpoller.py), same purpose, but this one loops
501         internally (rather than expecting to run from a cronjob) and works
502         under windows.
503         * contrib/README.txt: same
505 2006-04-11  Brian Warner  <warner@lothar.com>
507         * all: fix a number of incorrect names and missing imports, thanks
508         to Anthony Baxter for the patch.
509         * buildbot/status/html.py (WaterfallStatusResource.statusToHTML): 
510         remove unused buggy method.
511         * buildbot/status/builder.py (BuildStatus.saveYourself): rmtree
512         comes from shutil, not "shutils"
513         * buildbot/process/step.py (TreeSize.evaluateCommand): fix bad name
514         (Arch.checkSlaveVersion): same
515         * buildbot/process/step_twisted.py (Trial.commandComplete): same, in
516         some disabled code
517         * buildbot/process/step_twisted2.py: add some missing imports
518         * buildbot/twcompat.py (_deferGenerator): fix cut-and-paste error,
519         this code used to live in twisted.internet.defer
521 2006-04-10  Brian Warner  <warner@lothar.com>
523         * buildbot/process/step.py (Mercurial): add Mercurial support
524         * buildbot/slave/commands.py (Mercurial): same
525         * buildbot/scripts/tryclient.py (MercurialExtractor): same
526         * buildbot/test/test_vc.py (Mercurial): same, checkout over HTTP is
527         not yet tested, but 'try' support *is* covered
528         * docs/buildbot.texinfo (Mercurial): document it
530         * buildbot/process/step.py (LoggedRemoteCommand.remoteUpdate): add
531         some debugging messages (turned off)
532         * buildbot/test/test_vc.py: improve debug messages
534 2006-04-07  Brian Warner  <warner@lothar.com>
536         * buildbot/test/test_vc.py (which): define our own which() in case
537         we can't import twisted.python.procutils, because procutils doesn't
538         exist in Twisted-1.3
540         * docs/buildbot.texinfo (Interlocks): fix some typos, mention use
541         of SlaveLocks for performance tests
543         * docs/examples/twisted_master.cfg: update to match current usage
545         * buildbot/changes/p4poller.py (P4Source): add new arguments:
546         password, p4 binary, pollinterval, maximum history to check.
547         Patch from an anonymous sf.net contributor, SF#1219384.
548         * buildbot/process/step.py (P4Sync.__init__): add username,
549         password, and client arguments.
550         * buildbot/slave/commands.py (P4Sync): same
552 2006-04-05  Brian Warner  <warner@lothar.com>
554         * buildbot/process/factory.py (BuildFactory.addStep): new method
555         to add steps to a BuildFactory. Use it instead of f.steps.append,
556         and you can probably avoid using the s() convenience function.
557         Patch from Neal Norwitz, sf.net #1412605.
558         (other): update all factories to use addStep
559         * buildbot/process/process_twisted.py: update all factories to use
560         addStep.
562 2006-04-03  Brian Warner  <warner@lothar.com>
564         * buildbot/test/test_vc.py: modified find-the-VC-command logic to
565         work under windows too. Adapted from a patch by Niklaus Giger,
566         addresses SF#1463399.
568         * buildbot/test/__init__.py: set $LANG to 'C', to insure that
569         spawned commands emit parseable results in english and not some
570         other language. Patch from Niklaus Giger, SF#1463395.
572         * README (INSTALLATION): discourage users from running unit tests on
573         a "network drive", patch from Niklaus Giger, SF#1463394.
575 2006-03-22  Brian Warner  <warner@lothar.com>
577         * contrib/svn_buildbot.py: rearrange, add an easy-to-change
578         function to turn a repository-relative pathname into a (branch,
579         branch-relative-filename) tuple. Change this function to handle
580         the branch naming policy used by your Subversion repository.
581         Thanks to AllMyData.com for sponsoring this work.
583 2006-03-16  Brian Warner  <warner@lothar.com>
585         * buildbot/scripts/sample.cfg: add python-mode declaration for
586         vim. Thanks to John Pye for the patch.
588         * docs/buildbot.texinfo (Launching the daemons): fix @reboot job
589         command line, mention the importance of running 'crontab' as the
590         buildmaster/buildslave user. Thanks to John Pye for the catch.
592 2006-03-13  Brian Warner  <warner@lothar.com>
594         * buildbot/status/words.py (IRC): add an optional password=
595         argument, which will be sent to Nickserv in an IDENTIFY message at
596         login, to claim the nickname. freenode requires this before the
597         bot can sent (or reply to) private messages. Thanks to Clement
598         Stenac for the patch.
599         * docs/buildbot.texinfo (IRC Bot): document it
601         * buildbot/status/builder.py (LogFile.merge): don't write chunks
602         larger than chunkSize. Fixes SF#1349253.
603         * buildbot/test/test_status.py (Log.testLargeSummary): test it
604         (Log.testConsumer): update to match new internal chunking behavior
606 2006-03-12  Brian Warner  <warner@lothar.com>
608         * buildbot/test/test_vc.py: remove the last use of waitForDeferred
610         * buildbot/test/test_maildir.py (MaildirTest): rename the
611         'timeout' method, as it collides with trial's internals
613         * buildbot/scripts/runner.py: add 'buildbot restart' command
614         (stop): don't sys.exit() out of here, otherwise restart can't work
615         * docs/buildbot.texinfo (Shutdown): document it
617         * buildbot/buildset.py (BuildSet.__init__): clean up docstring
618         * buildbot/status/html.py (Waterfall.__init__): same
619         * buildbot/process/builder.py (Builder.startBuild): same
620         * buildbot/process/base.py (BuildRequest): same
621         * buildbot/sourcestamp.py (SourceStamp): same
622         * buildbot/scheduler.py (Nightly): same
624         * buildbot/__init__.py (version): bump to 0.7.2+ while between
625         releases
626         * docs/buildbot.texinfo: same
628 2006-02-17  Brian Warner  <warner@lothar.com>
630         * buildbot/__init__.py (version): Releasing buildbot-0.7.2
631         * docs/buildbot.texinfo: set version number to match
632         * NEWS: update for 0.7.2
634 2006-02-16  Brian Warner  <warner@lothar.com>
636         * docs/buildbot.texinfo (Build Dependencies): add cindex tag
638 2006-02-09  Brian Warner  <warner@lothar.com>
640         * docs/buildbot.texinfo (How Different VC Systems Specify Sources):
641         add text to explain per-build branch parameters
642         * NEWS: mention --umask
644 2006-02-08  Brian Warner  <warner@lothar.com>
646         * buildbot/scripts/runner.py (Maker.makeSlaveTAC): remove unused
647         method
648         (SlaveOptions.optParameters): add --umask, to make it possible to
649         make buildslave-generated files (including build products) be
650         world-readable
651         (slaveTAC): same
652         * buildbot/slave/bot.py (BuildSlave.startService): same
654 2006-01-23  Brian Warner  <warner@lothar.com>
656         * buildbot/status/builder.py: urllib.quote() all URLs that include
657         Builder names, so that builders can include characters like '/'
658         and ' ' without completely breaking the resulting HTML. Thanks to
659         Kevin Turner for the patch.
660         * buildbot/status/html.py: same
661         * buildbot/test/test_web.py (GetURL.testBuild): match changes
663         * NEWS: update in preparation for upcoming release
665 2006-01-18  Brian Warner  <warner@lothar.com>
667         * docs/examples/twisted_master.cfg: update to match the Twisted
668         buildbot: remove python2.2, switch to exarkun's buildslaves,
669         disable the .deb builder until we figure out how to build twisted
670         .debs from SVN, add some ktrace debugging to the OS-X build
671         process and remove the qt build, remove threadless builders,
672         change freebsd builder to use landonf's buildslave.
674 2006-01-12  Brian Warner  <warner@lothar.com>
676         * buildbot/master.py (Manhole.__init__): let port= be a strports
677         specification string, but handle a regular int for backwards
678         compatibility. This allows "tcp:12345:interface=127.0.0.1" to be
679         used in master.cfg to limit connections to just the local host.
680         (BuildMaster.loadConfig): same for c['slavePortnum']
681         * buildbot/scheduler.py (Try_Userpass.__init__): same
682         * buildbot/status/client.py (PBListener.__init__): same
683         * buildbot/status/html.py (Waterfall.__init__): same, for both
684         http_port and distrib_port. Include backwards-compatibility checks
685         so distrib_port can be a filename string and still mean unix:/foo
686         * docs/buildbot.texinfo (Setting the slaveport): document it
687         (Debug options): same
688         (HTML Waterfall): same
689         (PBListener): same
690         (try): same
691         * buildbot/test/test_config.py (ConfigTest): test it
693         * buildbot/master.py (BuildMaster.loadConfig): wait for the
694         slaveport's disownServiceParent deferred to fire before opening
695         the new one. Fixes an annoying bug in the unit tests.
697 2006-01-03  Brian Warner  <warner@lothar.com>
699         * buildbot/master.py (BuildMaster): remove the .schedulers
700         attribute, replacing it with an allSchedulers() method that looks
701         for all IService children that implement IScheduler. Having only
702         one parent/child relationship means fewer opportunities for bugs.
703         (BuildMaster.allSchedulers): new method
704         (BuildMaster.loadConfig_Schedulers): update to use allSchedulers,
705         also fix ugly bug that caused any config-file reload to
706         half-forget about the earlier Schedulers, causing an exception
707         when a Change arrived and was handed to a half-connected
708         Scheduler. The exception was in scheduler.py line 54ish:
709           self.parent.submitBuildSet(bs)
710           exceptions.AttributeError: 'NoneType' object has no attribute
711           'submitBuildSet'
712         (BuildMaster.addChange): update to use allSchedulers()
714         * buildbot/scheduler.py (BaseScheduler.__implements__): fix this
715         to work properly with twisted-1.3.0, where you must explicitly
716         include the __implements__ from parent classes
717         (BaseScheduler.__repr__): make it easier to distinguish distinct
718         instances
719         (BaseUpstreamScheduler.__implements__): same
721         * buildbot/status/builder.py (Status.getSchedulers): update to
722         use allSchedulers()
723         * buildbot/test/test_run.py (Run.testMaster): same
724         * buildbot/test/test_dependencies.py (Dependencies.findScheduler): same
725         * buildbot/test/test_config.py (ConfigTest.testSchedulers): same,
726         make sure Scheduler instances are left alone when an identical
727         config file is reloaded
728         (ConfigElements.testSchedulers): make sure Schedulers are properly
729         comparable
731         * Makefile (TRIALARGS): my local default Twisted version is now
732         2.1.0, update the trial arguments accordingly
734 2005-12-22  Brian Warner  <warner@lothar.com>
736         * docs/examples/twisted_master.cfg: merge changes from pyr: add
737         new win32 builders
739         * buildbot/scheduler.py (BaseScheduler.addChange): include a dummy
740         addChange in the parent class, although I suspect this should be
741         fixed better in the future.
743 2005-11-26  Brian Warner  <warner@lothar.com>
745         * buildbot/scheduler.py (AnyBranchScheduler.addChange): don't
746         explode when branch==None, thanks to Kevin Turner for the catch
747         * buildbot/test/test_scheduler.py (Scheduling.testAnyBranch): test
748         it
750         * buildbot/__init__.py (version): bump to 0.7.1+ while between
751         releases
752         * docs/buildbot.texinfo: same
754 2005-11-26  Brian Warner  <warner@lothar.com>
756         * buildbot/__init__.py (version): Releasing buildbot-0.7.1
757         * docs/buildbot.texinfo: set version number to match
759 2005-11-26  Brian Warner  <warner@lothar.com>
761         * NEWS: update for 0.7.1
763         * buildbot/status/builder.py (BuildStepStatus.unsubscribe): make
764         sure that unsubscribe works even if we never sent an ETA update.
765         Also, don't explode on duplicate unsubscribe.
766         (BuildStepStatus.addLog): make the convenience "return self"-added
767         watcher automatically unsubscribe when the Step finishes.
768         (BuildStatus.unsubscribe): same handle-duplicate-unsubscribe
769         (BuildStatus.stepStarted): same auto-unsubscribe
770         (BuilderStatus.buildStarted): same auto-unsubscribe
772         * buildbot/interfaces.py (IStatusReceiver.buildStarted): document
773         auto-unsubscribe
774         (IStatusReceiver.stepStarted): same
775         (IStatusReceiver.logStarted): same
777         * buildbot/test/test_run.py (Status): move the Status test..
778         * buildbot/test/test_status.py (Subscription): .. to here
780 2005-11-25  Brian Warner  <warner@lothar.com>
782         * NEWS: more updates
784         * buildbot/locks.py: fix the problem in which loading a master.cfg
785         file that changes some Builders (but not all of them) can result
786         in having multiple copies of the same Lock. Now, the real Locks
787         are kept in a table inside the BotMaster, and the Builders/Steps
788         use "LockIDs", which are still instances of MasterLock and
789         SlaveLock. The real Locks are instances of the new RealMasterLock
790         and RealSlaveLock classes.
791         * buildbot/master.py (BotMaster.getLockByID): new method to
792         convert LockIDs into real Locks.
793         * buildbot/process/base.py (Build.startBuild): convert LockIDs
794         into real Locks before building
795         * buildbot/process/step.py (BuildStep.startStep): same
796         * buildbot/test/test_locks.py (Locks.testLock1a): add a test which
797         exercises the problem
800         * docs/buildbot.texinfo (Scheduler Types): give a few hints about
801         what Schedulers are available
803         * buildbot/scheduler.py (Nightly): add new Scheduler based upon
804         work by Dobes Vandermeer and hacked mercilessly by me. This offers
805         'cron'-style build scheduling at certain times of day, week,
806         month, or year.
807         * buildbot/test/test_scheduler.py (Scheduling.testNightly): test it
809         * buildbot/scheduler.py (Scheduler): change fileIsImportant
810         handling: treat self.fileIsImportant more as an attribute that
811         contains a callable than as a method. If the attribute is None,
812         don't call it and assume all filenames are important. It is still
813         possible to provide a fileIsImportant method in a subclass,
814         however.
815         (AnyBranchScheduler): handle fileIsImportant=None, previously it
816         was broken
817         * buildbot/test/test_scheduler.py (Scheduling.testAnyBranch2):
818         test using AnyBranchScheduler with fileIsImportant=None
820 2005-11-24  Brian Warner  <warner@lothar.com>
822         * buildbot/test/test_config.py (StartService): don't claim a fixed
823         port number, instead set slavePort=0 on the first pass, figure out
824         what port was allocated, then switch to a config file that uses
825         the allocated port.
827         * buildbot/master.py (BuildMaster.loadConfig): close the old
828         slaveport before opening the new one, because unit tests might
829         replace slavePort=0 with the same allocated portnumber, and if we
830         don't wait for the old port to close first, we get a "port already
831         in use" error. There is a tiny race condition here, but the only
832         threat is from other programs that bind (statically) to the same
833         port number we happened to be allocated, and only if those
834         programs use SO_REUSEADDR, and only if they get control in between
835         reactor turns.
837         * Makefile (TRIALARGS): update to handle Twisted > 2.1.0
839         * buildbot/master.py (BuildMaster.loadConfig_Sources): remove all
840         deleted ChangeSources before adding any new ones
841         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): fix
842         compare_attrs, to make sure that a config-file reload does not
843         unnecessarily replace an unmodified ChangeSource instance
844         * buildbot/test/test_config.py (ConfigTest.testSources): update
846         * buildbot/scheduler.py (AnyBranchScheduler): fix branches=[] to
847         mean "don't build anything", and add a warning if it gets used
848         because it isn't actually useful.
850         * contrib/svn_buildbot.py: update example usage to match the port
851         number that gets used by the PBChangeSource
852         * buildbot/scripts/sample.cfg: add example of PBChangeSource
854 2005-11-22  Brian Warner  <warner@lothar.com>
856         * NEWS: start collecting items for next release
858         * buildbot/process/step.py (SVN.computeSourceRevision): assume
859         revisions are strings
860         (P4Sync.computeSourceRevision): same
862         * buildbot/status/html.py (StatusResourceBuild.body): add a link
863         to the Buildbot's overall status page
864         (StatusResourceBuilder.body): same
866 2005-11-15  Brian Warner  <warner@lothar.com>
868         * buildbot/master.py (BuildMaster.loadConfig): serialize the
869         config-file loading, specifically to make sure old StatusTargets
870         are finished shutting down before new ones start up (thus
871         resolving a bug in which changing the Waterfall object would fail
872         because both new and old instances were claiming the same
873         listening port). Also load new Schedulers after all the new
874         Builders are set up, in case they fire off a new build right away.
875         * buildbot/test/test_config.py (StartService): test it
877         * buildbot/status/mail.py (MailNotifier.buildMessage): oops, add
878         the branch name to the mail body
880         * buildbot/changes/pb.py (PBChangeSource.compare_attrs): add this.
881         Without it, a config-file reload fails to update an existing
882         PBChangeSource.
883         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): add
884         username/passwd to compare_attrs, for the same reason
885         * buildbot/status/html.py (Waterfall): add favicon to
886         compare_attrs, same reason
888 2005-11-05  Brian Warner  <warner@lothar.com>
890         * buildbot/scripts/tryclient.py (createJobfile): stringify the
891         baserev before stuffing it in the jobfile. This resolves problems
892         under SVN (and probably Arch) where revisions are expressed as
893         numbers. I'm inclined to use string-based revisions everywhere in
894         the future, but this fix should be safe for now. Thanks to Steven
895         Walter for the patch.
897         * buildbot/changes/changes.py (ChangeMaster.saveYourself): use
898         binary mode when opening pickle files, to make windows work
899         better. Thanks to Dobes Vandermeer for the catch.
900         * buildbot/status/builder.py (BuildStatus.saveYourself): same
901         (BuilderStatus.getBuildByNumber): same
902         (Status.builderAdded): same
903         * buildbot/master.py (BuildMaster.loadChanges): same
905         * buildbot/util.py (Swappable): delete unused leftover code
907         * buildbot/process/step.py (SVN): when building on a non-default
908         branch, add the word "[branch]" to the VC step's description, so
909         it is obvious that we're not building the usual stuff. Likewise,
910         when we are building a specific revision, add the text "rNNN" to
911         indicate what that revision number is. Thanks to Brad Hards and
912         Nathaniel Smith for the suggestion.
913         (Darcs.startVC): same
914         (Arch.startVC): same
915         (Bazaar.startVC): same
917         * buildbot/process/factory.py (GNUAutoconf.__init__): fix a silly
918         typo, caught by Mark Dillavou, closes SF#1216636.
920         * buildbot/test/test_status.py (Log.TODO_testDuplicate): add notes
921         about a test to add some day
923         * docs/examples/twisted_master.cfg: update: bot1 can now handle
924         the 'full-2.3' build, and the 'reactors' build is now run under
925         python-2.4 because the buildslave no longer has gtk/etc bindings
926         for earlier versions.
928 2005-11-03  Brian Warner  <warner@lothar.com>
930         * buildbot/interfaces.py (IBuilderControl.resubmitBuild): new
931         method, takes an IBuildStatus and rebuilds it. It might make more
932         sense to add this to IBuildControl instead, but that instance goes
933         away completely once the build has finished, and resubmitting
934         builds can take place weeks later.
935         * buildbot/process/builder.py (BuilderControl.resubmitBuild): same
936         * buildbot/status/html.py (StatusResourceBuild): also stash an
937         IBuilderControl so we can use resubmitBuild.
938         (StatusResourceBuild.body): render "resubmit" button if we can.
939         Also add hrefs for each BuildStep
940         (StatusResourceBuild.rebuild): add action for "resubmit" button
941         (StatusResourceBuilder.getChild): give it an IBuilderControl
943         * buildbot/status/builder.py (Status.getURLForThing): change the
944         URL for BuildSteps to have a "step-" prefix, so the magic URLs
945         that live as targets of buttons like "stop" and "rebuild" can't
946         collide with them.
947         * buildbot/status/builder.py (Status.getURLForThing): same
948         * buildbot/status/html.py (StatusResourceBuild.getChild): same
949         (StepBox.getBox): same
950         * buildbot/test/test_web.py (GetURL): same
951         (Logfile): same
953         * buildbot/process/step.py (SVN.__init__): put svnurl/baseURL
954         exclusivity checks after Source.__init__ upcall, so misspelled
955         arguments will be reported more usefully
956         (Darcs.__init__): same
958 2005-10-29  Brian Warner  <warner@lothar.com>
960         * docs/examples/twisted_master.cfg: don't double-fire the 'quick'
961         builder. Move the Try scheduler off to a separate port.
963 2005-10-27  Brian Warner  <warner@lothar.com>
965         * buildbot/clients/gtkPanes.py
966         (TwoRowClient.remote_builderRemoved): disappearing Builders used
967         to cause the app to crash, now they don't.
969         * buildbot/clients/debug.py: display the buildmaster's location
970         in the window's title bar
972 2005-10-26  Brian Warner  <warner@lothar.com>
974         * buildbot/status/mail.py (MailNotifier): urllib.escape the URLs
975         in case they have spaces or whatnot. Patch from Dobes Vandermeer.
976         * buildbot/test/test_status.py (MyStatus.getURLForThing): fix it
978         * buildbot/status/html.py (td): put a single non-breaking space
979         inside otherwise empty <td> elements, as a workaround for buggy
980         browsers which would optimize them away (along with any associated
981         styles, like the kind that create the waterfall grid borders).
982         Patch from Frerich Raabe.
984         * buildbot/process/step_twisted.py (Trial): expose the trialMode=
985         argv-list as an argument, defaulting to ["-to"], which is
986         appropriate for the Trial that comes with Twisted-2.1.0 and
987         earlier. The Trial in current Twisted SVN wants
988         ["--reporter=bwverbose"] instead. Also expose trialArgs=, which
989         defaults to an empty list.
990         * buildbot/process/process_twisted.py (TwistedTrial.trialMode):
991         match it, now that trialMode= is a list instead of a single string
993         * buildbot/__init__.py (version): bump to 0.7.0+ while between
994         releases
995         * docs/buildbot.texinfo: same
997 2005-10-24  Brian Warner  <warner@lothar.com>
999         * buildbot/__init__.py (version): Releasing buildbot-0.7.0
1000         * docs/buildbot.texinfo: set version number to match
1002 2005-10-24  Brian Warner  <warner@lothar.com>
1004         * README: update for 0.7.0
1005         * NEWS: same
1006         * docs/buildbot.texinfo: move the freshcvs stuff out of the README
1008         * buildbot/clients/debug.glade: add 'branch' box to fake-commit
1009         * buildbot/clients/debug.py (DebugWidget.do_commit): same. Don't
1010         send the branch= argument unless the user really provided one, to
1011         retain compatibility with older buildmasters that don't accept
1012         that argument.
1013         * buildbot/master.py (DebugPerspective.perspective_fakeChange):
1014         same
1016         * docs/buildbot.texinfo: update lots of stuff
1018         * buildbot/scripts/runner.py (sendchange): add a --branch argument
1019         to the 'buildbot sendchange' command
1020         * buildbot/clients/sendchange.py (Sender.send): same
1021         * buildbot/changes/pb.py (ChangePerspective): same
1022         * buildbot/test/test_changes.py (Sender.testSender): test it
1024         * buildbot/process/step.py (SVN.__init__): change 'base_url' and
1025         'default_branch' argument names to 'baseURL' and 'defaultBranch',
1026         for consistency with other BuildStep arguments that use camelCase.
1027         Well, at least more of them use camelCase (like flunkOnWarnings)
1028         than don't.. I wish I'd picked one style and stuck with it
1029         earlier. Annoying, but it's best done before the release, since
1030         these arguments didn't exist at all in 0.6.6 .
1031         (Darcs): same
1032         * buildbot/test/test_vc.py (SVN.testCheckout): same
1033         (Darcs.testPatch): same
1034         * docs/buildbot.texinfo (SVN): document the change
1035         (Darcs): same, add some build-on-branch docs
1036         * docs/examples/twisted_master.cfg: match change
1038         * buildbot/process/step.py (BuildStep): rename
1039         slaveVersionNewEnough to slaveVersionIsOlderThan, because that's
1040         how it is normally used.
1041         * buildbot/test/test_steps.py (Version.checkCompare): same
1043         * buildbot/process/step.py (CVS.startVC): refuse to build
1044         update/copy -style builds on a non-default branch with an old
1045         buildslave (<=0.6.6) that doesn't know how to do it properly. The
1046         concern is that it will do a VC 'update' in an existing tree when
1047         it is supposed to be switching branches (and therefore clobbering
1048         the tree to do a full checkout), thus building the wrong source.
1049         This used to be a warning, but I think the confusion it is likely
1050         to cause warrants making it an error.
1051         (SVN.startVC): same, also make mode=export on old slaves an error
1052         (Darcs.startVC): same
1053         (Git.startVC): improve error message for non-Git-enabled slaves
1054         (Arch.checkSlaveVersion): same. continue to emit a warning when a
1055         specific revision is built on a slave that doesn't pay attention
1056         to args['revision'], because for slowly-changing trees it will
1057         probably do the right thing, and because we have no way to tell
1058         whether we're asking it to build the most recent version or not.
1059         * buildbot/interfaces.py (BuildSlaveTooOldError): new exception
1061         * buildbot/scripts/runner.py (SlaveOptions.postOptions): assert
1062         that 'master' is in host:portnum format, to catch errors sooner
1064 2005-10-23  Brian Warner  <warner@lothar.com>
1066         * buildbot/process/step_twisted.py (ProcessDocs.createSummary):
1067         when creating the list of warning messages, include the line
1068         immediately after each WARNING: line, since that's usually where
1069         the file and line number wind up.
1071         * docs/examples/twisted_master.cfg: OS-X slave now does QT, add a
1072         TryScheduler
1074         * NEWS: update
1076 2005-10-22  Brian Warner  <warner@lothar.com>
1078         * buildbot/status/html.py (HtmlResource): incorporate valid-HTML
1079         patch from Brad Hards
1080         * buildbot/status/classic.css: same
1081         * buildbot/test/test_web.py (Waterfall): match changes
1083         * buildbot/test/test_steps.py (BuildStep.setUp): set
1084         nextBuildNumber so the test passes
1085         * buildbot/test/test_status.py (MyBuilder): same
1087         * buildbot/status/html.py (StatusResourceBuild.body): revision
1088         might be numeric, so stringify it before html-escapifying it
1089         (CurrentBox.getBox): add a "waiting" state, and show a countdown
1090         timer for the upcoming build
1091         * buildbot/status/classic.css: add background-color attributes for
1092         offline/waiting/building classes
1094         * buildbot/status/builder.py (BuildStatus): derive from
1095         styles.Versioned, fix upgrade of .sourceStamp attribute. Also set
1096         the default (i.e. unknown) .slavename to "???" instead of None,
1097         since even unknown slavenames need to be printed eventually.
1098         (BuilderStatus): also derive from styles.Versioned . More
1099         importantly, determine .nextBuildNumber at creation/unpickling
1100         time by scanning the directory of saved BuildStatus instances and
1101         choosing one larger than the highest-numbered one found. This
1102         should fix the problem where random errors during upgrades cause
1103         the buildbot to forget about earlier builds. .nextBuildNumber is
1104         no longer stored in the pickle.
1105         (Status.builderAdded): if we can't unpickle the BuilderStatus,
1106         at least log the error. Also call Builder.determineNextBuildNumber
1107         once the basedir is set.
1109         * buildbot/master.py (BuildMaster.loadChanges): do
1110         styles.doUpgrade afterwards, in case I decide to make Changes
1111         derived from styles.Versioned some day and forget to make this
1112         change later.
1115         * buildbot/test/test_runner.py (Options.testForceOptions): skip
1116         when running under older pythons (<2.3) in which the shlex module
1117         doesn't have a 'split' function.
1119         * buildbot/process/step.py (ShellCommand.start): make
1120         errorMessages= be a list of strings to stuff in the log before the
1121         command actually starts. This makes it easier to flag multiple
1122         warning messages, e.g. when the Source steps have to deal with an
1123         old buildslave.
1124         (CVS.startVC): handle slaves that don't handle multiple branches
1125         by switching into 'clobber' mode
1126         (SVN.startVC): same. Also reject branches without base_url
1127         (Darcs.startVC): same. Also reject revision= in older slaves
1128         (Arch.checkSlaveVersion): same (just the multiple-branches stuff)
1129         (Bazaar.startVC): same, and test for baz separately than for arch
1131         * buildbot/slave/commands.py (cvs_ver): document new features
1133         * buildbot/process/step.py (BuildStep.slaveVersion): document it
1134         (BuildStep.slaveVersionNewEnough): more useful utility method
1135         * buildbot/test/test_steps.py (Version): start testing it
1137         * buildbot/status/words.py (IrcStatusBot.command_FORCE): note that
1138         the 'force' command requires python2.3, for the shlex.split method
1140         * docs/examples/twisted_master.cfg: remove old freshcvs stuff,
1141         since we don't use it anymore. The Twisted buildbot uses a
1142         PBChangeSource now.
1144 2005-10-21  Brian Warner  <warner@lothar.com>
1146         * buildbot/process/process_twisted.py: rework all BuildFactory
1147         classes to take a 'source' step as an argument, instead of
1148         building up the SVN instance in the factory.
1149         * docs/examples/twisted_master.cfg: enable build-on-branch by
1150         providing a base_url and default_branch
1152         * buildbot/status/words.py (IrcStatusBot.command_FORCE): add
1153         control over --branch and --revision, not that they are always
1154         legal to provide
1155         * buildbot/status/html.py (StatusResourceBuilder.force): same
1156         (StatusResourceBuild.body): display SourceStamp components
1158         * buildbot/scripts/runner.py (ForceOptions): option parser for the
1159         IRC 'force' command, so it can be shared with an eventual
1160         command-line-tool 'buildbot force' mode.
1161         * buildbot/test/test_runner.py (Options.testForceOptions): test it
1163 2005-10-20  Brian Warner  <warner@lothar.com>
1165         * buildbot/status/mail.py (MailNotifier.buildMessage): reformat
1167         * docs/examples/twisted_master.cfg: update to use Schedulers
1169         * buildbot/scripts/sample.cfg: update with Schedulers
1171         * buildbot/interfaces.py (IBuilderControl.requestBuildSoon): new
1172         method specifically for use by HTML "force build" button and the
1173         IRC "force" command. Raises an immediate error if there are no
1174         slaves available.
1175         (IBuilderControl.requestBuild): make this just submit a build, not
1176         try to check for existing slaves or set up any when-finished
1177         Deferreds or anything.
1178         * buildbot/process/builder.py (BuilderControl): same
1179         * buildbot/status/html.py (StatusResourceBuilder.force): same
1180         * buildbot/status/words.py (IrcStatusBot.command_FORCE): same
1181         * buildbot/test/test_slaves.py: same
1182         * buildbot/test/test_web.py: same
1184 2005-10-19  Brian Warner  <warner@lothar.com>
1186         * docs/examples/twisted_master.cfg: re-sync with reality: bring
1187         back python2.2 tests, turn off OS-X threadedselect-reactor tests
1189 2005-10-18  Brian Warner  <warner@lothar.com>
1191         * buildbot/status/html.py: provide 'status' argument to most
1192         StatusResourceFOO objects
1193         (StatusResourceBuild.body): href-ify the Builder name, add "Steps
1194         and Logfiles" section to make the Build page into a more-or-less
1195         comprehensive source of status information about the build
1197         * buildbot/status/mail.py (MailNotifier): include the Build's URL
1198         * buildbot/status/words.py (IrcStatusBot.buildFinished): same
1200 2005-10-17  Brian Warner  <warner@lothar.com>
1202         * buildbot/process/process_twisted.py (TwistedTrial): update Trial
1203         arguments to accomodate Twisted >=2.1.0 . I will have to figure
1204         out what to do about other projects: the correct options for
1205         recent Twisteds will not work for older ones.
1207 2005-10-15  Brian Warner  <warner@lothar.com>
1209         * buildbot/status/builder.py (Status.getURLForThing): add method
1210         to provide a URL for arbitrary IStatusFoo objects. The idea is to
1211         use this in email/IRC status clients to make them more useful, by
1212         providing the end user with hints on where to learn more about the
1213         object being reported on.
1214         * buildbot/test/test_web.py (GetURL): tests for it
1216 2005-10-14  Brian Warner  <warner@lothar.com>
1218         * buildbot/test/test_config.py (ConfigTest._testSources_1): oops,
1219         fix bug resulting from deferredResult changes
1221 2005-10-13  Brian Warner  <warner@lothar.com>
1223         * buildbot/test/test_changes.py: remove use of deferredResult
1224         * buildbot/test/test_config.py: same
1225         * buildbot/test/test_control.py: same
1226         * buildbot/test/test_status.py: same
1227         * buildbot/test/test_vc.py: this is the only remaining use, since
1228         it gets used at module level. This needs to be replaced by some
1229         sort of class-level run-once routine.
1231         * buildbot/status/words.py (IrcStatusBot.command_WATCH): fix typo
1233         * lots: implement multiple slaves per Builder, which means multiple
1234         current builds per Builder. Some highlights:
1235         * buildbot/interfaces.py (IBuilderStatus.getState): return a tuple
1236         of (state,currentBuilds) instead of (state,currentBuild)
1237         (IBuilderStatus.getCurrentBuilds): replace getCurrentBuild()
1238         (IBuildStatus.getSlavename): new method, so you can tell which
1239         slave got used. This only gets set when the build completes.
1240         (IBuildRequestStatus.getBuilds): new method
1242         * buildbot/process/builder.py (SlaveBuilder): add a .state
1243         attribute to track things like ATTACHING and IDLE and BUILDING,
1244         instead of..
1245         (Builder): .. the .slaves attribute here, which has been turned
1246         into a simple list of available slaves. Added a separate
1247         attaching_slaves list to track ones that are not yet ready for
1248         builds.
1249         (Builder.fireTestEvent): put off the test-event callback for a
1250         reactor turn, to make tests a bit more consistent.
1251         (Ping): cleaned up the slaveping a bit, now it disconnects if the
1252         ping fails due to an exception. This needs work, I'm worried that
1253         a code error could lead to a constantly re-connecting slave.
1254         Especially since I'm trying to move to a distinct remote_ping
1255         method, separate from the remote_print that we currently use.
1256         (BuilderControl.requestBuild): return a convenience Deferred that
1257         provides an IBuildStatus when the build finishes.
1258         (BuilderControl.ping): ping all connected slaves, only return True
1259         if they all respond.
1261         * buildbot/slave/bot.py (BuildSlave.stopService): stop trying to
1262         reconnect when we shut down.
1264         * buildbot/status/builder.py: implement new methods, convert
1265         one-build-at-a-time methods to handle multiple builds
1266         * buildbot/status/*.py: do the same in all default status targets
1267         * buildbot/status/html.py: report the build's slavename in the
1268         per-Build page, report all buildslaves on the per-Builder page
1270         * buildbot/test/test_run.py: update/create tests
1271         * buildbot/test/test_slaves.py: same
1272         * buildbot/test/test_scheduler.py: remove stale test
1274         * docs/buildbot.texinfo: document the new builder-specification
1275         'slavenames' parameter
1277 2005-10-12  Brian Warner  <warner@lothar.com>
1279         * buildbot/buildset.py (BuildSet): fix bug where BuildSet did not
1280         report failure correctly, causing Dependent builds to run when
1281         they shouldn't have.
1282         * buildbot/status/builder.py (BuildSetStatus): same
1283         * buildbot/test/test_buildreq.py (Set.testBuildSet): verify it
1284         (Set.testSuccess): test the both-pass case too
1285         * buildbot/test/test_dependencies.py (Dependencies.testRun_Fail):
1286         fix this test: it was ending too early, masking the failure before
1287         (Logger): specialized StatusReceiver to make sure the dependent
1288         builds aren't even started, much less completed.
1290 2005-10-07  Brian Warner  <warner@lothar.com>
1292         * buildbot/slave/bot.py (SlaveBuilder.activity): survive
1293         bot.SlaveBuilder being disowned in the middle of a build
1295         * buildbot/status/base.py (StatusReceiverMultiService): oops, make
1296         this inherit from StatusReceiver. Also upcall in __init__. This
1297         fixes the embarrasing crash when the new buildSetSubmitted method
1298         is invoked and Waterfall/etc don't implement their own.
1299         * buildbot/test/test_run.py: add a TODO note about a test to catch
1300         just this sort of thing.
1302         * buildbot/process/builder.py (Builder.attached): remove the
1303         already-attached warning, this situation is normal. Add some
1304         comments explaining it.
1306 2005-10-02  Brian Warner  <warner@lothar.com>
1308         * buildbot/changes/maildir.py (Maildir.start): Tolerate
1309         OverflowError when setting up dnotify, because some 64-bit systems
1310         have problems with signed-vs-unsigned constants and trip up on the
1311         DN_MULTISHOT flag. Patch from Brad Hards.
1313 2005-09-06  Fred Drake  <fdrake@users.sourceforge.net>
1315         * buildbot/process/step.py (BuildStep, ShellCommand): Add
1316         progressMetrics, description, descriptionDone to the 'parms' list,
1317         and make use the 'parms' list from the implementation class
1318         instead of only BuildStep to initialize the parameters.  This
1319         allows buildbot.process.factory.s() to initialize all the parms,
1320         not just those defined in directly by BuildStep.
1322 2005-09-03  Brian Warner  <warner@lothar.com>
1324         * NEWS: start adding items for the next release
1326         * docs/examples/twisted_master.cfg: (sync with reality) turn off
1327         python2.2 tests, change 'Quick' builder to only use python2.3
1329 2005-09-02  Fred Drake  <fdrake@users.sourceforge.net>
1331         * buildbot/status/html.py (StatusResourceBuilder.body): only show
1332         the "Ping Builder" button if the build control is available; the
1333         user sees an exception otherwise
1335         * docs/buildbot.texinfo (PBChangeSource): fix a typo
1337 2005-09-01  Brian Warner  <warner@lothar.com>
1339         * buildbot/interfaces.py (IBuilderStatus.getState): update
1340         signature, point out that 'build' can be None
1341         (IBuildStatus.getETA): point out ETA can be none
1343         * buildbot/status/html.py (CurrentBox.getBox): tolerate build/ETA
1344         being None
1345         * buildbot/status/words.py (IrcStatusBot.emit_status): same
1347 2005-08-31  Brian Warner  <warner@lothar.com>
1349         * buildbot/status/base.py (StatusReceiver.builderChangedState):
1350         update to match correct signature: removed 'eta' argument
1351         * buildbot/status/mail.py (MailNotifier.builderChangedState): same
1353 2005-08-30  Brian Warner  <warner@lothar.com>
1355         * buildbot/status/builder.py (LogFile): remove the assertion that
1356         blows up when you try to overwrite an existing logfile, instead
1357         just emit a warning. This case gets hit when the buildmaster is
1358         killed and doesn't get a chance to write out the serialized
1359         BuilderStatus object, so the .nextBuildNumber attribute gets out
1360         of date.
1362         * buildbot/scripts/runner.py (sendchange): add --revision_file to
1363         the 'buildbot sendchange' arguments, for the Darcs context file
1364         * docs/buildbot.texinfo (sendchange): document it
1366         * buildbot/status/html.py: add pending/upcoming builds to CurrentBox
1367         * buildbot/interfaces.py (IScheduler.getPendingBuildTimes): new method
1368         (IStatus.getSchedulers): new method
1369         * buildbot/status/builder.py (BuilderStatus): track pendingBuilds
1370         (Status.getSchedulers): implement
1371         * buildbot/process/builder.py (Builder): maintain
1372         BuilderStatus.pendingBuilds
1373         * buildbot/scheduler.py (Scheduler.getPendingBuildTimes): new method
1374         (TryBase.addChange): Try schedulers should ignore Changes
1376         * buildbot/scripts/tryclient.py (getTopdir): implement getTopdir
1377         for 'try' on CVS/SVN
1378         * buildbot/test/test_runner.py (Try.testGetTopdir): test case
1380         * buildbot/scripts/tryclient.py (Try): make jobdir-style 'try'
1381         report status properly.
1382         (Try.createJob): implement unique buildset IDs
1384         * buildbot/status/client.py (StatusClientPerspective): add a
1385         perspective_getBuildSets method for the benefit of jobdir-style
1386         'try'.
1387         * docs/buildbot.texinfo (try): more docs
1388         * buildbot/test/test_scheduler.py (Scheduling.testGetBuildSets):
1389         new test case
1391 2005-08-18  Brian Warner  <warner@lothar.com>
1393         * buildbot/scripts/tryclient.py (Try): make 'try' status reporting
1394         actually work. It's functional but still kind of clunky. Also, it
1395         only works with the pb-style.. needs to be made to work with the
1396         jobdir-style too.
1398         * buildbot/status/client.py (RemoteBuildSet): new class
1399         (RemoteBuildRequest): same
1400         (RemoteBuild.remote_waitUntilFinished): return the RemoteBuild
1401         object, not the internal BuildStatus object.
1402         (RemoteBuild.remote_subscribe): new method to subscribe to builds
1403         outside of the usual buildStarted() return value.
1404         (BuildSubscriber): support class for RemoteBuild.remote_subscribe
1406         * buildbot/scheduler.py (Try_Jobdir): convey buildsetID properly
1407         (Try_Userpass_Perspective.perspective_try): return a remotely
1408         usable BuildSetStatus object
1410         * buildbot/interfaces.py (IBuildStatus): remove obsolete
1411         isStarted()/waitUntilStarted()
1413 2005-08-16  Brian Warner  <warner@lothar.com>
1415         * buildbot/status/builder.py: implement IBuildSetStatus and
1416         IBuildRequestStatus, wire them into place.
1417         * buildbot/buildset.py: same. Add ID, move wait-until-finished
1418         methods into the BuildSetStatus object.
1419         * buildbot/interfaces.py: same
1420         (IStatus.getBuildSets): new method to get pending BuildSets
1421         (IStatusReceiver.buildsetSubmitted): new method which hears about
1422         new BuildSets
1423         * buildbot/master.py (BuildMaster.submitBuildSet): same
1424         * buildbot/process/base.py (BuildRequest): same, replace
1425         waitUntilStarted with subscribe/unsubscribe
1426         * buildbot/process/builder.py (BuilderControl.forceBuild): use
1427         subscribe instead of waitUntilStarted
1428         * buildbot/status/base.py (StatusReceiver.buildsetSubmitted): stub
1429         for new method
1430         * buildbot/status/client.py (StatusClientPerspective.builderRemoved): 
1431         same
1432         * buildbot/test/test_buildreq.py: update for new code
1433         * buildbot/test/test_control.py (Force.testRequest): same
1436         * buildbot/slave/commands.py (Darcs.doVCFull): fix get-revision
1437         for Darcs to not use the tempfile module, so it works under
1438         python-2.2 too. We really didn't need the full cleverness of that
1439         module, since the slave has exclusive control of its own builddir.
1441 2005-08-15  Brian Warner  <warner@lothar.com>
1443         * buildbot/scripts/tryclient.py (CVSExtractor): implement 'try'
1444         for CVS trees. It doesn't work for non-trunk branches,
1445         unfortunately.
1446         * buildbot/test/test_vc.py (CVS.testTry): test it, but skip the
1447         branch test
1449         * Makefile: make it easier to test against python2.2
1451         * buildbot/test/test_vc.py (VCBase.tearDown): provide for
1452         tearDown2, so things like Arch can unregister archives as they're
1453         shutting down. The previous subclass-override-tearDown technique
1454         resulted in a nested maybeWait() and test failures under
1455         Twisted-1.3.0
1457         * buildbot/scripts/tryclient.py (getSourceStamp): extract branches
1458         where we can (Arch), add a branch= argument to set the branch used
1459         when we can't
1460         (BazExtractor): extract the branch too
1461         (TlaExtractor): same
1462         * buildbot/scripts/runner.py (TryOptions): add --branch
1463         * docs/buildbot.texinfo (try): document --branch/try_branch
1465         * buildbot/slave/commands.py (Darcs): implement get-revision for
1466         Darcs, so that 'try' will work. This requires the tempfile module
1467         from python-2.3 .
1469         * buildbot/test/test_vc.py: rewrite tests, getting better coverage
1470         of revisions, branches, and 'try' in the process.
1472 2005-08-11  Brian Warner  <warner@lothar.com>
1474         * buildbot/master.py (DebugPerspective.perspective_pokeIRC): fix
1475         this, it got broken at some point in the last few releases
1476         * buildbot/status/words.py (IrcBuildRequest): reply was broken
1477         (IrcStatusBot.emit_status): handle new IBuilderStatus.getState,
1478         specifically the removal of ETA information from the tuple
1480         * buildbot/locks.py: use %d for id() instead of %x, avoid a silly
1481         warning message
1483         * docs/buildbot.texinfo (try): document both --builder and
1484         'try_builders' in .buildbot/options
1485         * buildbot/scripts/runner.py (TryOptions): add --builder,
1486         accumulate the values into opts['builders']
1487         * buildbot/scripts/tryclient.py (Try.__init__): set builders
1488         * buildbot/test/test_runner.py (Try): add some quick tests to make
1489         sure 'buildbot try --options' and .buildbot/options get parsed
1490         * buildbot/test/test_scheduler.py (Scheduling.testTryUserpass):
1491         use --builder control
1493         * docs/buildbot.texinfo (try): add --port argument to PB style
1495         * buildbot/scripts/tryclient.py (SourceStampExtractor): return an
1496         actual SourceStamp. Still need to extract a branch name, somehow.
1497         (Try): finish implementing the try client side, still need a UI
1498         for specifying which builders to use
1499         (Try.getopt): factor our options/config-file reading
1500         * buildbot/test/test_scheduler.py (Scheduling.testTryUserpass):
1501         test it
1502         * buildbot/test/test_vc.py: match SourceStampExtractor change
1504         * buildbot/scripts/runner.py (Options.opt_verbose): --verbose
1505         causes the twisted log to be sent to stderr
1507         * buildbot/scheduler.py (Try_Userpass): implement the PB style
1509 2005-08-10  Brian Warner  <warner@lothar.com>
1511         * buildbot/scripts/runner.py: Add 'buildbot try' command, jobdir
1512         style is 90% done, still missing status reporting or waiting for
1513         the buildsets to finish, and it is completely untested.
1515         * buildbot/trybuild.py: delete file, move contents to ..
1516         * buildbot/scripts/tryclient.py (getSourceStamp): .. here
1517         * buildbot/test/test_vc.py: match the move
1519         * buildbot/scheduler.py (Try_Jobdir): implement the jobdir style
1520         of the TryScheduler, no buildsetID or status-tracking support yet
1521         * buildbot/test/test_scheduler.py (Scheduling.testTryJobdir): test it
1523         * buildbot/changes/maildir.py (Maildir.setBasedir): make it
1524         possible to set the basedir after __init__ time, so it is easier
1525         to use as a Service-child of the BuildMaster instance
1527         * buildbot/changes/maildirtwisted.py (MaildirService): make a form
1528         that delivers messages to its Service parent instead of requiring
1529         a subclass to be useful. This turns out to be much easier to build
1530         unit tests around.
1532         * buildbot/scripts/tryclient.py (createJob): utility code to
1533         create jobfiles, will eventually be used by 'buildbot try'
1535 2005-08-08  Brian Warner  <warner@lothar.com>
1537         * docs/buildbot.texinfo (try): add docs on the
1538         as-yet-unimplemented Try scheduler
1540         * buildbot/test/test_buildreq.py: move Scheduling tests out to ..
1541         * buildbot/test/test_scheduler.py: .. here
1542         (Scheduling.testTryJobdir): add placeholder test for 'try'
1544         * buildbot/test/test_status.py (Log.testMerge3): update to match new
1545         addEntry merging (>=chunkSize) behavior
1546         (Log.testConsumer): update to handle new callLater(0) behavior
1548         * buildbot/test/test_web.py: rearrange tests a bit, add test for
1549         both the MAX_LENGTH bugfix and the resumeProducing hang.
1551         * buildbot/status/builder.py (LogFileProducer.resumeProducing):
1552         put off the actual resumeProducing for a moment with
1553         reactor.callLater(0). This works around a twisted-1.3.0 bug which
1554         causes large logfiles to hang midway through.
1556         * buildbot/process/step.py (BuildStep.addCompleteLog): break the
1557         logfile up into chunks, both to avoid NetstringReceiver.MAX_LENGTH
1558         and to improve memory usage when streaming the file out to a web
1559         browser.
1560         * buildbot/status/builder.py (LogFile.addEntry): change > to >= to
1561         make this work cleanly
1563 2005-08-03  Brian Warner  <warner@lothar.com>
1565         * buildbot/trybuild.py: new file for 'try' utilities
1566         (getSourceStamp): run in a tree, find out the baserev+patch
1567         * buildbot/test/test_vc.py (VCBase.do_getpatch): test it,
1568         implemented for SVN and Darcs, still working on Arch. I don't know
1569         how to make CVS work yet.
1571         * docs/buildbot.texinfo: document the 'buildbot' command-line
1572         tool, including the not-yet-implemented 'try' feature, and the
1573         in-flux .buildbot/ options directory.
1575 2005-07-20  Brian Warner  <warner@lothar.com>
1577         * buildbot/locks.py: added temporary id() numbers to Lock
1578         descriptions, to track down a not-really-sharing-the-Lock bug
1580         * buildbot/test/runutils.py: must import errno, cut-and-paste bug
1582         * buildbot/test/test_slavecommand.py (ShellBase.failUnlessIn):
1583         needed for python2.2 compatibility
1584         * buildbot/test/test_vc.py: python2.2 compatibility: generators
1585         are from the __future__
1587 2005-07-19  Brian Warner  <warner@lothar.com>
1589         * buildbot/master.py (BuildMaster.loadConfig): give a better error
1590         message when schedulers use unknown builders
1592         * buildbot/process/builder.py (Builder.compareToSetup): make sure
1593         SlaveLock('name') and MasterLock('name') are distinct
1595         * buildbot/master.py (BuildMaster.loadConfig): oops, sanity-check
1596         c['schedulers'] in such a way that we can actually accept
1597         Dependent instances
1598         * buildbot/test/test_config.py: check it
1600         * buildbot/scheduler.py (Dependent.listBuilderNames): oops, add
1601         utility method to *all* the Schedulers
1602         (Periodic.listBuilderNames): same
1604         * docs/buildbot.texinfo (Interlocks): update chapter to match
1605         reality
1607         * buildbot/master.py (BuildMaster.loadConfig): Add sanity checks
1608         to make sure that c['sources'], c['schedulers'], and c['status']
1609         are all lists of the appropriate objects, and that the Schedulers
1610         all point to real Builders
1611         * buildbot/interfaces.py (IScheduler, IUpstreamScheduler): add
1612         'listBuilderNames' utility method to support this
1613         * buildbot/scheduler.py: implement the utility method
1614         * buildbot/test/test_config.py (ConfigTest.testSchedulers): test it
1616         * docs/buildbot.texinfo: add some @cindex entries
1618         * buildbot/test/test_vc.py (Arch.createRepository): set the tla ID
1619         if it wasn't already set: most tla commands will fail unless one
1620         has been set.
1621         (Arch.createRepository): and disable bazaar's revision cache, since
1622         they cause test failures (the multiple repositories we create all
1623         interfere with each other through the cache)
1625         * buildbot/test/test_web.py (WebTest): remove use of deferredResult,
1626         bring it properly up to date with twisted-2.0 test guidelines
1628         * buildbot/master.py (BuildMaster): remove references to old
1629         'interlock' module, this caused a bunch of post-merge test
1630         failures
1631         * buildbot/test/test_config.py: same
1632         * buildbot/process/base.py (Build): same
1634         * buildbot/test/test_slaves.py: stubs for new test case
1636         * buildbot/scheduler.py: add test-case-name tag
1637         * buildbot/test/test_buildreq.py: same
1639         * buildbot/slave/bot.py (SlaveBuilder.__init__): remove some
1640         unnecessary init code
1641         (Bot.remote_setBuilderList): match it
1643         * docs/buildbot.texinfo (@settitle): don't claim version 1.0
1645         * buildbot/changes/mail.py (parseSyncmail): update comment
1647         * buildbot/test/test_slavecommand.py: disable Shell tests on
1648         platforms that don't suport IReactorProcess
1650         * buildbot/status/builder.py (LogFile): remove the 't' mode from
1651         all places where we open logfiles. It causes OS-X to open the file
1652         in some weird mode that that prevents us from mixing reads and
1653         writes to the same filehandle, which we depend upon to implement
1654         _generateChunks properly. This change doesn't appear to break
1655         win32, on which "b" and "t" are treated differently but a missing
1656         flag seems to be interpreted as "t".
1658 2005-07-18  Brian Warner  <warner@lothar.com>
1660         * buildbot/slave/commands.py (ShellCommand): overhaul
1661         error-handling code, to try and make timeout/interrupt work
1662         properly, and make win32 happier
1663         * buildbot/test/test_slavecommand.py: clean up, stop using
1664         reactor.iterate, add tests for timeout and interrupt
1665         * buildbot/test/sleep.py: utility for a new timeout test
1667         * buildbot/twcompat.py: copy over twisted 1.3/2.0 compatibility
1668         code from the local-usebranches branch
1670 2005-07-17  Brian Warner  <warner@lothar.com>
1672         * buildbot/process/process_twisted.py
1673         (TwistedReactorsBuildFactory): change the treeStableTimer to 5
1674         minutes, to match the other twisted BuildFactories, and don't
1675         excuse failures in c/qt/win32 reactors any more.
1677         * docs/examples/twisted_master.cfg: turn off the 'threadless' and
1678         'freebsd' builders, since the buildslaves have been unavailable
1679         for quite a while
1681 2005-07-13  Brian Warner  <warner@lothar.com>
1683         * buildbot/test/test_vc.py (VCBase.do_branch): test the new
1684         build-on-branch feature
1686         * buildbot/process/step.py (Darcs.__init__): add base_url and
1687         default_branch arguments, just like SVN
1688         (Arch.__init__): note that the version= argument is really the
1689         default branch name
1691         * buildbot/slave/commands.py (SourceBase): keep track of the
1692         repository+branch that was used for the last checkout in
1693         SRCDIR/.buildbot-sourcedata . If the contents of this file do not
1694         match, we clobber the directory and perform a fresh checkout
1695         rather than trying to do an in-place update. This should protect
1696         us against trying to get to branch B by doing an update in a tree
1697         obtained from branch A.
1698         (CVS.setup): add CVS-specific sourcedata: root, module, and branch
1699         (SVN.setup): same, just the svnurl
1700         (Darcs.setup): same, just the repourl
1701         (Arch.setup): same, arch coordinates (url), version, and
1702         buildconfig. Also pull the buildconfig from the args dictionary,
1703         which we weren't doing before, so the build-config was effectively
1704         disabled.
1705         (Arch.sourcedirIsUpdateable): don't try to update when we're
1706         moving to a specific revision: arch can't go backwards, so it is
1707         safer to just clobber the tree and checkout a new one at the
1708         desired revision.
1709         (Bazaar.setup): same sourcedata as Arch
1711         * buildbot/test/test_dependencies.py (Dependencies.testRun_Fail):
1712         use maybeWait, to work with twisted-1.3.0 and twcompat
1713         (Dependencies.testRun_Pass): same
1715         * buildbot/test/test_vc.py: rearrange, cleanup
1717         * buildbot/twcompat.py: add defer.waitForDeferred and
1718         utils.getProcessOutputAndValue, so test_vc.py (which uses them)
1719         can work under twisted-1.3.0 .
1721         * buildbot/test/test_vc.py: rewrite. The sample repositories are
1722         now created at setUp time. This increases the runtime of the test
1723         suite considerably (from 91 seconds to 151), but it removes the
1724         need for an offline tarball, which should solve a problem I've
1725         seen where the test host has a different version of svn than the
1726         tarball build host. The new code also validates that mode=update
1727         really picks up recent commits. This approach will also make it
1728         easier to test out branches, because the code which creates the VC
1729         branches is next to the code which uses them. It will also make it
1730         possible to test some change-notification hooks, by actually
1731         performing a VC commit and watching to see the ChangeSource get
1732         notified.
1734 2005-07-12  Brian Warner  <warner@lothar.com>
1736         * docs/buildbot.texinfo (SVN): add branches example
1737         * docs/Makefile (buildbot.ps): add target for postscript manual
1739         * buildbot/test/test_dependencies.py: s/test_interlocks/test_locks/ 
1740         * buildbot/test/test_locks.py: same
1742         * buildbot/process/step.py (Darcs): comment about default branches
1744         * buildbot/master.py (BuildMaster.loadConfig): don't look for
1745         c['interlocks'] in the config file, complain if it is present.
1746         Scan all locks in c['builders'] to make sure the Locks they use
1747         are uniquely named.
1748         * buildbot/test/test_config.py: remove old c['interlocks'] test,
1749         add some tests to check for non-uniquely-named Locks
1750         * buildbot/test/test_vc.py (Patch.doPatch): fix factory.steps,
1751         since the unique-Lock validation code requires it now
1753         * buildbot/locks.py: fix test-case-name
1755         * buildbot/interlock.py: remove old file
1757 2005-07-11  Brian Warner  <warner@lothar.com>
1759         * buildbot/test/test_interlock.py: rename to..
1760         * buildbot/test/test_locks.py: .. something shorter
1762         * buildbot/slave/bot.py (BuildSlave.stopService): newer Twisted
1763         versions (after 2.0.1) changed internet.TCPClient to shut down the
1764         connection in stopService. Change the code to handle this
1765         gracefully.
1767         * buildbot/process/base.py (Build): handle whole-Build locks
1768         * buildbot/process/builder.py (Builder.compareToSetup): same
1769         * buildbot/test/test_interlock.py: make tests work
1771         * buildbot/process/step.py (BuildStep.startStep): complain if a
1772         Step tries to claim a lock that's owned by its own Build
1773         (BuildStep.releaseLocks): typo
1775         * buildbot/locks.py (MasterLock): use ComparableMixin so config
1776         file reloads don't replace unchanged Builders
1777         (SlaveLock): same
1778         * buildbot/test/test_config.py (ConfigTest.testInterlocks):
1779         rewrite to cover new Locks instead of old c['interlocks']
1780         * buildbot/test/runutils.py (RunMixin.connectSlaves): remember
1781         slave2 too
1784         * buildbot/test/test_dependencies.py (Dependencies.setUp): always
1785         start the master and connect the buildslave
1787         * buildbot/process/step.py (FailingDummy.done): finish with a
1788         FAILURE status rather than raising an exception
1790         * buildbot/process/base.py (BuildRequest.mergeReasons): don't try to
1791         stringify a BuildRequest.reason that is None
1793         * buildbot/scheduler.py (BaseUpstreamScheduler.buildSetFinished):
1794         minor fix
1795         * buildbot/status/builder.py (BuildSetStatus): implement enough to
1796         allow scheduler.Dependent to work
1797         * buildbot/buildset.py (BuildSet): set .reason and .results
1799         * buildbot/test/test_interlock.py (Locks.setUp): connect both
1800         slaves, to make the test stop hanging. It still fails, of course,
1801         because I haven't even started to implement Locks.
1803         * buildbot/test/runutils.py (RunMixin.connectSlaves): new utility
1805         * docs/buildbot.texinfo (Build-Dependencies): redesign the feature
1806         * buildbot/interfaces.py (IUpstreamScheduler): new Interface
1807         * buildbot/scheduler.py (BaseScheduler): factor out common stuff
1808         (Dependent): new class for downstream build dependencies
1809         * buildbot/test/test_dependencies.py: tests (still failing)
1811         * buildbot/buildset.py (BuildSet.waitUntilSuccess): minor notes
1813 2005-07-07  Brian Warner  <warner@lothar.com>
1815         * buildbot/test/runutils.py (RunMixin): factored this class out..
1816         * buildbot/test/test_run.py: .. from here
1817         * buildbot/test/test_interlock.py: removed old c['interlock'] tests,
1818         added new buildbot.locks tests (which all hang right now)
1819         * buildbot/locks.py (SlaveLock, MasterLock): implement Locks
1820         * buildbot/process/step.py: claim/release per-BuildStep locks
1822         * docs/Makefile: add 'buildbot.html' target
1824         * buildbot/process/step.py (CVS.__init__): allow branch=None to be
1825         interpreted as "HEAD", so that all VC steps can accept branch=None
1826         and have it mean the "default branch".
1828         * docs/buildbot.texinfo: add Schedulers, Dependencies, and Locks
1830 2005-07-07  Brian Warner  <warner@lothar.com>
1832         * docs/examples/twisted_master.cfg: update to match current usage
1834         * docs/buildbot.texinfo (System Architecture): comment out the
1835         image, it doesn't exist yet and just screws up the HTML manual.
1837 2005-07-05  Brian Warner  <warner@lothar.com>
1839         * debian/.cvsignore: oops, missed one. Removing leftover file.
1841 2005-06-17  Brian Warner  <warner@lothar.com>
1843         * buildbot/test/test_vc.py (VCSupport.__init__): svn --version
1844         changed its output in 1.2.0, don't mistakenly think that the
1845         subversion we find isn't capable of supporting our tests.
1847         * debian/*: remove the debian/ directory and its contents, to make
1848         life easier for the proper Debian maintainer
1849         * MANIFEST.in: same
1850         * Makefile (release): same
1852 2005-06-07  Brian Warner  <warner@lothar.com>
1854         * everything: create a distinct SourceStamp class to replace the
1855         ungainly 4-tuple, let it handle merging instead of BuildRequest.
1856         Changed the signature of Source.startVC to include the revision
1857         information (instead of passing it through self.args). Implement
1858         branches for SVN (now only Darcs/Git is missing support). Add more
1859         Scheduler tests.
1861 2005-06-06  Brian Warner  <warner@lothar.com>
1863         * everything: rearrange build scheduling. Create a new Scheduler
1864         object (configured in c['schedulers'], which submit BuildSets to a
1865         set of Builders. Builders can now use multiple slaves. Builds can
1866         be run on alternate branches, either requested manually or driven
1867         by changes. This changed some of the Status classes. Interlocks
1868         are out of service until they've been properly split into Locks
1869         and Dependencies. treeStableTimer, isFileImportant, and
1870         periodicBuild have all been moved from the Builder to the
1871         Scheduler.
1872         (BuilderStatus.currentBigState): removed the 'waiting' and
1873         'interlocked' states, removed the 'ETA' argument.
1875 2005-05-24  Brian Warner  <warner@lothar.com>
1877         * buildbot/pbutil.py (ReconnectingPBClientFactory): Twisted-1.3
1878         erroneously abandons the connection (in clientConnectionFailed)
1879         for non-UserErrors, which means that if we lose the connection due
1880         to a network problem or a timeout, we'll never try to reconnect.
1881         Fix this by not upcalling to the buggy parent method. Note:
1882         twisted-2.0 fixes this, but the function only has 3 lines so it
1883         makes more sense to copy it than to try and detect the buggyness
1884         of the parent class. Fixes SF#1207588.
1886         * buildbot/changes/changes.py (Change.branch): doh! Add a
1887         class-level attribute to accomodate old Change instances that were
1888         pickled before 0.6.5 (where .branch was added for new Changes).
1889         This fixes the exception that occurs when you try to look at an
1890         old Change (through asHTML).
1892         * buildbot/__init__.py (version): bump to 0.6.6+ while between
1893         releases
1895 2005-05-23  Brian Warner  <warner@lothar.com>
1897         * buildbot/__init__.py (version): release 0.6.6
1899 2005-05-23  Brian Warner  <warner@lothar.com>
1901         * NEWS: update for 0.6.6 release
1902         * debian/changelog: same
1904         * buildbot/scripts/runner.py (start): put the basedir in sys.path
1905         before starting: this was done by twistd back when we spawned it,
1906         now that we're importing the pieces and running them in the
1907         current process, we have to do it ourselves. This allows
1908         master.cfg to import files from the same directory without
1909         explicitly manipulating PYTHONPATH. Thanks to Thomas Vander
1910         Stichele for the catch.
1911         (Options.opt_version): Add a --version command (actually, just make
1912         the existing --version command emit Buildbot's version too)
1914         * buildbot/status/builder.py (HTMLLogFile.upgrade): oops! second
1915         fix to make this behave like other LogFiles, this time to handle
1916         existing LogFiles on disk. (add the missing .upgrade method)
1917         * buildbot/test/test_status.py (Log.testHTMLUpgrade): test it
1919 2005-05-21  Brian Warner  <warner@lothar.com>
1921         * buildbot/test/test_runner.py (Create.testMaster): match the
1922         rawstring change in runner.py:masterTAC
1924         * buildbot/test/test_config.py (ConfigTest.testIRC): skip unless
1925         TwistedWords is installed
1926         * buildbot/test/test_status.py: same, with TwistedMail
1928         * buildbot/master.py: remove old IRC/Waterfall imports (used by
1929         some old, deprecated, and removed config keys). This should enable
1930         you to use the base buildbot functionality with Twisted-2.0.0 when
1931         you don't also have TwistedWeb and TwistedWords installed
1933 2005-05-20  Brian Warner  <warner@lothar.com>
1935         * buildbot/scripts/runner.py (run): call sendchange(), not
1936         do_sendchange(): thus 'buildbot sendchange' was broken in 0.6.5
1937         (run): call stop("HUP"), not "-HUP", 'buildbot stop' was broken.
1938         (stop): don't wait for process to die when sending SIGHUP
1939         (masterTAC): use a rawstring for basedir=, otherwise '\' in the
1940         directory name gets interpreted, which you don't want
1941         (slaveTAC): same
1943         * buildbot/__init__.py (version): bump to 0.6.5+ while between
1944         releases
1946 2005-05-18  Brian Warner  <warner@lothar.com>
1948         * buildbot/__init__.py (version): Releasing buildbot-0.6.5
1950 2005-05-18  Brian Warner  <warner@lothar.com>
1952         * README: update for 0.6.5
1953         * debian/changelog: same
1955         * buildbot/changes/changes.py: rename tag= to branch=, since
1956         that's how we're using it, and my design for the upcoming "build a
1957         specific branch" feature wants it. also, tag= was too CVS-centric
1958         * buildbot/changes/mail.py (parseSyncmail): same
1959         * buildbot/process/base.py (Build.isBranchImportant): same
1960         * buildbot/test/test_mailparse.py (Test3.testMsgS4): same
1961         * docs/buildbot.texinfo (Attributes of Changes): same
1963         * NEWS: update tag=, update for upcoming release
1965 2005-05-17  Brian Warner  <warner@lothar.com>
1967         * buildbot/scripts/runner.py (stop): actually poll once per
1968         second, instead of re-killing the poor daemon once per second.
1969         Sleep briefly (0.1s) before the first poll, since there's a good
1970         chance we can avoid waiting the full second if the daemon shuts
1971         down quickly. Also remove the sys.exit() at the end.
1972         (start): remove the unneighborly sys.exit()
1974         * Makefile: improve permission-setting to not kick Arch so badly
1976         * buildbot/scripts/runner.py (SlaveOptions.optParameters): set a
1977         default --keepalive=600, since it doesn't hurt very much, and it's
1978         a hassle to discover that you need it.
1979         * buildbot/test/test_runner.py (Create.testSlave): test it
1981         * buildbot/status/words.py (IrcStatusBot.buildFinished): Teach the
1982         IRC bot about EXCEPTION
1984         * buildbot/status/client.py (PBListener): upcall more correctly
1986         * buildbot/process/base.py (Build.allStepsDone): if a step caused
1987         an exception mark the overall build with EXCEPTION, not SUCCESS
1989         * buildbot/scripts/runner.py (makefile_sample): remove the leading
1990         newline
1991         * buildbot/status/mail.py (MailNotifier): oops, forgot to upcall
1992         * Makefile: update some release-related stuff
1994         * buildbot/slave/commands.py (ShellCommand.kill): if somehow this
1995         gets called when there isn't actually an active process, just end
1996         the Command instead of blowing up. I don't know how it gets into
1997         this state, but the twisted win32 buildslave will sometimes hang,
1998         and when it shakes its head and comes back, it thinks it's still
1999         running a Command. The next build causes this command to be
2000         interrupted, but the lack of self.process.pid breaks the interrupt
2001         attempt.
2003         * NEWS: document changes since the last release
2005         * buildbot/scripts/runner.py (start): change 'buildbot start' to
2006         look for Makefile.buildbot instead of a bare Makefile . The
2007         'buildbot start' does not install this file, so you have to
2008         manually copy it if you want to customize startup behavior.
2009         (createMaster): change 'buildbot master' command to create
2010         Makefile.sample instead of Makefile, to create master.cfg.sample
2011         instead of master.cfg (requiring you to copy it before the
2012         buildmaster can be started). Both sample files are kept up to
2013         date, i.e. they are overwritten if they have been changed. The
2014         'buildbot.tac' file is *not* overwritten, but if the new contents
2015         don't match the old, a 'buildbot.tac.new' file is created and the
2016         user is warned. This seems to be a much more sane way to handle
2017         startup files. Also, don't sys.exit(0) when done, so we can run
2018         unit tests against it.
2019         (createSlave): same. Don't overwrite the sample info/ files.
2020         * buildbot/scripts/sample.mk: remove. the contents were pulled
2021         into runner.py, since they need to match the behavior of start()
2022         * setup.py: same
2023         * MANIFEST.in: same
2025         * docs/buildbot.texinfo (Launching the daemons): document it
2026         * buildbot/test/test_runner.py (Create): test it
2028         * buildbot/test/test_vc.py (SetupMixin.failUnlessIn): Add a
2029         version that can handle string-in-string tests, because otherwise
2030         python-2.2 fails the tests. It'd be tremendous if Trial's test
2031         took two strings under 2.2 too.
2033         * everything: fixed all deprecation warnings when running against
2034         Twisted-2.0 . (at least all the ones in buildbot code, there are a
2035         few that come from Twisted itself). This involved putting most of
2036         the Twisted-version specific code in the new buildbot.twcompat
2037         module, and creating some abstract base classes in
2038         buildbot.changes.base and buildbot.status.base (which might be
2039         useful anyway). __implements__ is a nuisance and requires an ugly
2040         'if' clause everywhere.
2042         * buildbot/test/test_status.py (Mail.testMail): add a 0.1 second
2043         delay before finishing the test: it seems that smtp.sendmail
2044         doesn't hang up on the server, so we must wait a moment so it can
2045         hang up on us. This removes the trial warning about an unclean
2046         reactor.
2048 2005-05-16  Brian Warner  <warner@lothar.com>
2050         * buildbot/process/step.py (Source): add 'retry' argument. It is a
2051         tuple of (delay, repeats).
2052         * buildbot/test/test_vc.py (Retry): test it
2053         * docs/buildbot.texinfo (Source Checkout): document it
2054         * buildbot/slave/commands.py (SourceBase): add 'retry' parameter.
2055         (SourceBase.maybeDoVCRetry): If 'retry' is set, failures in
2056         doVCFull() are handled by re-trying the checkout (after a delay)
2057         some number of times.
2058         (ShellCommand._startCommand): make header lines easier to read
2060         * buildbot/test/test_web.py (WebTest.tearDown): factor out master
2061         shutdown
2062         (WebTest.test_logfile): make sure master gets shut down, silences
2063         some "unclean reactor" test errors
2065         * buildbot/test/test_changes.py (Sender.tearDown): spin the
2066         reactor once after shutdown, something in certain versions of
2067         Twisted trigger a test failure. 1.3.0 is ok, 2.0.0 fails, 2.0.1pre
2068         fails, svn-trunk is ok.
2070         * buildbot/test/test_slavecommand.py (Shell.testShellZ): add a
2071         second win32 error message
2073         * buildbot/test/test_run.py (Status.testSlave): be smarter about
2074         validating the ETA, so the tests don't fail on slow systems
2076 2005-05-15  Brian Warner  <warner@lothar.com>
2078         * buildbot/status/builder.py (HTMLLogFile): make this behave like
2079         the new LogFile class, so upgrading works properly
2080         (LogFileProducer.resumeProducing): survive resumeProducing after
2081         we've exhausted the chunkGenerator
2083         * buildbot/test/test_web.py (WebTest.test_logfile): validate HTML
2084         logs too
2085         * buildbot/test/test_status.py (Log.testAdd): validate hasContents
2086         (Log.testUpgrade): same
2088         * docs/buildbot.texinfo (Maintenance): describe how to delete old
2089         Builds and logs with a cron job.
2091         * buildbot/status/builder.py (LogFile): revamp LogFiles. Got rid
2092         of the old non-offline LogFile, added code to upgrade these to
2093         new-style contents-live-on-disk instances at load time (in a way
2094         that doesn't invalidate the old Build pickles, so upgrading to
2095         0.6.5 is not a one-way operation). Got rid of everything related
2096         to 'stub' builds.
2097         (LogFile.__init__): create LogFiles with the parent step status,
2098         the log's name, and a builder-relative filename where it can keep
2099         the contents on disk.
2100         (LogFile.hasContents): new method, clients are advised to call it
2101         before getText or getChunks and friends. If it returns False, the
2102         log's contents have been deleted and getText() will raise an
2103         error.
2104         (LogFile.getChunks): made it a generator
2105         (LogFile.subscribeConsumer): new method, takes a Twisted-style
2106         Consumer (except one that takes chunks instead of strings). This
2107         enables streaming of very large logfiles without storing the whole
2108         thing in memory.
2109         (BuildStatus.generateLogfileName): create names like
2110         12-log-compile-output, with a _0 suffix if required to be unique
2111         (BuildStatus.upgradeLogfiles): transform any old-style (from 0.6.4
2112         or earlier) logfiles into new-style ones
2113         (BuilderStatus): remove everything related to 'stub' builds. There
2114         is now only one build cache, and we don't strip logs from old
2115         builds anymore.
2116         (BuilderStatus.getBuildByNumber): check self.currentBuild too,
2117         since we no longer fight to keep it in the cache
2119         * buildbot/status/html.py (TextLog.render_GET): use a
2120         ChunkConsumer to stream the log entries efficiently.
2121         (ChunkConsumer): wrapper which consumes chunks and writes
2122         formatted HTML.
2124         * buildbot/test/test_twisted.py (Parse.testParse): use a
2125         LogFile-like object instead of a real one
2127         * buildbot/test/test_status.py (MyLog): handle new LogFile code
2128         (Log.testMerge3): validate more merge behavior
2129         (Log.testChunks): validate LogFile.getChunks
2130         (Log.testUpgrade): validate old-style LogFile upgrading
2131         (Log.testSubscribe): validate LogFile.subscribe
2132         (Log.testConsumer): validate LogFile.subscribeConsumer
2134         * buildbot/interfaces.py (IStatusLogStub): remove
2135         (IStatusLog.subscribeConsumer): new method
2136         (IStatusLog.hasContents): new method
2137         (IStatusLogConsumer): describes things passed to subscribeConsumer
2139         * buildbot/status/html.py (StepBox.getBox): Don't offer an href to
2140         the log contents if it does not have any contents.
2141         (StatusResourceBuildStep.body): same
2142         (StatusResourceBuildStep.getChild): give a 404 for empty logs
2144 2005-05-14  Brian Warner  <warner@lothar.com>
2146         * buildbot/test/test_web.py (WebTest.test_logfile): add 5-second
2147         timeouts to try and make the windows metabuildslave not hang
2149 2005-05-13  Mike Taylor  <bear@code-bear.com>
2151         * buildbot/slave/commands.py (rmdirRecursive): added a check
2152         to ensure the path passed into rmdirRecursive actually exists.
2153         On win32 a non-existant path would generate an exception.
2155 2005-05-13  Brian Warner  <warner@lothar.com>
2157         * buildbot/slave/commands.py (rmdirRecursive): replacement for
2158         shutil.rmtree which behaves correctly on windows in the face of
2159         files that you have to chmod before deleting. Thanks to Bear at
2160         the OSAF for the routine.
2161         (SourceBase.doClobber): use rmdirRecursive
2163 2005-05-12  Brian Warner  <warner@lothar.com>
2165         * buildbot/status/builder.py (OfflineLogFile.getChunks): have this
2166         method generate chunks instead of returning a big list. This
2167         allows the same method to be used for both old LogFile and new
2168         OfflineLogFile.
2169         (OfflineLogFile.getText): use the generator
2170         (OfflineLogFile.subscribe): same
2171         * buildbot/status/html.py (TextLog.resumeProducing): same
2172         * buildbot/interfaces.py (IStatusLog.getChunks): document it
2174         * buildbot/test/test_web.py (WebTest.test_logfile): Add a test to
2175         point out that OfflineLogFile does not currently work with
2176         html.Waterfall . Fixing this is high-priority.
2178         * buildbot/scripts/runner.py (start): add --logfile=twistd.log, since
2179         apparently windows defaults to using stdout
2181         * buildbot/test/test_slavecommand.py (Shell.testShellZ): log a
2182         better message on failure so I can figure out the win32 problem
2184         * buildbot/slave/commands.py (ShellCommand._startCommand): update
2185         log messages to include more useful copies of the command being
2186         run, the argv array, and the child command's environment.
2187         (Git.doVCFull): update cg-close usage, patch from Brandon Philips.
2189 2005-05-11  Brian Warner  <warner@lothar.com>
2191         * setup.py: oops, install debug.glade so 'buildbot debugclient'
2192         will actually work
2193         * Makefile: update the deb-snapshot version
2195         * docs/buildbot.texinfo: move all .xhtml docs into a new
2196         .texinfo-format document, adding a lot of material in the process.
2197         This is starting to look like a real user's manual. Removed all
2198         the Lore-related files: *.xhtml, *.css, template.tpl .
2199         * docs/Makefile: simple makefile to run 'makeinfo'
2200         * buildbot/scripts/sample.cfg: rearrange slightly
2201         * MANIFEST.in: include .info and .textinfo, don't include *.xhtml
2203 2005-05-10  Brian Warner  <warner@lothar.com>
2205         * buildbot/scripts/runner.py (start): Twisted-1.3.0 used a
2206         different name for the internal twistw module, handle it.
2208         * MANIFEST.in: we deleted plugins.tml, so stop shipping it
2209         * setup.py: .. and stop trying to install it
2211         * buildbot/process/step.py (Git): added support for 'cogito' (aka
2212         'git'), the new linux kernel VC system (http://kernel.org/git/).
2213         Thanks to Brandon Philips for the patch.
2214         * buildbot/slave/commands.py (Git): same
2216 2005-05-06  Brian Warner  <warner@lothar.com>
2218         * buildbot/status/builder.py (OfflineLogFile): replace the default
2219         LogFile with a form that appends its new contents to a disk file
2220         as they arrive. The complete log data is never kept in RAM. This
2221         is the first step towards handling very large (100MB+) logfiles
2222         without choking quite so badly. (The other half is
2223         producer/consumer on the HTML pages).
2224         (BuildStepStatus.addLog): use OfflineLogFile by default
2225         (BuildStatus.getLogfileName): helper code to give the
2226         OfflineLogFile a filename to work with
2228         * buildbot/test/test_status.py (Results.testAddResults): update
2229         tests to handle new asserts
2230         * buildbot/test/test_vc.py (Patch.doPatch): same
2231         * buildbot/test/test_steps.py (BuildStep.setUp): same
2233 2005-05-05  Brian Warner  <warner@lothar.com>
2235         * buildbot/scripts/runner.py (start): if there is no Makefile,
2236         launch the app by importing twistd's internals and calling run(),
2237         rather than spawning a new twistd process. This stands a much
2238         better chance of working under windows.
2239         (stop): kill the process with os.kill instead of spawning
2240         /bin/kill, again to reduce the number of external programs which
2241         windows might not have in the PATH. Also wait up to 5 seconds for
2242         the process to go away, allowing things like 'buildbot stop;
2243         buildbot start' to be reliable in the face of slow shutdowns.
2245         * buildbot/master.py (Dispatcher.__getstate__): remove old
2246         .tap-related methods
2247         (BuildMaster.__getstate__): same
2248         (makeService): same
2249         * buildbot/slave/bot.py (makeService): same
2250         (Options.longdesc): same
2251         * buildbot/scripts/runner.py: copy over some old mktap option text
2253         * buildbot/scripts/runner.py (masterTAC): stop using mktap.
2254         'buildbot master' now creates a buildbot.tac file, so there is no
2255         longer a create-instance/save/reload sequence. mktap is dead, long
2256         live twistd -y.
2257         * buildbot/scripts/sample.mk: use twistd -y, not -f
2258         * buildbot/test/test_config.py: remove mktap-based test
2259         * buildbot/bb_tap.py, buildbot/plugins.tml: delete old files
2260         * README: don't reference mktap
2262         * docs/source.xhtml: document some of the attributes that Changes
2263         might have
2265         * docs/steps.xhtml (Bazaar): document the Bazaar checkout step
2267         * general: merge in Change(tag=) patch from Thomas Vander Stichele.
2268         [org.apestaart@thomas--buildbot/buildbot--cvstag--0-dev--patch-2]
2269         * buildbot/changes/changes.py (Change)
2270         * buildbot/changes/mail.py (parseSyncmail)
2271         * buildbot/test/test_mailparse.py (Test3.getNoPrefix)
2272         (Test3.testMsgS5)
2273         * buildbot/process/base.py (Build.isTagImportant)
2274         (Build.addChange)
2277 2005-05-04  Brian Warner  <warner@lothar.com>
2279         * buildbot/clients/sendchange.py (Sender.send): tear down the PB
2280         connection after sending the change, so that unit tests don't
2281         complain about sockets being left around
2283         * buildbot/status/html.py (WaterfallStatusResource.body): fix
2284         exception in phase=0 rendering
2285         * buildbot/test/test_web.py (WebTest.test_waterfall): test it
2287         * buildbot/changes/dnotify.py (DNotify.__init__): remove debug msg
2289         * buildbot/master.py (BuildMaster.loadConfig): finally remove
2290         deprecated config keys: webPortnum, webPathname, irc, manholePort,
2291         and configuring builders with tuples.
2292         * buildbot/test/test_config.py: stop testing compatibility with
2293         deprecated config keys
2294         * buildbot/test/test_run.py: same
2296 2005-05-03  Brian Warner  <warner@lothar.com>
2298         * contrib/arch_buildbot.py: survive if there are no logfiles
2299         (username): just use a string, os.getlogin isn't reliable
2301         * buildbot/scripts/runner.py (sendchange): oops, fix the command
2302         so 'buildbot sendchange' actually works. The earlier test only
2303         covered the internal (non-reactor-running) form.
2305         * contrib/arch_buildbot.py: utility that can run as an Arch hook
2306         script to notify the buildmaster about changes
2308         * buildbot/scripts/runner.py (sendchange): new command to send a
2309         change to a buildbot.changes.pb.PBChangeSource receiver.
2310         * buildbot/test/test_changes.py (Sender): test it
2312         * buildbot/master.py (BuildMaster.startService): mark .readConfig
2313         after any reading of the config file, not just when we do it in
2314         startService. This makes some tests a bit cleaner.
2316         * buildbot/changes/pb.py: add some log messages
2318         * buildbot/process/base.py (Build.startBuild): fix a bug that
2319         caused an exception when the build terminated in the very first
2320         step.
2321         (Build.stepDone): let steps return a status of EXCEPTION. This
2322         terminates the build right away, and sets the build's overall
2323         status to EXCEPTION too.
2324         * buildbot/process/step.py (BuildStep.failed): return a status of
2325         EXCEPTION when that is what has happened.
2327         * buildbot/process/step.py (Arch.computeSourceRevision): finally
2328         implement this, allowing Arch-based projects to get precise
2329         checkouts instead of always using the latest code
2330         (Bazaar): create variant of Arch to let folks use baz instead of
2331         tla. Requires a new buildslave too.
2332         * buildbot/slave/commands.py (Arch): add 'revision' argument
2333         (Bazaar): create variant of Arch that uses baz instead of tla.
2334         Remove the code that extracts the archive name from the
2335         register-archive output, since baz doesn't provide it, and require
2336         the user provide both the archive name and its location.
2337         * buildbot/test/test_vc.py (VC.testBazaar): added tests
2339 2005-05-02  Brian Warner  <warner@lothar.com>
2341         * buildbot/scripts/sample.cfg: improve docs for c['buildbotURL'],
2342         thanks to Nick Trout.
2344         * buildbot/scripts/runner.py (Maker.makefile): chmod before edit,
2345         deals better with source Makefile coming from a read-only CVS
2346         checkout. Thanks to Nick Trout for the catch.
2348         * buildbot/__init__.py (version): bump to 0.6.4+ while between
2349         releases
2351 2005-04-28  Brian Warner  <warner@lothar.com>
2353         * buildbot/__init__.py (version): Releasing buildbot-0.6.4
2355         * debian/changelog: update for 0.6.4
2357 2005-04-28  Brian Warner  <warner@lothar.com>
2359         * README.w32: add a checklist of steps for getting buildbot
2360         running on windows.
2361         * MANIFEST.in: include it in the tarball
2363         * NEWS: update
2365         * buildbot/master.py (BuildMaster.upgradeToVersion3): deal with
2366         broken .tap files from 0.6.3 by getting rid of .services,
2367         .namedServices, and .change_svc at load time.
2369 2005-04-27  Brian Warner  <warner@lothar.com>
2371         * NEWS: update in preparation for new release
2373         * buildbot/test/test_config.py (Save.testSave): don't pull in
2374         twisted.scripts.twistd, we don't need it and it isn't for windows
2375         anyway.
2377         * buildbot/changes/changes.py (ChangeMaster.saveYourself):
2378         accomodate win32 which can't do atomic-rename
2380 2005-04-27  Brian Warner  <warner@lothar.com>
2382         * buildbot/test/test_run.py (Disconnect.testBuild2): crank up some
2383         timeouts to help the slow metabuildbot not flunk them so much
2384         (Disconnect.testBuild3): same
2385         (Disconnect.testBuild4): same
2386         (Disconnect.testInterrupt): same
2388         * buildbot/master.py (BuildMaster.loadChanges): fix change_svc
2389         setup, it was completely broken for new buildmasters (those which
2390         did not have a 'change.pck' already saved. Thanks to Paul Warren
2391         for catching this (embarrassing!) bug.
2392         (Dispatcher.__getstate__): don't save our registered avatar
2393         factories, since they'll be re-populated when the config file is
2394         re-read.
2395         (BuildMaster.__init__): add a dummy ChangeMaster, used only by
2396         tests (since the real mktap-generated BuildMaster doesn't save
2397         this attribute).
2398         (BuildMaster.__getstate__): don't save any service children,
2399         they'll all be re-populated when the config file is re-read.
2400         * buildbot/test/test_config.py (Save.testSave): test for this
2402 2005-04-26  Brian Warner  <warner@lothar.com>
2404         * buildbot/buildbot.png: use a new, smaller (16x16) icon image,
2405         rendered with Blender.. looks a bit nicer.
2406         * buildbot/docs/images/icon.blend: add the Blender file for it
2408         * buildbot/slave/commands.py (ShellCommand._startCommand): prepend
2409         'cmd.exe' (or rather os.environ['COMSPEC']) to the argv list when
2410         running under windows. This appears to be the best way to allow
2411         BuildSteps to do something normal like 'trial -v buildbot.test' or
2412         'make foo' and still expect it to work. The idea is to make the
2413         BuildSteps look as much like what a developer would type when
2414         compiling or testing the tree by hand. This approach probably has
2415         problems when there are spaces in the arguments, so if you've got
2416         windows buildslaves, you'll need to pay close attention to your
2417         commands.
2419         * buildbot/status/html.py (WaterfallStatusResource.body): add the
2420         timezone to the timestamp column.
2421         * buildbot/test/test_web.py (WebTest.test_waterfall): test it
2423         * buildbot/scripts/runner.py (loadOptions): do something sane for
2424         windows, I think. We use %APPDATA%/buildbot instead of
2425         ~/.buildbot, but we still search everywhere from the current
2426         directory up to the root for a .buildbot/ subdir. The "is it under
2427         $HOME" security test was replaced with "is it owned by the current
2428         user", which is only performed under posix.
2429         * buildbot/test/test_runner.py (Options.testFindOptions): update
2430         tests to match. The "is it owned by the current user" check is
2431         untested. The test has been re-enabled for windows.
2433         * buildbot/test/test_slavecommand.py (Shell.checkOutput): replace
2434         any "\n" in the expected output with the platform-specific line
2435         separator. Make this separator "\r\n" on PTYs under unix, they
2436         seem to do that and I don't know why
2438         * buildbot/test/test_runner.py (Options.optionsFile): disable on
2439         windows for now, I don't know what ~/.buildbot/ should mean there.
2441         * buildbot/test/test_run.py (BuilderNames.testGetBuilderNames):
2442         win32 compatibility, don't use "/tmp"
2443         (Basedir.testChangeBuilddir): remove more unixisms
2445 2005-04-26  Brian Warner  <warner@lothar.com>
2447         * buildbot/test/test_control.py (Force.rmtree): python2.2
2448         compatibility, apparently its shutil.rmtree ignore_errors=
2449         argument is ignored.
2450         * buildbot/test/test_run.py (Run.rmtree): same
2451         (RunMixin.setUp): same
2453         * buildbot/test/test_runner.py (make): python2.2 has os.sep but
2454         not os.path.sep
2456         * buildbot/test/test_twisted.py (Parse.failUnlessIn): 2.2 has no
2457         'substring in string' operator, must use string.find(substr)!=-1
2458         * buildbot/test/test_vc.py (Patch.failUnlessIn): same
2459         * buildbot/test/test_web.py (WebTest.failUnlessIn): same
2461         * buildbot/scripts/runner.py (loadOptions): add code to search for
2462         ~/.buildbot/, a directory with things like 'options', containing
2463         defaults for various 'buildbot' subcommands. .buildbot/ can be in
2464         the current directory, your $HOME directory, or anywhere
2465         inbetween, as long as you're somewhere inside your home directory.
2466         (debugclient): look in ~/.buildbot/options for master and passwd
2467         (statuslog): look in ~/.buildbot/options for 'masterstatus'
2468         * buildbot/test/test_runner.py (Options.testFindOptions): test it
2470         * buildbot/status/client.py (makeRemote): new approach to making
2471         IRemote(None) be None, which works under Twisted-2.0
2472         * buildbot/test/test_status.py (Client.testAdaptation): test it
2474         * buildbot/status/builder.py (Status.builderAdded): when loading a
2475         pickled BuilderStatus in from disk, set its name after loading.
2476         The config file might have changed its name (but not its
2477         directory) while it wasn't looking.
2478         
2479         * buildbot/process/builder.py (Builder.attached): always return a
2480         Deferred, even if the builder was already attached
2481         * buildbot/test/test_run.py (Basedir.testChangeBuilddir): test it
2483 2005-04-25  Brian Warner  <warner@lothar.com>
2485         * buildbot/status/words.py (IrcStatusBot.buildFinished): fix a
2486         category-related exception when announcing a build has finished
2488         * buildbot/status/html.py (StatusResourceChanges.body): oops, don't
2489         reference no-longer-existent changemaster.sources
2490         * buildbot/test/test_web.py (WebTest.test_waterfall): test for it
2492         * buildbot/__init__.py (version): bump to 0.6.3+ while between
2493         releases
2495 2005-04-25  Brian Warner  <warner@lothar.com>
2497         * buildbot/__init__.py (version): Releasing buildbot-0.6.3
2499         * debian/changelog: update for 0.6.3
2501 2005-04-25  Brian Warner  <warner@lothar.com>
2503         * MANIFEST.in: make sure debug.glade is in the tarball
2505         * README (REQUIREMENTS): list necessary Twisted-2.0 packages
2507         * NEWS: update for the imminent 0.6.3 release
2509         * buildbot/status/html.py (HtmlResource.content): make the
2510         stylesheet <link> always point at "buildbot.css".
2511         (StatusResource.getChild): map "buildbot.css" to a static.File
2512         containing whatever css= argument was provided to Waterfall()
2513         (Waterfall): provide the "classic" css as the default.
2514         * docs/waterfall.classic.css: move default CSS from here ..
2515         * buildbot/status/classic.css: .. to here
2517         * MANIFEST.in: make sure classic.css is included in the tarball
2518         * setup.py: and that it is installed too, under buildbot/status/
2520         * buildbot/master.py (BuildMaster): oops, set .change_svc=None at
2521         the module level, because buildbot.tap files from 0.6.2 don't have
2522         it in their attribute dictionary.
2524         * buildbot/slave/bot.py (Bot.startService): make sure the basedir
2525         really exists at startup, might save some confusion somewhere.
2527 2005-04-24  Thomas Vander Stichele  <thomas at apestaart dot org>
2529         * docs/waterfall.classic.css:
2530           add a stylesheet that's almost the same as the "classic"
2531           buildbot style
2533         * buildbot/status/builder.py:
2534           add EXCEPTION as a result - this is a problem for the bot
2535           maintainer, not a build problem for the changers
2536         * buildbot/process/step.py:
2537           use EXCEPTION instead of FAILURE for exceptions
2538         * buildbot/status/html.py:
2539           add build_get_class to get a class out of a build/buildstep
2540           finish naming the classes
2541           split out sourceNames to changeNames and builderNames so we
2542           can style them separately
2543         * docs/config.xhtml:
2544           finish documenting classes as they are right now
2546         * buildbot/status/html.py:
2547           name the classes as we agreed on IRC
2548         * docs/config.xhtml:
2549           and document them
2551         * buildbot/status/html.py:
2552           same for cssclass->class_
2554         * buildbot/status/html.py:
2555           as decided on IRC, use class_ for the "class" attribute to not
2556           conflict with the class keyword, and clean up the messy **{} stuff.
2558         * buildbot/status/mail.py:
2559           put back "builders" argument, and fix docstring, because the
2560           code *ignores* builders listed in this argument
2562         * buildbot/process/builder.py:
2563           remove FIXME notes - category is now indeed a cvar of BuilderStatus
2565         * docs/config.xhtml:
2566           describe the category argument for builders
2568         * buildbot/status/builder.py:
2569           Fix a silly bug due to merging
2571         * buildbot/process/builder.py:
2572           remove category from the process Builder ...
2573         * buildbot/status/builder.py:
2574           ... and add it to BuilderStatus instead.
2575           Set category on unpickled builder statuses, they might not have it.
2576         * buildbot/master.py:
2577           include category when doing builderAdded
2578         * buildbot/status/mail.py:
2579           return None instead of self for builders we are not interested in.
2580         * buildbot/test/test_run.py:
2581           fix a bug due to only doing deferredResult on "dummy" waiting
2582         * buildbot/test/test_status.py:
2583           add checks for the Mail IStatusReceiver returning None or self
2585         * buildbot/status/html.py:
2586           fix testsuite by prefixing page title with BuildBot
2588         * buildbot/status/builder.py:
2589           have .category in builder status ...
2590         * buildbot/process/builder.py:
2591           ... and set it from Builder
2592         * buildbot/status/html.py:
2593           make .css a class variable 
2594         * buildbot/test/test_status.py:
2595           write more tests to cover our categories stuff ...
2596         * buildbot/status/mail.py:
2597           ... and fix the bug that this uncovered
2599         * buildbot/changes/mail.py:
2600         * buildbot/changes/pb.py:
2601         * buildbot/master.py:
2602         * buildbot/process/base.py:
2603         * buildbot/process/factory.py:
2604         * buildbot/process/interlock.py:
2605         * buildbot/process/step.py:
2606         * buildbot/process/step_twisted.py:
2607         * buildbot/slave/commands.py:
2608         * buildbot/status/builder.py:
2609         * buildbot/status/client.py:
2610         * buildbot/status/html.py:
2611         * buildbot/status/mail.py:
2612         * buildbot/status/progress.py:
2613         * buildbot/test/test_changes.py:
2614         * buildbot/test/test_config.py:
2615         * buildbot/test/test_control.py:
2616         * buildbot/test/test_interlock.py:
2617         * buildbot/test/test_maildir.py:
2618         * buildbot/test/test_mailparse.py:
2619         * buildbot/test/test_run.py:
2620         * buildbot/test/test_slavecommand.py:
2621         * buildbot/test/test_status.py:
2622         * buildbot/test/test_steps.py:
2623         * buildbot/test/test_twisted.py:
2624         * buildbot/test/test_util.py:
2625         * buildbot/test/test_vc.py:
2626         * buildbot/test/test_web.py:
2627         * buildbot/util.py:
2628           add test-case-name at the top of a whole set of files
2630         * buildbot/status/builder.py:
2631           keep order of addition when getting builder names
2632         * buildbot/status/words.py:
2633         * buildbot/test/test_run.py:
2634           add test for getBuilderNames
2636         * buildbot/process/base.py:
2637         * buildbot/process/step.py:
2638         * buildbot/status/builder.py:
2639         * buildbot/status/html.py:
2640           make buildbot css-able
2641           replace the color code for purple with purple, don't understand
2642           why it wasn't purple to start with
2644         * buildbot/status/words.py:
2645           ok, so it doesn't look like BuilderStatus.remote is still valid.
2646           Use what waterfall uses instead.
2648         * buildbot/interfaces.py:
2649         * buildbot/status/builder.py:
2650         * buildbot/status/html.py:
2651         * buildbot/status/mail.py:
2652         * buildbot/status/words.py:
2653         * buildbot/test/test_run.py:
2654           use categories everywhere and make it be a list.  More sensible
2655           for the future.  Also make words actually respect this in
2656           buildFinished.
2658         * buildbot/interfaces.py:
2659           add category argument to getBuilderNames
2660         * buildbot/process/builder.py:
2661         * buildbot/status/builder.py:
2662         * buildbot/status/html.py:
2663         * buildbot/status/mail.py:
2664         * buildbot/status/words.py:
2665         * buildbot/test/test_run.py:
2666           move from specifying builders by name to specifying the category
2668         * buildbot/status/html.py:
2669         * buildbot/status/words.py:
2670           add "builders=" to __init__ of status clients so they can
2671           limit themselves to the given list of builders to report on
2673         * buildbot/status/html.py: set the title to the product name
2675 2005-04-23  Thomas Vander Stichele  <thomas at apestaart dot org>
2677         * buildbot/interfaces.py:
2678         * buildbot/status/builder.py:
2679           more documentation.  Hm, not sure if ChangeLog entries make sense
2680           here...
2682 2005-04-23  Brian Warner  <warner@lothar.com>
2684         * buildbot/test/test_vc.py (SetupMixin.do_vc): increase timeouts
2686         * buildbot/test/test_slavecommand.py (Shell): increase timeouts
2688         * buildbot/scripts/runner.py: make 'statuslog' and 'statusgui' be
2689         the sub-commands that log buildmaster status to stdout and to a
2690         GUI window, respectively.
2692         * buildbot/clients/gtkPanes.py: overhaul. basic two-row
2693         functionality is working again, but all the step-status and ETA
2694         stuff is missing. Commented out a lot of code pending more
2695         overhaul work.
2697         * buildbot/status/client.py: make sure that IRemote(None) is None
2699         * buildbot/changes/changes.py: import defer, oops
2700         (ChangeMaster): remove the .sources list, rely upon the fact that
2701         MultiServices can be treated as sequences of their children. This
2702         cleans up the add/remove ChangeSource routines a lot, as we keep
2703         exactly one list of the current sources instead of three.
2705         * buildbot/master.py (BuildMaster.__init__): remove .sources, set
2706         up an empty ChangeMaster at init time.
2707         (BuildMaster.loadChanges): if there are changes to be had from
2708         disk, replace self.change_svc with the new ones. If not, keep
2709         using the empty ChangeMaster set up in __init__.
2710         (BuildMaster.loadConfig_Sources): use list(self.change_svc)
2711         instead of a separate list, makes the code a bit cleaner.
2712         * buildbot/test/test_config.py (ConfigTest.testSimple): match it
2713         (ConfigTest.testSources): same, also wait for loadConfig to finish.
2714         Extend the test to make sure we can get rid of the sources when
2715         we're done.
2717 2005-04-22  Brian Warner  <warner@lothar.com>
2719         * buildbot/scripts/runner.py (Maker.mkinfo): create the info/admin
2720         and info/host files when making the slave directory
2722         * buildbot/test/test_run.py (RunMixin.shutdownSlave): remove the
2723         whendone= argument, just return the Deferred and let the caller do
2724         what they want with it.
2725         (Disconnect.testBuild1): wait for shutdownSlave
2726         (Basedir.testChangeBuilddir): new test to make sure changes to the
2727         builddir actually get propagated to the slave
2729         * buildbot/slave/bot.py (SlaveBuilder.setBuilddir): use an
2730         explicit method, rather than passing the builddir in __init__ .
2731         Make sure to update self.basedir too, this was broken before.
2732         (Bot.remote_setBuilderList): use b.setBuilddir for both new
2733         builders and for ones that have just had their builddir changed.
2734         (BotFactory): add a class-level .perspective attribute, so
2735         BuildSlave.waitUntilDisconnected won't get upset when the
2736         connection hasn't yet been established
2737         (BuildSlave.__init__): keep track of the bot.Bot instance, so
2738         tests can reach through it to inspect the SlaveBuilders
2740         * buildbot/process/base.py (Build.buildException): explain the
2741         log.err with a log.msg
2742         * buildbot/process/builder.py (Builder.startBuild): same
2743         (Builder._startBuildFailed): improve error message
2745         * buildbot/pbutil.py (RBCP.failedToGetPerspective): if the failure
2746         occurred because we lost the brand-new connection, retry instead
2747         of giving up. If not, it's probably an authorization failure, and
2748         it makes sense to stop trying. Make sure we log.msg the reason
2749         that we're log.err'ing the failure, otherwise test failures are
2750         really hard to figure out.
2752         * buildbot/master.py: change loadConfig() to return a Deferred
2753         that doesn't fire until the change has been fully implemented.
2754         This means any connected slaves have been updated with the new
2755         builddir. This change makes it easier to test the code which
2756         actually implements this builddir-updating.
2757         (BotPerspective.addBuilder): return Deferred
2758         (BotPerspective.removeBuilder): same
2759         (BotPerspective.attached): same
2760         (BotPerspective._attached): same. finish with remote_print before
2761         starting the getSlaveInfo, instead of doing them in parallel
2762         (BotPerspective.list_done): same
2763         (BotMaster.removeSlave): same. Fix the typo that meant we weren't
2764         actually calling slave.disconnect()
2765         (BotMaster.addBuilder): same
2766         (BotMaster.removeBuilder): same
2767         (BuildMaster.loadConfig): same
2768         (BuildMaster.loadConfig_Slaves): same
2769         (BuildMaster.loadConfig_Sources): same
2770         (BuildMaster.loadConfig_Builders): same
2771         (BuildMaster.loadConfig_status): same
2773         * buildbot/changes/changes.py (ChangeMaster.removeSource): return
2774         a Deferred that fires when the source is finally removed
2776         * buildbot/slave/commands.py (SourceBase.doClobber): when removing
2777         the previous tree on win32, where we have to do it synchronously,
2778         make sure we return a Deferred anyway.
2779         (SourceBase.doCopy): same
2781         * buildbot/scripts/runner.py (statusgui): use the text client for
2782         now, while I rewrite the Gtk one
2783         * buildbot/clients/base.py: strip out old code, leaving just the
2784         basic print-message-on-event functionality. I also remove the
2785         ReconnectingPBClientFactory, but it does at least quit when it
2786         loses the connection instead of going silent
2788 2005-04-21  Brian Warner  <warner@lothar.com>
2790         * Makefile: minor tweaks
2792         * NEWS: point out deprecation warnings, new features for
2793         /usr/bin/buildbot
2795         * buildbot/master.py (BuildMaster.loadConfig): emit
2796         DeprecationWarnings for Builders defined with tuples. Rearrange
2797         code to facility removal of deprecated configuration keys in the
2798         next release.
2800         * buildbot/scripts/runner.py (createMaster,createSlave): rewrite
2801         'buildbot' command to put a little Makefile in the target that
2802         helps you re-create the buildbot.tap file, start or stop the
2803         master/slave, and reconfigure (i.e. SIGHUP) the master. Also chmod
2804         all the files 0600, since they contain passwords.
2805         (start): if there is a Makefile, and /usr/bin/make exists, use
2806         'make start' in preference to a raw twistd command. This lets
2807         slave admins put things like PYTHONPATH variables in their
2808         Makefiles and have them still work when the slave is started with
2809         'buildbot start ~/slave/foo'. The test is a bit clunky, it would
2810         be nice to first try the 'make' command and only fall back to
2811         twistd if it fails. TODO: the Makefile's "start" command does not
2812         add the --reactor=win32 argument when running under windows.
2813         (Options.debugclient, Options.statusgui): add sub-commands to launch
2814         the debug client (formerly in contrib/debugclient.py) and the
2815         Gtk status application (currently broken)
2816         * buildbot/clients/debug.py: move from contrib/debugclient.py
2817         * buildbot/clients/debug.glade: same
2819         * buildbot/test/test_trial.py: remove it. This requires some
2820         functionality out of Twisted that isn't there yet, and until then
2821         having it around just confuses things.
2823         * buildbot/test/test_slavecommand.py (Shell): test both with and
2824         without PTYs, and make sure that command output is properly
2825         interleaved in the with-PTY case. I think the without-PTY test
2826         should pass on windows, where we never use PTYs anyway.
2828 2005-04-20  Brian Warner  <warner@lothar.com>
2830         * README (REQUIREMENTS): mention Twisted-2.0.0 compatibility
2832         * MANIFEST.in: add epyrun, gen-reference, buildbot.png
2834         * NEWS: start creating entries for the next release
2836         * buildbot/slave/commands.py (ShellCommand.__init__): use os.pathsep
2838         * buildbot/test/test_web.py (WebTest.test_webPortnum): add timeout
2839         (WebTest.test_webPathname): same
2840         (WebTest.test_webPathname_port): same
2841         (WebTest.test_waterfall): use the default favicon rather than
2842         rooting around the filesystem for it. Open the expected-icon file
2843         in binary mode, to make win32 tests happier (thanks to Nick Trout
2844         for the catch)
2845         * buildbot/status/html.py (buildbot_icon): win32 portability
2847         * buildbot/test/test_slavecommand.py (SlaveCommandTestCase.testShellZ):
2848         win32-compatibility fixes from Nick Trout, the "file not found" message
2849         is different under windows
2850         (FakeSlaveBuilder.__init__): clean up setup a bit
2851         * buildbot/test/test_vc.py (VCSupport.__init__): win32: use os.pathsep
2853 2005-04-19  Brian Warner  <warner@lothar.com>
2855         * buildbot/test/test_vc.py (SetupMixin.setUpClass): fix the
2856         skip-if-repositories-are-unavailable test to not kill the trial
2857         that comes with Twisted-1.3.0
2859         * setup.py: install buildbot.png icon file when installing code
2861         * buildbot/slave/commands.py (ShellCommand._startCommand): log the
2862         environment used by the command, at least on the child side.
2864         * buildbot/status/html.py (TextLog.pauseProducing): add a note,
2865         this method needs to be added and implemented because it gets
2866         called under heavy load. I don't quite understand the
2867         producer/consumer API enough to write it.
2868         (StatusResource.getChild): add a resource for /favicon.ico
2869         (Waterfall.__init__): add favicon= argument
2870         * buildbot/test/test_web.py (WebTest.test_waterfall): test it
2871         (WebTest.test_webPortnum): stop using deprecated 'webPortnum'
2872         (WebTest.test_webPathname): same
2873         (WebTest.test_webPathname_port): same
2874         * docs/config.xhtml: mention favicon=
2875         * buildbot/buildbot.png: add a default icon, dorky as it is
2877 2005-04-18  Thomas Vander Stichele  <thomas at apestaart dot org>
2879         * buildbot/master.py:
2880         * buildbot/process/base.py:
2881         * buildbot/process/builder.py:
2882         * buildbot/process/interlock.py:
2883         * buildbot/status/builder.py:
2884         * buildbot/status/html.py:
2885         * buildbot/status/mail.py:
2886         * buildbot/status/words.py:
2887           new documentation while digging through the code
2889 2005-04-17  Brian Warner  <warner@lothar.com>
2891         * general: try to fix file modes on all .py files: a+r, a-x,
2892         but let buildbot/clients/*.py be +x since they're tools
2894         * docs/epyrun (addMod): when an import fails, say why
2896         * Makefile: Add a 'docs' target, hack on the PYTHONPATH stuff
2898 2005-04-17  Thomas Vander Stichele  <thomas at apestaart dot org>
2900         * buildbot/process/base.py:
2901         * buildbot/process/builder.py:
2902         * buildbot/status/builder.py:
2903           new documentation while digging through the code
2905 2005-04-17  Thomas Vander Stichele  <thomas at apestaart dot org>
2907         * buildbot/changes/changes.py:
2908         * buildbot/changes/p4poller.py:
2909         * buildbot/interfaces.py:
2910         * buildbot/process/base.py:
2911         * buildbot/process/builder.py:
2912         * buildbot/process/step.py:
2913         * buildbot/process/step_twisted.py:
2914         * buildbot/slave/bot.py:
2915         * buildbot/slave/commands.py:
2916         * buildbot/status/builder.py:
2917           fix all docstrings to make epydoc happy.  In the process of fixing
2918           some, I also moved pieces of docs, and removed some deprecated
2919           documentation
2921 2005-04-17  Thomas Vander Stichele  <thomas at apestaart dot org>
2923         * buildbot/process/builder.py:
2924         * buildbot/process/interlock.py:
2925         * buildbot/process/process_twisted.py:
2926         * buildbot/process/step.py:
2927           BuildProcess -> Build, as it looks like that's what happened
2928         * buildbot/process/base.py:
2929         * buildbot/process/factory.py:
2930           update epydoc stuff
2932 2005-04-17  Brian Warner  <warner@lothar.com>
2934         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
2935         update compile command to accomodate the Twisted split.. now
2936         instead of './setup.py build_ext -i', you do './setup.py all
2937         build_ext -i', to run build_ext over all sub-projects.
2938         (FullTwistedBuildFactory): same
2939         (TwistedReactorsBuildFactory): same
2941         * buildbot/status/html.py (TextLog.finished): null out self.req
2942         when we're done, otherwise the reference cycle of TextLog to .req
2943         to .notifications to a Deferred to TextLog.stop keeps them from
2944         being collected, and consumes a huge (610MB on pyramid at last
2945         check) amount of memory.
2947 2005-04-11  Brian Warner  <warner@lothar.com>
2949         * buildbot/test/test_vc.py (VCSupport.__init__): use abspath() to
2950         normalize the VC-repository location.. makes SVN happier with
2951         certain test environments.
2953         * buildbot/process/step.py (RemoteShellCommand.__init__): let each
2954         RemoteShellCommand gets its own .env dictionary, so that code in
2955         start() doesn't mutate the original. I think this should fix the
2956         step_twisted.Trial problem where multiple identical components
2957         kept getting added to PYTHONPATH= over and over again.
2959         * general: merge org.apestaart@thomas/buildbot--doc--0--patch-3,
2960         adding epydoc-format docstrings to many classes. Thanks to Thomas
2961         Vander Stichele for the patches.
2962         * docs/epyrun, docs/gen-reference: add epydoc-generating tools
2963         * buildbot/status/mail.py, buildbot/process/step_twisted.py: same
2964         * buildbot/slave/bot.py, commands.py, registry.py: same
2966 2005-04-05  Brian Warner  <warner@lothar.com>
2968         * buildbot/slave/commands.py (SourceBase.doCopy): use cp -p to
2969         preserve timestamps, helps incremental builds of large trees.
2970         Patch from Rene Rivera.
2972         * buildbot/slave/bot.py (SlaveBuilder.commandComplete): oops, log
2973         'failure' and not the non-existent 'why'. Thanks to Rene Rivera
2974         for the catch.
2976 2005-04-03  Brian Warner  <warner@lothar.com>
2978         * buildbot/master.py (BuildMaster.loadConfig): only call exec()
2979         with one dict, apparently exec has some scoping bugs when used
2980         with both global/local dicts. Thanks to Nathaniel Smith for the
2981         catch.
2983 2005-04-02  Brian Warner  <warner@lothar.com>
2985         * buildbot/process/step_twisted.py (countFailedTests): the new
2986         trial in Twisted-2.0 emits a slightly different status line than
2987         old trial ("PASSED.." instead of "OK.."). Handle it so we don't
2988         mistakenly think the test count is unparseable.
2989         (Trial.start): note that for some reason each build causes another
2990         copy of self.testpath to be prepended to PYTHONPATH. This needs to
2991         be fixed but I'm not sure quite where the problem is.
2993 2005-04-01  Brian Warner  <warner@lothar.com>
2995         * buildbot/test/test_run.py (Run.testMaster): change some uses of
2996         deferredResult to avoid hangs/warnings under twisted-2.0
2997         (RunMixin.tearDown): same
2998         (RunMixin.shutdownSlave): same
2999         (Disconnect.testIdle1): same
3000         (Disconnect.testBuild2): same: wait one second after the build
3001         finishes for test to really be done.. this should be cleaned up to
3002         avoid wasting that second. Builder.detach uses a callLater(0),
3003         either that should be done in-line (something else needed that
3004         behavior), or it should return a Deferred that fires when the
3005         builder is really offline.
3006         (Disconnect.testBuild3): same
3007         (Disconnect.testDisappear): same
3009         * buildbot/test/test_web.py: rearrange server-setup and teardown
3010         code to remove unclean-reactor warnings from twisted-2.0
3012         * buildbot/test/test_vc.py: rearrange probe-for-VC-program routine
3013         so the tests don't hang under twisted-2.0
3015 2005-03-31  Brian Warner  <warner@lothar.com>
3017         * buildbot/slave/bot.py (Bot.remote_setBuilderList): fix typo that
3018         caused a warning each time the master changed our set of builders
3020         * buildbot/status/builder.py (BuildStatus.saveYourself): under
3021         w32, don't unlink the file unless it already exists. Thanks to
3022         Baptiste Lepilleur for the catch.
3023         (BuilderStatus.saveYourself): same
3025 2005-02-01  Brian Warner  <warner@lothar.com>
3027         * buildbot/status/html.py (TextLog.getChild): use a /text child
3028         URL, such as http://foo.com/svn-hello/builds/1/test/0/text instead
3029         of http://foo.com/svn-hello/builds/1/test/0 , to retrieve the
3030         logfile as text/plain (no markup, no headers). This replaces the
3031         previous scheme (which used an ?text=1 argument), and gets us back
3032         to a relative link (which works better when the buildbot lives
3033         behind another web server, such as Apache configured as a reverse
3034         proxy). Thanks to Gerald Combs for spotting the problem.
3036         * buildbot/__init__.py (version): bump to 0.6.2+ while between
3037         releases
3039 2004-12-13  Brian Warner  <warner@lothar.com>
3041         * buildbot/__init__.py (version): Releasing buildbot-0.6.2
3043         * debian/changelog: update for 0.6.2
3044         * NEWS: finalize for 0.6.2
3046 2004-12-11  Brian Warner  <warner@lothar.com>
3048         * NEWS: bring it up to date
3050         * buildbot/slave/bot.py (BotFactory): revamp keepalive/lost-master
3051         detection code. Require some sign of life from the buildmaster
3052         every BotFactory.keepaliveInterval seconds. Provoke this
3053         indication at BotFactory.keepaliveTimeout seconds before the
3054         deadline by sending a keepalive request. We don't actually care if
3055         that request is answered in a timely fashion, what we care about
3056         is that .activity() is called before the deadline. .activity() is
3057         triggered by any PB message from the master (including an ack to
3058         one of the slave's status-update messages). With this new scheme,
3059         large status messages over slow pipes are OK, as long as any given
3060         message can be sent (and thus acked) within .keepaliveTimeout
3061         seconds (which defaults to 30).
3062         (SlaveBuilder.remote_startCommand): record activity
3063         (SlaveBuilder.ackUpdate): same
3064         (SlaveBuilder.ackComplete): same
3065         (BotFactory.gotPerspective): same
3066         * buildbot/test/test_run.py (Disconnect.testSlaveTimeout): test it
3068 2004-12-09  Brian Warner  <warner@lothar.com>
3070         * buildbot/status/html.py (StatusResourceBuilder.getChild): remove
3071         debug message
3073         * buildbot/process/step_twisted.py (Trial._commandComplete):
3074         update self.cmd when we start the 'cat test.log' transfer. Without
3075         this, we cannot interrupt the correct RemoteCommand when we lose
3076         the connection.
3078         * buildbot/process/step.py (RemoteCommand.interrupt): don't bother
3079         trying to tell the slave to stop the command if we're already
3080         inactive, or if we no longer have a .remote
3082         * buildbot/process/builder.py (Builder._detached): don't let an
3083         exception in currentBuild.stopBuild() prevent the builder from
3084         being marked offline
3086 2004-12-07  Brian Warner  <warner@lothar.com>
3088         * buildbot/status/words.py (IrcStatusBot.getBuilder): catch the
3089         KeyError that happens when you ask for a non-existent Builder, and
3090         translate it into a UsageError.
3092         * buildbot/test/test_run.py (Disconnect.testBuild4): validate that
3093         losing the slave in the middle of a remote step is handled too
3095         * buildbot/process/step.py (ShellCommand.interrupt): 'reason' can
3096         be a Failure, so be sure to stringify it before using it as the
3097         contents of the 'interrupt' logfile
3098         (RemoteCommand.interrupt): use stringified 'why' in
3099         remote_interruptCommand too, just in case
3101 2004-12-06  Brian Warner  <warner@lothar.com>
3103         * buildbot/slave/commands.py (Arch.doVCUpdate): use 'tla replay'
3104         instead of 'tla update', which is more efficient in case we've
3105         missed a couple of patches since the last update.
3107         * debian/changelog: update for previous (0.6.1) release. Obviously
3108         this needs to be handled better.
3110 2004-12-05  Brian Warner  <warner@lothar.com>
3112         * NEWS: update for stuff since last release
3114         * buildbot/master.py (DebugPerspective.attached): return 'self', to
3115         match the maybeDeferred change in Dispatcher.requestAvatar
3116         * buildbot/changes/pb.py (ChangePerspective.attached): same
3117         * buildbot/status/client.py (StatusClientPerspective.attached): same
3118         * buildbot/process/builder.py (Builder._attached3): same
3119         * buildbot/pbutil.py (NewCredPerspective.attached): same
3121         * buildbot/status/html.py (WaterfallStatusResource.phase2): Add
3122         the date to the top-most box, if it is not the same as today's
3123         date.
3125         * docs/slave.xhtml: provide a buildslave setup checklist
3127         * docs/source.xhtml (Arch): correct terminology
3129 2004-12-04  Brian Warner  <warner@lothar.com>
3131         * buildbot/test/test_slavecommand.py: use sys.executable instead
3132         of hard-coding 'python' for child commands, might help portability
3134         * docs/examples/twisted_master.cfg: update to current usage
3136         * buildbot/status/words.py (IrcStatusBot.command_STOP): add a
3137         'stop build' command to the IRC bot
3139         * buildbot/master.py (Dispatcher.requestAvatar): remove debug
3140         message that broke PBChangeSource
3142         * buildbot/slave/bot.py: clean up shutdown/lose-master code
3143         (SlaveBuilder): make some attributes class-level, remove the old
3144         "update queue" which existed to support resuming a build after the
3145         master connection was lost. Try to reimplement that feature later.
3146         (SlaveBuilder.stopCommand): clear self.command when the
3147         SlaveCommand finishes, so that we don't try to kill a leftover one
3148         at shutdown time.
3149         (SlaveBuilder.commandComplete): same, merge with commandFailed and
3150         .finishCommand
3152         * buildbot/slave/commands.py (SourceBase): set self.command for
3153         all VC commands, so they can be interrupted.
3155 2004-12-03  Brian Warner  <warner@lothar.com>
3157         * buildbot/master.py: clean up slave-handling code, to handle
3158         slave-disconnect and multiple-connect better
3159         (BotPerspective): make these long-lasting, exactly one per bot
3160         listed in the config file.
3161         (BotPerspective.attached): if a slave connects while an existing
3162         one appears to still be connected, disconnect the old one first.
3163         (BotPerspective.disconnect): new method to forcibly disconnect a
3164         buildslave. Use some hacks to empty the transmit buffer quickly to
3165         avoid the long (20-min?) TCP timeout that could occur if the old
3166         slave has dropped off the net.
3167         (BotMaster): Keep persistent BotPerspectives in .slaves, let them
3168         own their own SlaveStatus objects. Remove .attached/.detached, add
3169         .addSlave/.removeSlave, treat slaves like Builders (config file
3170         parsing sends deltas to the BotMaster). Inform the slave
3171         instances, i.e. the BotPerspective, about addBuilder and
3172         removeBuilder.
3173         (BotMaster.getPerspective): turns into a single dict lookup
3174         (Dispatcher.requestAvatar): allow .attached to return a Deferred,
3175         which gives BotPerspective.attached a chance to disconnect the old
3176         slave first.
3177         (BuildMaster.loadConfig): add code (disabled) to validate that all
3178         builders use known slaves (listed in c['bots']). The check won't
3179         work with tuple-specified builders, which are deprecated but not
3180         yet invalid, so the check is disabled for now.
3181         (BuildMaster.loadConfig_Slaves): move slave-config into a separate
3182         routine, do the add/changed/removed dance with them like we do
3183         with builders.
3184         (BuildMaster.loadConfig_Sources): move source-config into a
3185         separate routine too
3187         * buildbot/status/builder.py (Status.getSlave): get the
3188         SlaveStatus object from the BotPerspective, not the BotMaster.
3190         * buildbot/test/test_run.py: bunch of new tests for losing the
3191         buildslave at various points in the build, handling a slave that
3192         connects multiple times, and making sure we can interrupt a
3193         running build
3195         * buildbot/slave/bot.py (BuildSlave): make it possible to use
3196         something other than 'Bot' for the Bot object, to make certain
3197         test cases easier to write.
3198         (BuildSlave.waitUntilDisconnected): utility method for testing
3200 2004-11-30  Brian Warner  <warner@lothar.com>
3202         * buildbot/test/test_run.py (RunMixin): refactor, remove debug msg
3204         * buildbot/interfaces.py (IBuilderControl.ping): add timeout=
3205         argument, return a Deferred that always fires with True or False.
3206         I don't use an errback to indicate 'ping failed' so that callers
3207         are free to ignore the deferred without causing spurious errors in
3208         the logs.
3209         * buildbot/process/builder.py (BuilderControl.ping): implement it
3211         * buildbot/test/test_run.py (Status.testDisappear): test ping
3212         (Status.disappearSlave): fix it
3214 2004-11-30  Brian Warner  <warner@lothar.com>
3216         * buildbot/interfaces.py (IBuildControl): add .stopBuild
3217         (IBuilderControl): add .getBuild(num), only works for the current
3218         build, of course, although it might be interesting to offer
3219         something for builds in the .waiting or .interlocked state.
3221         * buildbot/process/base.py (Build): have .stopBuild just do the
3222         interrupt, then let the build die by itself.
3223         (BuildControl): add .stopBuild, and add a point-event named
3224         'interrupt' just after the build so status viewers can tell that
3225         someone killed it.
3226         (BuilderControl): add .getBuild
3228         * buildbot/process/step.py (Dummy): use haltOnFailure so it really
3229         stops when you kill it, good for testing
3230         (ShellCommand.interrupt): add a logfile named 'interrupt' which
3231         contains the 'reason' text.
3233         * buildbot/status/html.py: Add Stop Build button, if the build can
3234         still be stopped. Send a Redirect (to the top page) one second
3235         later, hopefully long enough for the interrupt to have an effect.
3236         Move make_row() up to top-level to share it between Stop Build and
3237         Force Build.
3239         * buildbot/slave/commands.py: only kill the child process once
3241         * buildbot/test/test_run.py: add testInterrupt
3243 2004-11-29  Brian Warner  <warner@lothar.com>
3245         * buildbot/process/base.py: Refactor command interruption. The
3246         Build is now responsible for noticing that the slave has gone
3247         away: Build.lostRemote() interrupts the current step and makes
3248         sure that no further ones will be started.
3249         
3250         * buildbot/process/builder.py: When the initial remote_startBuild
3251         message fails, log it: this usually indicates that the slave has
3252         gone away, but we don't really start paying attention until they
3253         fail to respond to the first step's command.
3255         * buildbot/process/step.py (RemoteCommand): Does *not* watch for
3256         slave disconnect. Now sports a new interrupt() method. Error
3257         handling was simplified a lot by chaining deferreds, so
3258         remoteFailed/remoteComplete were merged into a single
3259         remoteComplete method (which can now get a Failure object).
3260         Likewise failed/finished were merged into just _finished.
3261         (BuildStep): Add interrupt(why) method, and if why is a
3262         ConnectionLost Failure then the step is failed with some useful
3263         error text.
3265         * buildbot/slave/bot.py: stop the current command when the remote
3266         Step reference is lost, and when the slave is shut down.
3267         (Bot): make it a MultiService, so it can have children. Use
3268         stopService to tell when the slave is shutting down.
3269         (SlaveBuilder): make it a Service, and a child of the Bot. Add
3270         remote_interruptCommand (which asks the current SlaveCommand to
3271         stop but allows it to keep emitting status messages), and
3272         stopCommand (which tells it to shut up and die).
3274         * buildbot/slave/commands.py: make commands interruptible
3275         (ShellCommand.kill): factor out os.kill logic
3276         (Command): factor out setup()
3277         (Command.sendStatus): don't send status if .running is false, this
3278         happens when the command has been halted.
3279         (Command.interrupt): new method, used to tell the command to die
3280         (SlaveShellCommand): implement .interrupt
3281         (DummyCommand): implement .interrupt
3282         (SourceBase, etc): factor out setup(), don't continue substeps if
3283         .interrupted is set
3285         * buildbot/status/builder.py: fix all waitUntilFinished() methods
3286         so they can be called after finishing
3288         * buildbot/test/test_run.py: new tests for disconnect behavior,
3289         refactor slave-shutdown routines, add different kinds of
3290         slave-shutdown
3292 2004-11-27  Brian Warner  <warner@lothar.com>
3294         * buildbot/status/words.py (IrcStatusBot.convertTime): utility
3295         method to express ETA time like "2m45s" instead of "165 seconds"
3297 2004-11-24  Brian Warner  <warner@lothar.com>
3299         * buildbot/test/test_vc.py (VC.testArch): unregister the test
3300         archive after the test completes, to avoid cluttering the user's
3301         'tla archives' listing with a bogus entry. Arch doesn't happen to
3302         provide any way to override the use of ~/.arch-params/, so there
3303         isn't a convenient way to avoid touching the setup of the user who
3304         runs the test.
3305         (VC_HTTP.testArchHTTP): same
3307 2004-11-23  Brian Warner  <warner@lothar.com>
3309         * buildbot/status/html.py (TextLog): split render() up into
3310         render_HEAD and render_GET. Use a Producer when sending log
3311         chunks, to reduce memory requirements and avoid sending huge
3312         non-Banana-able strings over web.distrib connections. Requires
3313         peeking under the covers of IStatusLog.
3314         (TextLog.resumeProducing): fix the "as text" link, handle client
3315         disconnects that occur while we're still sending old chunks.
3317         * buildbot/status/builder.py (HTMLLogFile.waitUntilFinished): oops,
3318         use defer.succeed, not the non-existent defer.success
3319         (LogFile.waitUntilFinished): same
3320         (LogFile.subscribe): don't add watchers to a finished logfile
3322         * buildbot/__init__.py (version): bump to 0.6.1+ while between
3323         releases
3325 2004-11-23  Brian Warner  <warner@lothar.com>
3327         * buildbot/__init__.py (version): Releasing buildbot-0.6.1
3329 2004-11-23  Brian Warner  <warner@lothar.com>
3331         * NEWS: update for the 0.6.1 release
3332         * MANIFEST.in: add new files
3334         * README (INSTALLATION): explain how to enable the extra VC tests
3336         * buildbot/status/builder.py (LogFile): add .runEntries at the class
3337         level to, so old pickled builds can be displayed ok
3339 2004-11-22  Brian Warner  <warner@lothar.com>
3341         * NEWS: summarize updates since last release
3343         * README (SLAVE): fix usage of 'buildbot slave' command. Thanks to
3344         Yoz Grahame. Closes SF#1050138.
3346         * docs/changes.xhtml (FreshCVSSourceNewcred): fix typo. Closes
3347         SF#1042563.
3349         * buildbot/process/step_twisted.py (Trial): update docs a bit
3351         * docs/factories.xhtml: fix Trial factory docs to match reality.
3352         Closes: SF#1049758.
3354         * buildbot/process/factory.py (Trial.__init__): add args for
3355         randomly= and recurse=, making them available to instantiators
3356         instead of only to subclassers. Closes: SF#1049759.
3358 2004-11-15  Brian Warner  <warner@lothar.com>
3360         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
3361         try to teach the Quick factory to use multiple versions of python
3363 2004-11-12  Brian Warner  <warner@lothar.com>
3365         * buildbot/status/builder.py (BuilderStatus.saveYourself): use a
3366         safer w32-compatible approach, and only use it on windows
3367         (BuildStatus.saveYourself): same
3369 2004-11-11  Brian Warner  <warner@lothar.com>
3371         * buildbot/status/builder.py (LogFile.addEntry): smarter way to do
3372         it: one string merge per chunk. There are now separate .entries
3373         and .runEntries lists: when enumerating over all chunks, make sure
3374         to look at both.
3375         * buildbot/test/test_status.py (Log): more tests
3377         * buildbot/status/builder.py (LogFile.addEntry): Merge string
3378         chunks together, up to 10kb per chunk. This ought to cut down on
3379         the CPU-burning overhead of large log files. Thanks to Alexander
3380         Staubo for spotting the problem.
3381         * buildbot/test/test_status.py (Log): tests for same
3383 2004-11-10  Brian Warner  <warner@lothar.com>
3385         * buildbot/status/mail.py (MailNotifier.buildMessage): add a Date
3386         header to outbound mail
3387         * buildbot/test/test_status.py (Mail.testBuild1): test for same
3389 2004-11-08  Brian Warner  <warner@lothar.com>
3391         * buildbot/status/builder.py (BuilderStatus.saveYourself): w32
3392         can't do os.rename() onto an existing file, so catch the exception
3393         and unlink the target file first. This introduces a slight window
3394         where the existing file could be lost, but the main failure case
3395         (disk full) should still be handled safely.
3396         (BuildStatus.saveYourself): same
3398         * buildbot/changes/pb.py (ChangePerspective): use a configurable
3399         separator character instead of os.sep, because the filenames being
3400         split here are coming from the VC system, which can have a
3401         different pathname convention than the local host. This should
3402         help a buildmaster running on windows that uses a CVS repository
3403         which runs under unix.
3404         * buildbot/changes/mail.py (MaildirSource): same, for all parsers
3406         * buildbot/process/step_twisted.py (Trial.createSummary): survive
3407         when there are no test failures to be parsed
3409         * buildbot/scripts/runner.py (createMaster): use shutil.copy()
3410         instead of the unix-specific os.system("cp"), thanks to Elliot
3411         Murphy for this and the other buildbot-vs-windows catches.
3412         * buildbot/test/test_maildir.py (MaildirTest.deliverMail): same
3414         * contrib/windows/buildbot.bat: prefix a '@', apparently to not
3415         echo the command as it is run
3417         * setup.py: install sample.mk too, not just sample.cfg
3418         (scripts): install contrib/windows/buildbot.bat on windows
3420 2004-11-07  Brian Warner  <warner@lothar.com>
3422         * buildbot/process/builder.py (Builder._detached): clear the
3423         self.currentBuild reference, otherwise the next build will be
3424         skipped because we think the Builder is already in use.
3426         * docs/examples/twisted_master.cfg: update to match current usage
3427         on the Twisted buildbot
3429 2004-10-29  Brian Warner  <warner@lothar.com>
3431         * buildbot/status/mail.py (MailNotifier): fix typo in docs
3433 2004-10-28  Brian Warner  <warner@lothar.com>
3435         * buildbot/slave/commands.py (SourceBase): refactor subclasses to
3436         have separate doVCUpdate/doVCFull methods. Catch an update failure
3437         and respond by clobbering the source directory and re-trying. This
3438         will handle local changes (like replacing a file with a directory)
3439         that will cause CVS and SVN updates to fail.
3440         * buildbot/test/test_vc.py (SetupMixin.do_vc): test the same
3442         * buildbot/process/step.py (LoggedRemoteCommand.__repr__): avoid a
3443         python-2.4 warning
3445 2004-10-19  Brian Warner  <warner@lothar.com>
3447         * buildbot/process/step_twisted.py (Trial.createSummary): bugfixes
3449         * buildbot/status/html.py (StatusResourceTestResults): display any
3450         TestResults that the Build might have
3451         (StatusResourceTestResult): and the logs for each TestResult
3452         (StatusResourceBuild): add link from the per-build page
3454 2004-10-15  Brian Warner  <warner@lothar.com>
3456         * buildbot/process/step_twisted.py (Trial.createSummary): parse
3457         the 'problems' portion of stdout, add TestResults to our build
3458         * buildbot/test/test_twisted.py (Parse.testParse): test it
3460         * buildbot/interfaces.py (IBuildStatus.getTestResults): new method
3461         to retrieve a dict of accumulated test results
3462         (ITestResult): define what a single test result can do
3463         * buildbot/status/builder.py (TestResult): implement ITestResult
3464         (BuildStatus.getTestResults): retrieve dict of TestResults
3465         (BuildStatus.addTestResult): add TestResults
3466         * buildbot/test/test_status.py (Results.testAddResults): test it
3468 2004-10-14  Brian Warner  <warner@lothar.com>
3470         * buildbot/test/test_maildir.py (MaildirTest): use shutil.rmtree
3471         instead of os.system("rm -rf") for win32 portability
3473         * buildbot/test/test_slavecommand.py (SlaveCommandTestCase): use
3474         SignalMixin instead of starting/stopping the reactor, which is
3475         likely to cause problems with other tests
3477         * buildbot/slave/commands.py (SourceBase.doCopy): remove leftover
3478         self.copyComplete() call. Yoz Grahame makes the catch.
3480         * contrib/windows/buildbot.bat: helper script to deal with path
3481         issues. Thanks to Yoz Grahame.
3483         * buildbot/master.py (BuildMaster.startService): don't register a
3484         SIGHUP handler if the signal module has no SIGHUP attribute.
3485         Apparently win32 does this.
3487         * buildbot/scripts/runner.py (start): add --reactor=win32 on win32
3489         * buildbot/test/test_web.py (WebTest.test_webPathname): skip the
3490         test if the reactor can't offer UNIX sockets
3492         * buildbot/status/html.py (StatusResourceBuild.body): fix syntax
3493         error introduced in the last commit. We really need that
3494         metabuildbot :).
3496 2004-10-12  Brian Warner  <warner@lothar.com>
3498         * buildbot/changes/mail.py (MaildirSource.describe): fix exception
3499         when describing a maildir source. Thanks to Stephen Davis.
3501         * buildbot/status/words.py (IrcStatusBot.command_WATCH): round off
3502         ETA seconds
3504         * buildbot/scripts/runner.py (createMaster): install Makefile too
3505         (start): add --no_save to 'start' command
3506         * buildbot/scripts/sample.mk: simple convenience Makefile with 
3507         start/stop/reload targets
3509         * buildbot/__init__.py (version): bump to 0.6.0+ while between
3510         releases
3512 2004-09-30  Brian Warner  <warner@lothar.com>
3514         * setup.py: Releasing buildbot-0.6.0
3516 2004-09-30  Brian Warner  <warner@lothar.com>
3518         * MANIFEST.in: add debian/*, sample.cfg, more docs files. Remove
3519         test_trial.py from the source tarball until support is complete.
3521         * NEWS: update for 0.6.0 release
3522         * buildbot/__init__.py (version): same
3523         * README: same
3525         * buildbot/status/words.py (IrcStatusBot.command_SOURCE): add
3526         'source' command to tell users where to get the Buildbot source
3528         * docs/examples/*.cfg: update to modern standards
3530         * NEWS: update for release
3532         * buildbot/scripts/runner.py (createMaster): remove the
3533         -shutdown.tap stuff now that it isn't necessary
3534         (createSlave): same
3535         (start): launch buildbot.tap, not buildbot-shutdown.tap
3538         * buildbot/status/mail.py (Domain): shorten class name
3539         (MailNotifier): if lookup= is a string, pass it to Domain()
3540         * buildbot/test/test_status.py (Mail.testBuild1): new class name
3541         (Mail.testBuild2): test the string-to-Domain shortcut
3542         (Mail.testMail): fix test
3545         * buildbot/scripts/sample.cfg: improve the build-the-buildbot
3546         example config file
3548         * buildbot/status/builder.py (BuildStatus.__setstate__): re-set
3549         more attributes on load
3550         (BuilderStatus.stubBuildCacheSize): bump to 30, this was too low
3551         to accomodate the whole waterfall page at once, and the thrashing
3552         results in a lot of unnecessary loads
3553         (BuildStatus.saveYourself): use binary pickles, not fluffy text
3554         (BuilderStatus.saveYourself): same
3555         (BuilderStatus.eventGenerator): stop generating on the first missing
3556         build. We assume that saved builds are deleted oldest-first.
3557         (BuildStepStatus.__getstate__): .progress might not exist
3559         * buildbot/changes/changes.py (ChangeMaster): make it
3560         serializable, in $masterdir/changes.pck
3561         (ChangeMaster.stopService): save on shutdown
3562         * buildbot/master.py (BuildMaster.loadChanges): load at startup
3563         * buildbot/test/test_config.py: load Changes before config file
3566         * buildbot/slave/commands.py (ShellCommand.doTimeout): put the
3567         "Oh my god, you killed the command" header on a separate line
3569         * buildbot/status/builder.py (BuilderStatus.getStubBuildByNumber):
3570         skip over corrupted build pickles
3571         (BuilderStatus.getFullBuildByNumber): same
3572         (BuilderStatus.eventGenerator): skip over unavailable builds
3573         (BuildStatus.saveYourself): save builds to a .tmp file first, then
3574         do an atomic rename. This prevents a corrupted pickle when some
3575         internal serialization error occurs.
3576         (BuilderStatus.saveYourself): same
3578         * buildbot/slave/commands.py (SlaveShellCommand): oops, restore
3579         the timeout for shell commands, it got lost somehow
3581         * buildbot/status/builder.py (BuilderStatus.eventGenerator): if we
3582         run out of build steps, return the rest of the builder events
3584         * buildbot/interfaces.py (IBuilderControl.ping): add method
3586         * buildbot/process/builder.py (BuilderControl.ping): move
3587         slave-ping to BuilderControl, and fix the failure case in the
3588         process (Event.finish() is the verb, Event.finished is the noun).
3590         * buildbot/status/html.py (StatusResourceBuilder.ping): ping
3591         through the BuilderControl instead of the BuilderStatus
3592         (EventBox): add adapter for builder.Event, allowing builder events to
3593         be displayed in the waterfall display
3595         * buildbot/master.py (BotMaster.stopService): add a 'master
3596         shutdown' event to the builder's log
3597         (BuildMaster.startService): and a 'master started' on startup
3599         * buildbot/status/builder.py (BuilderStatus.eventGenerator): merge
3600         builder events into the BuildStep event stream
3601         (Status.builderAdded): add a 'builder created' event
3604         * buildbot/status/words.py (IrcStatusBot.command_WATCH): new
3605         command to announce the completion of a running build
3606         (IrcStatusBot.command_FORCE): announce when the build finishes
3608         * buildbot/status/builder.py (BuilderStatus.addFullBuildToCache):
3609         don't evict unfinished builds from the cache: they must stay in
3610         the full-cache until their logfiles have stopped changing. Make
3611         sure the eviction loop terminates if an unfinished build was hit.
3612         (HTMLLogFile.getTextWithHeaders): return HTML as if it were text.
3613         This lets exceptions be dumped in an email status message. Really
3614         we need LogFiles which contain both text and HTML, instead of two
3615         separate classes.
3616         (BuildStatus.__getstate__): handle self.finished=False
3617         (Status.builderAdded): if the pickle is corrupted, abandon the
3618         history and create a new BuilderStatus object.
3620         * buildbot/process/base.py (Build.stopBuild): tolerate lack of a
3621         self.progress attribute, helped one test which doesn't fully set
3622         up the Build object.
3624         * buildbot/interfaces.py (IStatusLogStub): split out some of the
3625         IStatusLog methods into an Interface that is implemented by "stub"
3626         logs, for which all the actual text chunks are on disk (in the
3627         pickled Build instance). To show the log contents, you must first
3628         adapt the stub log to a full IStatusLog object.
3630         * buildbot/status/builder.py (LogFileStub): create separate stub
3631         log objects, which can be upgraded to a real one if necessary.
3632         (LogFile): make them persistable, and let them stubify themselves
3633         (HTMLLogFile): same
3634         (BuildStepStatus): same
3635         (BuildStatus): same
3636         (BuildStatus.saveYourself): save the whole build out to disk
3637         (BuilderStatus): make it persistable
3638         (BuilderStatus.saveYourself): save the builder to disk
3639         (BuilderStatus.addFullBuildToCache): implement two caches which
3640         hold Build objects: a small one which holds full Builds, and a
3641         larger one which holds "stubbed" Builds (ones with their LogFiles
3642         turned into LogFileStubs). This reduces memory usage by the
3643         buildmaster by not keeping more than a few (default is 2) whole
3644         build logs in RAM all the time.
3645         (BuilderStatus.getBuild): rewrite to pull from disk (through the
3646         cache)
3647         (BuilderStatus.eventGenerator): rewrite since .builds went away
3648         (BuilderStatus.buildStarted): remove the .builds array. Add the
3649         build to the "full" cache when it starts.
3650         (BuilderStatus._buildFinished): save the build to disk when it
3651         finishes
3652         (Status): give it a basedir (same as the BuildMaster's basedir)
3653         where the builder pickles can be saved
3654         (Status.builderAdded): create the BuilderStatus ourselves, by
3655         loading a pickle from disk (or creating a new instance if there
3656         was none on disk). Return the BuilderStatus so the master can glue
3657         it into the new Builder object.
3659         * buildbot/master.py (BotMaster.stopService): on shutdown, tell
3660         all BuilderStatuses to save themselves out to disk. This is in
3661         lieu of saving anything important in the main Application pickle
3662          (the -shutdown.tap file).
3663         (BuildMaster.__init__): give Status() a basedir for its files
3664         (BuildMaster.loadConfig_Builders): do status.builderAdded first,
3665         to get the BuilderStatus, then give it to the Builder (instead of
3666         doing it the other way around). It's ok if the status announces
3667         the new Builder before it's really ready, as the outside world can
3668         only see the BuilderStatus object anyway (and it is ready before
3669         builderAdded returns). Use the builder's "builddir" (which
3670         normally specifies where the slave will run the builder) as the
3671         master's basedir (for saving serialized builds).
3673         * buildbot/status/html.py (StatusResourceBuildStep.getChild):
3674         coerce the logfile to IStatusLog before trying to get the text
3675         chunks out of it. This will pull the full (non-stubified) Build in
3676         from disk if necessary.
3677         (TextLog): fix the adapter registration
3679         * buildbot/test/test_control.py (Force.setUp): create the basedir
3680         * buildbot/test/test_web.py: same
3681         * buildbot/test/test_vc.py (SetupMixin.setUp): same
3682         * buildbot/test/test_status.py (Mail.makeBuild): match new setup
3683         * buildbot/test/test_run.py (Run.testMaster): same
3684         (Status.setUp): same
3686 2004-09-29  Fred L. Drake, Jr.  <fdrake@acm.org>
3688         * buildbot/status/html.py (Waterfall.__init__): store actual
3689         allowForce flag passed in rather than using True for everyone;
3690         make sure setting it to False doesn't cause a NameError
3691         (Waterfall.setup).
3692         (StatusResourceBuilder.__init__) add the builder name to the page
3693         title.
3694         (StatusResourceBuilder.body) move HTML generation for a name/value
3695         row into a helper method (StatusResourceBuilder.make_row); only
3696         generate the "Force Build" form if allowForce was True and the
3697         slave is connected.  Use class attributes in the generated HTML to
3698         spread a little CSS-joy.
3700 2004-09-28  Brian Warner  <warner@lothar.com>
3702         * buildbot/process/step_twisted.py (Trial.createSummary): fix
3703         warning-scanner to not ignore things like
3704         'ComponentsDeprecationWarning' and 'exceptions.RuntimeWarning'
3706         * buildbot/status/html.py (StatusResource.control): add some
3707         class-level values for .control in an attempt to make upgrading
3708         smoother
3710         * buildbot/util.py (ComparableMixin): survive missing attributes,
3711         such as when a class is modified and we're comparing old instances
3712         against new ones
3714         * buildbot/status/words.py (IrcStatusBot.privmsg): clean up
3715         failure handling, remove a redundant try/except block. Don't
3716         return the full traceback to the IRC channel.
3717         (IrcStatusBot.command_FORCE): catch new exceptions, return useful
3718         error messages. Get ETA properly.
3720         * buildbot/status/html.py (StatusResourceBuild.body): html.escape
3721         the reason, since (at least) IRC message will have <> in them.
3722         (StatusResourceBuilder.__init__): take an IBuilderControl
3723         (StatusResourceBuilder.force): use the IBuilderControl we get in
3724         the constructor instead of trying to make our own. Catch the
3725         new exceptions and ignore them for now (until we make an
3726         intermediate web page where we could show the error message)
3727         (StatusResource): create with an IControl, use it to give an
3728         IBuilderControl to all children
3729         (Waterfall): take an allowForce= option, pass an IControl object
3730         to StatusResource if it is True
3732         * buildbot/test/test_web.py (ConfiguredMaster): handle IControl
3734         * buildbot/master.py (BotPerspective.perspective_forceBuild):
3735         catch new exceptions and return string forms
3737         * buildbot/interfaces.py: add NoSlaveError, BuilderInUseError
3738         * buildbot/process/builder.py (Builder.forceBuild): raise them
3739         * buildbot/test/test_control.py (Force.testNoSlave): new test
3740         (Force.testBuilderInUse): same
3743         * buildbot/status/words.py (IrcStatusBot): enable build-forcing
3745         * buildbot/test/test_run.py: use IControl
3746         * buildbot/test/test_vc.py: same
3748         * buildbot/status/html.py (StatusResourceBuilder.force): rewrite
3749         to use IControl. Still offline.
3750         * buildbot/status/words.py (IrcStatusBot.command_FORCE): same
3752         * buildbot/process/builder.py (Builder.doPeriodicBuild): set
3753         who=None so periodic builds don't send out status mail
3754         (Builder.forceBuild): include reason in the log message
3755         (BuilderControl.forceBuild): rename 'name' to 'who'
3757         * buildbot/master.py (BotPerspective.perspective_forceBuild): add
3758         'who' parameter, but make it None by default so builds forced by
3759         slave admins don't cause status mail to be sent to anybody
3760         (BotMaster.forceBuild): same. this method is deprecated.
3761         (DebugPerspective.perspective_forceBuild): same, use IControl.
3762         (DebugPerspective.perspective_fakeChange): use IControl..
3763         (Dispatcher.requestAvatar): .. so don't set .changemaster
3765         * buildbot/interfaces.py (IBuilderControl.forceBuild): rename 'who'
3766         parameter to avoid confusion with the name of the builder
3769         * buildbot/status/mail.py: refine comment about needing 2.3
3771         * buildbot/status/html.py: move all imports to the top
3773         * buildbot/test/test_control.py: test new interfaces
3774         * buildbot/test/test_run.py (Status): handle new interfaces
3775         * buildbot/test/test_vc.py (SetupMixin.doBuild): same
3777         * buildbot/process/base.py (BuildControl): implement IBuildControl
3778         and its lonely getStatus() method
3780         * buildbot/process/builder.py (BuilderControl): implement
3781         IBuilderControl, obtained by adapting the Builder instance
3782         (Builder.startBuild): return a BuilderControl instead of a
3783         Deferred. The caller can use bc.getStatus().waitUntilFinished() to
3784         accomplish the same thing.
3786         * buildbot/master.py: move all import statements to the top
3787         (Control): implement IControl, obtained by adapting the
3788         BuildMaster instance.
3790         * buildbot/interfaces.py: add IControl, IBuilderControl, and
3791         IBuildControl. These are used to force builds. Eventually they
3792         will provide ways to reconfigure the Builders, pause or abandon a
3793         Build, and perhaps control the BuildMaster itself.
3795 2004-09-26  Brian Warner  <warner@lothar.com>
3797         * buildbot/util.py (ComparableMixin): survive twisted>1.3.0 which
3798         ends up comparing us against something without a .__class__
3800 2004-09-24  Brian Warner  <warner@lothar.com>
3802         * buildbot/scripts/runner.py: rearrange option parsing a lot, to get
3803         usage text right.
3805         * Makefile: add 'deb-snapshot' target, to create a timestamped
3806         .deb package
3808         * debian/rules (binary-indep): skip CVS/ files in dh_installexamples
3810 2004-09-23  Brian Warner  <warner@lothar.com>
3812         * buildbot/__init__.py (version): move version string here
3813         * setup.py: get version string from buildbot.version
3814         * buildbot/status/html.py (WaterfallStatusResource.body): add
3815         buildbot version to the page footer
3816         * buildbot/status/words.py (IrcStatusBot.command_VERSION): provide
3817         version when asked
3819         * buildbot/master.py (BotMaster.getPerspective): detect duplicate
3820         slaves, let the second know where the first one is coming from
3821         (BuildMaster.__init__): turn on .unsafeTracebacks so the slave can
3822         see our exceptions. It would be nice if there were a way to just
3823         send them the exception type and value, not the full traceback.
3826         * buildbot/status/mail.py (MailNotifier): add a new argument
3827         sendToInterestedUsers=, which can be set to False to disable the
3828         usual send-to-blamelist behavior.
3829         (top): handle python-2.2 which has no email.MIMEMultipart
3830         (MailNotifier.buildMessage): don't send logs without MIMEMultipart
3831         (MailNotifier.disownServiceParent): unsubscribe on removal
3833         * buildbot/test/test_status.py (Mail.testBuild2): test it
3836         * buildbot/status/progress.py (Expectations.wavg): tolerate
3837         current=None, which happens when steps start failing badly
3838         * buildbot/test/test_status.py (Progress.testWavg): test for it
3840         * buildbot/process/step.py (SVN.startVC): when the (old) slave
3841         doesn't understand args['revision'], emit a warning instead of
3842         bailing completely. Updating to -rHEAD is probably close enough.
3844         * buildbot/process/step_twisted.py (Trial.start): fix sanity-check
3846         * buildbot/test/test_status.py: at least import bb.status.client
3847         even if we don't have any test coverage for it yet
3849         * contrib/svn_buildbot.py: don't require python2.3
3850         (main): wait, do require it (for sets.py), but explain how to
3851         make it work under python2.2
3853 2004-09-23  Brian Warner  <warner@lothar.com>
3855         * contrib/svn_buildbot.py: include the revision number in the Change
3857         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): use when=,
3858         using util.now() because FreshCVS is a realtime service
3860         * buildbot/status/event.py: delete dead code
3861         * buildbot/process/step.py: don't import dead Event class
3862         * buildbot/process/step_twisted.py: same
3863         * buildbot/status/builder.py: same
3864         * buildbot/status/client.py: same
3866         * buildbot/test/test_process.py: kill buggy out-of-date disabled test
3868         * buildbot/changes/changes.py (Change): set .when from an __init__
3869         argument (which defaults to now()), rather than having
3870         ChangeMaster.addChange set it later.
3871         (ChangeMaster.addChange): same
3873         * buildbot/changes/mail.py (parseFreshCVSMail): pass in when=
3874         (parseSyncmail): same. Just use util.now() for now.
3875         (parseBonsaiMail): parse the timestamp field for when=
3877         * buildbot/test/test_vc.py (SourceStamp.addChange): page in when=
3878         instead of setting .when after the fact
3880 2004-09-22  slyphon
3882         * buildbot/slave/trial.py: new SlaveCommand to machine-parse test
3883         results when the target project uses retrial. Still under
3884         development.
3885         * buildbot/test/test_trial.py: same
3887 2004-09-21  Brian Warner  <warner@lothar.com>
3889         * buildbot/status/mail.py (MailNotifier.__init__): include
3890         success/warnings/failure in the Subject line
3891         (MailNotifier.buildMessage): add the buildbot's URL to the body,
3892         use step.logname for the addLogs=True attachment filenames
3893         * buildbot/test/test_status.py (Mail): test Subject lines
3894         (Mail.testLogs): test attachment filenames
3896         * buildbot/master.py (DebugPerspective.perspective_fakeChange):
3897         accept a 'who' argument from the debug tool
3898         * contrib/debugclient.py (DebugWidget.do_commit): send 'who'
3899         * contrib/debug.glade: add text box to set 'who'
3901         * buildbot/interfaces.py (IBuildStatus.getBuilder): replace
3902         .getBuilderName with .getBuilder().getName(), more flexible
3903         (IStatusLog.getName): logs have short names, but you can prefix
3904         them with log.getStep().getName() to make them more useful
3905         * buildbot/status/builder.py: same
3906         * buildbot/status/client.py: same
3907         * buildbot/status/html.py: same
3908         * buildbot/test/test_run.py (Status.testSlave): same
3909         * buildbot/process/step.py: tweak logfile names
3911         * buildbot/status/mail.py (MailNotifier): add lookup, change
3912         argument to extraRecipients. The notifier is now aimed at sending
3913         mail to the people involved in a particular build, with additional
3914         constant recipients as a secondary function.
3916         * buildbot/test/test_status.py: add coverage for IEmailLookup,
3917         including slow-lookup and failing-lookup. Make sure the blamelist
3918         members are included.
3920         * buildbot/interfaces.py: new interfaces IEmailSender+IEmailLookup
3921         (IBuildStatus.getResponsibleUsers): rename from getBlamelist
3922         (IBuildStatus.getInterestedUsers): new method
3923         * buildbot/status/builder.py (BuildStatus.getResponsibleUsers): same
3924         * buildbot/status/client.py (remote_getResponsibleUsers): same
3925         * buildbot/status/html.py (StatusResourceBuild.body): same
3926         * buildbot/test/test_run.py (Status.testSlave): same
3928 2004-09-20  Brian Warner  <warner@lothar.com>
3930         * docs/users.xhtml: update concepts
3932         * Makefile: add a convenience makefile, for things like 'make
3933         test'. It is not included in the source tarball.
3935 2004-09-16  Brian Warner  <warner@lothar.com>
3937         * NEWS: mention /usr/bin/buildbot, debian/*
3939         * debian/*: add preliminary debian packaging. Many thanks to
3940         Kirill Lapshin (and Kevin Turner) for the hard work. I've mangled
3941         it considerably since it left their hands, I am responsible for
3942         all breakage that's resulted.
3944         * bin/buildbot: create a top-level 'buildbot' command, to be
3945         installed in /usr/bin/buildbot . For now it's just a simple
3946         frontend to mktap/twistd/kill, but eventually it will be the entry
3947         point to the 'try' command and also a status client. It is also
3948         intended to support the upcoming debian-packaging init.d scripts.
3949         * buildbot/scripts/runner.py: the real work is done here
3950         * buildbot/scripts/__init__.py: need this too
3951         * buildbot/scripts/sample.cfg: this is installed in new
3952         buildmaster directories
3953         * setup.py: install new stuff
3955 2004-09-15  Brian Warner  <warner@lothar.com>
3957         * buildbot/test/test_vc.py: skip SVN tests if svn can't handle the
3958         'file:' schema (the version shipped with OS-X was built without the
3959         ra_local plugin).
3960         (SetupMixin.tearDown): stop the goofy twisted.web timer which
3961         updates the log-timestamp, to make sure it isn't still running after
3962         the test finishes
3964         * docs/config.xhtml: Add projectName, projectURL, buildbotURL
3965         values to the config file.
3966         * docs/examples/hello.cfg: add examples
3967         * buildbot/interfaces.py (IStatus.getBuildbotURL): define accessors
3968         * buildbot/status/builder.py (Status.getProjectURL): implement them
3969         * buildbot/master.py (BuildMaster.loadConfig): set them from config
3970         * buildbot/test/test_config.py (ConfigTest.testSimple): test them
3971         * buildbot/status/html.py (WaterfallStatusResource): display them
3974         * buildbot/test/test_vc.py (FakeBuilder.name): add attribute so
3975         certain error cases don't suffer a secondary exception.
3976         (top): Skip tests if the corresponding VC tool is not installed.
3978         * buildbot/process/factory.py (Trial): introduce separate
3979         'buildpython' and 'trialpython' lists, since trialpython=[] is
3980         what you want to invoke /usr/bin/python, whereas ./setup.py is
3981         less likely to be executable. Add env= parameter to pass options
3982         to test cases (which is how I usually write tests, I don't know if
3983         anyone else does it this way).
3985         * buildbot/process/step_twisted.py (Trial): handle python=None.
3986         Require 'testpath' be a string, not a list. Fix tests= typo.
3987         (Trial.start): sanity-check any PYTHONPATH value for stringness.
3989         * buildbot/process/step.py (RemoteCommand._remoteFailed): goofy
3990         way to deal with the possibility of removing the disconnect notify
3991         twice.
3992         (CVS): add a 'login' parameter to give a password to 'cvs login',
3993         commonly used with pserver methods (where pw="" or pw="guest")
3995         * buildbot/slave/commands.py (SourceBase): move common args
3996         extraction and setup() to __init__, so everything is ready by the
3997         time setup() is called
3998         (CVS.start): call 'cvs login' if a password was supplied
3999         (ShellCommand): special-case PYTHONPATH: prepend the master's
4000         value to any existing slave-local value.
4002         * buildbot/process/builder.py (Builder.updateBigStatus): if we
4003         don't have a remote, mark the builder as Offline. This whole
4004         function should probably go away and be replaced by individual
4005         deltas.
4006         (Builder.buildFinished): return the results to the build-finished
4007         deferred callback, helps with testing
4009 2004-09-14  Brian Warner  <warner@lothar.com>
4011         * buildbot/test/test_vc.py: put all the repositories needed to run
4012         the complete tests into a single small (1.3MB) tarball, so I can
4013         make that tarball available on the buildbot web site. Test HTTP
4014         access (for Arch and Darcs) by spawning a temporary web server
4015         while the test runs.
4017         * docs/users.xhtml: new document, describe Buildbot's limited
4018         understanding of different human users
4020         * buildbot/test/test_vc.py: rearrange test cases a bit
4022         * buildbot/process/step_twisted.py (Trial): handle testpath=
4023         * buildbot/process/factory.py (Trial): update to use step.Trial
4025         * buildbot/slave/commands.py (ShellCommandPP): fix fatal typo
4027         * buildbot/status/builder.py (BuildStatus.getText): add text2 to
4028         the overall build text (which gives you 'failed 2 tests' rather
4029         than just 'failed')
4030         (BuildStepStatus.text2): default to [], not None
4032         * buildbot/process/step_twisted.py (Trial.commandComplete): text2
4033         must be a list
4035 2004-09-12  Brian Warner  <warner@lothar.com>
4037         * buildbot/master.py (BotPerspective._commandsUnavailable): don't
4038         log the whole exception if it's just an AttributeError (old slave)
4040         * buildbot/process/step.py (ShellCommand.__init__): stash .workdir
4041         so (e.g.) sub-commands can be run in the right directory.
4042         (ShellCommand.start): accept an optional errorMessage= argument
4043         to make life easier for SVN.start
4044         (SVN.startVC): put the "can't do mode=export" warning in the LogFile
4045         headers
4046         (ShellCommand.start): move ['dir'] compatibility hack..
4047         (RemoteShellCommand.start): .. to here so everyone can use it
4049         * buildbot/process/step_twisted.py (Trial): use .workdir
4051         * buildbot/process/step_twisted.py (BuildDebs.getText): fix the
4052         text displayed when debuild fails completely
4053         (Trial): snarf _trial_temp/test.log from the slave and display it
4055 2004-09-11  Brian Warner  <warner@lothar.com>
4057         * buildbot/process/step_twisted.py (ProcessDocs.getText): typo
4059         * buildbot/process/process_twisted.py (TwistedTrial.tests): oops,
4060         set to 'twisted', so --recurse can find twisted/web/test/*, etc
4062         * buildbot/process/step.py (ShellCommand): call .createSummary
4063         before .evaluateCommand instead of the other way around. This
4064         makes it slightly easier to count warnings and then use that to
4065         set results=WARNINGS
4066         * buildbot/process/step_twisted.py: cosmetic, swap the methods
4068         * buildbot/process/base.py (Build.buildFinished): update status
4069         before doing progress. It's embarrassing for the build to be stuck
4070         in the "building" state when an exceptions occurs elsewhere..
4072         * buildbot/status/progress.py (Expectations.expectedBuildTime):
4073         python2.2 doesn't have 'sum'
4075         * buildbot/status/builder.py (Status.getBuilderNames): return a copy,
4076         to prevent clients from accidentally sorting it
4078         * buildbot/master.py (Manhole): add username/password
4079         (BuildMaster.loadConfig): use c['manhole']=Manhole() rather than
4080         c['manholePort'], deprecate old usage
4081         * docs/config.xhtml: document c['manhole']
4082         * docs/examples/hello.cfg: show example of using a Manhole
4085         * buildbot/test/test_steps.py (FakeBuilder.getSlaveCommandVersion):
4086         pretend the slave is up to date
4088         * buildbot/status/builder.py (BuildStepStatus.stepFinished): 'log',
4089         the module, overlaps with 'log', the local variable
4091         * buildbot/status/html.py: oops, 2.2 needs __future__ for generators
4093         * buildbot/process/builder.py (Builder.getSlaveCommandVersion):
4094         new method to let Steps find out the version of their
4095         corresponding SlaveCommand.
4096         * buildbot/process/step.py (BuildStep.slaveVersion): utility method
4097         (ShellCommand.start): add 'dir' argument for <=0.5.0 slaves
4098         (CVS.startVC): backwards compatibility for <=0.5.0 slaves
4099         (SVN.startVC): same
4100         (Darcs.startVC): detect old slaves (missing the 'darcs' command)
4101         (Arch.startVC): same
4102         (P4Sync.startVC): same
4104         * buildbot/process/step.py (LoggedRemoteCommand.start): return the
4105         Deferred so we can catch errors in remote_startCommand
4106         (RemoteShellCommand.start): same
4108         * docs/examples/twisted_master.cfg: update sample config file
4110         * buildbot/slave/commands.py (ShellCommandPP): write to stdin
4111         after connectionMade() is called, not before. Close stdin at that
4112         point too.
4114         * buildbot/process/process_twisted.py: update to use Trial, clean
4115         up argument passing (move to argv arrays instead of string
4116         commands)
4118         * buildbot/process/step_twisted.py (Trial): new step to replace
4119         RunUnitTests, usable by any trial-using project (not just
4120         Twisted). Arguments have changed, see the docstring for details.
4122         * buildbot/process/base.py (Build.startBuild): this now returns a
4123         Deferred. Exceptions that occur during setupBuild are now
4124         caught better and lead to fewer build_status weirdnesses, like
4125         finishing a build that was never started.
4126         (Build.buildFinished): fire the Deferred instead of calling
4127         builder.buildFinished directly. The callback argument is this
4128         Build, everything else can be extracted from it, including the
4129         new build.results attribute.
4130         * buildbot/process/builder.py (Builder.startBuild): same
4131         (Builder.buildFinished): same, extract results from build
4133         * buildbot/process/step.py (ShellCommands): remove dead code
4135 2004-09-08  Brian Warner  <warner@lothar.com>
4137         * buildbot/test/test_vc.py (VC.doPatch): verify that a new build
4138         doesn't try to use the leftover patched workdir
4139         (SourceStamp): test source-stamp computation for CVS and SVN
4141         * buildbot/slave/commands.py (SourceBase.doPatch): mark the
4142         patched workdir ('touch .buildbot-patched') so we don't try to
4143         update it later
4144         (SourceBase.start): add ['revision'] for all Source steps
4145         (CVS): change args: use ['branch'] for -r, remove ['files']
4146         (CVS.buildVC): fix revision/branch stuff
4147         (SVN): add revision stuff
4149         * buildbot/process/step.py (BuildStep.__init__): reject unknown
4150         kwargs (except 'workdir') to avoid silent spelling errors
4151         (ShellCommand.__init__): same
4152         (Source): new base class for CVS/SVN/etc. Factor out everything
4153         common, add revision computation (perform the checkout with a -D
4154         DATE or -r REVISION that gets exactly the sources described by the
4155         last Change), overridable with step.alwaysUseLatest. Add patch
4156         handling (build.getSourceStamp can trigger the use of a base
4157         revision and a patch).
4158         (CVS, SVN, Darcs, Arch, P4Sync): refactor, remove leftover arguments
4159         * docs/steps.xhtml: update docs
4160         * docs/source.xhtml: mention .checkoutDelay
4161         * docs/examples/hello.cfg: show use of checkoutDelay, alwaysUseLatest
4163         * buildbot/process/base.py (Build.setSourceStamp): add a
4164         .sourceStamp attribute to each Build. If set, this indicates that
4165         the build should be done with something other than the most
4166         recent source tree. This will be used to implement "try" builds.
4167         (Build.allChanges): new support method
4168         (Build.lastChangeTime): remove, functionality moved to Source steps
4169         (Build.setupBuild): copy the Step args before adding ['workdir'],
4170         to avoid modifying the BuildFactory (and thus triggering spurious
4171         config changes)
4174         * buildbot/status/html.py: rename s/commits/changes/
4175         (StatusResourceChanges): same
4176         (CommitBox.getBox): same, update URL
4177         (WaterfallStatusResource): same
4178         (StatusResource.getChild): same
4180         * contrib/debugclient.py (DebugWidget.do_commit): send .revision
4181         * contrib/debug.glade: add optional 'revision' to the fakeChange
4183         * buildbot/changes/changes.py (html_tmpl): display .revision
4184         (ChangeMaster.addChange): note .revision in log
4185         * buildbot/changes/pb.py (ChangePerspective.perspective_addChange):
4186         accept a ['revision'] attribute
4188         * buildbot/process/factory.py (BuildFactory): use ComparableMixin
4190         * buildbot/master.py (BotMaster.getPerspective): update the
4191         .connected flag in SlaveStatus when it connects
4192         (BotMaster.detach): and when it disconnects
4193         (DebugPerspective.perspective_fakeChange): take a 'revision' attr
4194         (BuildMaster.loadConfig_Builders): walk old list correctly
4196         * buildbot/test/test_config.py: fix prefix= usage
4198 2004-09-06  Brian Warner  <warner@lothar.com>
4200         * NEWS: mention P4
4202         * buildbot/changes/p4poller.py (P4Source): New ChangeSource to
4203         poll a P4 depot looking for recent changes. Thanks to Dave
4204         Peticolas for the contribution. Probably needs some testing after
4205         I mangled it.
4207         * buildbot/process/step.py (P4Sync): simple P4 source-updater,
4208         requires manual client setup for each buildslave. Rather
4209         experimental. Thanks again to Dave Peticolas.
4210         * buildbot/slave/commands.py (P4Sync): slave-side source-updater
4212         * buildbot/changes/changes.py (Change): add a .revision attribute,
4213         which will eventually be used to generate source-stamp values.
4215         * buildbot/process/step.py (RemoteCommand.start): use
4216         notifyOnDisconnect to notice when we lose the slave, then treat it
4217         like an exception. This allows LogFiles to be closed and the build
4218         to be wrapped up normally. Be sure to remove the disconnect
4219         notification when the step completes so we don't accumulate a
4220         bazillion such notifications which will fire weeks later (when the
4221         slave finally disconnects normally). Fixes SF#915807, thanks to
4222         spiv (Andrew Bennetts) for the report.
4223         (LoggedRemoteCommand): move __init__ code to RemoteCommand, since it
4224         really isn't Logged- specific
4225         (LoggedRemoteCommand.remoteFailed): Add an extra newline to the
4226         header, since it's almost always going to be appended to an
4227         incomplete line
4228         * buildbot/test/test_steps.py (BuildStep.testShellCommand1):
4229         update test to handle use of notifyOnDisconnect
4231         * buildbot/status/builder.py (BuilderStatus.currentlyOffline):
4232         don't clear .ETA and .currentBuild when going offline, let the
4233         current build clean up after itself
4235         * buildbot/process/builder.py (Builder.detached): wait a moment
4236         before doing things like stopping the current build, because the
4237         current step will probably notice the disconnect and cleanup the
4238         build by itself
4239         * buildbot/test/test_run.py (Status.tearDown): update test to
4240         handle asynchronous build-detachment
4242         * buildbot/process/base.py (Build.stopBuild): minor shuffles
4244         * buildbot/status/html.py (WaterfallStatusResource.buildGrid):
4245         hush a debug message
4247 2004-09-05  Brian Warner  <warner@lothar.com>
4249         * buildbot/changes/maildir.py (Maildir.start): catch an IOError
4250         when the dnotify fcntl() fails and fall back to polling. Linux 2.2
4251         kernels do this: the fcntl module has the F_NOTIFY constant, but
4252         the kernel itself doesn't support the operation. Thanks to Olly
4253         Betts for spotting the problem.
4255         * buildbot/process/step.py (Darcs): new source-checkout command
4256         (Arch): new source-checkout command
4257         (todo_P4): fix constructor syntax, still just a placeholder
4258         * buildbot/test/test_vc.py (VC.testDarcs): test it
4259         (VC.testDarcsHTTP): same, via localhost HTTP
4260         (VC.testArch): same
4261         (VC.testArchHTTP): same
4262         * NEWS: mention new features
4264         * buildbot/slave/commands.py (ShellCommand): add .keepStdout,
4265         which tells the step to stash stdout text locally (in .stdout).
4266         Slave-side Commands can use this to make decisions based upon the
4267         output of the the ShellCommand (not just the exit code).
4268         (Darcs): New source-checkout command
4269         (Arch): New source-checkout command, uses .keepStdout in one place
4270         where it needs to discover the archive's default name.
4272         * docs/steps.xhtml: Document options taken by Darcs and Arch.
4273         * docs/source.xhtml: add brief descriptions of Darcs and Arch
4274         * docs/examples/hello.cfg: add examples of Darcs and Arch checkout
4276         * buildbot/process/step.py (ShellCommand.describe): add an
4277         alternate .descriptionDone attribute which provides descriptive
4278         text when the step is complete. .description can be ["compiling"],
4279         for use while the step is running, then .descriptionDone can be
4280         ["compile"], used alone when the step succeeds or with "failed" when
4281         it does not. Updated other steps to use the new text.
4282         * buildbot/process/step_twisted.py: same
4283         * buildbot/test/test_run.py: update tests to match
4285 2004-08-30  Brian Warner  <warner@lothar.com>
4287         * buildbot/process/step.py (ShellCommand.createSummary): fix docs
4288         (CVS.__init__): send 'patch' argument to slave
4289         (CVS.start): don't create the LoggedRemoteCommand until start(),
4290         so we can catch a .patch added after __init__
4291         (SVN.__init__): add 'patch' to SVN too
4292         (SVN.start): same
4294         * buildbot/slave/commands.py (ShellCommand): add a 'stdin'
4295         argument, to let commands push data into the process' stdin pipe.
4296         Move usePTY to a per-instance attribute, and clear it if 'stdin'
4297         is in use, since closing a PTY doesn't really affect the process
4298         in the right way (in particular, I couldn't run /usr/bin/patch
4299         under a pty).
4300         (SourceBase.doPatch): handle 'patch' argument
4302         * buildbot/test/test_vc.py (VC.doPatch): test 'patch' argument for
4303         both CVS and SVN
4305         * buildbot/slave/commands.py (cvs_ver): fix version-parsing goo
4306         * buildbot/slave/bot.py (Bot.remote_getCommands): send command
4307         versions to master
4308         * buildbot/master.py (BotPerspective.got_commands): get command
4309         versions from slave, give to each builder
4310         * buildbot/process/builder.py (Builder.attached): stash slave
4311         command versions in .remoteCommands
4313         * docs/steps.xhtml: bring docs in-line with reality
4315         * buildbot/process/step.py (CVS.__init__): more brutal
4316         compatibility code removal
4317         (SVN.__init__): same
4319         * buildbot/slave/commands.py (SlaveShellCommand): update docs
4320         (SlaveShellCommand.start): require ['workdir'] argument, remove
4321         the ['dir'] fallback (compatibility will come later)
4322         (SourceBase): update docs
4323         (SourceBase.start): remove ['directory'] fallback
4324         (CVS): update docs
4325         (SVN): update docs
4326         * buildbot/test/test_config.py (ConfigTest.testBuilders): update test
4327         * buildbot/test/test_steps.py (BuildStep.testShellCommand1): same
4328         * buildbot/test/test_slavecommand.py (SlaveCommandTestCase): same
4330         * buildbot/process/step.py (RemoteShellCommand.__init__): add
4331         want_stdout/want_stderr. remove old 'dir' keyword (to simplify the
4332         code.. I will figure out 0.5.0-compatibility hooks later)
4334 2004-08-30  Brian Warner  <warner@lothar.com>
4336         * buildbot/process/process_twisted.py: rewrite in terms of new
4337         BuildFactory base class. It got significantly shorter. Yay
4338         negative code days.
4340         * buildbot/process/step_twisted.py (HLint.start): fix to make it
4341         work with the new "self.build isn't nailed down until we call
4342         step.start()" scheme: specifically, __init__ is called before the
4343         build has decided on which Changes are going in, so we don't scan
4344         build.allFiles() for .xhtml files until start()
4345         (HLint.commandComplete): use getText(), not getStdout()
4346         (RunUnitTests.start): same: don't use .build until start()
4347         (RunUnitTests.describe): oops, don't report (None) when using
4348         the default reactor
4349         (RunUnitTests.commandComplete): use getText()
4350         (RunUnitTests.createSummary): same
4351         (BuildDebs.commandComplete): same
4353         * buildbot/process/step.py (RemoteShellCommand.__init__): don't
4354         set args['command'] until start(), since our BuildStep is allowed
4355         to change their mind up until that point
4356         (TreeSize.commandComplete): use getText(), not getStdout()
4358         * docs/examples/twisted_master.cfg: update to current standards
4360         * docs/factories.xhtml: update
4361         * buildbot/process/factory.py: implement all the common factories
4362         described in the docs. The Trial factory doesn't work yet, and
4363         I've probably broken all the process_twisted.py factories in the
4364         process. There are compatibility classes left in for things like
4365         the old BasicBuildFactory, but subclasses of them are unlikely to
4366         work.
4367         * docs/examples/glib_master.cfg: use new BuildFactories
4368         * docs/examples/hello.cfg: same
4370         * buildbot/test/test_config.py (ConfigTest.testBuilders): remove
4371         explicit 'workdir' args
4373         * buildbot/process/base.py (BuildFactory): move factories to ..
4374         * buildbot/process/factory.py (BuildFactory): .. here
4375         * buildbot/process/process_twisted.py: handle move
4376         * buildbot/test/test_config.py: same
4377         * buildbot/test/test_run.py: same
4378         * buildbot/test/test_steps.py: same
4379         * buildbot/test/test_vc.py: same
4380         * docs/factories.xhtml: same
4382         * NEWS: mention config changes that require updating master.cfg
4384         * buildbot/process/base.py (Build.setupBuild): add a 'workdir'
4385         argument to all steps that weren't given one already, pointing at
4386         the "build/" directory.
4388         * docs/examples/hello.cfg: remove explicit 'workdir' args
4390         * docs/factories.xhtml: document standard BuildFactory clases,
4391         including a bunch which are have not yet been written
4393 2004-08-29  Brian Warner  <warner@lothar.com>
4395         * buildbot/interfaces.py (IBuildStepStatus.getResults): move
4396         result constants (SUCCESS, WARNINGS, FAILURE, SKIPPED) to
4397         buildbot.status.builder so they aren't quite so internal
4398         * buildbot/process/base.py, buildbot/process/builder.py: same
4399         * buildbot/process/maxq.py, buildbot/process/step.py: same
4400         * buildbot/process/step_twisted.py, buildbot/status/builder.py: same
4401         * buildbot/status/mail.py, buildbot/test/test_run.py: same
4402         * buildbot/test/test_status.py, buildbot/test/test_vc.py: same
4404         * buildbot/status/html.py (StatusResourceBuildStep): oops, update
4405         to handle new getLogs()-returns-list behavior
4406         (StatusResourceBuildStep.getChild): same
4407         (StepBox.getBox): same
4408         (WaterfallStatusResource.phase0): same
4410         * docs/source.xhtml: document how Buildbot uses version-control
4411         systems (output side: how we get source trees)
4412         * docs/changes.xhtml: rename from sources.xhtml, documents VC
4413         systems (input side: how we learn about Changes)
4415         * buildbot/master.py (Manhole): use ComparableMixin
4416         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): same
4417         * buildbot/changes/mail.py (MaildirSource): same
4418         * buildbot/status/client.py (PBListener): same
4419         * buildbot/status/html.py (Waterfall): same
4420         * buildbot/status/words.py (IRC): same
4422         * NEWS: start describing new features
4424         * buildbot/status/mail.py (MailNotifier): finish implementation.
4425         The message body is still a bit sparse.
4426         * buildbot/test/test_status.py (Mail): test it
4428         * buildbot/util.py (ComparableMixin): class to provide the __cmp__
4429         and __hash__ methods I wind up adding everywhere. Specifically
4430         intended to support the buildbot config-file update scheme where
4431         we compare, say, the old list of IStatusTargets against the new
4432         one and don't touch something which shows up on both lists.
4433         * buildbot/test/test_util.py (Compare): test case for it
4435         * buildbot/interfaces.py (IBuildStatus): change .getLogs() to
4436         return a list instead of a dict
4437         (IBuildStepStatus.getLogs): same. The idea is that steps create
4438         logs with vaguely unique names (although their uniqueness is not
4439         guaranteed). Thus a compilation step should create its sole
4440         logfile with the name 'compile', and contribute it to the
4441         BuildStatus. If a step has two logfiles, try to create them with
4442         different names (like 'test.log' and 'test.summary'), and only
4443         contribute the important ones to the overall BuildStatus.
4444         * buildbot/status/builder.py (Event.getLogs): same
4445         (BuildStepStatus): fix default .text and .results
4446         (BuildStepStatus.addLog): switch to list-like .getLogs()
4447         (BuildStepStatus.stepFinished): same
4448         (BuildStatus.text): fix default .text
4449         (BuildStatus.getLogs): temporary hack to return all logs (from all
4450         child BuildStepStatus objects). Needs to be fixed to only report
4451         the significant ones (as contributed by the steps themselves)
4452         * buildbot/test/test_run.py: handle list-like .getLogs()
4453         * buildbot/test/test_steps.py (BuildStep.testShellCommand1): same
4455 2004-08-28  Brian Warner  <warner@lothar.com>
4457         * buildbot/process/builder.py (Builder.attached): serialize the
4458         attachment process, so the attach-watcher isn't called until the
4459         slave is really available. Add detached watchers too, which makes
4460         testing easier.
4462         * buildbot/test/test_vc.py: test VC modes (clobber/update/etc)
4464         * buildbot/test/test_swap.py: remove dead code
4466         * buildbot/slave/commands.py (ShellCommandPP): add debug messages
4467         (ShellCommand.start): treat errors in _startCommand/spawnProcess
4468         sort of as if the command being run exited with a -1. There may
4469         still be some holes in this scheme.
4470         (CVSCommand): add 'revision' tag to the VC commands, make sure the
4471         -r option appears before the module list
4472         * buildbot/process/step.py (CVS): add 'revision' argument
4474         * buildbot/slave/bot.py (SlaveBuilder._ackFailed): catch failures
4475         when sending updates or stepComplete messages to the master, since
4476         we don't currently care whether they arrive or not. When we revamp
4477         the master/slave protocol to really resume interrupted builds,
4478         this will need revisiting.
4479         (lostRemote): remove spurious print
4481         * buildbot/master.py (BotPerspective.attached): serialize the
4482         new-builder interrogation process, to make testing easier
4483         (BotMaster.waitUntilBuilderDetached): convenience function
4485         * buildbot/status/builder.py (BuilderStatus): prune old builds
4486         (BuildStatus.pruneSteps): .. and steps
4487         (BuildStepStatus.pruneLogs): .. and logs
4488         (BuilderStatus.getBuild): handle missing builds
4489         * buildbot/status/html.py (StatusResourceBuild.body): display build
4490         status in the per-build page
4491         (BuildBox.getBox): color finished builds in the per-build box
4493 2004-08-27  Brian Warner  <warner@lothar.com>
4495         * buildbot/status/mail.py (MailNotifier): new notification class,
4496         not yet finished
4498         * buildbot/slave/commands.py (SourceBase): refactor SVN and CVS into
4499         variants of a common base class which handles all the mode= logic
4501         * buildbot/interfaces.py (IBuildStatus.getPreviousBuild): add
4502         convenience method
4503         * buildbot/status/builder.py (BuildStatus.getPreviousBuild): same
4505 2004-08-26  Brian Warner  <warner@lothar.com>
4507         * buildbot/test/test_slavecommand.py: accomodate new slavecommand
4508         interfaces
4510         * buildbot/test/test_run.py: update to new Logfile interface, new
4511         buildbot.slave modules
4512         * buildbot/test/test_steps.py: same, remove Swappable, add timeouts
4514         * MANIFEST.in: new sample config file
4515         * docs/examples/hello.cfg: same
4517         * buildbot/process/step_twisted.py: remove dead import
4519         * buildbot/process/step.py (RemoteCommand.run): catch errors
4520         during .start
4521         (RemoteCommand.remote_update): ignore updates that arrive after
4522         we've shut down
4523         (RemoteCommand.remote_complete): ignore duplicate complete msgs
4524         (RemoteCommand._remoteComplete): cleanup failure handling, reduce
4525         the responsibilities of the subclass's methods
4526         (BuildStep.failed): catch errors during failure processing
4527         (BuildStep.addHTMLLog): provide all-HTML logfiles (from Failures)
4528         (CVS): move to a mode= argument (described in docstring), rather
4529         than the ungainly clobber=/export=/copydir= combination.
4530         (SVN): add mode= functionality to SVN too
4531         (todo_Darcs, todo_Arch, todo_P4): placeholders for future work
4533         * buildbot/process/base.py (Build.startNextStep): catch errors
4534         during s.startStep()
4536         * buildbot/clients/base.py: update to new PB client interface.
4537         gtkPanes is still broken
4539         * buildbot/bot.py, buildbot/slavecommand.py: move to..
4540         * buildbot/slave/bot.py, buildbot/slave/commands.py: .. new directory
4541         * setup.py: add buildbot.slave module
4542         * buildbot/bb_tap.py: handle move
4543         * buildbot/slave/registry.py: place to register commands, w/versions
4544         * buildbot/slave/bot.py: major simplifications
4545         (SlaveBuilder.remote_startCommand): use registry for slave commands,
4546         instead of a fixed table. Eventually this will make the slave more
4547         extensible. Use 'start' method on the command, not .startCommand.
4548         Fix unsafeTracebacks handling (I think).
4549         * buildbot/slave/commands.py: major cleanup. ShellCommand is now a
4550         helper class with a .start method that returns a Deferred.
4551         SlaveShellCommand is the form reached by the buildmaster. Commands
4552         which use multiple ShellCommands can just chain them as Deferreds,
4553         with some helper methods in Command (_abandonOnFailure and
4554         _checkAbandoned) to bail on rc!=0.
4555         (CVSCommand): prefer new mode= argument
4556         (SVNFetch): add mode= argument
4558         * buildbot/master.py (DebugPerspective.perspective_forceBuild):
4559         put a useful reason string on the build
4561         * buildbot/status/builder.py (LogFile): do LogFile right: move the
4562         core functionality into an IStatusLog object
4563         (BuildStatus.sendETAUpdate): don't send empty build-eta messages
4564         * buildbot/status/html.py (TextLog): HTML-rendering goes here
4565         (StatusResourceBuild.body): use proper accessor methods
4566         * buildbot/status/client.py (RemoteLog): PB-access goes here
4567         (StatusClientPerspective.perspective_subscribe): add "full" mode,
4568         which delivers log contents too
4569         (PBListener.__cmp__): make PBListeners comparable, thus removeable
4570         * buildbot/status/event.py: remove old Logfile completely
4572         * buildbot/interfaces.py (IStatusLog.subscribe): make the
4573         subscription interface for IStatusLog subscriptions just like all
4574         other the status subscriptions
4575         (IStatusReceiver.logChunk): method called on subscribers
4577 2004-08-24  Brian Warner  <warner@lothar.com>
4579         * buildbot/process/builder.py (Builder._pong): oops, ping response
4580         includes a result (the implicit None returned by remote_print).
4581         Accept it so the _pong method handles the response correctly.
4583 2004-08-06  Brian Warner  <warner@lothar.com>
4585         * buildbot/test/test_config.py: update IRC, PBListener tests
4587         * buildbot/status/client.py (StatusClientPerspective): total
4588         rewrite to match new IStatus interfaces. New subscription scheme.
4589         There are still a few optimizations to make (sending down extra
4590         information with event messages so the client doesn't have to do a
4591         round trip). The logfile-retrieval code is probably still broken.
4592         Moved the PB service into its own port, you can no longer share a
4593         TCP socket between a PBListener and, say, the slaveport (this
4594         should be fixed eventually).
4595         * buildbot/clients/base.py (Client): revamp to match. still needs
4596         a lot of work, but basic event reporting works fine. gtkPanes is
4597         completely broken.
4599         * buildbot/status/words.py (IRC): move to c['status']. Each IRC
4600         instance talks to a single irc server. Threw out all the old
4601         multi-server handling code. Still need to add back in
4602         builder-control (i.e. "force build")
4604         * buildbot/status/html.py (StatusResourceBuildStep.body): add some
4605         more random text to the as-yet-unreachable per-step page
4607         * buildbot/status/builder.py (BuildStepStatus.sendETAUpdate):
4608         rename to stepETAUpdate
4609         (BuildStatus.subscribe): add build-wide ETA updates
4610         (BuilderStatus.getState): remove more cruft
4611         (BuilderStatus.getCurrentBuild): remove more cruft
4612         (BuilderStatus.buildStarted): really handle tuple-subscription
4613         * buildbot/test/test_run.py (Status.testSlave): handle the
4614         stepETAUpdate rename
4616         * buildbot/master.py (BuildMaster): don't add a default
4617         StatusClientService. Don't add a default IrcStatusFactory. Both
4618         are now added through c['status'] in the config file. c['irc'] is
4619         accepted for backwards compatibility, the only quirk is you cannot
4620         use c['irc'] to specify IRC servers on ports other than 6667.
4622         * buildbot/interfaces.py (IBuildStatus.getCurrentStep): add method
4623         (IStatusReceiver.buildStarted): allow update-interval on subscribe
4624         (IStatusReceiver.buildETAUpdate): send build-wide ETA updates
4625         (IStatusReceiver.stepETAUpdate): rename since it's step-specific
4628         * buildbot/master.py (BuildMaster.startService): SIGHUP now causes
4629         the buildmaster to re-read its config file
4632         * buildbot/test/test_web.py (test_webPortnum): need a new hack to
4633         find out the port our server is running on
4634         (WebTest.test_webPathname_port): same
4636         * buildbot/test/test_config.py (testWebPortnum): test it
4637         (testWebPathname): ditto
4639         * docs/config.xhtml: document new c['status'] configuration option
4641         * buildbot/status/html.py (Waterfall): new top-level class which
4642         can be added to c['status']. This creates the Site as well as the
4643         necessary TCPServer/UNIXServer. It goes through the BuildMaster,
4644         reachable as .parent, for everything.
4646         * buildbot/master.py (Manhole): make it a normal service Child
4647         (BuildMaster.loadConfig_status): c['status'] replaces webPortnum and
4648         webPathname. It will eventually replace c['irc'] and the implicit
4649         PB listener as well. c['webPortnum'] and c['webPathname'] are left
4650         in as (deprecated) backward compatibility hooks for now.
4653         * buildbot/process/builder.py (Builder.buildFinished): don't
4654         inform out builder_status about a finished build, as it finds out
4655         through its child BuildStatus object
4657         * buildbot/status/html.py: extensive revamp. Use adapters to make
4658         Boxes out of BuildStepStatus and friends. Acknowledge that Steps
4659         have both starting and finishing times and adjust the waterfall
4660         display accordingly, using spacers if necessary. Use SlaveStatus
4661         to get buildslave info.
4662         (StatusResourceBuildStep): new just-one-step resource, used to get
4663         logfiles. No actual href to it yet.
4665         * buildbot/status/event.py (Logfile.doSwap): disable Swappable for
4666         the time being, until I get the file-naming scheme right
4668         * buildbot/status/builder.py (Event): clean started/finished names
4669         (BuildStatus.isFinished): .finished is not None is the right test
4670         (BuildStatus.buildStarted): track started/finished times ourselves
4671         (BuilderStatus.getSlave): provide access to SlaveStatus object
4672         (BuilderStatus.getLastFinishedBuild): all builds are now in
4673         .builds, even the currently-running one. Accomodate this change.
4674         (BuilderStatus.eventGenerator): new per-builder event generator.
4675         Returns BuildStepStatus and BuildStatus objects, since they can
4676         both be adapted as necessary.
4677         (BuilderStatus.addEvent): clean up started/finished attributes
4678         (BuilderStatus.startBuild,finishBuild): remove dead code
4679         (SlaveStatus): new object to provide ISlaveStatus
4681         * buildbot/process/step.py (ShellCommand.getColor): actually
4682         return the color instead of setting it ourselves
4683         (CVS.__init__): pull .timeout and .workdir options out of
4684         **kwargs, since BuildStep will ignore them. Without this neither
4685         will be sent to the slave correctly.
4686         (SVN.__init__): same
4688         * buildbot/process/builder.py (Builder): move flags to class-level
4689         attributes
4690         (Builder.attached): remove .remoteInfo, let the BotPerspective and
4691         SlaveStatus handle that
4693         * buildbot/process/base.py (Build.firstEvent): remove dead code
4694         (Build.stopBuild): bugfix
4696         * buildbot/changes/pb.py (PBChangeSource.describe): add method
4698         * buildbot/changes/changes.py (Change): add IStatusEvent methods
4699         (ChangeMaster.eventGenerator): yield Changes, since there are now
4700         Adapters to turn them into HTML boxes
4702         * buildbot/master.py (BotMaster): track SlaveStatus from BotMaster
4703         (BotPerspective.attached): feed a SlaveStatus object
4704         (BuildMaster.loadConfig): add a manhole port (debug over telnet)
4705         (BuildMaster.loadConfig_Builders): give BuilderStatus a parent
4707         * buildbot/interfaces.py: API additions
4708         (ISlaveStatus): place to get slave status
4710 2004-08-04  Brian Warner  <warner@lothar.com>
4712         * buildbot/slavecommand.py (DummyCommand.finished): send rc=0 when
4713         the delay finishes, so the step is marked as SUCCESS
4715         * buildbot/test/test_run.py (Status.testSlave): cover more of
4716         IBuildStatus and IBuildStepStatus
4718         * buildbot/status/progress.py (StepProgress): move some flags to
4719         class-level attributes
4720         (StepProgress.remaining): if there are no other progress metrics
4721         to go by, fall back to elapsed time
4722         (StepProgress.setExpectations): take a dict of metrics instead of
4723         a list
4724         (BuildProgress.setExpectationsFrom): pull expectations from the
4725         Expectations, instead of having it push them to the BuildProgress
4726         (Expectations): move some flags to class-level attributes
4727         (Expectations.__init__): copy per-step times from the
4728         BuildProgress too
4729         (Expectations.expectedBuildTime): new method for per-build ETA
4731         * buildbot/status/event.py (Logfile): move some flags to
4732         class-level attributes
4733         (Logfile.logProgressTo): better method name, let step set the
4734         progress axis name (instead of always being "output")
4736         * buildbot/status/builder.py (BuildStepStatus.getTimes): track the
4737         times directly, rather than depending upon the (possibly missing)
4738         .progress object. Use 'None' to indicate "not started/finished
4739         yet"
4740         (BuildStepStatus.getExpectations): oops, return the full list of
4741         expectations
4742         (BuilderStatus._buildFinished): append finished builds to .builds
4744         * buildbot/process/step.py (BuildStep): add separate .useProgress
4745         flag, since empty .progressMetrics[] still implies that time is a
4746         useful predictor
4747         (CVS): set up the cmd in __init__, instead of waiting for start()
4749         * buildbot/process/base.py (Build.startBuild): disable the 'when'
4750         calculation, this will eventually turn into a proper sourceStamp
4751         (Build.setupBuild): tell the Progress to load from the Expectations,
4752         instead of having the Expectations stuff things into the Progress
4753         (Build.buildException): add a build-level errback to make sure the
4754         build's Deferred fires even in case of exceptions
4756         * buildbot/master.py (BotMaster.forceBuild): convey the reason into
4757         the forced build
4758         * buildbot/process/builder.py (Builder.forceBuild): convey the
4759         reason instead of creating a fake Change
4761         * docs/examples/twisted_master.cfg: update to match reality
4763         * buildbot/test/test_config.py, buildbot/test/test_process.py:
4764         * buildbot/test/test_run.py, buildbot/test/test_steps.py:
4765         fix or remove broken/breaking tests
4767         * buildbot/status/event.py (Logfile.__len__): remove evil method
4769         * buildbot/status/builder.py (BuildStepStatus.stepStarted): tolerate
4770         missing .build, for test convenience
4772         * buildbot/process/step_twisted.py: import fixes
4774         * buildbot/process/step.py (BuildStep.failed): exception is FAILURE
4776         * buildbot/master.py (BuildMaster.loadConfig_Builders): leftover
4777         .statusbag reference
4779         * buildbot/bot.py (BuildSlave.stopService): tear down the TCP
4780         connection at shutdown, and stop it from reconnecting
4782         * buildbot/test/test_run.py (Run.testSlave): use a RemoteDummy to
4783         chase down remote-execution bugs
4785         * buildbot/process/step.py: more fixes, remove
4786         BuildStep.setStatus()
4787         * buildbot/status/builder.py: move setStatus() functionality into
4788         BuildStatus.addStep
4789         * buildbot/status/event.py: minor fixes
4791 2004-08-03  Brian Warner  <warner@lothar.com>
4793         * buildbot/process/base.py, buildbot/process/builder.py
4794         * buildbot/process/step.py, buildbot/status/builder.py
4795         * buildbot/status/event.py, buildbot/test/test_run.py:
4796         fix status delivery, get a basic test case working
4797         * buildbot/master.py: finish implementing basic status delivery,
4798         temporarily disable HTML/IRC/PB status sources
4800         * buildbot/bot.py (Bot.remote_setBuilderList): remove debug noise
4802         * buildbot/status/progress.py (BuildProgress): remove dead code
4804         * buildbot/interfaces.py
4805         * buildbot/process/base.py, buildbot/process/builder.py
4806         * buildbot/process/step.py, buildbot/process/step_twisted.py
4807         * buildbot/status/builder.py: Complete overhaul of the all
4808         status-delivery code, unifying all types of status clients (HTML,
4809         IRC, PB). See interfaces.IBuildStatus for an idea of what it will
4810         look like. This commit is a checkpointing of the work-in-progress:
4811         the input side is mostly done (Builders/Builds sending status
4812         to the BuilderStatus/BuildStatus objects), but the output side has
4813         not yet been started (HTML resources querying BuilderStatus
4814         objects). Things are probably very broken right now and may remain
4815         so for several weeks, I apologize for the disruption.
4817         * buildbot/status/event.py: add a setHTML method to use pre-rendered
4818         HTML as the log's contents. Currently used for exception tracebacks.
4819         * buildbot/status/progress.py: minor spelling changes
4821 2004-08-02  Brian Warner  <warner@lothar.com>
4823         * docs/config.xhtml: XHTML fixes, makes raw .xhtml files viewable
4824         in mozilla. Also added stylesheets copied from Twisted's docs.
4825         Remember that these files are meant to be run through Lore first.
4826         Thanks to Philipp Frauenfelder for the fixes.
4827         * docs/factories.xhtml, docs/sources.xhtml, docs/steps.xhtml: same
4828         * docs/stylesheet-unprocessed.css, docs/stylesheet.css: same
4829         * docs/template.tpl: added a Lore template
4831 2004-07-29  Brian Warner  <warner@lothar.com>
4833         * buildbot/interfaces.py: revamp status delivery. This is the
4834         preview: these are the Interfaces that will be provided by new
4835         Builder code, and to which the current HTML/IRC/PB status
4836         displayers will be adapted.
4838         * buildbot/slavecommand.py (ShellCommand.start): look for .usePTY
4839         on the SlaveBuilder, not the Bot.
4840         * buildbot/bot.py (Bot.remote_setBuilderList): copy Bot.usePTY to
4841         SlaveBuilder.usePTY
4842         * buildbot/test/test_slavecommand.py (FakeSlaveBuilder.usePTY):
4843         set .usePTY on the FakeSlaveBuilder
4845 2004-07-25  Brian Warner  <warner@lothar.com>
4847         * buildbot/changes/freshcvs.py: add some debug log messages
4848         (FreshCVSConnectionFactory.gotPerspective): pre-emptively fix the
4849         disabled 'setFilter' syntax
4850         (FreshCVSSourceNewcred.__init__): warn about prefix= values that
4851         don't end with a slash
4853         * buildbot/process/base.py (Builder._pong_failed): add TODO note
4855         * setup.py: bump to 0.5.0+ while between releases
4857 2004-07-23  Brian Warner  <warner@lothar.com>
4859         * setup.py (version): Releasing buildbot-0.5.0
4861 2004-07-23  Brian Warner  <warner@lothar.com>
4863         * README: update for 0.5.0 release
4865         * NEWS: update for 0.5.0 release
4867 2004-07-22  Brian Warner  <warner@lothar.com>
4869         * buildbot/slavecommand.py (ShellCommand): make usePTY a
4870         mktap-time configuration flag (--usepty=1, --usepty=0)
4871         * buildbot/bot.py: same
4873         * buildbot/master.py (BotPerspective.got_dirs): don't complain about
4874         an 'info' directory being unwanted
4876         * buildbot/changes/freshcvs.py (FreshCVSSource): flip the
4877         newcred/oldcred switch. Newcred (for CVSToys-1.0.10 and later) is now
4878         the default. To communicate with an oldcred daemond (CVSToys-1.0.9
4879         and earlier), use a FreshCVSSourceOldcred instead.
4880         (test): simple test routine: connect to server, print changes
4882         * buildbot/changes/changes.py (Change.getTime): make it possible
4883         to print un-timestamped changes
4885         * buildbot/master.py (makeApp): delete ancient dead code
4886         (BuildMaster.loadTheConfigFile): make "master.cfg" name configurable
4887         * buildbot/test/test_config.py (testFindConfigFile): test it
4889         * docs/examples/twisted_master.cfg (b22w32): use iocp reactor
4890         instead of win32 one
4893         * buildbot/master.py (BuildMaster.loadConfig_Builders): config file
4894         now takes a dictionary instead of a tuple. See docs/config.xhtml for
4895         details.
4897         * buildbot/process/base.py (Builder.__init__): change constructor
4898         to accept a dictionary of config data, rather than discrete
4899         name/slave/builddir/factory arguments
4901         * docs/examples/twisted_master.cfg: update to new syntax
4902         * docs/examples/glib_master.cfg: same
4903         * buildbot/test/test_config.py (ConfigTest.testBuilders): some
4904         rough tests of the new syntax
4906         
4907         * buildbot/master.py (BuildMaster.loadConfig): allow webPathname
4908         to be an int, which means "run a web.distrib sub-server on a TCP
4909         port". This lets you publish the buildbot status page to a remote
4910         twisted.web server (using distrib.ResourceSubscription). Also
4911         rename the local attributes used to hold these web things so
4912         they're more in touch with reality.
4913         * buildbot/test/test_web.py: test webPortnum and webPathname
4914         * docs/config.xhtml: document this new use of webPathname
4916         * docs/config.xhtml: new document, slightly ahead of reality
4917         
4918         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred.notify): fix
4919         'prefix' handling: treat it as a simple string to check with
4920         .startswith, instead of treating it as a directory. This allows
4921         sub-directories to be used. If you use prefix=, you should give it
4922         a string that starts just below the CVSROOT and ends with a slash.
4923         This prefix will be stripped from all filenames, and filenames
4924         which do not start with it will be ignored.
4926 2004-07-20  Cory Dodt  <corydodt@twistedmatrix.com>
4928         * contrib/svn_buildbot.py: Add --include (synonym for --filter)
4929         and --exclude (inverse of --include).  SVN post-commit hooks
4930         now have total control over which changes get sent to buildbot and which
4931         do not.
4933 2004-07-10  Brian Warner  <warner@lothar.com>
4935         * buildbot/test/test_twisted.py (Case1.testCountFailedTests): fix
4936         test case to match new API
4938         * buildbot/status/event.py (Logfile.getEntries): fix silly bug
4939         which crashed HTML display when self.entries=[] (needed to
4940         distinguish between [], which means "no entries yet", and None,
4941         which means "the entries have been swapped out to disk, go fetch
4942         them").
4944 2004-07-04  Brian Warner  <warner@lothar.com>
4946         * buildbot/process/step_twisted.py (countFailedTests): Count
4947         skips, expectedFailures, and unexpectedSuccesses. Start scanning
4948         10kb from the end because any import errors are wedged there and
4949         they would make us think the test log was unparseable.
4950         (RunUnitTests.finishStatus): add skip/todo counts to the event box
4952 2004-06-26  Brian Warner  <warner@lothar.com>
4954         * buildbot/process/step_twisted.py (RemovePYCs): turn the
4955         delete-*.pyc command into an actual BuildStep, so we can label it
4956         nicely
4957         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
4958         (FullTwistedBuildFactory): same
4960 2004-06-25  Cory Dodt  <corydodt@twistedmatrix.com>
4962         * contrib/fakechange.py: Add an errback when sending the fake 
4963         change, so we know it didn't work.
4965 2004-06-25  Christopher Armstrong  <radix@twistedmatrix.com>
4967         * buildbot/process/step_twisted.py: Delete *.pyc files before
4968         calling trial, so it doesn't catch any old .pyc files whose .py
4969         files have been moved or deleted.
4971         * buildbot/process/step_twisted.py (RunUnitTests): 1) Add a new
4972         parameter, 'recurse', that passes -R to trial. 2) have 'runAll'
4973         imply 'recurse'. 3) Make the default 'allTests' be ["twisted"]
4974         instead of ["twisted.test"], so that the end result is "trial -R
4975         twisted".
4977         * contrib/svn_buildbot.py: Add a --filter parameter that accepts a
4978         regular expression to match filenames that should be ignored when
4979         changed. Also add a --revision parameter that specifies the
4980         revision to examine, which is useful for debugging.
4982 2004-06-25  Brian Warner  <warner@lothar.com>
4984         * buildbot/process/step_twisted.py (trialTextSummarizer): create a
4985         summary of warnings (like DeprecationWarnings), next to the
4986         "summary" file
4988 2004-05-13  Brian Warner  <warner@lothar.com>
4990         * docs/examples/twisted_master.cfg: enable the win32 builder, as
4991         we now have a w32 build slave courtesy of Mike Taylor.
4993         * buildbot/process/base.py (Build.checkInterlocks): OMG this was
4994         so broken. Fixed a race condition that tripped up interlocked
4995         builds and caused the status to be stuck at "Interlocked" forever.
4996         The twisted buildbot's one interlocked build just so happened to
4997         never hit this case until recently (the feeding builds both pass
4998         before the interlocked build is attempted.. usually it has to wait
4999         a while).
5000         (Builder._pong_failed): fix method signature
5002         * setup.py: bump to 0.4.3+ while between releases
5004 2004-04-30  Brian Warner  <warner@lothar.com>
5006         * setup.py (version): Releasing buildbot-0.4.3
5008 2004-04-30  Brian Warner  <warner@lothar.com>
5010         * MANIFEST.in: add the doc fragments in  docs/*.xhtml
5012         * README: update for 0.4.3 release
5014         * NEWS: update for 0.4.3 release
5016         * buildbot/master.py (BuildMaster.__getstate__): make sure
5017         Versioned.__getstate__ is invoked, for upgrade from 0.4.2
5019         * buildbot/process/step_twisted.py (RunUnitTests.trial): add
5020         .trial as a class attribute, for upgrade from 0.4.2
5022         * buildbot/changes/changes.py (Change.links): add .links for
5023         upgrade from 0.4.2
5025         * buildbot/status/event.py (Logfile.__getstate__): get rid of both
5026         .textWatchers and .htmlWatchers at save time, since they are both
5027         volatile, should allow smooth 0.4.2 upgrade
5029         * buildbot/process/step.py (CVS.finishStatus): catch failed
5030         CVS/SVN commands so we can make the status box red
5032 2004-04-29  Brian Warner  <warner@lothar.com>
5034         * buildbot/changes/freshcvs.py
5035         (FreshCVSConnectionFactory.gotPerspective): add (commented-out)
5036         code to do setFilter(), which tells the freshcvs daemon to not
5037         send us stuff that we're not interested in. I will uncomment it
5038         when a new version of CVSToys is available in which setFilter()
5039         actually works, and I get a chance to test it better.
5041         * docs/examples/twisted_master.cfg: start using a PBChangeSource
5043         * buildbot/master.py (Dispatcher): use a registration scheme
5044         instead of hardwired service names
5045         (BuildMaster): keep track of the Dispatcher to support
5046         registration
5048         * buildbot/changes/changes.py (ChangeMaster): create a distinct
5049         PBChangeSource class instead of having it be an undocumented
5050         internal feature of the ChangeMaster. Split out the code into a
5051         new file.
5052         * buildbot/changes/pb.py (PBChangeSource): same
5053         * buildbot/test/test_changes.py: a few tests for PBChangeSource
5055         * docs/{factories|sources|steps}.xhtml: document some pieces
5057         * docs/examples/twisted_master.cfg: use SVN instead of CVS, stop
5058         using FCMaildirSource
5059         (f23osx): update OS-X builder to use python2.3, since the slave
5060         was updated to Panther (10.3.3)
5062 2004-03-21  Brian Warner  <warner@lothar.com>
5064         * buildbot/process/process_twisted.py: factor out doCheckout, change
5065         to use SVN instead of CVS
5067         * buildbot/process/base.py (BasicBuildFactory): refactor to make
5068         an SVN subclass easier
5069         (BasicSVN): subclass which uses Subversion instead of CVS
5071 2004-03-15  Christopher Armstrong  <radix@twistedmatrix.com>
5073         * buildbot/slavecommand.py (ShellCommand.start): use COMSPEC instead
5074         of /bin/sh on win32
5075         (CVSCommand.cvsComplete): don't assume chdir worked on win32
5077 2004-02-25  Brian Warner  <warner@lothar.com>
5079         * buildbot/slavecommand.py (ShellCommand): ['commands'] argument
5080         is now either a list (which is passed to spawnProcess directly) or
5081         a string (which gets passed to /bin/sh -c). This removes the useSH
5082         flag and the ArgslistCommand class. Also send status header at the
5083         start and end of each command, instead of having the master-side
5084         code do that.
5085         (CVSCommand): fix the doUpdate command, it failed to do the 'cp
5086         -r'. Update to use list-based arguments.
5087         (SVNFetch): use list-based arguments, use ['dir'] argument to
5088         simplify code.
5089         * buildbot/test/test_steps.py (Commands): match changes
5091         * buildbot/process/step.py (InternalShellCommand.words): handle
5092         command lists
5093         (SVN): inherit from CVS, cleanup
5095         * buildbot/status/event.py (Logfile.content): render in HTML, with
5096         stderr in red and headers (like the name of the command we're
5097         about to run) in blue. Add link to a second URL (url + "?text=1")
5098         to get just stdout/stderr in text/plain without markup. There is
5099         still a problem with .entries=None causing a crash, it seems to occur
5100         when the logfile is read before it is finished.
5102         * buildbot/bot.py (BotFactory.doKeepalive): add a 30-second
5103         timeout to the keepalives, and use it to explicitly do a
5104         loseConnection instead of waiting for TCP to notice the loss. This
5105         ought to clear up the silent-lossage problem.
5106         (unsafeTracebacks): pass exception tracebacks back to the master,
5107         makes it much easier to debug problems
5109 2004-02-23  Brian Warner  <warner@lothar.com>
5111         * buildbot/slavecommand.py (ShellCommand): add useSH flag to pass
5112         the whole command to /bin/sh instead of execve [Johan Dahlin]
5113         (CVSCommand): drop '-r BRANCH' if BRANCH==None instead of usiing
5114         '-r HEAD' [Johan Dahlin]
5115         (CVSCommand.start2): fix cvsdir calculation [Johan Dahlin]
5117         * buildbot/changes/changes.py (Change): add links= argument, add
5118         asHTML method [Johan Dahlin]. Modified to make a bit more
5119         XHTMLish. Still not sure how to best use links= .
5121         * buildbot/status/html.py (StatusResourceCommits.getChild): use 
5122         Change.asHTML to display the change, not asText
5124         * buildbot/status/html.py (StatusResourceBuilder): web button to
5125         ping slave
5127         * buildbot/test/test_run.py: test to actually start a buildmaster
5128         and poke at it
5130         * MANIFEST.in: bring back accidentally-dropped test helper files
5132         * buildbot/test/test_config.py (ConfigTest.testSources): skip tests
5133         that require cvstoys if it is not installed
5135         * buildbot/process/step_twisted.py (RunUnitTests): allow other
5136         values of "bin/trial" [Dave Peticolas]
5137         (RunUnitTests.finishStatus): say "no tests run" instead of "0
5138         tests passed" when we didn't happen to run any tests
5140         * buildbot/process/step.py (Compile): use haltOnFailure instead of
5141         flunkOnFailure [Johan Dahlin]
5143         * buildbot/process/base.py (ConfigurableBuild.setSteps): allow
5144         multiple instances of the same Step class by suffixing "_2", etc,
5145         to the name until it is unique. This name needs to be unique
5146         because it is used as a key in the dictionary that tracks build
5147         progress.
5148         * buildbot/test/test_steps.py (Steps.testMultipleStepInstances):
5149         add test for it
5151         * buildbot/process/base.py (Builder.ping): add "ping slave" command
5153 2004-01-14  Brian Warner  <warner@lothar.com>
5155         * buildbot/status/words.py (IrcStatusBot): when we leave or get
5156         kicked from a channel, log it
5158         * buildbot/master.py (Dispatcher): add "poke IRC" command to say
5159         something over whatever IRC channels the buildmaster is currently
5160         connected to. Added to try and track down a problem in which the
5161         master thinks it is still connected but the IRCd doesn't see it. I
5162         used a styles.Versioned this time, so hopefully users won't have
5163         to rebuild their .tap files this time.
5164         * contrib/debug.glade: add a "Poke IRC" button
5165         * contrib/debugclient.py: same
5167         * setup.py: bump to 0.4.2+ while between releases
5169 2004-01-08  Brian Warner  <warner@lothar.com>
5171         * setup.py (version): Releasing buildbot-0.4.2
5173 2004-01-08  Brian Warner  <warner@lothar.com>
5175         * NEWS: update for 0.4.2 release
5177         * README: document how to run the tests, now that they all pass
5179         * buildbot/changes/maildir.py (Maildir.poll): minor comment
5181         * buildbot/process/step.py (CVS): add a global_options= argument,
5182         which lets you set CVS global options for the command like "-r"
5183         for read-only checkout, or "-R" to avoid writing in the
5184         repository.
5185         * buildbot/slavecommand.py (CVSCommand): same
5187         * buildbot/status/event.py (Logfile): add a .doSwap switch to make
5188         testing easier (it is turned off when testing, to avoid the
5189         leftover timer)
5191         * buildbot/process/step.py (InternalBuildStep): shuffle code a bit
5192         to make it easier to test: break generateStepID() out to a
5193         separate function, only update statusbag if it exists.
5194         (ShellCommands): create useful text for dict-based commands too.
5196         * test/*, buildbot/test/*: move unit tests under the buildbot/
5197         directory
5198         * setup.py (packages): install buildbot.test too
5200         * buildbot/test/test_slavecommand.py: fix it, tests pass now
5201         * buildbot/test/test_steps.py: fix it, tests pass now
5203 2004-01-06  Brian Warner  <warner@lothar.com>
5205         * buildbot/changes/mail.py (parseFreshCVSMail): looks like new
5206         freshcvs mail uses a slightly different syntax for new
5207         directories. Update parser to handle either.
5208         * test/test_mailparse.py (Test1.testMsg9): test for same
5210 2003-12-21  Brian Warner  <warner@lothar.com>
5212         * buildbot/process/process_twisted.py (TwistedDebsBuildFactory): set
5213         'warnOnWarnings' so that lintian errors mark the build orange
5215 2003-12-17  Brian Warner  <warner@lothar.com>
5217         * buildbot/changes/mail.py (parseBonsaiMail): parser for commit
5218         messages emitted by Bonsai, contributed by Stephen Davis.
5220         * test/*: moved all tests to use trial instead of unittest. Some
5221         still fail (test_steps, test_slavecommand, and test_process).
5223         * setup.py (version): bump to 0.4.1+ while between releases
5225 2003-12-09  Brian Warner  <warner@lothar.com>
5227         * setup.py (version): Releasing buildbot-0.4.1
5229 2003-12-09  Brian Warner  <warner@lothar.com>
5231         * NEWS: update for 0.4.1 release
5233         * docs/examples/twisted_master.cfg: add netbsd builder, shuffle
5234         freebsd builder code a little bit
5236         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred.__cmp__):
5237         don't try to compare attributes of different classes
5238         * buildbot/changes/mail.py (MaildirSource.__cmp__): same
5239         (MaildirSource.messageReceived): fix Change delivery
5241         * buildbot/master.py (BuildMaster.loadConfig): insert 'basedir'
5242         into the config file's namespace before loading it, like the
5243         documentation claims it does
5244         * docs/examples/twisted_master.cfg: remove explicit 'basedir'
5245         (useFreshCVS): switch to using a maildir until Twisted's freshcvs
5246         daemon comes back online
5248 2003-12-08  Brian Warner  <warner@lothar.com>
5250         * docs/examples/twisted_master.cfg: provide an explicit 'basedir'
5251         so the example will work with online=0 as well
5253         * buildbot/changes/mail.py (FCMaildirSource, SyncmailMaildirSource):
5254         fix the __implements__ line
5256         * buildbot/changes/maildirtwisted.py (MaildirTwisted): make this
5257         class a twisted.application.service.Service, use startService to
5258         get it moving.
5260         * buildbot/changes/dnotify.py (DNotify): use os.open to get the
5261         directory fd instead of simple open(). I'm sure this used to work,
5262         but the current version of python refuses to open directories with
5263         open().
5265 2003-12-05  Brian Warner  <warner@lothar.com>
5267         * setup.py (version): bump to 0.4.0+ while between releases
5269 2003-12-05  Brian Warner  <warner@lothar.com>
5271         * setup.py (version): Releasing buildbot-0.4.0
5273 2003-12-05  Brian Warner  <warner@lothar.com>
5275         * docs/examples/glib_master.cfg: replace old sample scripts with
5276         new-style config files
5277         * MANIFEST.in: include .cfg files in distribution tarball
5279         * buildbot/changes/freshcvs.py (FreshCVSListener.remote_goodbye):
5280         implement a dummy method to avoid the exception that occurs when
5281         freshcvs sends this to us.
5283         * buildbot/pbutil.py (ReconnectingPBClientFactory.stopFactory):
5284         removed the method, as it broke reconnection. Apparently
5285         stopFactory is called each time the connection attempt fails. Must
5286         rethink this.
5287         (ReconnectingPBClientFactory.__getstate__): squash the _callID
5288         attribute before serialization, since without stopFactory the
5289         reconnect timer may still be active and they aren't serializable.
5291         * test/test_mailparse.py (ParseTest): test with 'self' argument
5293         * buildbot/changes/mail.py (parseFreshCVSMail): add (silly) 'self'
5294         argument, as these "functions" are invoked like methods from class
5295         attributes and therefore always get an instance as the first
5296         argument.
5298         * buildbot/changes/maildir.py (Maildir.start): fix error in error
5299         message: thanks to Stephen Davis for the catch
5301 2003-12-04  Brian Warner  <warner@lothar.com>
5303         * buildbot/pbutil.py: complete rewrite using PBClientFactory and
5304         twisted's standard ReconnectingClientFactory. Handles both oldcred
5305         and newcred connections. Also has a bug-workaround for
5306         ReconnectingClientFactory serializing its connector when it
5307         shouldn't.
5309         * buildbot/bot.py (BotFactory): rewrite connection layer with new
5310         pbutil. Replace makeApp stuff with proper newcred/mktap
5311         makeService(). Don't serialize Ephemerals on shutdown.
5313         * buildbot/changes/changes.py (ChangeMaster): make it a
5314         MultiService and add the sources as children, to get startService
5315         and stopService for free. This also gets rid of the .running flag.
5317         * buildbot/changes/freshcvs.py (FreshCVSSource): rewrite to use
5318         new pbutil, turn into a TCPClient at the same time (to get
5319         startService for free). Two variants exist: FreshCVSSourceOldcred
5320         and FreshCVSSourceNewcred (CVSToys doesn't actualy support newcred
5321         yet, but when it does, we'll be ready).
5322         (FreshCVSSource.notify): handle paths which are empty after the
5323         prefix is stripped. This only happens when the top-level (prefix)
5324         directory is added, at the very beginning of a Repository's life.
5326         * buildbot/clients/base.py: use new pbutil, clean up startup code.
5327         Now the only reconnecting code is in the factory where it belongs.
5328         (Builder.unsubscribe): unregister the disconnect callback when we
5329         delete the builder on command from the master (i.e. when the
5330         buildmaster is reconfigured and that builder goes away). This
5331         fixes a multiple-delete exception when the status client is shut
5332         down afterwards.
5333         * buildbot/clients/gtkPanes.py (GtkClient): cleanup, match the
5334         base Client. 
5336         * buildbot/status/words.py (IrcStatusBot): add some more sillyness
5337         (IrcStatusBot.getBuilderStatus): fix minor exception in error message
5339 2003-10-20  Christopher Armstrong  <radix@twistedmatrix.com>
5341         * contrib/run_maxq.py: Accept a testdir as an argument rather than
5342         a list of globs (ugh). The testdir will be searched for files
5343         named *.tests and run the tests in the order specified in each of
5344         those files. This allows for "dependancies" between tests to be
5345         codified.
5347         * buildbot/process/maxq.py (MaxQ.__init__): Accept a testdir
5348         argument to pass to run_maxq.py, instead of a glob.
5350 2003-10-17  Brian Warner  <warner@lothar.com>
5352         * buildbot/process/step_twisted.py (HLint.start): ignore .xhtml
5353         files that live in the sandbox
5355 2003-10-15  Brian Warner  <warner@lothar.com>
5357         * buildbot/process/step_twisted.py (ProcessDocs.finished): fix
5358         spelling error in "docs" count-warnings output
5359         (HLint.start): stupid thinko meant .xhtml files were ignored
5361         * docs/examples/twisted_master.cfg (reactors): disable cReactor
5362         tests now that cReactor is banished to the sandbox
5364 2003-10-10  Brian Warner  <warner@lothar.com>
5366         * buildbot/process/step_twisted.py (ProcessDocs, HLint): new Twisted
5367         scheme: now .xhtml are sources and .html are generated
5369 2003-10-08  Brian Warner  <warner@lothar.com>
5371         * buildbot/process/step_twisted.py (RunUnitTests.__init__): oops,
5372         we were ignoring the 'randomly' parameter.
5374 2003-10-01  Brian Warner  <warner@lothar.com>
5376         * buildbot/slavecommand.py (ShellCommand.start): set usePTY=1 on
5377         posix, to kill sub-children of aborted slavecommands.
5379         * buildbot/status/builder.py: rename Builder to BuilderStatus.
5380         Clean up initialization: lastBuildStatus remains None until the
5381         first build has been completed.
5383         * buildbot/status/html.py (WaterfallStatusResource.body): handle
5384         None as a lastBuildStatus
5385         * buildbot/clients/gtkPanes.py: same
5387         * buildbot/status/client.py (StatusClientService): keep
5388         BuilderStatus objects in self.statusbags . These objects now live
5389         here in the StatusClientService and are referenced by the Builder
5390         object, rather than the other way around.
5391         * buildbot/status/words.py (IrcStatusBot.getBuilderStatus): same
5392         * buildbot/process/base.py (Builder): same
5393         * test/test_config.py (ConfigTest.testBuilders): same
5395         * buildbot/master.py (BuildMaster.loadConfig_Builders): when modifying
5396         an existing builder, leave the statusbag alone. This will preserve the
5397         event history.
5399         * buildbot/pbutil.py (ReconnectingPB.connect): add initial newcred
5400         hook. This will probably go away in favor of a class in upcoming
5401         Twisted versions.
5403         * buildbot/changes/freshcvs.py (FreshCVSSource.start): Remove old
5404         serviceName from newcred FreshCVSNotifiee setup
5406 2003-09-29  Brian Warner  <warner@lothar.com>
5408         * buildbot/process/process_twisted.py: switch to new reactor
5409         abbreviations
5410         * docs/examples/twisted_master.cfg: same
5412         * README (REQUIREMENTS): mention twisted-1.0.8a3 requirement
5414         * buildbot/status/words.py (IrcStatusBot.getBuilder): use the
5415         botmaster reference instead of the oldapp service lookup
5417         * buildbot/master.py (BuildMaster.__init__): give the
5418         StatusClientService a reference to the botmaster to make it easier to
5419         force builds
5421 2003-09-24  Christopher Armstrong  <radix@twistedmatrix.com>
5423         * buildbot/status/html.py (Box.td): escape hreffy things so you
5424         can have spaces in things like builder names
5425         (StatusResourceBuilder.body)
5426         (WaterfallStatusResource.body)
5427         (WaterfallStatusResource.body0): same
5429 2003-09-25  Brian Warner  <warner@lothar.com>
5431         * buildbot/master.py (BuildMaster.loadConfig_Builders): don't
5432         rearrange the builder list when adding or removing builders: keep
5433         them in the order the user requested.
5434         * test/test_config.py (ConfigTest.testBuilders): verify it
5436         * contrib/debug.glade: give the debug window a name
5438         * buildbot/process/base.py (Builder.buildTimerFired): builders can
5439         now wait on multiple interlocks. Fix code relating to that.
5440         (Builder.checkInterlocks): same
5441         * buildbot/status/builder.py (Builder.currentlyInterlocked): same
5443         * buildbot/master.py (BuildMaster.loadConfig): move from
5444         deprecated pb.BrokerFactory to new pb.PBServerFactory
5445         * test/test_config.py (ConfigTest.testWebPathname): same
5447         * docs/examples/twisted_master.cfg: fix interlock declaration
5449         * buildbot/master.py (BotMaster.addInterlock): move code to attach
5450         Interlocks to their Builders into interlock.py .
5451         (BuildMaster.loadConfig_Interlocks): fix interlock handling
5453         * test/test_config.py (ConfigTest.testInterlocks): validate
5454         interlock handling
5456         * buildbot/process/base.py (Builder.__init__): better comments
5457         * buildbot/process/interlock.py (Interlock.__repr__): same
5458         (Interlock.deactivate): add .active flag, move the code that
5459         attaches/detaches builders into the Interlock
5461 2003-09-24  Christopher Armstrong  <radix@twistedmatrix.com>
5463         * buildbot/process/maxq.py (MaxQ): support for running a set of MaxQ
5464         tests using the new run_maxq.py script, and reporting failures by
5465         parsing its output.
5467         * contrib/run_maxq.py: Hacky little script for running a set of maxq
5468         tests, reporting their success or failure in a buildbot-friendly 
5469         manner.
5471 2003-09-24  Brian Warner  <warner@lothar.com>
5473         * docs/examples/twisted_master.cfg: example of a new-style config
5474         file. This lives in the buildmaster base directory as
5475         "master.cfg".
5477         * contrib/debugclient.py (DebugWidget.do_rebuild): add 'reload'
5478         button to make the master re-read its config file
5480         * buildbot/master.py (BuildMaster.loadConfig): new code to load
5481         buildmaster configuration from a file. This file can be re-read
5482         later, and the buildmaster will update itself to match the new
5483         desired configuration. Also use new Twisted Application class.
5484         * test/Makefile, test/test_config.py: unit tests for same
5486         * buildbot/changes/freshcvs.py (FreshCVSSource.__cmp__): make
5487         FreshCVSSources comparable, to support reload.
5488         * buildbot/changes/mail.py (MaildirSource.__cmp__): same
5490         * buildbot/process/base.py (Builder): make them comparable, make
5491         Interlocks easier to attach, to support reload. Handle
5492         re-attachment of remote slaves.
5493         * buildbot/process/interlock.py (Interlock): same
5495         * buildbot/bot.py, bb_tap.py, changes/changes.py: move to
5496         Twisted's new Application class. Requires Twisted >= 1.0.8 .
5497         buildmaster taps are now constructed with mktap.
5498         * buildbot/status/client.py (StatusClientService): same
5500         * buildbot/status/words.py: move to new Services, add support to
5501         connect to multiple networks, add reload support, allow nickname
5502         to be configured on a per-network basis
5504 2003-09-20  Brian Warner  <warner@lothar.com>
5506         * docs/examples/twisted_master.py (twisted_app): use python2.3 for
5507         the freebsd builder, now that the machine has been upgraded and no
5508         longer has python2.2
5510         * setup.py (version): bump to 0.3.5+ while between releases
5512 2003-09-19  Brian Warner  <warner@lothar.com>
5514         * setup.py (version): Releasing buildbot-0.3.5
5516 2003-09-19  Brian Warner  <warner@lothar.com>
5518         * NEWS: add post-0.3.4 notes
5520         * README (REQUIREMENTS): note twisted-1.0.7 requirement
5522         * MANIFEST.in: add contrib/*
5524         * docs/examples/twisted_master.py (twisted_app): all build slaves must
5525         use a remote root now: cvs.twistedmatrix.com
5527         * buildbot/changes/freshcvs.py (FreshCVSNotifiee.connect): update
5528         to newcred
5529         (FreshCVSNotifieeOldcred): but retain a class that uses oldcred for
5530         compatibility with old servers
5531         (FreshCVSSource.start): and provide a way to use it
5532         (FreshCVSNotifiee.disconnect): handle unconnected notifiee
5534         * docs/examples/twisted_master.py (twisted_app): update to new
5535         makeApp interface.
5536         (twisted_app): listen on new ~buildbot socket
5537         (twisted_app): Twisted CVS has moved to cvs.twistedmatrix.com
5539         * buildbot/process/process_twisted.py: Use 'copydir' on CVS steps
5540         to reduce cvs bandwidth (update instead of full checkout)
5542 2003-09-11  Brian Warner  <warner@lothar.com>
5544         * contrib/fakechange.py: demo how to connect to the changemaster
5545         port. You can use this technique to submit changes to the
5546         buildmaster from source control systems that offer a hook to run a
5547         script when changes are committed.
5549         * contrib/debugclient.py: tool to connect to the debug port. You
5550         can use it to force builds, submit fake changes, and wiggle the
5551         builder state
5553         * buildbot/master.py: the Big NewCred Reorganization. Use a single
5554         'Dispatcher' realm to handle all the different kinds of
5555         connections and Perspectives: buildslaves, the changemaster port,
5556         the debug port, and the status client port. NewCredPerspectives
5557         now have .attached/.detached methods called with the remote 'mind'
5558         reference, much like old perspectives did. All the pb.Services
5559         turned into ordinary app.ApplicationServices .
5560         (DebugService): went away, DebugPerspectives are now created
5561         directly by the Dispatcher.
5562         (makeApp): changed interface a little bit
5564         * buildbot/changes/changes.py: newcred
5565         * buildbot/status/client.py: newcred
5567         * buildbot/clients/base.py: newcred client side changes
5568         * buildbot/bot.py: ditto
5570         * docs/examples/glib_master.py: handle new makeApp() interface
5571         * docs/examples/twisted_master.py: ditto
5573         * buildbot/pbutil.py (NewCredPerspective): add a helper class to
5574         base newcred Perspectives on. This should go away once Twisted
5575         itself provides something sensible.
5578 2003-09-11  Christopher Armstrong  <radix@twistedmatrix.com>
5580         * contrib/svn_buildbot.py: A program that you can call from your
5581         SVNREPO/hooks/post-commit file that will notify a BuildBot master
5582         when a change in an SVN repository has happened. See the top of
5583         the file for some minimal usage info.
5585 2003-09-10  Christopher Armstrong  <radix@twistedmatrix.com>
5587         * buildbot/slavecommand.py (ArglistCommand): Add new
5588         ArglistCommand that takes an argument list rather than a string as
5589         a parameter. Using a st.split() for argv is very bad.
5591         * buildbot/slavecommand.py (SVNFetch): Now has the ability to
5592         update to a particular revision rather than always checking out
5593         (still not very smart about it, there may be cases where the
5594         checkout becomes inconsistent).
5596 2003-09-10  Christopher Armstrong  <radix@twistedmatrix.com>
5598         * buildbot/{bot.py,slavecommand.py,process/step.py}: Rudimentary
5599         SVN fetch support. It can checkout (not update!) a specified
5600         revision from a specified repository to a specified directory.
5602         * buildbot/status/progress.py (Expectations.update): Fix an
5603         obvious bug (apparently created by the change described in the
5604         previous ChangeLog message) by moving a check to *after* the
5605         variable it checks is defined.
5608 2003-09-08  Brian Warner  <warner@lothar.com>
5610         * buildbot/status/progress.py (Expectations.update): hack to catch
5611         an exception TTimo sees: sometimes the update() method seems to
5612         get called before the step has actually finished, so the .stopTime
5613         is not set, so no totalTime() is available and we average None
5614         with the previous value. Catch this and just don't update the
5615         metrics, and emit a log message.
5617 2003-08-24  Brian Warner  <warner@lothar.com>
5619         * buildbot/process/base.py (BasicBuildFactory): accept 'cvsCopy'
5620         parameter to set copydir='original' in CVS commands.
5622         * buildbot/process/step.py (CVS): accept 'copydir' parameter.
5624         * buildbot/slavecommand.py (CVSCommand): add 'copydir' parameter,
5625         which tells the command to maintain a separate original-source CVS
5626         workspace. For each build, this workspace will be updated, then
5627         the tree copied into a new workdir. This reduces CVS bandwidth
5628         (from a full checkout to a mere update) while doubling the local
5629         disk usage (to keep two copies of the tree).
5631 2003-08-21  Brian Warner  <warner@lothar.com>
5633         * buildbot/status/event.py (Logfile.addEntry): if the master web
5634         server dies while we're serving a page, request.write raises
5635         pb.DeadReferenceError . Catch this and treat it like a
5636         notifyFinish event by dropping the request.
5638 2003-08-18  Brian Warner  <warner@lothar.com>
5640         * buildbot/status/words.py (IrcStatusBot.command_FORCE): complain
5641         (instead of blowing up) if a force-build command is given without
5642         a reason field
5644         * buildbot/changes/changes.py (ChangeMaster.getChangeNumbered):
5645         don't blow up if there aren't yet any Changes in the list
5647 2003-08-02  Brian Warner  <warner@lothar.com>
5649         * buildbot/bot.py (updateApplication): don't set the .tap name,
5650         since we shouldn't assume we own the whole .tap file
5652         * buildbot/bb_tap.py (updateApplication): clean up code, detect
5653         'mktap buildbot' (without a subcommand) better
5655 2003-07-29  Brian Warner  <warner@lothar.com>
5657         * buildbot/status/words.py
5658         (IrcStatusFactory.clientConnectionLost): when we lose the
5659         connection to the IRC server, schedule a reconnection attempt.
5661         * buildbot/slavecommand.py (CVSCommand.doClobber): on non-posix,
5662         use shutil.rmtree instead of forking off an "rm -rf" command.
5663         rmtree may take a while and will block until it finishes, so we
5664         use "rm -rf" if available.
5666         * docs/examples/twisted_master.py: turn off kqreactor, it hangs
5667         freebsd buildslave badly
5669         * setup.py (version): bump to 0.3.4+ while between releases
5671 2003-07-28  Brian Warner  <warner@lothar.com>
5673         * setup.py (version): Releasing buildbot-0.3.4
5675 2003-07-28  Brian Warner  <warner@lothar.com>
5677         * NEWS: update in preparation for release
5679         * buildbot/slavecommand.py (ShellCommand.doTimeout): use
5680         process.signalProcess instead of os.kill, to improve w32
5681         portability
5683         * docs/examples/twisted_master.py (twisted_app): turn off
5684         win32eventreactor: the tests hang the buildslave badly
5686         * buildbot/process/base.py (Build.buildFinished): update ETA even on
5687         failed builds, since usually the failures are consistent
5689         * buildbot/process/process_twisted.py (TwistedReactorsBuildFactory):
5690         add compileOpts/compileOpts2 to reactors build
5692         * docs/examples/twisted_master.py (twisted_app): add "-c mingw32"
5693         (twisted_app): use both default and win32eventreactor on w32 build.
5694         Use both default and kqreactor on freebsd build.
5696         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
5697         add compileOpts2, which is put after the build_ext argument. w32
5698         needs "-c mingw32" here.
5700         * buildbot/status/html.py (StatusResourceBuilder.getChild): don't
5701         touch .acqpath, it goes away in recent Twisted releases
5703         * docs/examples/twisted_master.py (twisted_app): use "python" for
5704         the w32 buildslave, not "python2.2"
5706         * buildbot/bot.py (Bot.remote_getSlaveInfo): only look in info/ if
5707         the directory exists.. should hush an exception under w32
5709         * buildbot/slavecommand.py (ShellCommandPP.processEnded): use
5710         ProcessTerminated -provided values for signal and exitCode rather
5711         than parsing the unix status code directly. This should remove one
5712         more roadblock for a w32-hosted buildslave.
5714         * test/test_mailparse.py: add test cases for Syncmail parser
5716         * Buildbot/changes/freshcvsmail.py: remove leftover code, leave a
5717         temporary compatibility import. Note! Start importing
5718         FCMaildirSource from changes.mail instead of changes.freshcvsmail
5720         * buildbot/changes/mail.py (parseSyncmail): finish Syncmail parser
5722 2003-07-27  Brian Warner  <warner@lothar.com>
5724         * NEWS: started adding new features
5726         * buildbot/changes/mail.py: start work on Syncmail parser, move
5727         mail sources into their own file
5729         * buildbot/changes/freshcvs.py (FreshCVSNotifiee): mark the class
5730         as implementing IChangeSource
5731         * buildbot/changes/freshcvsmail.py (FCMaildirSource): ditto
5733         * buildbot/interfaces.py: define the IChangeSource interface
5735 2003-07-26  Brian Warner  <warner@lothar.com>
5737         * buildbot/master.py (makeApp): docstring (thanks to Kevin Turner)
5739 2003-06-25  Brian Warner  <warner@lothar.com>
5741         * buildbot/status/words.py (IrcStatusBot.emit_last): round off
5742         seconds display
5744 2003-06-17  Brian Warner  <warner@lothar.com>
5746         * buildbot/status/words.py: clean up method usage to avoid error
5747         in silly IRC command
5748         (IrcStatusBot.emit_status): round off seconds display
5750         * buildbot/process/base.py (Build): delete the timer when saving
5751         to the .tap file, and restore it (if it should still be running)
5752         upon restore. This should fix the "next build in -34 seconds"
5753         messages that result when the master is restarted while builds are
5754         sitting in the .waiting slot. If the time for the build has
5755         already passed, start it very soon (in 1 second).
5757         * buildbot/status/words.py: more silly commands
5759         * README (REQUIREMENTS): add URLs to all required software
5761         * buildbot/status/words.py ('last'): mention results of, and time
5762         since last build
5764 2003-05-28  Brian Warner  <warner@lothar.com>
5766         * buildbot/status/words.py: add 'last' command
5767         (IrcStatusBot.emit_status): add current-small text to 'status' output
5769         * docs/examples/twisted_master.py (twisted_app): turn on IRC bot
5770         (twisted_app): remove spaces from OS-X builder name
5772         * buildbot/master.py (makeApp): add knob to turn on IRC bot
5773         * buildbot/status/words.py: IRC bot should actually be useful now
5775 2003-05-23  Brian Warner  <warner@lothar.com>
5777         * buildbot/bot.py (Bot.remote_getSlaveInfo): add routines to get
5778         "slave information" from $(slavedir)/info/* . These files are
5779         maintained by the slave administrator, and describe the
5780         machine/environment that is hosting the slave. Information from
5781         them is put into the "Builder" HTML page. Still need to establish
5782         a set of well-known filenames and meanings for this data: at the
5783         moment, *all* info/* files are sent to the master, but only
5784         'admin' and 'host' are used on that end.
5785         * buildbot/status/html.py (StatusResourceBuilder.body): ditto
5786         * buildbot/process/base.py (Builder.setRemoteInfo):  ditto
5787         * buildbot/master.py (BotPerspective.got_info):  ditto
5789 2003-05-22  Brian Warner  <warner@lothar.com>
5791         * setup.py (version): bump version to 0.3.3+ while between releases
5793 2003-05-21  Brian Warner  <warner@lothar.com>
5795         * setup.py: Releasing buildbot-0.3.3
5797 2003-05-21  Brian Warner  <warner@lothar.com>
5799         * NEWS: 0.3.3 news items
5801         * README: describe --keepalive and life behind a NAT box
5803         * buildbot/bot.py (Bot.connected): implement application-level
5804         keepalives to deal with NAT timeouts, turn them on with
5805         --keepalive option or when SO_KEEPALIVE doesn't work.
5807         * buildbot/master.py (BotPerspective): accept keepalives silently
5809         * buildbot/process/base.py (Build.buildException): CopiedFailures
5810         don't carry as much information as local ones, so don't try to
5811         create a big HTMLized version of them.
5813         * buildbot/process/step.py (InternalShellCommand.stepFailed): close
5814         log file when step fails due to an exception, such as when the slave
5815         becomes unreachable
5817         * buildbot/process/step_twisted.py (RunUnitTests): use trial's new
5818         --testmodule argument instead of grepping for test-case-name tags
5819         ourselves. Remove FindUnitTests code.
5820         * buildbot/slavecommand.py, buildbot/bot.py: remove old code
5822         * MANIFEST.in: Add docs/examples, files under test/ . Oops!
5824 2003-05-16  Brian Warner  <warner@lothar.com>
5826         * buildbot/process/base.py (BasicBuildFactory): add 'configureEnv'
5827         argument to allow things like CFLAGS=-O0 to be passed without relying
5828         upon /bin/sh processing on the slave.
5830         * buildbot/process/step.py (InternalShellCommand.start): send
5831         'env' dict to slave
5832         * buildbot/slavecommand.py (ShellCommand.start): create argv with
5833         'split' instead of letting /bin/sh do it. This should also remove
5834         the need for /bin/sh on the buildslave, making it more likely to
5835         work with win32.
5837         * buildbot/status/html.py: html-escape text in blamelist.
5838         Add "force build" button to the Builder page.
5840         * buildbot/process/step_twisted.py (countFailedTests): look at
5841         last 1000 characters for status line, as import errors can put it
5842         before the -200 point.
5844 2003-05-15  Brian Warner  <warner@lothar.com>
5846         * docs/examples/twisted_master.py: use clobber=0 for remote builds
5848         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
5849         make 'clobber' a parameter, so it is possible to have builds which
5850         do full tests but do a cvs update instead of hammering the CVS
5851         server with a full checkout each build
5853         * buildbot/process/step.py (InternalShellCommand): bump default
5854         timeout to 20 minutes
5856         * buildbot/bot.py (Bot.debug_forceBuild): utility method to ask
5857         the master to trigger a build. Run it via manhole.
5859         * buildbot/master.py (BotPerspective.perspective_forceBuild):
5860         allow slaves to trigger any build that they host, to make life
5861         easier for slave admins who are testing out new build processes
5863         * buildbot/process/process_twisted.py (TwistedReactorsBuildFactory):
5864         don't flunk cReactor or qtreactor on failure, since they fail alot
5865         these days. Do warnOnFailure instead.
5867         * buildbot/process/base.py: change Builder.buildable from a list
5868         into a single slot. When we don't have a slave, new builds (once
5869         they make it past the timeout) are now merged into an existing
5870         buildable one instead of being queued. With this change, a slave
5871         which has been away for a while doesn't get pounded with all the
5872         builds it missed, but instead just does a single build.
5874 2003-05-07  Brian Warner  <warner@lothar.com>
5876         * setup.py (version): bump version to 0.3.2+ while between releases
5878 2003-05-07  Brian Warner  <warner@lothar.com>
5880         * setup.py: Releasing buildbot-0.3.2
5882 2003-05-07  Brian Warner  <warner@lothar.com>
5884         * setup.py: fix major packaging error: include subdirectories!
5885         
5886         * NEWS: add changes since last release
5888         * README (REQUIREMENTS): update twisted/python dependencies
5890         * buildbot/status/builder.py (Builder.startBuild): change
5891         BuildProcess API: now they should call startBuild/finishBuild
5892         instead of pushing firstEvent / setLastBuildStatus. Moving towards
5893         keeping a list of builds in the statusbag, to support other kinds of
5894         status delivery.
5895         (Builder.addClient): send current-activity-small to new clients
5896         * buildbot/process/base.py (Build.startBuild, .buildFinished): use
5897         new API
5899         * buildbot/status/client.py: drop RemoteReferences at shutdown
5901         * buildbot/status/event.py (Event.stoppedObserving): oops, add it
5903         * buildbot/status/progress.py (BuildProgress.remote_subscribe):
5904         more debug messages for remote status client
5906         * buildbot/process/step.py (InternalBuildStep.stepComplete)
5907         (.stepFailed): only fire the Deferred once, even if both
5908         stepComplete and stepFailed are called. I think this can happen if
5909         an exception occurs at a weird time.
5911         * buildbot/status/words.py: work-in-progress: IRC status delivery
5913 2003-05-05  Brian Warner  <warner@lothar.com>
5915         * docs/examples/twisted_master.py (twisted_app): hush internal
5916         python2.3 distutils deprecation warnings
5917         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
5918         add compileOpts= argument which inserts extra args before the
5919         "setup.py build_ext" command. This can be used to give -Wignore
5920         warnings, to hush some internal python-2.3 deprecation messages.
5922         * buildbot/process/step_twisted.py (RunUnitTests): parameterize
5923         the ['twisted.test'] default test case to make it easier to change
5924         in subclasses
5926         * buildbot/clients/base.py: switch to pb.Cacheable-style Events
5927         * buildbot/clients/gtkPanes.py: ditto
5929         * buildbot/process/step_twisted.py (RunUnitTests): use randomly=
5930         arg to collapse RunUnitTestsRandomly into RunUnitTests
5931         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
5932         use RunUnitTests(randomly=1) instead of RunUnitTestsRandomly
5934         * buildbot/status/html.py (StatusResource): shuffle Resources
5935         around to fix a bug: both 'http://foo:8080' and 'http://foo:8080/'
5936         would serve the waterfall display, but the internal links were
5937         only valid on the trailing-slash version. The correct behavior is
5938         for the non-slashed one to serve a Redirect to the slashed one.
5939         This only shows up when the buildbot page is hanging off another
5940         server, like a Twisted-Web distributed server.
5942         * buildbot/status/event.py (Event, RemoteEvent): make Events
5943         pb.Cacheable, with RemoteEvent as the cached version. This removes
5944         a lot of explicit send-an-update code.
5945         * buildbot/status/builder.py (Builder): remove send-update code
5946         * buildbot/status/client.py (ClientBuilder): remove send-update
5947         code, and log errors that occur during callRemote (mostly to catch
5948         InsecureJelly exceptions)
5950         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
5951         run Lore with the same python used in the rest of the build
5953         * buildbot/process/step_twisted2.py (RunUnitTestsJelly): moved
5955         * buildbot/process/step_twisted.py (HLint): accept 'python'
5956         argument. Catch rc!=0 and mark the step as failed. This marks the
5957         build orange ("has warnings").
5958         (RunUnitTestsJelly): move out to step_twisted2.py
5960         * buildbot/util.py (ignoreStaleRefs): add utility function
5962         * buildbot/master.py (DebugPerspective.perspective_setCurrentState):
5963         don't fake ETA object, it's too hard to get right
5965 2003-05-02  Brian Warner  <warner@lothar.com>
5967         * docs/examples/twisted_master.py (twisted_app): add FreeBSD builder
5969 2003-05-01  Brian Warner  <warner@lothar.com>
5971         * buildbot/status/html.py (StatusResource.body): oops, I was
5972         missing a <tr>, causing the waterfall page to be misrendered in
5973         everything except Galeon.
5975 2003-04-29  Brian Warner  <warner@lothar.com>
5977         * docs/examples/twisted_master.py: make debuild use python-2.2
5978         explicitly, now that Twisted stopped supporting 2.1
5980         * buildbot/process/step_twisted.py (BuildDebs.finishStatus): oops,
5981         handle tuple results too. I keep forgetting this, which suggests
5982         it needs to be rethought.
5984         * setup.py (setup): bump version to 0.3.1+ while between releases
5985         
5986 2003-04-29  Brian Warner  <warner@lothar.com>
5988         * setup.py: Releasing buildbot-0.3.1
5990 2003-04-29  Brian Warner  <warner@lothar.com>
5992         * README (SUPPORT): add plea to send questions to the mailing list
5994         * NEWS, MANIFEST.in: add description of recent changes
5996         * docs/examples/twisted_master.py: add the code used to create the
5997         Twisted buildmaster, with passwords and such removed out to a
5998         separate file.
6000         * buildbot/changes/changes.py, freshcvs.py, freshcvsmail.py: split
6001         out cvstoys-using bits from generic changes.py, to allow non-cvstoys
6002         buildmasters to not require CVSToys be installed.
6003         * README, docs/examples/glib_master: update to match the change
6005         * buildbot/clients/base.py, buildbot/bot.py,
6006         buildbot/changes/changes.py, buildbot/pbutil.py: copy
6007         ReconnectingPB from CVSToys distribution to remove CVSToys
6008         dependency for build slaves and status clients. Buildmasters which
6009         use FreshCVSSources still require cvstoys be installed, of course.
6011 2003-04-25  Brian Warner  <warner@lothar.com>
6013         * buildbot/process/process_twisted.py (FullTwistedBuildFactory): add
6014         runTestsRandomly arg to turn on trial -z
6016         * buildbot/process/step_twisted.py (TwistedJellyTestResults):
6017         experimental code to use trial's machine-parseable output to get
6018         more detailed test results. Still has some major issues.
6019         (RunUnitTestsRandomly): subclass to add "-z 0" option, runs tests
6020         in random sequence
6022         * buildbot/status/builder.py (Builder.setCurrentBuild):
6023         anticipating moving build history into statusbag, not used yet
6025         * buildbot/status/tests.py: code to centralize test results,
6026         doesn't work quite yet
6028         * buildbot/status/event.py (Event): use hasattr("setName") instead
6029         of isinstance for now.. need better long-term solution
6031         * buildbot/status/html.py: Remove old imports
6033 2003-04-24  Brian Warner  <warner@lothar.com>
6035         * buildbot/process/process_twisted.py (TwistedBuild.isFileImportant):
6036         ignore changes under doc/fun/ and sandbox/
6038         * buildbot/process/step_twisted.py: update pushEvent and friends.
6040         * buildbot/status/html.py (Box.td): replace event.buildername with
6041         event.parent.getSwappableName(). Needs more thought.
6043         * buildbot/status/builder.py (Builder): Replace pushEvent and
6044         getLastEvent with {set|update|addFileTo|finish}CurrentActivity.
6045         Tell events they are being pruned with event.delete().
6047         * buildbot/process/base.py (Build): Remove Builder status-handling
6048         methods. s/pushEvent/setCurrentActivity/.
6050         * buildbot/process/step.py (BuildStep): clean up status delivery.
6051         Gouse builder.statusbag methods instead of intermediate builder
6052         methods. s/updateLastEvent/updateCurrentActivity/.
6053         s/finalizeLastEvent/finishCurrentActivity/. Use
6054         addFileToCurrentActivity for summaryFunction.
6056         * buildbot/status/event.py (Logfile): put data in a Swappable when
6057         .finish is called.
6058         (Event): add more setter methods. Remove .buildername, use .parent
6059         and getSwappableName instead (needs more thought).
6061         * buildbot/util.py (Swappable):
6062         * test/test_swap.py: don't bother setting filename at __init__
6063         time, do it later. Change setFilename args to take parent first,
6064         since it provides the most significant part of the filename.
6066 2003-04-23  Brian Warner  <warner@lothar.com>
6068         * buildbot/status/event.py (Logfile.addEntry): append to previous
6069         entry, if possible
6071         * buildbot/process/step.py (BuildStep.finalizeLastEvent):
6072         anticipating Swappable
6073         (InternalShellCommand.remoteUpdate): split out various log-adding
6074         methods so subclasses can snarf stdout separately
6076         * buildbot/process/base.py (Builder.finalizeLastEvent): more code
6077         in anticipation of Swappable build logs
6078         (Builder.testsFinished): anticipating TestResults, still disabled
6080         * buildbot/status/builder.py (Builder.pruneEvents): only keep the
6081         last 100 events
6083         * buildbot/status/event.py (Logfile): add (disabled) support for
6084         Swappable, not ready for use yet
6086         * buildbot/util.py (Swappable): object which is swapped out to
6087         disk after some period of no use.
6088         * test/test_swap.py: test buildbot.utils.Swappable
6090 2003-04-14  Brian Warner  <warner@lothar.com>
6092         * buildbot/process/base.py (Builder.doPeriodicBuild): add simple
6093         periodic-build timer. Set the .periodicBuildTime on a builder
6094         instance to some number of seconds to activate it.
6096         * buildbot/master.py (BotMaster.forceBuild): change forceBuild API
6098         * buildbot/process/step.py (ShellCommand.finishStatus): use log.msg in
6099         a way that survives result tuples
6101 2003-04-12  Brian Warner  <warner@lothar.com>
6103         * buildbot/process/step.py (ShellCommand.finishStatusSummary):
6104         return a dict instead of a tuple: allow summarizers to provide
6105         multiple summaries if they want
6106         * buildbot/process/step_twisted.py (trialTextSummarizer): return dict
6107         (debuildSummarizer): summarize lintian warnings/errors
6109 2003-04-10  Brian Warner  <warner@lothar.com>
6111         * README (REQUIREMENTS): slave requires twisted-1.0.4a2
6113 2003-04-09  Brian Warner  <warner@lothar.com>
6115         * buildbot/process/step_twisted.py (trialTextSummarizer): Don't create
6116         empty summaries: happens when the tests fail so hard they don't emit
6117         a parseable summary line.
6119         * buildbot/process/step.py (ShellCommand.finishStatusSummary):
6120         Allow summaryFunction to return None to indicate no summary should
6121         be added.
6123         * buildbot/status/event.py (Logfile.removeHtmlWatcher): avoid
6124         writing to stale HTTP requests: notice when they disconnect and
6125         remove the request from the list. Also add CacheToFile from
6126         moshez, will be used later.
6128 2003-04-08  Brian Warner  <warner@lothar.com>
6130         * buildbot/process/step_twisted.py (ProcessDocs.finished): warnings
6131         should be an int, not a list of strings
6133         * buildbot/changes/changes.py (FreshCVSSource.stop): don't disconnect
6134         if we weren't actually connected
6136         * buildbot/process/step_twisted.py (trialTextSummarizer): function
6137         to show the tail end of the trial text output
6139         * buildbot/process/step.py (ShellCommand.finishStatusSummary): add
6140         hook to summarize the results of a ShellCommand
6142 2003-04-07  Brian Warner  <warner@lothar.com>
6144         * buildbot/process/step_twisted.py (RunUnitTests): consolidate all
6145         twisted test suite code into a single class.
6146         * buildbot/process/process_twisted.py: same
6148 2003-04-04  Brian Warner  <warner@lothar.com>
6150         * setup.py, MANIFEST.in: hack to make sure plugins.tml gets installed
6152         * README (SLAVE): document use of mktap to create slave .tap file
6153         (REQUIREMENTS): describe dependencies
6155         * buildbot/bb_tap.py, buildbot/plugins.tml:
6156         * buildbot/bot.py (updateApplication): Add mktap support for creating
6157         buildslave .tap files
6159 2003-03-28  Brian Warner  <warner@lothar.com>
6161         * buildbot/process/step.py (InternalShellCommand.finished): handle
6162         new tuple result values (fix embarrasing bug that appeared during
6163         PyCon demo)
6165 2003-03-27  Brian Warner  <warner@lothar.com>
6167         * docs/examples/glib_master.py, README: add sample buildmaster.tap
6168         -making program
6170 2003-03-25  Brian Warner  <warner@lothar.com>
6172         * buildbot/process/step.py (CVS, ShellCommand): add reason for failure
6173         to overall build status
6174         * buildbot/clients/base.py (Builder): improve event printing
6175         * buildbot/process/base.py (BasicBuildFactory): use specific steps
6176         instead of generic ShellCommand
6177         (Build): Add .stopBuild, use it when slave is detached
6179         * buildbot/process/step.py (Configure,Test): give the steps their
6180         own names and status strings
6182         * buildbot/status/html.py (StatusResource): add "show" argument,
6183         lets you limit the set of Builders being displayed.
6185 2003-03-20  Brian Warner  <warner@lothar.com>
6187         * buildbot/process/basic.py: removed
6189 2003-03-19  Brian Warner  <warner@lothar.com>
6191         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
6192         turn off process-docs by default
6194         * buildbot/process/base.py (Builder.getBuildNumbered): Don't blow up
6195         when displaying build information without anything in allBuilds[]
6197         * buildbot/bot.py (makeApp): really take password from sys.argv
6199 2003-03-18  Brian Warner  <warner@lothar.com>
6201         * buildbot/bot.py (buildApp): take password from sys.argv
6203         * README: replace with more useful text
6205         * setup.py: add a real one
6206         * MANIFEST.in, .cvsignore: more distutils packaging stuff
6207         
6208         * docs/PyCon-2003/: added sources for PyCon paper.
6210         * buildbot/process/base.py, step.py: revamp. BuildProcess is gone,
6211         now Build objects control the process and Builder only handles
6212         slave stuff and distribution of changes/status. A new BuildFactory
6213         class creates Build objects on demand.
6215         Created ConfigurableBuild which takes a list of steps to run. This
6216         makes it a lot easier to set up a new kind of build and moves us
6217         closer to being able to configure a build from a web page.
6219         * buildbot/process/step_twisted.py, process_twisted.py: move to
6220         new model. A lot of code went away.
6221         
6222         * buildbot/status/progress.py (BuildProgress.newProgress): Don't
6223         send lots of empty progress messages to the client.
6225         * buildbot/master.py (makeApp): enforce builder-name uniqueness
6227 2003-02-20  Brian Warner  <warner@lothar.com>
6229         * buildbot/process/step_twisted.py (BuildDebs): count lintian hits
6231         * buildbot/slavecommand.py (ShellCommand): back to usePTY=0. The
6232         Twisted bug that prevented non-pty processes from working just got
6233         fixed, and the bug that leaks ptys is still being investigated.
6235         * buildbot/process/step.py (CVS): send timeout arg to slave
6237         * buildbot/clients/gtkPanes.py: add connection-status row, handle
6238         builders coming and going
6239         * buildbot/clients/base.py: clean up protocol, move to ReconnectingPB
6240         from CVSToys, handle lost-buildmaster
6242         * buildbot/status/client.py (StatusClientService.removeBuilder):
6243         Clean up status client protocol: send builders (with references)
6244         as they are created, rather than sending a list and requiring the
6245         client to figure out which ones are new.
6246         * buildbot/master.py (BotMaster.forceBuild): Log debugclient
6247         attempts to force a build on an unknown builder
6249 2003-02-19  Brian Warner  <warner@lothar.com>
6251         * buildbot/slavecommand.py (CVSCommand): add timeout to sub-commands
6252         * buildbot/slavecommand.py (ShellCommand.start): stop using PTYs until
6253         Twisted stops leaking them.
6254         * buildbot/clients/gtkPanes.py (CompactBuilder): forget ETA when the
6255         builder goes to an idle state.
6257         * buildbot/slavecommand.py (ShellCommand.start): bring back PTYs until
6258         I figure out why CVS commands hang without them, and/or I fix the
6259         hung-command timeout
6261 2003-02-16  Brian Warner  <warner@lothar.com>
6263         * buildbot/process/step_twisted.py: bin/hlint went away, replace
6264         with 'bin/lore --output lint'. Use 'bin/trial -o' to remove
6265         ansi-color markup. Remove GenerateLore step. Count hlint warnings in
6266         GenerateDocs now that they are prefixed with WARNING:.
6268         * buildbot/status/html.py (StatusResource.body): Fix Builder link,
6269         use manual href target instead of request.childLink
6271         * buildbot/clients/gtkPanes.py: Fix progress countdown: update the
6272         display every second, but update the ETA every 5 seconds (or
6273         whenever) as remote_progress messages arrive.
6276 2003-02-12  Brian Warner  <warner@lothar.com>
6278         * *: import current sources from home CVS repository
6279         
6281 # Local Variables:
6282 # add-log-time-format: add-log-iso8601-time-string
6283 # End: