add user's manual sections on LogObservers, writing status plugins
[buildbot.git] / ChangeLog
blob2f38506486fd1ce4b01dc23f192d804c1d009e78
1 2006-06-14  Brian Warner  <warner@lothar.com>
3         * docs/buildbot.texinfo (Adding LogObservers): add some limited
4         docs on writing new LogObserver classes
5         (Writing New Status Plugins): brief docs on how Status Plugins fit
6         together
8         * buildbot/process/step_twisted.py (TrialTestCaseCounter):
9         implement a LogObserver that counts how many unit tests have been
10         run so far
11         (Trial.__init__): wire it in
12         * buildbot/test/test_twisted.py (Counter): unit test for it
14         * buildbot/process/step_twisted.py (HLint.commandComplete): update
15         to new cmd.logs['stdio'] scheme
16         (Trial.commandComplete): same
17         (BuildDebs.commandComplete): same
19         * buildbot/process/step.py (LoggedRemoteCommand): use a dict of
20         LogFiles, instead of just a single one. The old single logfile is
21         now called "stdio". LoggedRemoteCommand no longer creates a
22         LogFile for you (the code to do that was broken anyway). If you
23         don't create a "stdio" LogFile, then stdout/stderr will be
24         discarded.
25         (LogObserver): implement "LogObservers", which a BuildStep can add
26         to parse the output of a command in real-time. The primary use is
27         to provide more useful information to the Progress code, allowing
28         better ETA estimates.
29         (LogLineObserver): utility subclass which feeds complete lines to
30         the parser instead of bytes.
31         (BuildStep.progressMetrics): this is safer as a tuple
32         (BuildStep.setProgress): utility method, meant to be called by
33         LogObservers
34         (BuildStep.addLogObserver): new method, to be called at any time
35         during the BuildStep (even before any LogFiles have been created),
36         to attach (or schedule for eventual attachment) a LogObserver to a
37         LogFile.
38         (StdioProgressObserver): new LogObserver which replaces the old
39         "output" progress gatherer
40         (LoggingBuildStep.__init__): same
41         (LoggingBuildStep.startCommand): set up the "stdio" LogFile
42         (LoggingBuildStep._commandComplete): must use logs['stdio']
43         instead of the old single ".log" attribute.
44         * buildbot/status/builder.py (LogFile): remove old logProgressTo
45         functionality, now subsumed into StdioProgressObserver
46         * buildbot/test/test_status.py (Subscription._testSlave_2): the
47         log name changed from "output" to "stdio".
50         * buildbot/interfaces.py (ILogFile): add the Interface used from
51         the BuildStep towards the LogFile
52         (ILogObserver): and the one provided by a LogObserver
53         * buildbot/status/builder.py (LogFile): implement it
55         * buildbot/interfaces.py (LOG_CHANNEL_*): move STDOUT / STDERR /
56         HEADER constants here ..
57         * buildbot/status/builder.py (STDOUT): .. from here
59 2006-06-13  Brian Warner  <warner@lothar.com>
61         * buildbot/test/test_p4poller.py (TestP4Poller.failUnlessIn): fix
62         compatibility with python2.2, which doesn't have the 'substr in
63         str' feature.
64         (TestP4Poller.makeTime): utility function to construct the
65         timestamp using the same strptime() approach as p4poller does. It
66         turns out that time.mktime() behaves slightly differently under
67         python2.2, probably something to do with the DST flag, and that
68         causes the test to fail under python2.2. (changing the mktime()
69         arguments to have dst=0 instead of -1 caused it to fail under
70         python2.3. Go figure.)
71         (TestP4Poller._testCheck3): use our makeTime() instead of mktime()
73 2006-06-12  Brian Warner  <warner@lothar.com>
75         * buildbot/process/step.py (P4): merge in patch SF#1473939, adding
76         proper Perforce (P4) support. Many many thanks to Scott Lamb for
77         contributing such an excellent patch, including docs and unit
78         tests! This makes it *so* much easier to apply. I had to update
79         test_vc.py to handle some recent refactorings, but everything else
80         applied smoothly. The only remaining thing I'd like to fix would
81         be to remove the hard-wired port 1666 used by p4d, and allow it to
82         claim any unused port. This would allow two copies of the test
83         suite to run on the same host at the same time, as well as
84         allowing the test suite to run while a real (production) p4d was
85         running on the same host. Oh, and maybe we should add a warning to
86         step.P4 that gets emitted if the slave is too old to provide the
87         'p4' SlaveCommand. Otherwise it looks great. (closes: SF#1473939).
88         * buildbot/slave/commands.py (P4): same
89         (P4Sync): same, some minor updates
90         * buildbot/changes/p4poller.py: same
91         * docs/buildbot.texinfo: same
92         * buildbot/test/test_p4poller.py: same
93         * buildbot/test/test_vc.py (P4): same
95         * setup.py: add Trove classifiers for PyPI
97 2006-06-08  Brian Warner  <warner@allmydata.com>
99         * buildbot/status/client.py
100         (RemoteBuilder.remote_getCurrentBuilds): oops, I screwed up when
101         changing this from getCurrentBuild() to getCurrentBuilds(). Each
102         build needs to be IRemote'd separately, rather than IRemote'ing
103         the whole list at once. I can't wait until newpb's serialization
104         adapters make this unnecessary.
106 2006-06-06  Brian Warner  <warner@lothar.com>
108         * buildbot/process/step.py (WithProperties): make this inherit
109         from ComparableMixin, so that reloading an unchanged config file
110         doesn't cause us to spuriously reload any Builders which use them.
111         * buildbot/test/test_config.py (ConfigTest.testWithProperties):
112         add a test for it
114 2006-06-03  Brian Warner  <warner@lothar.com>
116         * contrib/windows/{setup.py, buildbot_service.py}: add support for
117         running py2exe on windows, contributed by Mark Hammond. Addresses
118         SF#1401121, but I think we still need to include
119         buildbot/scripts/sample.cfg
120         * setup.py: include buildbot_service.py as a script under windows
121         * buildbot/status/html.py: when sys.frozen (i.e. we're running in
122         a py2exe application), get the icon/css datafiles from a different
123         place than usual.
125         * buildbot/status/mail.py (MailNotifier.buildMessage): don't
126         double-escape the build URL. Thanks to Olivier Bonnet for the
127         patch. Fixes SF#1452801.
129 2006-06-02  Brian Warner  <warner@lothar.com>
131         * contrib/svn_buildbot.py (ChangeSender.getChanges): ignore the
132         first six columns of 'svnlook' output, not just the first column,
133         since property changes appear in the other five. Thanks to Olivier
134         Bonnet for the patch. Fixes SF#1398174.
136 2006-06-01  Brian Warner  <warner@lothar.com>
138         * buildbot/test/test_web.py (Logfile.setUp): set the .reason on
139         the fake build, so that title= has something to be set to
141         * buildbot/status/html.py (BuildBox.getBox): set the 'title='
142         attribute of the "Build #NN" link in the yellow start-the-build
143         box to the build's reason. This means that you get a little
144         tooltip explaining why the build was done when you hover over the
145         yellow box. Thanks to Zandr Milewski for the suggestion.
147         * buildbot/clients/gtkPanes.py (Box.setColor): ignore color=None
148         (Box.setETA): handle ETA=None (by stopping the timer)
149         (Box.update): make the [soon] text less different than the usual
150         text, so the rest of the text doesn't flop around so much. It
151         would be awfully nice to figure out how to center this stuff.
152         (ThreeRowBuilder.stepETAUpdate): more debugging printouts
154         * buildbot/process/step.py (ShellCommand): set flunkOnFailure=True
155         by default, so that any ShellCommand which fails marks the overall
156         build as a failure. I should have done this from the beginning.
157         Add flunkOnFailure=False to the arguments if you want to turn off
158         this behavior.
160 2006-05-30  Brian Warner  <warner@lothar.com>
162         * buildbot/clients/gtkPanes.py: add a third row: now it shows
163         last-build/current-build/current-step. Show what step is currently
164         running. Show ETA for both the overall build and the current step.
165         Update GTK calls to modern non-deprecated forms. There's still a
166         lot of dead code and debug noise to remove.
168         * buildbot/process/step_twisted.py (Trial): set the step name, so it
169         shows up properly in status displays
171 2006-05-28  Brian Warner  <warner@lothar.com>
173         * buildbot/test/test_properties.py (Run.testInterpolate): on the
174         build we use to verify that WithProperties works:
176         ** set flunkOnFailure=True so that build failures get noticed
177         ** set workdir='.' so that the build succeeds, otherwise it is trying
178             to touch 'build/something', and 'build/' doesn't exist because
179             usually that's created by a Source step
180         ** set timeout=10, because Twisted-1.3.0 has a race condition that
181             this test somehow triggers, in which the 'touch' process becomes
182             a zombie and we wait for th etimeout before giving up on it.
184         * buildbot/test/runutils.py (RunMixin.logBuildResults): utility method
185         to log the Build results and step logs to the twisted log.
186         (RunMixin.failUnlessBuildSucceeded): use logBuildResults to record
187         what went wrong if a build was expected to succeed but didn't.
189         * buildbot/process/step_twisted.py (Trial): set the default
190         trialMode to '--reporter=bwverbose', which specifies verbose
191         black-and-white text. Back in twisted-1.3/2.0 days we had to use
192         '-to', but those are completely missing in modern Twisteds.
194         * buildbot/scripts/sample.cfg: make the sample Manhole config use
195         a localhost-only port, to encourage better security
197         * docs/buildbot.texinfo (Change Sources): mention
198         darcs_buildbot.py
200         * .darcs-boring: add a Darcs boringfile
202         * README (REQUIREMENTS): stop claiming compatibility with
203         Twisted-1.3.0
205         * contrib/darcs_buildbot.py: write a darcs-commit-hook change
206         sender
208 2006-05-27  Brian Warner  <warner@lothar.com>
210         * buildbot/__init__.py: bump to 0.7.3+ while between releases
211         * docs/buildbot.texinfo: same
213 2006-05-23  Brian Warner  <warner@lothar.com>
215         * buildbot/__init__.py (version): Releasing buildbot-0.7.3
216         * docs/buildbot.texinfo: set version to match
217         * NEWS: update for 0.7.3
219         * docs/buildbot.texinfo (Change Sources): mention hg_buildbot.py,
220         give a quick mapping from VC system to possible ChangeSources
221         (Build Properties): add 'buildername'
223         * buildbot/process/base.py (Build.setupStatus): oops, set
224         'buildername' and 'buildnumber' properties
225         * buildbot/test/test_properties.py (Interpolate.testBuildNumber):
226         test them
228 2006-05-22  Brian Warner  <warner@lothar.com>
230         * docs/buildbot.texinfo (Build Properties): explain the syntax of
231         property interpolation better
233         * README (INSTALLATION): remove old '-v' argument from recommended
234         trial command line
236         * docs/buildbot.texinfo (ShellCommand): add docs for description=
237         and descriptionDone= arguments. Thanks to Niklaus Giger for the
238         patch. SF#1475494.
240         * buildbot/slave/commands.py (SVN.parseGotRevision._parse): use
241         'svnversion' instead of grepping the output of 'svn info', much
242         simpler and avoids CR/LF problems on windows. Thanks to Olivier
243         Bonnet for the suggestion.
244         (SVN.parseGotRevision): oops, older verisons of 'svnversion'
245         require the WC_PATH argument, so run 'svnversion .' instead.
247         * buildbot/interfaces.py (IChangeSource): methods in Interfaces
248         aren't supposed to have 'self' in their argument list
250 2006-05-21  Brian Warner  <warner@lothar.com>
252         * buildbot/process/step.py (ShellCommand.start): make
253         testInterpolate pass. I was passing the uninterpolated command to
254         the RemoteShellCommand constructor
255         (ShellCommand._interpolateProperties): oops, handle non-list
256         commands (i.e. strings with multiple words separated by spaces in
257         them) properly, instead of forgetting about them.
259         * buildbot/test/test_properties.py (Run.testInterpolate): new test
260         to actually try to use build properties in a real build. This test
261         fails.
262         * buildbot/test/runutils.py (RunMixin.requestBuild): utility methods
263         to start and evaluate builds
265         * buildbot/test/test__versions.py: add a pseudo-test to record
266         what version of Twisted/Python/Buildbot are running. This should
267         show up at the beginning of _trial_tmp/test.log, and exists to help
268         debug other problems.
270         * buildbot/status/html.py (Waterfall): add 'robots_txt=' argument,
271         a filename to be served as 'robots.txt' to discourage web spiders.
272         Adapted from a patch by Tobi Vollebregt, thanks!
273         * buildbot/test/test_web.py (Waterfall._test_waterfall_5): test it
274         (Waterfall.test_waterfall): tweak the way that filenames are put
275         into the config file, to accomodate windows pathnames better.
277         * docs/buildbot.texinfo (HTML Waterfall): document it
279         * buildbot/process/process_twisted.py
280         (QuickTwistedBuildFactory.__init__): recent versions of Twisted
281         changed the build process. The new setup.py no longer takes the
282         'all' argument.
283         (FullTwistedBuildFactory.__init__): same
284         (TwistedReactorsBuildFactory.__init__): same
286         * contrib/hg_buildbot.py: wrote a commit script for mercurial, to
287         be placed in the [hooks] section of the central repository (the
288         one that everybody pushes changes to).
290 2006-05-20  Brian Warner  <warner@lothar.com>
292         * buildbot/slave/commands.py (Darcs.doVCFull): when writing the
293         .darcs-context file, use binary mode. I think this was causing a
294         Darcs failure under windows.
296 2006-05-19  Brian Warner  <warner@lothar.com>
298         * buildbot/scripts/tryclient.py (CVSExtractor.getBaseRevision):
299         use a timezone string of +0000 and gmtime, since this timestamp is
300         sent to a buildmaster and %z is broken.
302         * buildbot/test/test_vc.py (CVSHelper.getdate): use no timezone
303         string and localtime, since this timestamp will only be consumed
304         locally, and %z is broken.
306         * buildbot/slave/commands.py (CVS.parseGotRevision): use +0000 and
307         gmtime, since this timestamp is returned to the buildmaster, and
308         %z is broken.
310 2006-05-18  Brian Warner  <warner@lothar.com>
312         * NEWS: update in preparation for next release
314         * buildbot/test/test_vc.py (VCS_Helper): factor out all the
315         setup-repository and do-we-have-the-vc-tools code into a separate
316         "helper" class, which sticks around in a single module-level
317         object. This seems more likely to continue to work in the future
318         than having it hide in the TestCase and hope that TestCases stick
319         around for a long time.
321         * buildbot/test/test_vc.py (MercurialSupport.vc_create): 'hg
322         addremove' has been deprecated in recent versions of mercurial, so
323         use 'hg add' instead
325 2006-05-07  Brian Warner  <warner@lothar.com>
327         * buildbot/scheduler.py (Try_Jobdir.messageReceived): when
328         operating under windows, move the file before opening it, since
329         you can't rename a file that somebody has open.
331         * buildbot/process/base.py (Build.setupBuild): if something goes
332         wrong while creating a Step, log the name and arguments, since the
333         error message when you get the number of arguments wrong is really
334         opaque.
336 2006-05-06  Brian Warner  <warner@lothar.com>
338         * buildbot/process/step_twisted.py (Trial.setupEnvironment): more
339         bugs in twisted-specific code not covered by my unit tests, this
340         time use 'cmd' argument instead of self.cmd
342         * buildbot/process/process_twisted.py (TwistedBuild.isFileImportant):
343         fix stupid braino: either use startwith or find()==0, not both.
344         (TwistedReactorsBuildFactory.__init__): another dumb typo
346         * buildbot/test/test_slavecommand.py (ShellBase.testInterrupt1): 
347         mark this test as TODO under windows, since process-killing seems
348         dodgy there. We'll come back to this later and try to fix it
349         properly.
351         * buildbot/test/test_vc.py (CVSSupport.getdate): use localtime,
352         and don't include a timezone
353         (CVSSupport.vc_try_checkout): stop trying to strip the timezone.
354         This should avoid the windows-with-verbose-timezone-name problem
355         altogether.
356         (Patch.testPatch): add a test which runs 'patch' with less
357         overhead than the full VCBase.do_patch sequence, to try to isolate
358         a windows test failure. This one uses slave.commands.ShellCommand
359         and 'patch', but none of the VC code.
361         * buildbot/slave/commands.py (getCommand): use which() to find the
362         executables for 'cvs', 'svn', etc. This ought to help under
363         windows.
365         * buildbot/test/test_vc.py (VCBase.do_getpatch): Delete the
366         working directory before starting. If an earlier test failed, the
367         leftover directory would mistakenly flunk a later test.
368         (ArchCommon.registerRepository): fix some tla-vs-baz problems.
369         Make sure that we use the right commandlines if which("tla") picks
370         up "tla.exe" (as it does under windows).
371         (TlaSupport.do_get): factor out this tla-vs-baz difference
372         (TlaSupport.vc_create): more tla-vs-baz differences
374         * buildbot/test/test_slavecommand.py
375         (ShellBase.testShellMissingCommand): stop trying to assert
376         anything about the error message: different shells on different
377         OSes with different languages makes it hard, and it really isn't
378         that interesting of a thing to test anyway.
380         * buildbot/test/test_vc.py (CVSSupport.capable): skip CVS tests if
381         we detect cvs-1.10 (which is the version shipped with OS-X 10.3
382         "Panther"), because it has a bug which flunks a couple tests in
383         weird ways. I've checked that cvs-1.12.9 (as shipped with debian)
384         is ok. OS-X 10.4 "Tiger" ships with cvs-1.11, but I haven't been
385         able to test that yet.
387 2006-04-30  Brian Warner  <warner@lothar.com>
389         * buildbot/test/test_vc.py (VCBase.runCommand): set $LC_ALL="C" to
390         make sure child commands emit messages in english, so our regexps
391         will match. Thanks to Nikaus Giger for identifying the problems.
392         (VCBase._do_vctest_export_1): mode="export" is not responsible
393         for setting the "got_revision" property, since in many cases it is
394         not convenient to determine.
395         (SVNSupport.capable): when running 'svn --version' to check for
396         ra_local, we want error messages in english
397         * buildbot/test/test_slavecommand.py 
398         (ShellBase.testShellMissingCommand): set $LC_ALL="C" to get bash
399         to emit the error message in english
401         * buildbot/slave/commands.py (SourceBase.setup): stash a copy of
402         the environment with $LC_ALL="C" so that Commands which need to
403         parse the output of their child processes can obtain it in
404         english.
405         (SVN.parseGotRevision): call "svn info" afterwards instead of
406         watching the output of the "svn update" or "svn checkout".
407         (Darcs.parseGotRevision): use $LC_ALL="C" when running the command
408         (Arch.parseGotRevision): same
409         (Bazaar.parseGotRevision): same
410         (Mercurial.parseGotRevision): same
412         * buildbot/scripts/tryclient.py (SourceStampExtractor.dovc): set
413         $LC_ALL="C" when running commands under 'buildbot try', too
415         * buildbot/test/__init__.py: remove the global os.environ()
416         setting, instead we do it just for the tests that run commands and
417         need to parse their output.
419         * buildbot/test/test_scheduler.py (Scheduling.testTryJobdir):
420         remove the overly-short .timeout on this test, because non-DNotify
421         platforms must fall back to polling which happens at 10 second
422         intervals, so a 5 second timeout would never succeed.
424 2006-04-24  Brian Warner  <warner@lothar.com>
426         * docs/buildbot.texinfo (Installing the code): update trial
427         invocation, SF#1469116 by Niklaus Giger.
428         (Attributes of Changes): updated branch-name examples to be
429         a bit more realistic, SF#1475240 by Stephen Davis.
431         * contrib/windows/buildbot2.bat: utility wrapper for windows
432         developers, contributed by Nick Trout (after a year of neglect..
433         sorry!). SF#1194231.
435         * buildbot/test/test_vc.py (*.capable): store the actual VC
436         binary's pathname in VCS[vcname], so it can be retrieved later
437         (CVSSupport.vc_try_checkout): incorporate Niklaus Giger's patch to
438         strip out non-numeric timezone information, specifically the funky
439         German string that his system produced that confuses CVS.
440         (DarcsSupport.vc_create): use dovc() instead of vc(), this should
441         allow Darcs tests to work on windows
442         * buildbot/scripts/tryclient.py (SourceStampExtractor): use
443         procutils.which() everywhere, to allow tryclient to work under
444         windows. Also from Niklaus Giger, SF#1463394.
446         * buildbot/twcompat.py (which): move the replacement for a missing
447         twisted.python.procutils.which from test_vc.py to here, so it can
448         be used in other places too (specifically tryclient.py)
450 2006-04-23  Brian Warner  <warner@lothar.com>
452         * buildbot/status/html.py (StatusResourceBuild.body): replace the
453         bare buildbotURL/projectName line with a proper DIV, along with a
454         CSS class of "title", from Stefan Seefeld (SF#1461675).
455         (WaterfallStatusResource.body0): remove the redundant 'table'
456         class from the table
457         (WaterfallStatusResource.body): same. Also add class="LastBuild"
458         to the top-row TR, and class="Activity" to the second-row TR,
459         rather than putting them in the individual TD nodes.
461         * buildbot/test/test_vc.py (VCBase.checkGotRevision): test
462         'got_revision' build property for all VC systems that implement
463         accurate ones: SVN, Darcs, Arch, Bazaar, Mercurial.
465         * buildbot/slave/commands.py (SourceBase._handleGotRevision): try
466         to determine which revision we actually obtained
467         (CVS.parseGotRevision): implement this for CVS, which just means
468         to grab a timestamp. Not ideal, and it depends upon the buildslave
469         having a clock that is reasonably well syncronized with the server,
470         but it's better than nothing.
471         (SVN.parseGotRevision): implement it for SVN, which is accurate
472         (Darcs.parseGotRevision): same
473         (Arch.parseGotRevision): same
474         (Bazaar.parseGotRevision): same
475         (Mercurial.parseGotRevision): same
477         * buildbot/process/step.py (LoggedRemoteCommand.remoteUpdate):
478         keep a record of all non-stdout/stderr/header/rc status updates,
479         for the benefit of RemoteCommands that send other useful things,
480         like got_revision
481         (Source.commandComplete): put any 'got_revision' status values
482         into a build property of the same name
485         * buildbot/process/step_twisted.py (Trial): update to deal with
486         new ShellCommand refactoring
488         * docs/buildbot.texinfo (Build Properties): document new feature
489         that allows BuildSteps to get/set Build-wide properties like which
490         revision was requested and/or checked out.
492         * buildbot/interfaces.py (IBuildStatus.getProperty): new method
493         * buildbot/status/builder.py (BuildStatus.getProperty): implement
494         it. Note that this bumps the persistenceVersion of the saved Build
495         object, so add the necessary upgrade-old-version logic to include
496         an empty properties dict.
498         * buildbot/process/base.py (Build.setProperty): implement it
499         (Build.getProperty): same
500         (Build.startBuild): change build startup to set 'branch',
501         'revision', and 'slavename' properties at the right time
503         * buildbot/process/step.py (BuildStep.__init__): change setup to
504         require 'build' argument in a better way
505         (LoggingBuildStep): split ShellCommand into two pieces, for better
506         subclassing elsewhere. LoggingBuildStep is a BuildStep which runs
507         a single RemoteCommand that sends stdout/stderr status text. It
508         also provides the usual commandComplete / createSummary /
509         evaluateCommand / getText methods to be overridden...
510         (ShellCommand): .. whereas ShellCommand is specifically for
511         running RemoteShellCommands. Other shell-like BuildSteps (like
512         Source) can inherit from LoggingBuildStep instead of ShellCommand
513         (WithProperties): marker class to do build-property interpolation
514         (Source): inherit from LoggingBuildStep instead of ShellCommand
515         (RemoteDummy): same
517         * buildbot/test/test_properties.py: test new functionality
519 2006-04-21  Brian Warner  <warner@lothar.com>
521         * buildbot/test/test_vc.py: rename testBranch to
522         testCheckoutBranch to keep the tests in about the right
523         alphabetical order
525 2006-04-18  Brian Warner  <warner@lothar.com>
527         * docs/buildbot.texinfo (PBListener): improve cross-references
528         between PBListener and 'buildbot statusgui', thanks to John Pye
529         for the suggestion.
531 2006-04-17  Brian Warner  <warner@lothar.com>
533         * buildbot/twcompat.py (maybeWait): handle SkipTest properly when
534         running under Twisted-1.3.0, otherwise skipped tests are reported
535         as errors.
537         * all: use isinstance() instead of 'type(x) is foo', suggested by
538         Neal Norwitz
540         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
541         oops, fix a brain-fade from the other week, when making the
542         addStep changes. I changed all the __init__ upcalls to use the
543         wrong superclass name.
544         (FullTwistedBuildFactory.__init__): same
545         (TwistedDebsBuildFactory.__init__): same
546         (TwistedReactorsBuildFactory.__init__): same
547         (TwistedBuild.isFileImportant): use .startswith for clarity,
548         thanks to Neal Norwitz for the suggestions.
550         * contrib/viewcvspoll.py: script to poll a viewcvs database for
551         changes, then deliver them over PB to a remote buildmaster.
553         * contrib/svnpoller.py: added script by John Pye to poll a remote
554         SVN repository (by running 'svn log') from a cronjob, and run
555         'buildbot sendchange' to deliver the changes to a remote
556         buildmaster.
557         * contrib/svn_watcher.py: added script by Niklaus Giger (a
558         modification of svnpoller.py), same purpose, but this one loops
559         internally (rather than expecting to run from a cronjob) and works
560         under windows.
561         * contrib/README.txt: same
563 2006-04-11  Brian Warner  <warner@lothar.com>
565         * all: fix a number of incorrect names and missing imports, thanks
566         to Anthony Baxter for the patch.
567         * buildbot/status/html.py (WaterfallStatusResource.statusToHTML): 
568         remove unused buggy method.
569         * buildbot/status/builder.py (BuildStatus.saveYourself): rmtree
570         comes from shutil, not "shutils"
571         * buildbot/process/step.py (TreeSize.evaluateCommand): fix bad name
572         (Arch.checkSlaveVersion): same
573         * buildbot/process/step_twisted.py (Trial.commandComplete): same, in
574         some disabled code
575         * buildbot/process/step_twisted2.py: add some missing imports
576         * buildbot/twcompat.py (_deferGenerator): fix cut-and-paste error,
577         this code used to live in twisted.internet.defer
579 2006-04-10  Brian Warner  <warner@lothar.com>
581         * buildbot/process/step.py (Mercurial): add Mercurial support
582         * buildbot/slave/commands.py (Mercurial): same
583         * buildbot/scripts/tryclient.py (MercurialExtractor): same
584         * buildbot/test/test_vc.py (Mercurial): same, checkout over HTTP is
585         not yet tested, but 'try' support *is* covered
586         * docs/buildbot.texinfo (Mercurial): document it
588         * buildbot/process/step.py (LoggedRemoteCommand.remoteUpdate): add
589         some debugging messages (turned off)
590         * buildbot/test/test_vc.py: improve debug messages
592 2006-04-07  Brian Warner  <warner@lothar.com>
594         * buildbot/test/test_vc.py (which): define our own which() in case
595         we can't import twisted.python.procutils, because procutils doesn't
596         exist in Twisted-1.3
598         * docs/buildbot.texinfo (Interlocks): fix some typos, mention use
599         of SlaveLocks for performance tests
601         * docs/examples/twisted_master.cfg: update to match current usage
603         * buildbot/changes/p4poller.py (P4Source): add new arguments:
604         password, p4 binary, pollinterval, maximum history to check.
605         Patch from an anonymous sf.net contributor, SF#1219384.
606         * buildbot/process/step.py (P4Sync.__init__): add username,
607         password, and client arguments.
608         * buildbot/slave/commands.py (P4Sync): same
610 2006-04-05  Brian Warner  <warner@lothar.com>
612         * buildbot/process/factory.py (BuildFactory.addStep): new method
613         to add steps to a BuildFactory. Use it instead of f.steps.append,
614         and you can probably avoid using the s() convenience function.
615         Patch from Neal Norwitz, sf.net #1412605.
616         (other): update all factories to use addStep
617         * buildbot/process/process_twisted.py: update all factories to use
618         addStep.
620 2006-04-03  Brian Warner  <warner@lothar.com>
622         * buildbot/test/test_vc.py: modified find-the-VC-command logic to
623         work under windows too. Adapted from a patch by Niklaus Giger,
624         addresses SF#1463399.
626         * buildbot/test/__init__.py: set $LANG to 'C', to insure that
627         spawned commands emit parseable results in english and not some
628         other language. Patch from Niklaus Giger, SF#1463395.
630         * README (INSTALLATION): discourage users from running unit tests on
631         a "network drive", patch from Niklaus Giger, SF#1463394.
633 2006-03-22  Brian Warner  <warner@lothar.com>
635         * contrib/svn_buildbot.py: rearrange, add an easy-to-change
636         function to turn a repository-relative pathname into a (branch,
637         branch-relative-filename) tuple. Change this function to handle
638         the branch naming policy used by your Subversion repository.
639         Thanks to AllMyData.com for sponsoring this work.
641 2006-03-16  Brian Warner  <warner@lothar.com>
643         * buildbot/scripts/sample.cfg: add python-mode declaration for
644         vim. Thanks to John Pye for the patch.
646         * docs/buildbot.texinfo (Launching the daemons): fix @reboot job
647         command line, mention the importance of running 'crontab' as the
648         buildmaster/buildslave user. Thanks to John Pye for the catch.
650 2006-03-13  Brian Warner  <warner@lothar.com>
652         * buildbot/status/words.py (IRC): add an optional password=
653         argument, which will be sent to Nickserv in an IDENTIFY message at
654         login, to claim the nickname. freenode requires this before the
655         bot can sent (or reply to) private messages. Thanks to Clement
656         Stenac for the patch.
657         * docs/buildbot.texinfo (IRC Bot): document it
659         * buildbot/status/builder.py (LogFile.merge): don't write chunks
660         larger than chunkSize. Fixes SF#1349253.
661         * buildbot/test/test_status.py (Log.testLargeSummary): test it
662         (Log.testConsumer): update to match new internal chunking behavior
664 2006-03-12  Brian Warner  <warner@lothar.com>
666         * buildbot/test/test_vc.py: remove the last use of waitForDeferred
668         * buildbot/test/test_maildir.py (MaildirTest): rename the
669         'timeout' method, as it collides with trial's internals
671         * buildbot/scripts/runner.py: add 'buildbot restart' command
672         (stop): don't sys.exit() out of here, otherwise restart can't work
673         * docs/buildbot.texinfo (Shutdown): document it
675         * buildbot/buildset.py (BuildSet.__init__): clean up docstring
676         * buildbot/status/html.py (Waterfall.__init__): same
677         * buildbot/process/builder.py (Builder.startBuild): same
678         * buildbot/process/base.py (BuildRequest): same
679         * buildbot/sourcestamp.py (SourceStamp): same
680         * buildbot/scheduler.py (Nightly): same
682         * buildbot/__init__.py (version): bump to 0.7.2+ while between
683         releases
684         * docs/buildbot.texinfo: same
686 2006-02-17  Brian Warner  <warner@lothar.com>
688         * buildbot/__init__.py (version): Releasing buildbot-0.7.2
689         * docs/buildbot.texinfo: set version number to match
690         * NEWS: update for 0.7.2
692 2006-02-16  Brian Warner  <warner@lothar.com>
694         * docs/buildbot.texinfo (Build Dependencies): add cindex tag
696 2006-02-09  Brian Warner  <warner@lothar.com>
698         * docs/buildbot.texinfo (How Different VC Systems Specify Sources):
699         add text to explain per-build branch parameters
700         * NEWS: mention --umask
702 2006-02-08  Brian Warner  <warner@lothar.com>
704         * buildbot/scripts/runner.py (Maker.makeSlaveTAC): remove unused
705         method
706         (SlaveOptions.optParameters): add --umask, to make it possible to
707         make buildslave-generated files (including build products) be
708         world-readable
709         (slaveTAC): same
710         * buildbot/slave/bot.py (BuildSlave.startService): same
712 2006-01-23  Brian Warner  <warner@lothar.com>
714         * buildbot/status/builder.py: urllib.quote() all URLs that include
715         Builder names, so that builders can include characters like '/'
716         and ' ' without completely breaking the resulting HTML. Thanks to
717         Kevin Turner for the patch.
718         * buildbot/status/html.py: same
719         * buildbot/test/test_web.py (GetURL.testBuild): match changes
721         * NEWS: update in preparation for upcoming release
723 2006-01-18  Brian Warner  <warner@lothar.com>
725         * docs/examples/twisted_master.cfg: update to match the Twisted
726         buildbot: remove python2.2, switch to exarkun's buildslaves,
727         disable the .deb builder until we figure out how to build twisted
728         .debs from SVN, add some ktrace debugging to the OS-X build
729         process and remove the qt build, remove threadless builders,
730         change freebsd builder to use landonf's buildslave.
732 2006-01-12  Brian Warner  <warner@lothar.com>
734         * buildbot/master.py (Manhole.__init__): let port= be a strports
735         specification string, but handle a regular int for backwards
736         compatibility. This allows "tcp:12345:interface=127.0.0.1" to be
737         used in master.cfg to limit connections to just the local host.
738         (BuildMaster.loadConfig): same for c['slavePortnum']
739         * buildbot/scheduler.py (Try_Userpass.__init__): same
740         * buildbot/status/client.py (PBListener.__init__): same
741         * buildbot/status/html.py (Waterfall.__init__): same, for both
742         http_port and distrib_port. Include backwards-compatibility checks
743         so distrib_port can be a filename string and still mean unix:/foo
744         * docs/buildbot.texinfo (Setting the slaveport): document it
745         (Debug options): same
746         (HTML Waterfall): same
747         (PBListener): same
748         (try): same
749         * buildbot/test/test_config.py (ConfigTest): test it
751         * buildbot/master.py (BuildMaster.loadConfig): wait for the
752         slaveport's disownServiceParent deferred to fire before opening
753         the new one. Fixes an annoying bug in the unit tests.
755 2006-01-03  Brian Warner  <warner@lothar.com>
757         * buildbot/master.py (BuildMaster): remove the .schedulers
758         attribute, replacing it with an allSchedulers() method that looks
759         for all IService children that implement IScheduler. Having only
760         one parent/child relationship means fewer opportunities for bugs.
761         (BuildMaster.allSchedulers): new method
762         (BuildMaster.loadConfig_Schedulers): update to use allSchedulers,
763         also fix ugly bug that caused any config-file reload to
764         half-forget about the earlier Schedulers, causing an exception
765         when a Change arrived and was handed to a half-connected
766         Scheduler. The exception was in scheduler.py line 54ish:
767           self.parent.submitBuildSet(bs)
768           exceptions.AttributeError: 'NoneType' object has no attribute
769           'submitBuildSet'
770         (BuildMaster.addChange): update to use allSchedulers()
772         * buildbot/scheduler.py (BaseScheduler.__implements__): fix this
773         to work properly with twisted-1.3.0, where you must explicitly
774         include the __implements__ from parent classes
775         (BaseScheduler.__repr__): make it easier to distinguish distinct
776         instances
777         (BaseUpstreamScheduler.__implements__): same
779         * buildbot/status/builder.py (Status.getSchedulers): update to
780         use allSchedulers()
781         * buildbot/test/test_run.py (Run.testMaster): same
782         * buildbot/test/test_dependencies.py (Dependencies.findScheduler): same
783         * buildbot/test/test_config.py (ConfigTest.testSchedulers): same,
784         make sure Scheduler instances are left alone when an identical
785         config file is reloaded
786         (ConfigElements.testSchedulers): make sure Schedulers are properly
787         comparable
789         * Makefile (TRIALARGS): my local default Twisted version is now
790         2.1.0, update the trial arguments accordingly
792 2005-12-22  Brian Warner  <warner@lothar.com>
794         * docs/examples/twisted_master.cfg: merge changes from pyr: add
795         new win32 builders
797         * buildbot/scheduler.py (BaseScheduler.addChange): include a dummy
798         addChange in the parent class, although I suspect this should be
799         fixed better in the future.
801 2005-11-26  Brian Warner  <warner@lothar.com>
803         * buildbot/scheduler.py (AnyBranchScheduler.addChange): don't
804         explode when branch==None, thanks to Kevin Turner for the catch
805         * buildbot/test/test_scheduler.py (Scheduling.testAnyBranch): test
806         it
808         * buildbot/__init__.py (version): bump to 0.7.1+ while between
809         releases
810         * docs/buildbot.texinfo: same
812 2005-11-26  Brian Warner  <warner@lothar.com>
814         * buildbot/__init__.py (version): Releasing buildbot-0.7.1
815         * docs/buildbot.texinfo: set version number to match
817 2005-11-26  Brian Warner  <warner@lothar.com>
819         * NEWS: update for 0.7.1
821         * buildbot/status/builder.py (BuildStepStatus.unsubscribe): make
822         sure that unsubscribe works even if we never sent an ETA update.
823         Also, don't explode on duplicate unsubscribe.
824         (BuildStepStatus.addLog): make the convenience "return self"-added
825         watcher automatically unsubscribe when the Step finishes.
826         (BuildStatus.unsubscribe): same handle-duplicate-unsubscribe
827         (BuildStatus.stepStarted): same auto-unsubscribe
828         (BuilderStatus.buildStarted): same auto-unsubscribe
830         * buildbot/interfaces.py (IStatusReceiver.buildStarted): document
831         auto-unsubscribe
832         (IStatusReceiver.stepStarted): same
833         (IStatusReceiver.logStarted): same
835         * buildbot/test/test_run.py (Status): move the Status test..
836         * buildbot/test/test_status.py (Subscription): .. to here
838 2005-11-25  Brian Warner  <warner@lothar.com>
840         * NEWS: more updates
842         * buildbot/locks.py: fix the problem in which loading a master.cfg
843         file that changes some Builders (but not all of them) can result
844         in having multiple copies of the same Lock. Now, the real Locks
845         are kept in a table inside the BotMaster, and the Builders/Steps
846         use "LockIDs", which are still instances of MasterLock and
847         SlaveLock. The real Locks are instances of the new RealMasterLock
848         and RealSlaveLock classes.
849         * buildbot/master.py (BotMaster.getLockByID): new method to
850         convert LockIDs into real Locks.
851         * buildbot/process/base.py (Build.startBuild): convert LockIDs
852         into real Locks before building
853         * buildbot/process/step.py (BuildStep.startStep): same
854         * buildbot/test/test_locks.py (Locks.testLock1a): add a test which
855         exercises the problem
858         * docs/buildbot.texinfo (Scheduler Types): give a few hints about
859         what Schedulers are available
861         * buildbot/scheduler.py (Nightly): add new Scheduler based upon
862         work by Dobes Vandermeer and hacked mercilessly by me. This offers
863         'cron'-style build scheduling at certain times of day, week,
864         month, or year.
865         * buildbot/test/test_scheduler.py (Scheduling.testNightly): test it
867         * buildbot/scheduler.py (Scheduler): change fileIsImportant
868         handling: treat self.fileIsImportant more as an attribute that
869         contains a callable than as a method. If the attribute is None,
870         don't call it and assume all filenames are important. It is still
871         possible to provide a fileIsImportant method in a subclass,
872         however.
873         (AnyBranchScheduler): handle fileIsImportant=None, previously it
874         was broken
875         * buildbot/test/test_scheduler.py (Scheduling.testAnyBranch2):
876         test using AnyBranchScheduler with fileIsImportant=None
878 2005-11-24  Brian Warner  <warner@lothar.com>
880         * buildbot/test/test_config.py (StartService): don't claim a fixed
881         port number, instead set slavePort=0 on the first pass, figure out
882         what port was allocated, then switch to a config file that uses
883         the allocated port.
885         * buildbot/master.py (BuildMaster.loadConfig): close the old
886         slaveport before opening the new one, because unit tests might
887         replace slavePort=0 with the same allocated portnumber, and if we
888         don't wait for the old port to close first, we get a "port already
889         in use" error. There is a tiny race condition here, but the only
890         threat is from other programs that bind (statically) to the same
891         port number we happened to be allocated, and only if those
892         programs use SO_REUSEADDR, and only if they get control in between
893         reactor turns.
895         * Makefile (TRIALARGS): update to handle Twisted > 2.1.0
897         * buildbot/master.py (BuildMaster.loadConfig_Sources): remove all
898         deleted ChangeSources before adding any new ones
899         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): fix
900         compare_attrs, to make sure that a config-file reload does not
901         unnecessarily replace an unmodified ChangeSource instance
902         * buildbot/test/test_config.py (ConfigTest.testSources): update
904         * buildbot/scheduler.py (AnyBranchScheduler): fix branches=[] to
905         mean "don't build anything", and add a warning if it gets used
906         because it isn't actually useful.
908         * contrib/svn_buildbot.py: update example usage to match the port
909         number that gets used by the PBChangeSource
910         * buildbot/scripts/sample.cfg: add example of PBChangeSource
912 2005-11-22  Brian Warner  <warner@lothar.com>
914         * NEWS: start collecting items for next release
916         * buildbot/process/step.py (SVN.computeSourceRevision): assume
917         revisions are strings
918         (P4Sync.computeSourceRevision): same
920         * buildbot/status/html.py (StatusResourceBuild.body): add a link
921         to the Buildbot's overall status page
922         (StatusResourceBuilder.body): same
924 2005-11-15  Brian Warner  <warner@lothar.com>
926         * buildbot/master.py (BuildMaster.loadConfig): serialize the
927         config-file loading, specifically to make sure old StatusTargets
928         are finished shutting down before new ones start up (thus
929         resolving a bug in which changing the Waterfall object would fail
930         because both new and old instances were claiming the same
931         listening port). Also load new Schedulers after all the new
932         Builders are set up, in case they fire off a new build right away.
933         * buildbot/test/test_config.py (StartService): test it
935         * buildbot/status/mail.py (MailNotifier.buildMessage): oops, add
936         the branch name to the mail body
938         * buildbot/changes/pb.py (PBChangeSource.compare_attrs): add this.
939         Without it, a config-file reload fails to update an existing
940         PBChangeSource.
941         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): add
942         username/passwd to compare_attrs, for the same reason
943         * buildbot/status/html.py (Waterfall): add favicon to
944         compare_attrs, same reason
946 2005-11-05  Brian Warner  <warner@lothar.com>
948         * buildbot/scripts/tryclient.py (createJobfile): stringify the
949         baserev before stuffing it in the jobfile. This resolves problems
950         under SVN (and probably Arch) where revisions are expressed as
951         numbers. I'm inclined to use string-based revisions everywhere in
952         the future, but this fix should be safe for now. Thanks to Steven
953         Walter for the patch.
955         * buildbot/changes/changes.py (ChangeMaster.saveYourself): use
956         binary mode when opening pickle files, to make windows work
957         better. Thanks to Dobes Vandermeer for the catch.
958         * buildbot/status/builder.py (BuildStatus.saveYourself): same
959         (BuilderStatus.getBuildByNumber): same
960         (Status.builderAdded): same
961         * buildbot/master.py (BuildMaster.loadChanges): same
963         * buildbot/util.py (Swappable): delete unused leftover code
965         * buildbot/process/step.py (SVN): when building on a non-default
966         branch, add the word "[branch]" to the VC step's description, so
967         it is obvious that we're not building the usual stuff. Likewise,
968         when we are building a specific revision, add the text "rNNN" to
969         indicate what that revision number is. Thanks to Brad Hards and
970         Nathaniel Smith for the suggestion.
971         (Darcs.startVC): same
972         (Arch.startVC): same
973         (Bazaar.startVC): same
975         * buildbot/process/factory.py (GNUAutoconf.__init__): fix a silly
976         typo, caught by Mark Dillavou, closes SF#1216636.
978         * buildbot/test/test_status.py (Log.TODO_testDuplicate): add notes
979         about a test to add some day
981         * docs/examples/twisted_master.cfg: update: bot1 can now handle
982         the 'full-2.3' build, and the 'reactors' build is now run under
983         python-2.4 because the buildslave no longer has gtk/etc bindings
984         for earlier versions.
986 2005-11-03  Brian Warner  <warner@lothar.com>
988         * buildbot/interfaces.py (IBuilderControl.resubmitBuild): new
989         method, takes an IBuildStatus and rebuilds it. It might make more
990         sense to add this to IBuildControl instead, but that instance goes
991         away completely once the build has finished, and resubmitting
992         builds can take place weeks later.
993         * buildbot/process/builder.py (BuilderControl.resubmitBuild): same
994         * buildbot/status/html.py (StatusResourceBuild): also stash an
995         IBuilderControl so we can use resubmitBuild.
996         (StatusResourceBuild.body): render "resubmit" button if we can.
997         Also add hrefs for each BuildStep
998         (StatusResourceBuild.rebuild): add action for "resubmit" button
999         (StatusResourceBuilder.getChild): give it an IBuilderControl
1001         * buildbot/status/builder.py (Status.getURLForThing): change the
1002         URL for BuildSteps to have a "step-" prefix, so the magic URLs
1003         that live as targets of buttons like "stop" and "rebuild" can't
1004         collide with them.
1005         * buildbot/status/builder.py (Status.getURLForThing): same
1006         * buildbot/status/html.py (StatusResourceBuild.getChild): same
1007         (StepBox.getBox): same
1008         * buildbot/test/test_web.py (GetURL): same
1009         (Logfile): same
1011         * buildbot/process/step.py (SVN.__init__): put svnurl/baseURL
1012         exclusivity checks after Source.__init__ upcall, so misspelled
1013         arguments will be reported more usefully
1014         (Darcs.__init__): same
1016 2005-10-29  Brian Warner  <warner@lothar.com>
1018         * docs/examples/twisted_master.cfg: don't double-fire the 'quick'
1019         builder. Move the Try scheduler off to a separate port.
1021 2005-10-27  Brian Warner  <warner@lothar.com>
1023         * buildbot/clients/gtkPanes.py
1024         (TwoRowClient.remote_builderRemoved): disappearing Builders used
1025         to cause the app to crash, now they don't.
1027         * buildbot/clients/debug.py: display the buildmaster's location
1028         in the window's title bar
1030 2005-10-26  Brian Warner  <warner@lothar.com>
1032         * buildbot/status/mail.py (MailNotifier): urllib.escape the URLs
1033         in case they have spaces or whatnot. Patch from Dobes Vandermeer.
1034         * buildbot/test/test_status.py (MyStatus.getURLForThing): fix it
1036         * buildbot/status/html.py (td): put a single non-breaking space
1037         inside otherwise empty <td> elements, as a workaround for buggy
1038         browsers which would optimize them away (along with any associated
1039         styles, like the kind that create the waterfall grid borders).
1040         Patch from Frerich Raabe.
1042         * buildbot/process/step_twisted.py (Trial): expose the trialMode=
1043         argv-list as an argument, defaulting to ["-to"], which is
1044         appropriate for the Trial that comes with Twisted-2.1.0 and
1045         earlier. The Trial in current Twisted SVN wants
1046         ["--reporter=bwverbose"] instead. Also expose trialArgs=, which
1047         defaults to an empty list.
1048         * buildbot/process/process_twisted.py (TwistedTrial.trialMode):
1049         match it, now that trialMode= is a list instead of a single string
1051         * buildbot/__init__.py (version): bump to 0.7.0+ while between
1052         releases
1053         * docs/buildbot.texinfo: same
1055 2005-10-24  Brian Warner  <warner@lothar.com>
1057         * buildbot/__init__.py (version): Releasing buildbot-0.7.0
1058         * docs/buildbot.texinfo: set version number to match
1060 2005-10-24  Brian Warner  <warner@lothar.com>
1062         * README: update for 0.7.0
1063         * NEWS: same
1064         * docs/buildbot.texinfo: move the freshcvs stuff out of the README
1066         * buildbot/clients/debug.glade: add 'branch' box to fake-commit
1067         * buildbot/clients/debug.py (DebugWidget.do_commit): same. Don't
1068         send the branch= argument unless the user really provided one, to
1069         retain compatibility with older buildmasters that don't accept
1070         that argument.
1071         * buildbot/master.py (DebugPerspective.perspective_fakeChange):
1072         same
1074         * docs/buildbot.texinfo: update lots of stuff
1076         * buildbot/scripts/runner.py (sendchange): add a --branch argument
1077         to the 'buildbot sendchange' command
1078         * buildbot/clients/sendchange.py (Sender.send): same
1079         * buildbot/changes/pb.py (ChangePerspective): same
1080         * buildbot/test/test_changes.py (Sender.testSender): test it
1082         * buildbot/process/step.py (SVN.__init__): change 'base_url' and
1083         'default_branch' argument names to 'baseURL' and 'defaultBranch',
1084         for consistency with other BuildStep arguments that use camelCase.
1085         Well, at least more of them use camelCase (like flunkOnWarnings)
1086         than don't.. I wish I'd picked one style and stuck with it
1087         earlier. Annoying, but it's best done before the release, since
1088         these arguments didn't exist at all in 0.6.6 .
1089         (Darcs): same
1090         * buildbot/test/test_vc.py (SVN.testCheckout): same
1091         (Darcs.testPatch): same
1092         * docs/buildbot.texinfo (SVN): document the change
1093         (Darcs): same, add some build-on-branch docs
1094         * docs/examples/twisted_master.cfg: match change
1096         * buildbot/process/step.py (BuildStep): rename
1097         slaveVersionNewEnough to slaveVersionIsOlderThan, because that's
1098         how it is normally used.
1099         * buildbot/test/test_steps.py (Version.checkCompare): same
1101         * buildbot/process/step.py (CVS.startVC): refuse to build
1102         update/copy -style builds on a non-default branch with an old
1103         buildslave (<=0.6.6) that doesn't know how to do it properly. The
1104         concern is that it will do a VC 'update' in an existing tree when
1105         it is supposed to be switching branches (and therefore clobbering
1106         the tree to do a full checkout), thus building the wrong source.
1107         This used to be a warning, but I think the confusion it is likely
1108         to cause warrants making it an error.
1109         (SVN.startVC): same, also make mode=export on old slaves an error
1110         (Darcs.startVC): same
1111         (Git.startVC): improve error message for non-Git-enabled slaves
1112         (Arch.checkSlaveVersion): same. continue to emit a warning when a
1113         specific revision is built on a slave that doesn't pay attention
1114         to args['revision'], because for slowly-changing trees it will
1115         probably do the right thing, and because we have no way to tell
1116         whether we're asking it to build the most recent version or not.
1117         * buildbot/interfaces.py (BuildSlaveTooOldError): new exception
1119         * buildbot/scripts/runner.py (SlaveOptions.postOptions): assert
1120         that 'master' is in host:portnum format, to catch errors sooner
1122 2005-10-23  Brian Warner  <warner@lothar.com>
1124         * buildbot/process/step_twisted.py (ProcessDocs.createSummary):
1125         when creating the list of warning messages, include the line
1126         immediately after each WARNING: line, since that's usually where
1127         the file and line number wind up.
1129         * docs/examples/twisted_master.cfg: OS-X slave now does QT, add a
1130         TryScheduler
1132         * NEWS: update
1134 2005-10-22  Brian Warner  <warner@lothar.com>
1136         * buildbot/status/html.py (HtmlResource): incorporate valid-HTML
1137         patch from Brad Hards
1138         * buildbot/status/classic.css: same
1139         * buildbot/test/test_web.py (Waterfall): match changes
1141         * buildbot/test/test_steps.py (BuildStep.setUp): set
1142         nextBuildNumber so the test passes
1143         * buildbot/test/test_status.py (MyBuilder): same
1145         * buildbot/status/html.py (StatusResourceBuild.body): revision
1146         might be numeric, so stringify it before html-escapifying it
1147         (CurrentBox.getBox): add a "waiting" state, and show a countdown
1148         timer for the upcoming build
1149         * buildbot/status/classic.css: add background-color attributes for
1150         offline/waiting/building classes
1152         * buildbot/status/builder.py (BuildStatus): derive from
1153         styles.Versioned, fix upgrade of .sourceStamp attribute. Also set
1154         the default (i.e. unknown) .slavename to "???" instead of None,
1155         since even unknown slavenames need to be printed eventually.
1156         (BuilderStatus): also derive from styles.Versioned . More
1157         importantly, determine .nextBuildNumber at creation/unpickling
1158         time by scanning the directory of saved BuildStatus instances and
1159         choosing one larger than the highest-numbered one found. This
1160         should fix the problem where random errors during upgrades cause
1161         the buildbot to forget about earlier builds. .nextBuildNumber is
1162         no longer stored in the pickle.
1163         (Status.builderAdded): if we can't unpickle the BuilderStatus,
1164         at least log the error. Also call Builder.determineNextBuildNumber
1165         once the basedir is set.
1167         * buildbot/master.py (BuildMaster.loadChanges): do
1168         styles.doUpgrade afterwards, in case I decide to make Changes
1169         derived from styles.Versioned some day and forget to make this
1170         change later.
1173         * buildbot/test/test_runner.py (Options.testForceOptions): skip
1174         when running under older pythons (<2.3) in which the shlex module
1175         doesn't have a 'split' function.
1177         * buildbot/process/step.py (ShellCommand.start): make
1178         errorMessages= be a list of strings to stuff in the log before the
1179         command actually starts. This makes it easier to flag multiple
1180         warning messages, e.g. when the Source steps have to deal with an
1181         old buildslave.
1182         (CVS.startVC): handle slaves that don't handle multiple branches
1183         by switching into 'clobber' mode
1184         (SVN.startVC): same. Also reject branches without base_url
1185         (Darcs.startVC): same. Also reject revision= in older slaves
1186         (Arch.checkSlaveVersion): same (just the multiple-branches stuff)
1187         (Bazaar.startVC): same, and test for baz separately than for arch
1189         * buildbot/slave/commands.py (cvs_ver): document new features
1191         * buildbot/process/step.py (BuildStep.slaveVersion): document it
1192         (BuildStep.slaveVersionNewEnough): more useful utility method
1193         * buildbot/test/test_steps.py (Version): start testing it
1195         * buildbot/status/words.py (IrcStatusBot.command_FORCE): note that
1196         the 'force' command requires python2.3, for the shlex.split method
1198         * docs/examples/twisted_master.cfg: remove old freshcvs stuff,
1199         since we don't use it anymore. The Twisted buildbot uses a
1200         PBChangeSource now.
1202 2005-10-21  Brian Warner  <warner@lothar.com>
1204         * buildbot/process/process_twisted.py: rework all BuildFactory
1205         classes to take a 'source' step as an argument, instead of
1206         building up the SVN instance in the factory.
1207         * docs/examples/twisted_master.cfg: enable build-on-branch by
1208         providing a base_url and default_branch
1210         * buildbot/status/words.py (IrcStatusBot.command_FORCE): add
1211         control over --branch and --revision, not that they are always
1212         legal to provide
1213         * buildbot/status/html.py (StatusResourceBuilder.force): same
1214         (StatusResourceBuild.body): display SourceStamp components
1216         * buildbot/scripts/runner.py (ForceOptions): option parser for the
1217         IRC 'force' command, so it can be shared with an eventual
1218         command-line-tool 'buildbot force' mode.
1219         * buildbot/test/test_runner.py (Options.testForceOptions): test it
1221 2005-10-20  Brian Warner  <warner@lothar.com>
1223         * buildbot/status/mail.py (MailNotifier.buildMessage): reformat
1225         * docs/examples/twisted_master.cfg: update to use Schedulers
1227         * buildbot/scripts/sample.cfg: update with Schedulers
1229         * buildbot/interfaces.py (IBuilderControl.requestBuildSoon): new
1230         method specifically for use by HTML "force build" button and the
1231         IRC "force" command. Raises an immediate error if there are no
1232         slaves available.
1233         (IBuilderControl.requestBuild): make this just submit a build, not
1234         try to check for existing slaves or set up any when-finished
1235         Deferreds or anything.
1236         * buildbot/process/builder.py (BuilderControl): same
1237         * buildbot/status/html.py (StatusResourceBuilder.force): same
1238         * buildbot/status/words.py (IrcStatusBot.command_FORCE): same
1239         * buildbot/test/test_slaves.py: same
1240         * buildbot/test/test_web.py: same
1242 2005-10-19  Brian Warner  <warner@lothar.com>
1244         * docs/examples/twisted_master.cfg: re-sync with reality: bring
1245         back python2.2 tests, turn off OS-X threadedselect-reactor tests
1247 2005-10-18  Brian Warner  <warner@lothar.com>
1249         * buildbot/status/html.py: provide 'status' argument to most
1250         StatusResourceFOO objects
1251         (StatusResourceBuild.body): href-ify the Builder name, add "Steps
1252         and Logfiles" section to make the Build page into a more-or-less
1253         comprehensive source of status information about the build
1255         * buildbot/status/mail.py (MailNotifier): include the Build's URL
1256         * buildbot/status/words.py (IrcStatusBot.buildFinished): same
1258 2005-10-17  Brian Warner  <warner@lothar.com>
1260         * buildbot/process/process_twisted.py (TwistedTrial): update Trial
1261         arguments to accomodate Twisted >=2.1.0 . I will have to figure
1262         out what to do about other projects: the correct options for
1263         recent Twisteds will not work for older ones.
1265 2005-10-15  Brian Warner  <warner@lothar.com>
1267         * buildbot/status/builder.py (Status.getURLForThing): add method
1268         to provide a URL for arbitrary IStatusFoo objects. The idea is to
1269         use this in email/IRC status clients to make them more useful, by
1270         providing the end user with hints on where to learn more about the
1271         object being reported on.
1272         * buildbot/test/test_web.py (GetURL): tests for it
1274 2005-10-14  Brian Warner  <warner@lothar.com>
1276         * buildbot/test/test_config.py (ConfigTest._testSources_1): oops,
1277         fix bug resulting from deferredResult changes
1279 2005-10-13  Brian Warner  <warner@lothar.com>
1281         * buildbot/test/test_changes.py: remove use of deferredResult
1282         * buildbot/test/test_config.py: same
1283         * buildbot/test/test_control.py: same
1284         * buildbot/test/test_status.py: same
1285         * buildbot/test/test_vc.py: this is the only remaining use, since
1286         it gets used at module level. This needs to be replaced by some
1287         sort of class-level run-once routine.
1289         * buildbot/status/words.py (IrcStatusBot.command_WATCH): fix typo
1291         * lots: implement multiple slaves per Builder, which means multiple
1292         current builds per Builder. Some highlights:
1293         * buildbot/interfaces.py (IBuilderStatus.getState): return a tuple
1294         of (state,currentBuilds) instead of (state,currentBuild)
1295         (IBuilderStatus.getCurrentBuilds): replace getCurrentBuild()
1296         (IBuildStatus.getSlavename): new method, so you can tell which
1297         slave got used. This only gets set when the build completes.
1298         (IBuildRequestStatus.getBuilds): new method
1300         * buildbot/process/builder.py (SlaveBuilder): add a .state
1301         attribute to track things like ATTACHING and IDLE and BUILDING,
1302         instead of..
1303         (Builder): .. the .slaves attribute here, which has been turned
1304         into a simple list of available slaves. Added a separate
1305         attaching_slaves list to track ones that are not yet ready for
1306         builds.
1307         (Builder.fireTestEvent): put off the test-event callback for a
1308         reactor turn, to make tests a bit more consistent.
1309         (Ping): cleaned up the slaveping a bit, now it disconnects if the
1310         ping fails due to an exception. This needs work, I'm worried that
1311         a code error could lead to a constantly re-connecting slave.
1312         Especially since I'm trying to move to a distinct remote_ping
1313         method, separate from the remote_print that we currently use.
1314         (BuilderControl.requestBuild): return a convenience Deferred that
1315         provides an IBuildStatus when the build finishes.
1316         (BuilderControl.ping): ping all connected slaves, only return True
1317         if they all respond.
1319         * buildbot/slave/bot.py (BuildSlave.stopService): stop trying to
1320         reconnect when we shut down.
1322         * buildbot/status/builder.py: implement new methods, convert
1323         one-build-at-a-time methods to handle multiple builds
1324         * buildbot/status/*.py: do the same in all default status targets
1325         * buildbot/status/html.py: report the build's slavename in the
1326         per-Build page, report all buildslaves on the per-Builder page
1328         * buildbot/test/test_run.py: update/create tests
1329         * buildbot/test/test_slaves.py: same
1330         * buildbot/test/test_scheduler.py: remove stale test
1332         * docs/buildbot.texinfo: document the new builder-specification
1333         'slavenames' parameter
1335 2005-10-12  Brian Warner  <warner@lothar.com>
1337         * buildbot/buildset.py (BuildSet): fix bug where BuildSet did not
1338         report failure correctly, causing Dependent builds to run when
1339         they shouldn't have.
1340         * buildbot/status/builder.py (BuildSetStatus): same
1341         * buildbot/test/test_buildreq.py (Set.testBuildSet): verify it
1342         (Set.testSuccess): test the both-pass case too
1343         * buildbot/test/test_dependencies.py (Dependencies.testRun_Fail):
1344         fix this test: it was ending too early, masking the failure before
1345         (Logger): specialized StatusReceiver to make sure the dependent
1346         builds aren't even started, much less completed.
1348 2005-10-07  Brian Warner  <warner@lothar.com>
1350         * buildbot/slave/bot.py (SlaveBuilder.activity): survive
1351         bot.SlaveBuilder being disowned in the middle of a build
1353         * buildbot/status/base.py (StatusReceiverMultiService): oops, make
1354         this inherit from StatusReceiver. Also upcall in __init__. This
1355         fixes the embarrasing crash when the new buildSetSubmitted method
1356         is invoked and Waterfall/etc don't implement their own.
1357         * buildbot/test/test_run.py: add a TODO note about a test to catch
1358         just this sort of thing.
1360         * buildbot/process/builder.py (Builder.attached): remove the
1361         already-attached warning, this situation is normal. Add some
1362         comments explaining it.
1364 2005-10-02  Brian Warner  <warner@lothar.com>
1366         * buildbot/changes/maildir.py (Maildir.start): Tolerate
1367         OverflowError when setting up dnotify, because some 64-bit systems
1368         have problems with signed-vs-unsigned constants and trip up on the
1369         DN_MULTISHOT flag. Patch from Brad Hards.
1371 2005-09-06  Fred Drake  <fdrake@users.sourceforge.net>
1373         * buildbot/process/step.py (BuildStep, ShellCommand): Add
1374         progressMetrics, description, descriptionDone to the 'parms' list,
1375         and make use the 'parms' list from the implementation class
1376         instead of only BuildStep to initialize the parameters.  This
1377         allows buildbot.process.factory.s() to initialize all the parms,
1378         not just those defined in directly by BuildStep.
1380 2005-09-03  Brian Warner  <warner@lothar.com>
1382         * NEWS: start adding items for the next release
1384         * docs/examples/twisted_master.cfg: (sync with reality) turn off
1385         python2.2 tests, change 'Quick' builder to only use python2.3
1387 2005-09-02  Fred Drake  <fdrake@users.sourceforge.net>
1389         * buildbot/status/html.py (StatusResourceBuilder.body): only show
1390         the "Ping Builder" button if the build control is available; the
1391         user sees an exception otherwise
1393         * docs/buildbot.texinfo (PBChangeSource): fix a typo
1395 2005-09-01  Brian Warner  <warner@lothar.com>
1397         * buildbot/interfaces.py (IBuilderStatus.getState): update
1398         signature, point out that 'build' can be None
1399         (IBuildStatus.getETA): point out ETA can be none
1401         * buildbot/status/html.py (CurrentBox.getBox): tolerate build/ETA
1402         being None
1403         * buildbot/status/words.py (IrcStatusBot.emit_status): same
1405 2005-08-31  Brian Warner  <warner@lothar.com>
1407         * buildbot/status/base.py (StatusReceiver.builderChangedState):
1408         update to match correct signature: removed 'eta' argument
1409         * buildbot/status/mail.py (MailNotifier.builderChangedState): same
1411 2005-08-30  Brian Warner  <warner@lothar.com>
1413         * buildbot/status/builder.py (LogFile): remove the assertion that
1414         blows up when you try to overwrite an existing logfile, instead
1415         just emit a warning. This case gets hit when the buildmaster is
1416         killed and doesn't get a chance to write out the serialized
1417         BuilderStatus object, so the .nextBuildNumber attribute gets out
1418         of date.
1420         * buildbot/scripts/runner.py (sendchange): add --revision_file to
1421         the 'buildbot sendchange' arguments, for the Darcs context file
1422         * docs/buildbot.texinfo (sendchange): document it
1424         * buildbot/status/html.py: add pending/upcoming builds to CurrentBox
1425         * buildbot/interfaces.py (IScheduler.getPendingBuildTimes): new method
1426         (IStatus.getSchedulers): new method
1427         * buildbot/status/builder.py (BuilderStatus): track pendingBuilds
1428         (Status.getSchedulers): implement
1429         * buildbot/process/builder.py (Builder): maintain
1430         BuilderStatus.pendingBuilds
1431         * buildbot/scheduler.py (Scheduler.getPendingBuildTimes): new method
1432         (TryBase.addChange): Try schedulers should ignore Changes
1434         * buildbot/scripts/tryclient.py (getTopdir): implement getTopdir
1435         for 'try' on CVS/SVN
1436         * buildbot/test/test_runner.py (Try.testGetTopdir): test case
1438         * buildbot/scripts/tryclient.py (Try): make jobdir-style 'try'
1439         report status properly.
1440         (Try.createJob): implement unique buildset IDs
1442         * buildbot/status/client.py (StatusClientPerspective): add a
1443         perspective_getBuildSets method for the benefit of jobdir-style
1444         'try'.
1445         * docs/buildbot.texinfo (try): more docs
1446         * buildbot/test/test_scheduler.py (Scheduling.testGetBuildSets):
1447         new test case
1449 2005-08-18  Brian Warner  <warner@lothar.com>
1451         * buildbot/scripts/tryclient.py (Try): make 'try' status reporting
1452         actually work. It's functional but still kind of clunky. Also, it
1453         only works with the pb-style.. needs to be made to work with the
1454         jobdir-style too.
1456         * buildbot/status/client.py (RemoteBuildSet): new class
1457         (RemoteBuildRequest): same
1458         (RemoteBuild.remote_waitUntilFinished): return the RemoteBuild
1459         object, not the internal BuildStatus object.
1460         (RemoteBuild.remote_subscribe): new method to subscribe to builds
1461         outside of the usual buildStarted() return value.
1462         (BuildSubscriber): support class for RemoteBuild.remote_subscribe
1464         * buildbot/scheduler.py (Try_Jobdir): convey buildsetID properly
1465         (Try_Userpass_Perspective.perspective_try): return a remotely
1466         usable BuildSetStatus object
1468         * buildbot/interfaces.py (IBuildStatus): remove obsolete
1469         isStarted()/waitUntilStarted()
1471 2005-08-16  Brian Warner  <warner@lothar.com>
1473         * buildbot/status/builder.py: implement IBuildSetStatus and
1474         IBuildRequestStatus, wire them into place.
1475         * buildbot/buildset.py: same. Add ID, move wait-until-finished
1476         methods into the BuildSetStatus object.
1477         * buildbot/interfaces.py: same
1478         (IStatus.getBuildSets): new method to get pending BuildSets
1479         (IStatusReceiver.buildsetSubmitted): new method which hears about
1480         new BuildSets
1481         * buildbot/master.py (BuildMaster.submitBuildSet): same
1482         * buildbot/process/base.py (BuildRequest): same, replace
1483         waitUntilStarted with subscribe/unsubscribe
1484         * buildbot/process/builder.py (BuilderControl.forceBuild): use
1485         subscribe instead of waitUntilStarted
1486         * buildbot/status/base.py (StatusReceiver.buildsetSubmitted): stub
1487         for new method
1488         * buildbot/status/client.py (StatusClientPerspective.builderRemoved): 
1489         same
1490         * buildbot/test/test_buildreq.py: update for new code
1491         * buildbot/test/test_control.py (Force.testRequest): same
1494         * buildbot/slave/commands.py (Darcs.doVCFull): fix get-revision
1495         for Darcs to not use the tempfile module, so it works under
1496         python-2.2 too. We really didn't need the full cleverness of that
1497         module, since the slave has exclusive control of its own builddir.
1499 2005-08-15  Brian Warner  <warner@lothar.com>
1501         * buildbot/scripts/tryclient.py (CVSExtractor): implement 'try'
1502         for CVS trees. It doesn't work for non-trunk branches,
1503         unfortunately.
1504         * buildbot/test/test_vc.py (CVS.testTry): test it, but skip the
1505         branch test
1507         * Makefile: make it easier to test against python2.2
1509         * buildbot/test/test_vc.py (VCBase.tearDown): provide for
1510         tearDown2, so things like Arch can unregister archives as they're
1511         shutting down. The previous subclass-override-tearDown technique
1512         resulted in a nested maybeWait() and test failures under
1513         Twisted-1.3.0
1515         * buildbot/scripts/tryclient.py (getSourceStamp): extract branches
1516         where we can (Arch), add a branch= argument to set the branch used
1517         when we can't
1518         (BazExtractor): extract the branch too
1519         (TlaExtractor): same
1520         * buildbot/scripts/runner.py (TryOptions): add --branch
1521         * docs/buildbot.texinfo (try): document --branch/try_branch
1523         * buildbot/slave/commands.py (Darcs): implement get-revision for
1524         Darcs, so that 'try' will work. This requires the tempfile module
1525         from python-2.3 .
1527         * buildbot/test/test_vc.py: rewrite tests, getting better coverage
1528         of revisions, branches, and 'try' in the process.
1530 2005-08-11  Brian Warner  <warner@lothar.com>
1532         * buildbot/master.py (DebugPerspective.perspective_pokeIRC): fix
1533         this, it got broken at some point in the last few releases
1534         * buildbot/status/words.py (IrcBuildRequest): reply was broken
1535         (IrcStatusBot.emit_status): handle new IBuilderStatus.getState,
1536         specifically the removal of ETA information from the tuple
1538         * buildbot/locks.py: use %d for id() instead of %x, avoid a silly
1539         warning message
1541         * docs/buildbot.texinfo (try): document both --builder and
1542         'try_builders' in .buildbot/options
1543         * buildbot/scripts/runner.py (TryOptions): add --builder,
1544         accumulate the values into opts['builders']
1545         * buildbot/scripts/tryclient.py (Try.__init__): set builders
1546         * buildbot/test/test_runner.py (Try): add some quick tests to make
1547         sure 'buildbot try --options' and .buildbot/options get parsed
1548         * buildbot/test/test_scheduler.py (Scheduling.testTryUserpass):
1549         use --builder control
1551         * docs/buildbot.texinfo (try): add --port argument to PB style
1553         * buildbot/scripts/tryclient.py (SourceStampExtractor): return an
1554         actual SourceStamp. Still need to extract a branch name, somehow.
1555         (Try): finish implementing the try client side, still need a UI
1556         for specifying which builders to use
1557         (Try.getopt): factor our options/config-file reading
1558         * buildbot/test/test_scheduler.py (Scheduling.testTryUserpass):
1559         test it
1560         * buildbot/test/test_vc.py: match SourceStampExtractor change
1562         * buildbot/scripts/runner.py (Options.opt_verbose): --verbose
1563         causes the twisted log to be sent to stderr
1565         * buildbot/scheduler.py (Try_Userpass): implement the PB style
1567 2005-08-10  Brian Warner  <warner@lothar.com>
1569         * buildbot/scripts/runner.py: Add 'buildbot try' command, jobdir
1570         style is 90% done, still missing status reporting or waiting for
1571         the buildsets to finish, and it is completely untested.
1573         * buildbot/trybuild.py: delete file, move contents to ..
1574         * buildbot/scripts/tryclient.py (getSourceStamp): .. here
1575         * buildbot/test/test_vc.py: match the move
1577         * buildbot/scheduler.py (Try_Jobdir): implement the jobdir style
1578         of the TryScheduler, no buildsetID or status-tracking support yet
1579         * buildbot/test/test_scheduler.py (Scheduling.testTryJobdir): test it
1581         * buildbot/changes/maildir.py (Maildir.setBasedir): make it
1582         possible to set the basedir after __init__ time, so it is easier
1583         to use as a Service-child of the BuildMaster instance
1585         * buildbot/changes/maildirtwisted.py (MaildirService): make a form
1586         that delivers messages to its Service parent instead of requiring
1587         a subclass to be useful. This turns out to be much easier to build
1588         unit tests around.
1590         * buildbot/scripts/tryclient.py (createJob): utility code to
1591         create jobfiles, will eventually be used by 'buildbot try'
1593 2005-08-08  Brian Warner  <warner@lothar.com>
1595         * docs/buildbot.texinfo (try): add docs on the
1596         as-yet-unimplemented Try scheduler
1598         * buildbot/test/test_buildreq.py: move Scheduling tests out to ..
1599         * buildbot/test/test_scheduler.py: .. here
1600         (Scheduling.testTryJobdir): add placeholder test for 'try'
1602         * buildbot/test/test_status.py (Log.testMerge3): update to match new
1603         addEntry merging (>=chunkSize) behavior
1604         (Log.testConsumer): update to handle new callLater(0) behavior
1606         * buildbot/test/test_web.py: rearrange tests a bit, add test for
1607         both the MAX_LENGTH bugfix and the resumeProducing hang.
1609         * buildbot/status/builder.py (LogFileProducer.resumeProducing):
1610         put off the actual resumeProducing for a moment with
1611         reactor.callLater(0). This works around a twisted-1.3.0 bug which
1612         causes large logfiles to hang midway through.
1614         * buildbot/process/step.py (BuildStep.addCompleteLog): break the
1615         logfile up into chunks, both to avoid NetstringReceiver.MAX_LENGTH
1616         and to improve memory usage when streaming the file out to a web
1617         browser.
1618         * buildbot/status/builder.py (LogFile.addEntry): change > to >= to
1619         make this work cleanly
1621 2005-08-03  Brian Warner  <warner@lothar.com>
1623         * buildbot/trybuild.py: new file for 'try' utilities
1624         (getSourceStamp): run in a tree, find out the baserev+patch
1625         * buildbot/test/test_vc.py (VCBase.do_getpatch): test it,
1626         implemented for SVN and Darcs, still working on Arch. I don't know
1627         how to make CVS work yet.
1629         * docs/buildbot.texinfo: document the 'buildbot' command-line
1630         tool, including the not-yet-implemented 'try' feature, and the
1631         in-flux .buildbot/ options directory.
1633 2005-07-20  Brian Warner  <warner@lothar.com>
1635         * buildbot/locks.py: added temporary id() numbers to Lock
1636         descriptions, to track down a not-really-sharing-the-Lock bug
1638         * buildbot/test/runutils.py: must import errno, cut-and-paste bug
1640         * buildbot/test/test_slavecommand.py (ShellBase.failUnlessIn):
1641         needed for python2.2 compatibility
1642         * buildbot/test/test_vc.py: python2.2 compatibility: generators
1643         are from the __future__
1645 2005-07-19  Brian Warner  <warner@lothar.com>
1647         * buildbot/master.py (BuildMaster.loadConfig): give a better error
1648         message when schedulers use unknown builders
1650         * buildbot/process/builder.py (Builder.compareToSetup): make sure
1651         SlaveLock('name') and MasterLock('name') are distinct
1653         * buildbot/master.py (BuildMaster.loadConfig): oops, sanity-check
1654         c['schedulers'] in such a way that we can actually accept
1655         Dependent instances
1656         * buildbot/test/test_config.py: check it
1658         * buildbot/scheduler.py (Dependent.listBuilderNames): oops, add
1659         utility method to *all* the Schedulers
1660         (Periodic.listBuilderNames): same
1662         * docs/buildbot.texinfo (Interlocks): update chapter to match
1663         reality
1665         * buildbot/master.py (BuildMaster.loadConfig): Add sanity checks
1666         to make sure that c['sources'], c['schedulers'], and c['status']
1667         are all lists of the appropriate objects, and that the Schedulers
1668         all point to real Builders
1669         * buildbot/interfaces.py (IScheduler, IUpstreamScheduler): add
1670         'listBuilderNames' utility method to support this
1671         * buildbot/scheduler.py: implement the utility method
1672         * buildbot/test/test_config.py (ConfigTest.testSchedulers): test it
1674         * docs/buildbot.texinfo: add some @cindex entries
1676         * buildbot/test/test_vc.py (Arch.createRepository): set the tla ID
1677         if it wasn't already set: most tla commands will fail unless one
1678         has been set.
1679         (Arch.createRepository): and disable bazaar's revision cache, since
1680         they cause test failures (the multiple repositories we create all
1681         interfere with each other through the cache)
1683         * buildbot/test/test_web.py (WebTest): remove use of deferredResult,
1684         bring it properly up to date with twisted-2.0 test guidelines
1686         * buildbot/master.py (BuildMaster): remove references to old
1687         'interlock' module, this caused a bunch of post-merge test
1688         failures
1689         * buildbot/test/test_config.py: same
1690         * buildbot/process/base.py (Build): same
1692         * buildbot/test/test_slaves.py: stubs for new test case
1694         * buildbot/scheduler.py: add test-case-name tag
1695         * buildbot/test/test_buildreq.py: same
1697         * buildbot/slave/bot.py (SlaveBuilder.__init__): remove some
1698         unnecessary init code
1699         (Bot.remote_setBuilderList): match it
1701         * docs/buildbot.texinfo (@settitle): don't claim version 1.0
1703         * buildbot/changes/mail.py (parseSyncmail): update comment
1705         * buildbot/test/test_slavecommand.py: disable Shell tests on
1706         platforms that don't suport IReactorProcess
1708         * buildbot/status/builder.py (LogFile): remove the 't' mode from
1709         all places where we open logfiles. It causes OS-X to open the file
1710         in some weird mode that that prevents us from mixing reads and
1711         writes to the same filehandle, which we depend upon to implement
1712         _generateChunks properly. This change doesn't appear to break
1713         win32, on which "b" and "t" are treated differently but a missing
1714         flag seems to be interpreted as "t".
1716 2005-07-18  Brian Warner  <warner@lothar.com>
1718         * buildbot/slave/commands.py (ShellCommand): overhaul
1719         error-handling code, to try and make timeout/interrupt work
1720         properly, and make win32 happier
1721         * buildbot/test/test_slavecommand.py: clean up, stop using
1722         reactor.iterate, add tests for timeout and interrupt
1723         * buildbot/test/sleep.py: utility for a new timeout test
1725         * buildbot/twcompat.py: copy over twisted 1.3/2.0 compatibility
1726         code from the local-usebranches branch
1728 2005-07-17  Brian Warner  <warner@lothar.com>
1730         * buildbot/process/process_twisted.py
1731         (TwistedReactorsBuildFactory): change the treeStableTimer to 5
1732         minutes, to match the other twisted BuildFactories, and don't
1733         excuse failures in c/qt/win32 reactors any more.
1735         * docs/examples/twisted_master.cfg: turn off the 'threadless' and
1736         'freebsd' builders, since the buildslaves have been unavailable
1737         for quite a while
1739 2005-07-13  Brian Warner  <warner@lothar.com>
1741         * buildbot/test/test_vc.py (VCBase.do_branch): test the new
1742         build-on-branch feature
1744         * buildbot/process/step.py (Darcs.__init__): add base_url and
1745         default_branch arguments, just like SVN
1746         (Arch.__init__): note that the version= argument is really the
1747         default branch name
1749         * buildbot/slave/commands.py (SourceBase): keep track of the
1750         repository+branch that was used for the last checkout in
1751         SRCDIR/.buildbot-sourcedata . If the contents of this file do not
1752         match, we clobber the directory and perform a fresh checkout
1753         rather than trying to do an in-place update. This should protect
1754         us against trying to get to branch B by doing an update in a tree
1755         obtained from branch A.
1756         (CVS.setup): add CVS-specific sourcedata: root, module, and branch
1757         (SVN.setup): same, just the svnurl
1758         (Darcs.setup): same, just the repourl
1759         (Arch.setup): same, arch coordinates (url), version, and
1760         buildconfig. Also pull the buildconfig from the args dictionary,
1761         which we weren't doing before, so the build-config was effectively
1762         disabled.
1763         (Arch.sourcedirIsUpdateable): don't try to update when we're
1764         moving to a specific revision: arch can't go backwards, so it is
1765         safer to just clobber the tree and checkout a new one at the
1766         desired revision.
1767         (Bazaar.setup): same sourcedata as Arch
1769         * buildbot/test/test_dependencies.py (Dependencies.testRun_Fail):
1770         use maybeWait, to work with twisted-1.3.0 and twcompat
1771         (Dependencies.testRun_Pass): same
1773         * buildbot/test/test_vc.py: rearrange, cleanup
1775         * buildbot/twcompat.py: add defer.waitForDeferred and
1776         utils.getProcessOutputAndValue, so test_vc.py (which uses them)
1777         can work under twisted-1.3.0 .
1779         * buildbot/test/test_vc.py: rewrite. The sample repositories are
1780         now created at setUp time. This increases the runtime of the test
1781         suite considerably (from 91 seconds to 151), but it removes the
1782         need for an offline tarball, which should solve a problem I've
1783         seen where the test host has a different version of svn than the
1784         tarball build host. The new code also validates that mode=update
1785         really picks up recent commits. This approach will also make it
1786         easier to test out branches, because the code which creates the VC
1787         branches is next to the code which uses them. It will also make it
1788         possible to test some change-notification hooks, by actually
1789         performing a VC commit and watching to see the ChangeSource get
1790         notified.
1792 2005-07-12  Brian Warner  <warner@lothar.com>
1794         * docs/buildbot.texinfo (SVN): add branches example
1795         * docs/Makefile (buildbot.ps): add target for postscript manual
1797         * buildbot/test/test_dependencies.py: s/test_interlocks/test_locks/ 
1798         * buildbot/test/test_locks.py: same
1800         * buildbot/process/step.py (Darcs): comment about default branches
1802         * buildbot/master.py (BuildMaster.loadConfig): don't look for
1803         c['interlocks'] in the config file, complain if it is present.
1804         Scan all locks in c['builders'] to make sure the Locks they use
1805         are uniquely named.
1806         * buildbot/test/test_config.py: remove old c['interlocks'] test,
1807         add some tests to check for non-uniquely-named Locks
1808         * buildbot/test/test_vc.py (Patch.doPatch): fix factory.steps,
1809         since the unique-Lock validation code requires it now
1811         * buildbot/locks.py: fix test-case-name
1813         * buildbot/interlock.py: remove old file
1815 2005-07-11  Brian Warner  <warner@lothar.com>
1817         * buildbot/test/test_interlock.py: rename to..
1818         * buildbot/test/test_locks.py: .. something shorter
1820         * buildbot/slave/bot.py (BuildSlave.stopService): newer Twisted
1821         versions (after 2.0.1) changed internet.TCPClient to shut down the
1822         connection in stopService. Change the code to handle this
1823         gracefully.
1825         * buildbot/process/base.py (Build): handle whole-Build locks
1826         * buildbot/process/builder.py (Builder.compareToSetup): same
1827         * buildbot/test/test_interlock.py: make tests work
1829         * buildbot/process/step.py (BuildStep.startStep): complain if a
1830         Step tries to claim a lock that's owned by its own Build
1831         (BuildStep.releaseLocks): typo
1833         * buildbot/locks.py (MasterLock): use ComparableMixin so config
1834         file reloads don't replace unchanged Builders
1835         (SlaveLock): same
1836         * buildbot/test/test_config.py (ConfigTest.testInterlocks):
1837         rewrite to cover new Locks instead of old c['interlocks']
1838         * buildbot/test/runutils.py (RunMixin.connectSlaves): remember
1839         slave2 too
1842         * buildbot/test/test_dependencies.py (Dependencies.setUp): always
1843         start the master and connect the buildslave
1845         * buildbot/process/step.py (FailingDummy.done): finish with a
1846         FAILURE status rather than raising an exception
1848         * buildbot/process/base.py (BuildRequest.mergeReasons): don't try to
1849         stringify a BuildRequest.reason that is None
1851         * buildbot/scheduler.py (BaseUpstreamScheduler.buildSetFinished):
1852         minor fix
1853         * buildbot/status/builder.py (BuildSetStatus): implement enough to
1854         allow scheduler.Dependent to work
1855         * buildbot/buildset.py (BuildSet): set .reason and .results
1857         * buildbot/test/test_interlock.py (Locks.setUp): connect both
1858         slaves, to make the test stop hanging. It still fails, of course,
1859         because I haven't even started to implement Locks.
1861         * buildbot/test/runutils.py (RunMixin.connectSlaves): new utility
1863         * docs/buildbot.texinfo (Build-Dependencies): redesign the feature
1864         * buildbot/interfaces.py (IUpstreamScheduler): new Interface
1865         * buildbot/scheduler.py (BaseScheduler): factor out common stuff
1866         (Dependent): new class for downstream build dependencies
1867         * buildbot/test/test_dependencies.py: tests (still failing)
1869         * buildbot/buildset.py (BuildSet.waitUntilSuccess): minor notes
1871 2005-07-07  Brian Warner  <warner@lothar.com>
1873         * buildbot/test/runutils.py (RunMixin): factored this class out..
1874         * buildbot/test/test_run.py: .. from here
1875         * buildbot/test/test_interlock.py: removed old c['interlock'] tests,
1876         added new buildbot.locks tests (which all hang right now)
1877         * buildbot/locks.py (SlaveLock, MasterLock): implement Locks
1878         * buildbot/process/step.py: claim/release per-BuildStep locks
1880         * docs/Makefile: add 'buildbot.html' target
1882         * buildbot/process/step.py (CVS.__init__): allow branch=None to be
1883         interpreted as "HEAD", so that all VC steps can accept branch=None
1884         and have it mean the "default branch".
1886         * docs/buildbot.texinfo: add Schedulers, Dependencies, and Locks
1888 2005-07-07  Brian Warner  <warner@lothar.com>
1890         * docs/examples/twisted_master.cfg: update to match current usage
1892         * docs/buildbot.texinfo (System Architecture): comment out the
1893         image, it doesn't exist yet and just screws up the HTML manual.
1895 2005-07-05  Brian Warner  <warner@lothar.com>
1897         * debian/.cvsignore: oops, missed one. Removing leftover file.
1899 2005-06-17  Brian Warner  <warner@lothar.com>
1901         * buildbot/test/test_vc.py (VCSupport.__init__): svn --version
1902         changed its output in 1.2.0, don't mistakenly think that the
1903         subversion we find isn't capable of supporting our tests.
1905         * debian/*: remove the debian/ directory and its contents, to make
1906         life easier for the proper Debian maintainer
1907         * MANIFEST.in: same
1908         * Makefile (release): same
1910 2005-06-07  Brian Warner  <warner@lothar.com>
1912         * everything: create a distinct SourceStamp class to replace the
1913         ungainly 4-tuple, let it handle merging instead of BuildRequest.
1914         Changed the signature of Source.startVC to include the revision
1915         information (instead of passing it through self.args). Implement
1916         branches for SVN (now only Darcs/Git is missing support). Add more
1917         Scheduler tests.
1919 2005-06-06  Brian Warner  <warner@lothar.com>
1921         * everything: rearrange build scheduling. Create a new Scheduler
1922         object (configured in c['schedulers'], which submit BuildSets to a
1923         set of Builders. Builders can now use multiple slaves. Builds can
1924         be run on alternate branches, either requested manually or driven
1925         by changes. This changed some of the Status classes. Interlocks
1926         are out of service until they've been properly split into Locks
1927         and Dependencies. treeStableTimer, isFileImportant, and
1928         periodicBuild have all been moved from the Builder to the
1929         Scheduler.
1930         (BuilderStatus.currentBigState): removed the 'waiting' and
1931         'interlocked' states, removed the 'ETA' argument.
1933 2005-05-24  Brian Warner  <warner@lothar.com>
1935         * buildbot/pbutil.py (ReconnectingPBClientFactory): Twisted-1.3
1936         erroneously abandons the connection (in clientConnectionFailed)
1937         for non-UserErrors, which means that if we lose the connection due
1938         to a network problem or a timeout, we'll never try to reconnect.
1939         Fix this by not upcalling to the buggy parent method. Note:
1940         twisted-2.0 fixes this, but the function only has 3 lines so it
1941         makes more sense to copy it than to try and detect the buggyness
1942         of the parent class. Fixes SF#1207588.
1944         * buildbot/changes/changes.py (Change.branch): doh! Add a
1945         class-level attribute to accomodate old Change instances that were
1946         pickled before 0.6.5 (where .branch was added for new Changes).
1947         This fixes the exception that occurs when you try to look at an
1948         old Change (through asHTML).
1950         * buildbot/__init__.py (version): bump to 0.6.6+ while between
1951         releases
1953 2005-05-23  Brian Warner  <warner@lothar.com>
1955         * buildbot/__init__.py (version): release 0.6.6
1957 2005-05-23  Brian Warner  <warner@lothar.com>
1959         * NEWS: update for 0.6.6 release
1960         * debian/changelog: same
1962         * buildbot/scripts/runner.py (start): put the basedir in sys.path
1963         before starting: this was done by twistd back when we spawned it,
1964         now that we're importing the pieces and running them in the
1965         current process, we have to do it ourselves. This allows
1966         master.cfg to import files from the same directory without
1967         explicitly manipulating PYTHONPATH. Thanks to Thomas Vander
1968         Stichele for the catch.
1969         (Options.opt_version): Add a --version command (actually, just make
1970         the existing --version command emit Buildbot's version too)
1972         * buildbot/status/builder.py (HTMLLogFile.upgrade): oops! second
1973         fix to make this behave like other LogFiles, this time to handle
1974         existing LogFiles on disk. (add the missing .upgrade method)
1975         * buildbot/test/test_status.py (Log.testHTMLUpgrade): test it
1977 2005-05-21  Brian Warner  <warner@lothar.com>
1979         * buildbot/test/test_runner.py (Create.testMaster): match the
1980         rawstring change in runner.py:masterTAC
1982         * buildbot/test/test_config.py (ConfigTest.testIRC): skip unless
1983         TwistedWords is installed
1984         * buildbot/test/test_status.py: same, with TwistedMail
1986         * buildbot/master.py: remove old IRC/Waterfall imports (used by
1987         some old, deprecated, and removed config keys). This should enable
1988         you to use the base buildbot functionality with Twisted-2.0.0 when
1989         you don't also have TwistedWeb and TwistedWords installed
1991 2005-05-20  Brian Warner  <warner@lothar.com>
1993         * buildbot/scripts/runner.py (run): call sendchange(), not
1994         do_sendchange(): thus 'buildbot sendchange' was broken in 0.6.5
1995         (run): call stop("HUP"), not "-HUP", 'buildbot stop' was broken.
1996         (stop): don't wait for process to die when sending SIGHUP
1997         (masterTAC): use a rawstring for basedir=, otherwise '\' in the
1998         directory name gets interpreted, which you don't want
1999         (slaveTAC): same
2001         * buildbot/__init__.py (version): bump to 0.6.5+ while between
2002         releases
2004 2005-05-18  Brian Warner  <warner@lothar.com>
2006         * buildbot/__init__.py (version): Releasing buildbot-0.6.5
2008 2005-05-18  Brian Warner  <warner@lothar.com>
2010         * README: update for 0.6.5
2011         * debian/changelog: same
2013         * buildbot/changes/changes.py: rename tag= to branch=, since
2014         that's how we're using it, and my design for the upcoming "build a
2015         specific branch" feature wants it. also, tag= was too CVS-centric
2016         * buildbot/changes/mail.py (parseSyncmail): same
2017         * buildbot/process/base.py (Build.isBranchImportant): same
2018         * buildbot/test/test_mailparse.py (Test3.testMsgS4): same
2019         * docs/buildbot.texinfo (Attributes of Changes): same
2021         * NEWS: update tag=, update for upcoming release
2023 2005-05-17  Brian Warner  <warner@lothar.com>
2025         * buildbot/scripts/runner.py (stop): actually poll once per
2026         second, instead of re-killing the poor daemon once per second.
2027         Sleep briefly (0.1s) before the first poll, since there's a good
2028         chance we can avoid waiting the full second if the daemon shuts
2029         down quickly. Also remove the sys.exit() at the end.
2030         (start): remove the unneighborly sys.exit()
2032         * Makefile: improve permission-setting to not kick Arch so badly
2034         * buildbot/scripts/runner.py (SlaveOptions.optParameters): set a
2035         default --keepalive=600, since it doesn't hurt very much, and it's
2036         a hassle to discover that you need it.
2037         * buildbot/test/test_runner.py (Create.testSlave): test it
2039         * buildbot/status/words.py (IrcStatusBot.buildFinished): Teach the
2040         IRC bot about EXCEPTION
2042         * buildbot/status/client.py (PBListener): upcall more correctly
2044         * buildbot/process/base.py (Build.allStepsDone): if a step caused
2045         an exception mark the overall build with EXCEPTION, not SUCCESS
2047         * buildbot/scripts/runner.py (makefile_sample): remove the leading
2048         newline
2049         * buildbot/status/mail.py (MailNotifier): oops, forgot to upcall
2050         * Makefile: update some release-related stuff
2052         * buildbot/slave/commands.py (ShellCommand.kill): if somehow this
2053         gets called when there isn't actually an active process, just end
2054         the Command instead of blowing up. I don't know how it gets into
2055         this state, but the twisted win32 buildslave will sometimes hang,
2056         and when it shakes its head and comes back, it thinks it's still
2057         running a Command. The next build causes this command to be
2058         interrupted, but the lack of self.process.pid breaks the interrupt
2059         attempt.
2061         * NEWS: document changes since the last release
2063         * buildbot/scripts/runner.py (start): change 'buildbot start' to
2064         look for Makefile.buildbot instead of a bare Makefile . The
2065         'buildbot start' does not install this file, so you have to
2066         manually copy it if you want to customize startup behavior.
2067         (createMaster): change 'buildbot master' command to create
2068         Makefile.sample instead of Makefile, to create master.cfg.sample
2069         instead of master.cfg (requiring you to copy it before the
2070         buildmaster can be started). Both sample files are kept up to
2071         date, i.e. they are overwritten if they have been changed. The
2072         'buildbot.tac' file is *not* overwritten, but if the new contents
2073         don't match the old, a 'buildbot.tac.new' file is created and the
2074         user is warned. This seems to be a much more sane way to handle
2075         startup files. Also, don't sys.exit(0) when done, so we can run
2076         unit tests against it.
2077         (createSlave): same. Don't overwrite the sample info/ files.
2078         * buildbot/scripts/sample.mk: remove. the contents were pulled
2079         into runner.py, since they need to match the behavior of start()
2080         * setup.py: same
2081         * MANIFEST.in: same
2083         * docs/buildbot.texinfo (Launching the daemons): document it
2084         * buildbot/test/test_runner.py (Create): test it
2086         * buildbot/test/test_vc.py (SetupMixin.failUnlessIn): Add a
2087         version that can handle string-in-string tests, because otherwise
2088         python-2.2 fails the tests. It'd be tremendous if Trial's test
2089         took two strings under 2.2 too.
2091         * everything: fixed all deprecation warnings when running against
2092         Twisted-2.0 . (at least all the ones in buildbot code, there are a
2093         few that come from Twisted itself). This involved putting most of
2094         the Twisted-version specific code in the new buildbot.twcompat
2095         module, and creating some abstract base classes in
2096         buildbot.changes.base and buildbot.status.base (which might be
2097         useful anyway). __implements__ is a nuisance and requires an ugly
2098         'if' clause everywhere.
2100         * buildbot/test/test_status.py (Mail.testMail): add a 0.1 second
2101         delay before finishing the test: it seems that smtp.sendmail
2102         doesn't hang up on the server, so we must wait a moment so it can
2103         hang up on us. This removes the trial warning about an unclean
2104         reactor.
2106 2005-05-16  Brian Warner  <warner@lothar.com>
2108         * buildbot/process/step.py (Source): add 'retry' argument. It is a
2109         tuple of (delay, repeats).
2110         * buildbot/test/test_vc.py (Retry): test it
2111         * docs/buildbot.texinfo (Source Checkout): document it
2112         * buildbot/slave/commands.py (SourceBase): add 'retry' parameter.
2113         (SourceBase.maybeDoVCRetry): If 'retry' is set, failures in
2114         doVCFull() are handled by re-trying the checkout (after a delay)
2115         some number of times.
2116         (ShellCommand._startCommand): make header lines easier to read
2118         * buildbot/test/test_web.py (WebTest.tearDown): factor out master
2119         shutdown
2120         (WebTest.test_logfile): make sure master gets shut down, silences
2121         some "unclean reactor" test errors
2123         * buildbot/test/test_changes.py (Sender.tearDown): spin the
2124         reactor once after shutdown, something in certain versions of
2125         Twisted trigger a test failure. 1.3.0 is ok, 2.0.0 fails, 2.0.1pre
2126         fails, svn-trunk is ok.
2128         * buildbot/test/test_slavecommand.py (Shell.testShellZ): add a
2129         second win32 error message
2131         * buildbot/test/test_run.py (Status.testSlave): be smarter about
2132         validating the ETA, so the tests don't fail on slow systems
2134 2005-05-15  Brian Warner  <warner@lothar.com>
2136         * buildbot/status/builder.py (HTMLLogFile): make this behave like
2137         the new LogFile class, so upgrading works properly
2138         (LogFileProducer.resumeProducing): survive resumeProducing after
2139         we've exhausted the chunkGenerator
2141         * buildbot/test/test_web.py (WebTest.test_logfile): validate HTML
2142         logs too
2143         * buildbot/test/test_status.py (Log.testAdd): validate hasContents
2144         (Log.testUpgrade): same
2146         * docs/buildbot.texinfo (Maintenance): describe how to delete old
2147         Builds and logs with a cron job.
2149         * buildbot/status/builder.py (LogFile): revamp LogFiles. Got rid
2150         of the old non-offline LogFile, added code to upgrade these to
2151         new-style contents-live-on-disk instances at load time (in a way
2152         that doesn't invalidate the old Build pickles, so upgrading to
2153         0.6.5 is not a one-way operation). Got rid of everything related
2154         to 'stub' builds.
2155         (LogFile.__init__): create LogFiles with the parent step status,
2156         the log's name, and a builder-relative filename where it can keep
2157         the contents on disk.
2158         (LogFile.hasContents): new method, clients are advised to call it
2159         before getText or getChunks and friends. If it returns False, the
2160         log's contents have been deleted and getText() will raise an
2161         error.
2162         (LogFile.getChunks): made it a generator
2163         (LogFile.subscribeConsumer): new method, takes a Twisted-style
2164         Consumer (except one that takes chunks instead of strings). This
2165         enables streaming of very large logfiles without storing the whole
2166         thing in memory.
2167         (BuildStatus.generateLogfileName): create names like
2168         12-log-compile-output, with a _0 suffix if required to be unique
2169         (BuildStatus.upgradeLogfiles): transform any old-style (from 0.6.4
2170         or earlier) logfiles into new-style ones
2171         (BuilderStatus): remove everything related to 'stub' builds. There
2172         is now only one build cache, and we don't strip logs from old
2173         builds anymore.
2174         (BuilderStatus.getBuildByNumber): check self.currentBuild too,
2175         since we no longer fight to keep it in the cache
2177         * buildbot/status/html.py (TextLog.render_GET): use a
2178         ChunkConsumer to stream the log entries efficiently.
2179         (ChunkConsumer): wrapper which consumes chunks and writes
2180         formatted HTML.
2182         * buildbot/test/test_twisted.py (Parse.testParse): use a
2183         LogFile-like object instead of a real one
2185         * buildbot/test/test_status.py (MyLog): handle new LogFile code
2186         (Log.testMerge3): validate more merge behavior
2187         (Log.testChunks): validate LogFile.getChunks
2188         (Log.testUpgrade): validate old-style LogFile upgrading
2189         (Log.testSubscribe): validate LogFile.subscribe
2190         (Log.testConsumer): validate LogFile.subscribeConsumer
2192         * buildbot/interfaces.py (IStatusLogStub): remove
2193         (IStatusLog.subscribeConsumer): new method
2194         (IStatusLog.hasContents): new method
2195         (IStatusLogConsumer): describes things passed to subscribeConsumer
2197         * buildbot/status/html.py (StepBox.getBox): Don't offer an href to
2198         the log contents if it does not have any contents.
2199         (StatusResourceBuildStep.body): same
2200         (StatusResourceBuildStep.getChild): give a 404 for empty logs
2202 2005-05-14  Brian Warner  <warner@lothar.com>
2204         * buildbot/test/test_web.py (WebTest.test_logfile): add 5-second
2205         timeouts to try and make the windows metabuildslave not hang
2207 2005-05-13  Mike Taylor  <bear@code-bear.com>
2209         * buildbot/slave/commands.py (rmdirRecursive): added a check
2210         to ensure the path passed into rmdirRecursive actually exists.
2211         On win32 a non-existant path would generate an exception.
2213 2005-05-13  Brian Warner  <warner@lothar.com>
2215         * buildbot/slave/commands.py (rmdirRecursive): replacement for
2216         shutil.rmtree which behaves correctly on windows in the face of
2217         files that you have to chmod before deleting. Thanks to Bear at
2218         the OSAF for the routine.
2219         (SourceBase.doClobber): use rmdirRecursive
2221 2005-05-12  Brian Warner  <warner@lothar.com>
2223         * buildbot/status/builder.py (OfflineLogFile.getChunks): have this
2224         method generate chunks instead of returning a big list. This
2225         allows the same method to be used for both old LogFile and new
2226         OfflineLogFile.
2227         (OfflineLogFile.getText): use the generator
2228         (OfflineLogFile.subscribe): same
2229         * buildbot/status/html.py (TextLog.resumeProducing): same
2230         * buildbot/interfaces.py (IStatusLog.getChunks): document it
2232         * buildbot/test/test_web.py (WebTest.test_logfile): Add a test to
2233         point out that OfflineLogFile does not currently work with
2234         html.Waterfall . Fixing this is high-priority.
2236         * buildbot/scripts/runner.py (start): add --logfile=twistd.log, since
2237         apparently windows defaults to using stdout
2239         * buildbot/test/test_slavecommand.py (Shell.testShellZ): log a
2240         better message on failure so I can figure out the win32 problem
2242         * buildbot/slave/commands.py (ShellCommand._startCommand): update
2243         log messages to include more useful copies of the command being
2244         run, the argv array, and the child command's environment.
2245         (Git.doVCFull): update cg-close usage, patch from Brandon Philips.
2247 2005-05-11  Brian Warner  <warner@lothar.com>
2249         * setup.py: oops, install debug.glade so 'buildbot debugclient'
2250         will actually work
2251         * Makefile: update the deb-snapshot version
2253         * docs/buildbot.texinfo: move all .xhtml docs into a new
2254         .texinfo-format document, adding a lot of material in the process.
2255         This is starting to look like a real user's manual. Removed all
2256         the Lore-related files: *.xhtml, *.css, template.tpl .
2257         * docs/Makefile: simple makefile to run 'makeinfo'
2258         * buildbot/scripts/sample.cfg: rearrange slightly
2259         * MANIFEST.in: include .info and .textinfo, don't include *.xhtml
2261 2005-05-10  Brian Warner  <warner@lothar.com>
2263         * buildbot/scripts/runner.py (start): Twisted-1.3.0 used a
2264         different name for the internal twistw module, handle it.
2266         * MANIFEST.in: we deleted plugins.tml, so stop shipping it
2267         * setup.py: .. and stop trying to install it
2269         * buildbot/process/step.py (Git): added support for 'cogito' (aka
2270         'git'), the new linux kernel VC system (http://kernel.org/git/).
2271         Thanks to Brandon Philips for the patch.
2272         * buildbot/slave/commands.py (Git): same
2274 2005-05-06  Brian Warner  <warner@lothar.com>
2276         * buildbot/status/builder.py (OfflineLogFile): replace the default
2277         LogFile with a form that appends its new contents to a disk file
2278         as they arrive. The complete log data is never kept in RAM. This
2279         is the first step towards handling very large (100MB+) logfiles
2280         without choking quite so badly. (The other half is
2281         producer/consumer on the HTML pages).
2282         (BuildStepStatus.addLog): use OfflineLogFile by default
2283         (BuildStatus.getLogfileName): helper code to give the
2284         OfflineLogFile a filename to work with
2286         * buildbot/test/test_status.py (Results.testAddResults): update
2287         tests to handle new asserts
2288         * buildbot/test/test_vc.py (Patch.doPatch): same
2289         * buildbot/test/test_steps.py (BuildStep.setUp): same
2291 2005-05-05  Brian Warner  <warner@lothar.com>
2293         * buildbot/scripts/runner.py (start): if there is no Makefile,
2294         launch the app by importing twistd's internals and calling run(),
2295         rather than spawning a new twistd process. This stands a much
2296         better chance of working under windows.
2297         (stop): kill the process with os.kill instead of spawning
2298         /bin/kill, again to reduce the number of external programs which
2299         windows might not have in the PATH. Also wait up to 5 seconds for
2300         the process to go away, allowing things like 'buildbot stop;
2301         buildbot start' to be reliable in the face of slow shutdowns.
2303         * buildbot/master.py (Dispatcher.__getstate__): remove old
2304         .tap-related methods
2305         (BuildMaster.__getstate__): same
2306         (makeService): same
2307         * buildbot/slave/bot.py (makeService): same
2308         (Options.longdesc): same
2309         * buildbot/scripts/runner.py: copy over some old mktap option text
2311         * buildbot/scripts/runner.py (masterTAC): stop using mktap.
2312         'buildbot master' now creates a buildbot.tac file, so there is no
2313         longer a create-instance/save/reload sequence. mktap is dead, long
2314         live twistd -y.
2315         * buildbot/scripts/sample.mk: use twistd -y, not -f
2316         * buildbot/test/test_config.py: remove mktap-based test
2317         * buildbot/bb_tap.py, buildbot/plugins.tml: delete old files
2318         * README: don't reference mktap
2320         * docs/source.xhtml: document some of the attributes that Changes
2321         might have
2323         * docs/steps.xhtml (Bazaar): document the Bazaar checkout step
2325         * general: merge in Change(tag=) patch from Thomas Vander Stichele.
2326         [org.apestaart@thomas--buildbot/buildbot--cvstag--0-dev--patch-2]
2327         * buildbot/changes/changes.py (Change)
2328         * buildbot/changes/mail.py (parseSyncmail)
2329         * buildbot/test/test_mailparse.py (Test3.getNoPrefix)
2330         (Test3.testMsgS5)
2331         * buildbot/process/base.py (Build.isTagImportant)
2332         (Build.addChange)
2335 2005-05-04  Brian Warner  <warner@lothar.com>
2337         * buildbot/clients/sendchange.py (Sender.send): tear down the PB
2338         connection after sending the change, so that unit tests don't
2339         complain about sockets being left around
2341         * buildbot/status/html.py (WaterfallStatusResource.body): fix
2342         exception in phase=0 rendering
2343         * buildbot/test/test_web.py (WebTest.test_waterfall): test it
2345         * buildbot/changes/dnotify.py (DNotify.__init__): remove debug msg
2347         * buildbot/master.py (BuildMaster.loadConfig): finally remove
2348         deprecated config keys: webPortnum, webPathname, irc, manholePort,
2349         and configuring builders with tuples.
2350         * buildbot/test/test_config.py: stop testing compatibility with
2351         deprecated config keys
2352         * buildbot/test/test_run.py: same
2354 2005-05-03  Brian Warner  <warner@lothar.com>
2356         * contrib/arch_buildbot.py: survive if there are no logfiles
2357         (username): just use a string, os.getlogin isn't reliable
2359         * buildbot/scripts/runner.py (sendchange): oops, fix the command
2360         so 'buildbot sendchange' actually works. The earlier test only
2361         covered the internal (non-reactor-running) form.
2363         * contrib/arch_buildbot.py: utility that can run as an Arch hook
2364         script to notify the buildmaster about changes
2366         * buildbot/scripts/runner.py (sendchange): new command to send a
2367         change to a buildbot.changes.pb.PBChangeSource receiver.
2368         * buildbot/test/test_changes.py (Sender): test it
2370         * buildbot/master.py (BuildMaster.startService): mark .readConfig
2371         after any reading of the config file, not just when we do it in
2372         startService. This makes some tests a bit cleaner.
2374         * buildbot/changes/pb.py: add some log messages
2376         * buildbot/process/base.py (Build.startBuild): fix a bug that
2377         caused an exception when the build terminated in the very first
2378         step.
2379         (Build.stepDone): let steps return a status of EXCEPTION. This
2380         terminates the build right away, and sets the build's overall
2381         status to EXCEPTION too.
2382         * buildbot/process/step.py (BuildStep.failed): return a status of
2383         EXCEPTION when that is what has happened.
2385         * buildbot/process/step.py (Arch.computeSourceRevision): finally
2386         implement this, allowing Arch-based projects to get precise
2387         checkouts instead of always using the latest code
2388         (Bazaar): create variant of Arch to let folks use baz instead of
2389         tla. Requires a new buildslave too.
2390         * buildbot/slave/commands.py (Arch): add 'revision' argument
2391         (Bazaar): create variant of Arch that uses baz instead of tla.
2392         Remove the code that extracts the archive name from the
2393         register-archive output, since baz doesn't provide it, and require
2394         the user provide both the archive name and its location.
2395         * buildbot/test/test_vc.py (VC.testBazaar): added tests
2397 2005-05-02  Brian Warner  <warner@lothar.com>
2399         * buildbot/scripts/sample.cfg: improve docs for c['buildbotURL'],
2400         thanks to Nick Trout.
2402         * buildbot/scripts/runner.py (Maker.makefile): chmod before edit,
2403         deals better with source Makefile coming from a read-only CVS
2404         checkout. Thanks to Nick Trout for the catch.
2406         * buildbot/__init__.py (version): bump to 0.6.4+ while between
2407         releases
2409 2005-04-28  Brian Warner  <warner@lothar.com>
2411         * buildbot/__init__.py (version): Releasing buildbot-0.6.4
2413         * debian/changelog: update for 0.6.4
2415 2005-04-28  Brian Warner  <warner@lothar.com>
2417         * README.w32: add a checklist of steps for getting buildbot
2418         running on windows.
2419         * MANIFEST.in: include it in the tarball
2421         * NEWS: update
2423         * buildbot/master.py (BuildMaster.upgradeToVersion3): deal with
2424         broken .tap files from 0.6.3 by getting rid of .services,
2425         .namedServices, and .change_svc at load time.
2427 2005-04-27  Brian Warner  <warner@lothar.com>
2429         * NEWS: update in preparation for new release
2431         * buildbot/test/test_config.py (Save.testSave): don't pull in
2432         twisted.scripts.twistd, we don't need it and it isn't for windows
2433         anyway.
2435         * buildbot/changes/changes.py (ChangeMaster.saveYourself):
2436         accomodate win32 which can't do atomic-rename
2438 2005-04-27  Brian Warner  <warner@lothar.com>
2440         * buildbot/test/test_run.py (Disconnect.testBuild2): crank up some
2441         timeouts to help the slow metabuildbot not flunk them so much
2442         (Disconnect.testBuild3): same
2443         (Disconnect.testBuild4): same
2444         (Disconnect.testInterrupt): same
2446         * buildbot/master.py (BuildMaster.loadChanges): fix change_svc
2447         setup, it was completely broken for new buildmasters (those which
2448         did not have a 'change.pck' already saved. Thanks to Paul Warren
2449         for catching this (embarrassing!) bug.
2450         (Dispatcher.__getstate__): don't save our registered avatar
2451         factories, since they'll be re-populated when the config file is
2452         re-read.
2453         (BuildMaster.__init__): add a dummy ChangeMaster, used only by
2454         tests (since the real mktap-generated BuildMaster doesn't save
2455         this attribute).
2456         (BuildMaster.__getstate__): don't save any service children,
2457         they'll all be re-populated when the config file is re-read.
2458         * buildbot/test/test_config.py (Save.testSave): test for this
2460 2005-04-26  Brian Warner  <warner@lothar.com>
2462         * buildbot/buildbot.png: use a new, smaller (16x16) icon image,
2463         rendered with Blender.. looks a bit nicer.
2464         * buildbot/docs/images/icon.blend: add the Blender file for it
2466         * buildbot/slave/commands.py (ShellCommand._startCommand): prepend
2467         'cmd.exe' (or rather os.environ['COMSPEC']) to the argv list when
2468         running under windows. This appears to be the best way to allow
2469         BuildSteps to do something normal like 'trial -v buildbot.test' or
2470         'make foo' and still expect it to work. The idea is to make the
2471         BuildSteps look as much like what a developer would type when
2472         compiling or testing the tree by hand. This approach probably has
2473         problems when there are spaces in the arguments, so if you've got
2474         windows buildslaves, you'll need to pay close attention to your
2475         commands.
2477         * buildbot/status/html.py (WaterfallStatusResource.body): add the
2478         timezone to the timestamp column.
2479         * buildbot/test/test_web.py (WebTest.test_waterfall): test it
2481         * buildbot/scripts/runner.py (loadOptions): do something sane for
2482         windows, I think. We use %APPDATA%/buildbot instead of
2483         ~/.buildbot, but we still search everywhere from the current
2484         directory up to the root for a .buildbot/ subdir. The "is it under
2485         $HOME" security test was replaced with "is it owned by the current
2486         user", which is only performed under posix.
2487         * buildbot/test/test_runner.py (Options.testFindOptions): update
2488         tests to match. The "is it owned by the current user" check is
2489         untested. The test has been re-enabled for windows.
2491         * buildbot/test/test_slavecommand.py (Shell.checkOutput): replace
2492         any "\n" in the expected output with the platform-specific line
2493         separator. Make this separator "\r\n" on PTYs under unix, they
2494         seem to do that and I don't know why
2496         * buildbot/test/test_runner.py (Options.optionsFile): disable on
2497         windows for now, I don't know what ~/.buildbot/ should mean there.
2499         * buildbot/test/test_run.py (BuilderNames.testGetBuilderNames):
2500         win32 compatibility, don't use "/tmp"
2501         (Basedir.testChangeBuilddir): remove more unixisms
2503 2005-04-26  Brian Warner  <warner@lothar.com>
2505         * buildbot/test/test_control.py (Force.rmtree): python2.2
2506         compatibility, apparently its shutil.rmtree ignore_errors=
2507         argument is ignored.
2508         * buildbot/test/test_run.py (Run.rmtree): same
2509         (RunMixin.setUp): same
2511         * buildbot/test/test_runner.py (make): python2.2 has os.sep but
2512         not os.path.sep
2514         * buildbot/test/test_twisted.py (Parse.failUnlessIn): 2.2 has no
2515         'substring in string' operator, must use string.find(substr)!=-1
2516         * buildbot/test/test_vc.py (Patch.failUnlessIn): same
2517         * buildbot/test/test_web.py (WebTest.failUnlessIn): same
2519         * buildbot/scripts/runner.py (loadOptions): add code to search for
2520         ~/.buildbot/, a directory with things like 'options', containing
2521         defaults for various 'buildbot' subcommands. .buildbot/ can be in
2522         the current directory, your $HOME directory, or anywhere
2523         inbetween, as long as you're somewhere inside your home directory.
2524         (debugclient): look in ~/.buildbot/options for master and passwd
2525         (statuslog): look in ~/.buildbot/options for 'masterstatus'
2526         * buildbot/test/test_runner.py (Options.testFindOptions): test it
2528         * buildbot/status/client.py (makeRemote): new approach to making
2529         IRemote(None) be None, which works under Twisted-2.0
2530         * buildbot/test/test_status.py (Client.testAdaptation): test it
2532         * buildbot/status/builder.py (Status.builderAdded): when loading a
2533         pickled BuilderStatus in from disk, set its name after loading.
2534         The config file might have changed its name (but not its
2535         directory) while it wasn't looking.
2536         
2537         * buildbot/process/builder.py (Builder.attached): always return a
2538         Deferred, even if the builder was already attached
2539         * buildbot/test/test_run.py (Basedir.testChangeBuilddir): test it
2541 2005-04-25  Brian Warner  <warner@lothar.com>
2543         * buildbot/status/words.py (IrcStatusBot.buildFinished): fix a
2544         category-related exception when announcing a build has finished
2546         * buildbot/status/html.py (StatusResourceChanges.body): oops, don't
2547         reference no-longer-existent changemaster.sources
2548         * buildbot/test/test_web.py (WebTest.test_waterfall): test for it
2550         * buildbot/__init__.py (version): bump to 0.6.3+ while between
2551         releases
2553 2005-04-25  Brian Warner  <warner@lothar.com>
2555         * buildbot/__init__.py (version): Releasing buildbot-0.6.3
2557         * debian/changelog: update for 0.6.3
2559 2005-04-25  Brian Warner  <warner@lothar.com>
2561         * MANIFEST.in: make sure debug.glade is in the tarball
2563         * README (REQUIREMENTS): list necessary Twisted-2.0 packages
2565         * NEWS: update for the imminent 0.6.3 release
2567         * buildbot/status/html.py (HtmlResource.content): make the
2568         stylesheet <link> always point at "buildbot.css".
2569         (StatusResource.getChild): map "buildbot.css" to a static.File
2570         containing whatever css= argument was provided to Waterfall()
2571         (Waterfall): provide the "classic" css as the default.
2572         * docs/waterfall.classic.css: move default CSS from here ..
2573         * buildbot/status/classic.css: .. to here
2575         * MANIFEST.in: make sure classic.css is included in the tarball
2576         * setup.py: and that it is installed too, under buildbot/status/
2578         * buildbot/master.py (BuildMaster): oops, set .change_svc=None at
2579         the module level, because buildbot.tap files from 0.6.2 don't have
2580         it in their attribute dictionary.
2582         * buildbot/slave/bot.py (Bot.startService): make sure the basedir
2583         really exists at startup, might save some confusion somewhere.
2585 2005-04-24  Thomas Vander Stichele  <thomas at apestaart dot org>
2587         * docs/waterfall.classic.css:
2588           add a stylesheet that's almost the same as the "classic"
2589           buildbot style
2591         * buildbot/status/builder.py:
2592           add EXCEPTION as a result - this is a problem for the bot
2593           maintainer, not a build problem for the changers
2594         * buildbot/process/step.py:
2595           use EXCEPTION instead of FAILURE for exceptions
2596         * buildbot/status/html.py:
2597           add build_get_class to get a class out of a build/buildstep
2598           finish naming the classes
2599           split out sourceNames to changeNames and builderNames so we
2600           can style them separately
2601         * docs/config.xhtml:
2602           finish documenting classes as they are right now
2604         * buildbot/status/html.py:
2605           name the classes as we agreed on IRC
2606         * docs/config.xhtml:
2607           and document them
2609         * buildbot/status/html.py:
2610           same for cssclass->class_
2612         * buildbot/status/html.py:
2613           as decided on IRC, use class_ for the "class" attribute to not
2614           conflict with the class keyword, and clean up the messy **{} stuff.
2616         * buildbot/status/mail.py:
2617           put back "builders" argument, and fix docstring, because the
2618           code *ignores* builders listed in this argument
2620         * buildbot/process/builder.py:
2621           remove FIXME notes - category is now indeed a cvar of BuilderStatus
2623         * docs/config.xhtml:
2624           describe the category argument for builders
2626         * buildbot/status/builder.py:
2627           Fix a silly bug due to merging
2629         * buildbot/process/builder.py:
2630           remove category from the process Builder ...
2631         * buildbot/status/builder.py:
2632           ... and add it to BuilderStatus instead.
2633           Set category on unpickled builder statuses, they might not have it.
2634         * buildbot/master.py:
2635           include category when doing builderAdded
2636         * buildbot/status/mail.py:
2637           return None instead of self for builders we are not interested in.
2638         * buildbot/test/test_run.py:
2639           fix a bug due to only doing deferredResult on "dummy" waiting
2640         * buildbot/test/test_status.py:
2641           add checks for the Mail IStatusReceiver returning None or self
2643         * buildbot/status/html.py:
2644           fix testsuite by prefixing page title with BuildBot
2646         * buildbot/status/builder.py:
2647           have .category in builder status ...
2648         * buildbot/process/builder.py:
2649           ... and set it from Builder
2650         * buildbot/status/html.py:
2651           make .css a class variable 
2652         * buildbot/test/test_status.py:
2653           write more tests to cover our categories stuff ...
2654         * buildbot/status/mail.py:
2655           ... and fix the bug that this uncovered
2657         * buildbot/changes/mail.py:
2658         * buildbot/changes/pb.py:
2659         * buildbot/master.py:
2660         * buildbot/process/base.py:
2661         * buildbot/process/factory.py:
2662         * buildbot/process/interlock.py:
2663         * buildbot/process/step.py:
2664         * buildbot/process/step_twisted.py:
2665         * buildbot/slave/commands.py:
2666         * buildbot/status/builder.py:
2667         * buildbot/status/client.py:
2668         * buildbot/status/html.py:
2669         * buildbot/status/mail.py:
2670         * buildbot/status/progress.py:
2671         * buildbot/test/test_changes.py:
2672         * buildbot/test/test_config.py:
2673         * buildbot/test/test_control.py:
2674         * buildbot/test/test_interlock.py:
2675         * buildbot/test/test_maildir.py:
2676         * buildbot/test/test_mailparse.py:
2677         * buildbot/test/test_run.py:
2678         * buildbot/test/test_slavecommand.py:
2679         * buildbot/test/test_status.py:
2680         * buildbot/test/test_steps.py:
2681         * buildbot/test/test_twisted.py:
2682         * buildbot/test/test_util.py:
2683         * buildbot/test/test_vc.py:
2684         * buildbot/test/test_web.py:
2685         * buildbot/util.py:
2686           add test-case-name at the top of a whole set of files
2688         * buildbot/status/builder.py:
2689           keep order of addition when getting builder names
2690         * buildbot/status/words.py:
2691         * buildbot/test/test_run.py:
2692           add test for getBuilderNames
2694         * buildbot/process/base.py:
2695         * buildbot/process/step.py:
2696         * buildbot/status/builder.py:
2697         * buildbot/status/html.py:
2698           make buildbot css-able
2699           replace the color code for purple with purple, don't understand
2700           why it wasn't purple to start with
2702         * buildbot/status/words.py:
2703           ok, so it doesn't look like BuilderStatus.remote is still valid.
2704           Use what waterfall uses instead.
2706         * buildbot/interfaces.py:
2707         * buildbot/status/builder.py:
2708         * buildbot/status/html.py:
2709         * buildbot/status/mail.py:
2710         * buildbot/status/words.py:
2711         * buildbot/test/test_run.py:
2712           use categories everywhere and make it be a list.  More sensible
2713           for the future.  Also make words actually respect this in
2714           buildFinished.
2716         * buildbot/interfaces.py:
2717           add category argument to getBuilderNames
2718         * buildbot/process/builder.py:
2719         * buildbot/status/builder.py:
2720         * buildbot/status/html.py:
2721         * buildbot/status/mail.py:
2722         * buildbot/status/words.py:
2723         * buildbot/test/test_run.py:
2724           move from specifying builders by name to specifying the category
2726         * buildbot/status/html.py:
2727         * buildbot/status/words.py:
2728           add "builders=" to __init__ of status clients so they can
2729           limit themselves to the given list of builders to report on
2731         * buildbot/status/html.py: set the title to the product name
2733 2005-04-23  Thomas Vander Stichele  <thomas at apestaart dot org>
2735         * buildbot/interfaces.py:
2736         * buildbot/status/builder.py:
2737           more documentation.  Hm, not sure if ChangeLog entries make sense
2738           here...
2740 2005-04-23  Brian Warner  <warner@lothar.com>
2742         * buildbot/test/test_vc.py (SetupMixin.do_vc): increase timeouts
2744         * buildbot/test/test_slavecommand.py (Shell): increase timeouts
2746         * buildbot/scripts/runner.py: make 'statuslog' and 'statusgui' be
2747         the sub-commands that log buildmaster status to stdout and to a
2748         GUI window, respectively.
2750         * buildbot/clients/gtkPanes.py: overhaul. basic two-row
2751         functionality is working again, but all the step-status and ETA
2752         stuff is missing. Commented out a lot of code pending more
2753         overhaul work.
2755         * buildbot/status/client.py: make sure that IRemote(None) is None
2757         * buildbot/changes/changes.py: import defer, oops
2758         (ChangeMaster): remove the .sources list, rely upon the fact that
2759         MultiServices can be treated as sequences of their children. This
2760         cleans up the add/remove ChangeSource routines a lot, as we keep
2761         exactly one list of the current sources instead of three.
2763         * buildbot/master.py (BuildMaster.__init__): remove .sources, set
2764         up an empty ChangeMaster at init time.
2765         (BuildMaster.loadChanges): if there are changes to be had from
2766         disk, replace self.change_svc with the new ones. If not, keep
2767         using the empty ChangeMaster set up in __init__.
2768         (BuildMaster.loadConfig_Sources): use list(self.change_svc)
2769         instead of a separate list, makes the code a bit cleaner.
2770         * buildbot/test/test_config.py (ConfigTest.testSimple): match it
2771         (ConfigTest.testSources): same, also wait for loadConfig to finish.
2772         Extend the test to make sure we can get rid of the sources when
2773         we're done.
2775 2005-04-22  Brian Warner  <warner@lothar.com>
2777         * buildbot/scripts/runner.py (Maker.mkinfo): create the info/admin
2778         and info/host files when making the slave directory
2780         * buildbot/test/test_run.py (RunMixin.shutdownSlave): remove the
2781         whendone= argument, just return the Deferred and let the caller do
2782         what they want with it.
2783         (Disconnect.testBuild1): wait for shutdownSlave
2784         (Basedir.testChangeBuilddir): new test to make sure changes to the
2785         builddir actually get propagated to the slave
2787         * buildbot/slave/bot.py (SlaveBuilder.setBuilddir): use an
2788         explicit method, rather than passing the builddir in __init__ .
2789         Make sure to update self.basedir too, this was broken before.
2790         (Bot.remote_setBuilderList): use b.setBuilddir for both new
2791         builders and for ones that have just had their builddir changed.
2792         (BotFactory): add a class-level .perspective attribute, so
2793         BuildSlave.waitUntilDisconnected won't get upset when the
2794         connection hasn't yet been established
2795         (BuildSlave.__init__): keep track of the bot.Bot instance, so
2796         tests can reach through it to inspect the SlaveBuilders
2798         * buildbot/process/base.py (Build.buildException): explain the
2799         log.err with a log.msg
2800         * buildbot/process/builder.py (Builder.startBuild): same
2801         (Builder._startBuildFailed): improve error message
2803         * buildbot/pbutil.py (RBCP.failedToGetPerspective): if the failure
2804         occurred because we lost the brand-new connection, retry instead
2805         of giving up. If not, it's probably an authorization failure, and
2806         it makes sense to stop trying. Make sure we log.msg the reason
2807         that we're log.err'ing the failure, otherwise test failures are
2808         really hard to figure out.
2810         * buildbot/master.py: change loadConfig() to return a Deferred
2811         that doesn't fire until the change has been fully implemented.
2812         This means any connected slaves have been updated with the new
2813         builddir. This change makes it easier to test the code which
2814         actually implements this builddir-updating.
2815         (BotPerspective.addBuilder): return Deferred
2816         (BotPerspective.removeBuilder): same
2817         (BotPerspective.attached): same
2818         (BotPerspective._attached): same. finish with remote_print before
2819         starting the getSlaveInfo, instead of doing them in parallel
2820         (BotPerspective.list_done): same
2821         (BotMaster.removeSlave): same. Fix the typo that meant we weren't
2822         actually calling slave.disconnect()
2823         (BotMaster.addBuilder): same
2824         (BotMaster.removeBuilder): same
2825         (BuildMaster.loadConfig): same
2826         (BuildMaster.loadConfig_Slaves): same
2827         (BuildMaster.loadConfig_Sources): same
2828         (BuildMaster.loadConfig_Builders): same
2829         (BuildMaster.loadConfig_status): same
2831         * buildbot/changes/changes.py (ChangeMaster.removeSource): return
2832         a Deferred that fires when the source is finally removed
2834         * buildbot/slave/commands.py (SourceBase.doClobber): when removing
2835         the previous tree on win32, where we have to do it synchronously,
2836         make sure we return a Deferred anyway.
2837         (SourceBase.doCopy): same
2839         * buildbot/scripts/runner.py (statusgui): use the text client for
2840         now, while I rewrite the Gtk one
2841         * buildbot/clients/base.py: strip out old code, leaving just the
2842         basic print-message-on-event functionality. I also remove the
2843         ReconnectingPBClientFactory, but it does at least quit when it
2844         loses the connection instead of going silent
2846 2005-04-21  Brian Warner  <warner@lothar.com>
2848         * Makefile: minor tweaks
2850         * NEWS: point out deprecation warnings, new features for
2851         /usr/bin/buildbot
2853         * buildbot/master.py (BuildMaster.loadConfig): emit
2854         DeprecationWarnings for Builders defined with tuples. Rearrange
2855         code to facility removal of deprecated configuration keys in the
2856         next release.
2858         * buildbot/scripts/runner.py (createMaster,createSlave): rewrite
2859         'buildbot' command to put a little Makefile in the target that
2860         helps you re-create the buildbot.tap file, start or stop the
2861         master/slave, and reconfigure (i.e. SIGHUP) the master. Also chmod
2862         all the files 0600, since they contain passwords.
2863         (start): if there is a Makefile, and /usr/bin/make exists, use
2864         'make start' in preference to a raw twistd command. This lets
2865         slave admins put things like PYTHONPATH variables in their
2866         Makefiles and have them still work when the slave is started with
2867         'buildbot start ~/slave/foo'. The test is a bit clunky, it would
2868         be nice to first try the 'make' command and only fall back to
2869         twistd if it fails. TODO: the Makefile's "start" command does not
2870         add the --reactor=win32 argument when running under windows.
2871         (Options.debugclient, Options.statusgui): add sub-commands to launch
2872         the debug client (formerly in contrib/debugclient.py) and the
2873         Gtk status application (currently broken)
2874         * buildbot/clients/debug.py: move from contrib/debugclient.py
2875         * buildbot/clients/debug.glade: same
2877         * buildbot/test/test_trial.py: remove it. This requires some
2878         functionality out of Twisted that isn't there yet, and until then
2879         having it around just confuses things.
2881         * buildbot/test/test_slavecommand.py (Shell): test both with and
2882         without PTYs, and make sure that command output is properly
2883         interleaved in the with-PTY case. I think the without-PTY test
2884         should pass on windows, where we never use PTYs anyway.
2886 2005-04-20  Brian Warner  <warner@lothar.com>
2888         * README (REQUIREMENTS): mention Twisted-2.0.0 compatibility
2890         * MANIFEST.in: add epyrun, gen-reference, buildbot.png
2892         * NEWS: start creating entries for the next release
2894         * buildbot/slave/commands.py (ShellCommand.__init__): use os.pathsep
2896         * buildbot/test/test_web.py (WebTest.test_webPortnum): add timeout
2897         (WebTest.test_webPathname): same
2898         (WebTest.test_webPathname_port): same
2899         (WebTest.test_waterfall): use the default favicon rather than
2900         rooting around the filesystem for it. Open the expected-icon file
2901         in binary mode, to make win32 tests happier (thanks to Nick Trout
2902         for the catch)
2903         * buildbot/status/html.py (buildbot_icon): win32 portability
2905         * buildbot/test/test_slavecommand.py (SlaveCommandTestCase.testShellZ):
2906         win32-compatibility fixes from Nick Trout, the "file not found" message
2907         is different under windows
2908         (FakeSlaveBuilder.__init__): clean up setup a bit
2909         * buildbot/test/test_vc.py (VCSupport.__init__): win32: use os.pathsep
2911 2005-04-19  Brian Warner  <warner@lothar.com>
2913         * buildbot/test/test_vc.py (SetupMixin.setUpClass): fix the
2914         skip-if-repositories-are-unavailable test to not kill the trial
2915         that comes with Twisted-1.3.0
2917         * setup.py: install buildbot.png icon file when installing code
2919         * buildbot/slave/commands.py (ShellCommand._startCommand): log the
2920         environment used by the command, at least on the child side.
2922         * buildbot/status/html.py (TextLog.pauseProducing): add a note,
2923         this method needs to be added and implemented because it gets
2924         called under heavy load. I don't quite understand the
2925         producer/consumer API enough to write it.
2926         (StatusResource.getChild): add a resource for /favicon.ico
2927         (Waterfall.__init__): add favicon= argument
2928         * buildbot/test/test_web.py (WebTest.test_waterfall): test it
2929         (WebTest.test_webPortnum): stop using deprecated 'webPortnum'
2930         (WebTest.test_webPathname): same
2931         (WebTest.test_webPathname_port): same
2932         * docs/config.xhtml: mention favicon=
2933         * buildbot/buildbot.png: add a default icon, dorky as it is
2935 2005-04-18  Thomas Vander Stichele  <thomas at apestaart dot org>
2937         * buildbot/master.py:
2938         * buildbot/process/base.py:
2939         * buildbot/process/builder.py:
2940         * buildbot/process/interlock.py:
2941         * buildbot/status/builder.py:
2942         * buildbot/status/html.py:
2943         * buildbot/status/mail.py:
2944         * buildbot/status/words.py:
2945           new documentation while digging through the code
2947 2005-04-17  Brian Warner  <warner@lothar.com>
2949         * general: try to fix file modes on all .py files: a+r, a-x,
2950         but let buildbot/clients/*.py be +x since they're tools
2952         * docs/epyrun (addMod): when an import fails, say why
2954         * Makefile: Add a 'docs' target, hack on the PYTHONPATH stuff
2956 2005-04-17  Thomas Vander Stichele  <thomas at apestaart dot org>
2958         * buildbot/process/base.py:
2959         * buildbot/process/builder.py:
2960         * buildbot/status/builder.py:
2961           new documentation while digging through the code
2963 2005-04-17  Thomas Vander Stichele  <thomas at apestaart dot org>
2965         * buildbot/changes/changes.py:
2966         * buildbot/changes/p4poller.py:
2967         * buildbot/interfaces.py:
2968         * buildbot/process/base.py:
2969         * buildbot/process/builder.py:
2970         * buildbot/process/step.py:
2971         * buildbot/process/step_twisted.py:
2972         * buildbot/slave/bot.py:
2973         * buildbot/slave/commands.py:
2974         * buildbot/status/builder.py:
2975           fix all docstrings to make epydoc happy.  In the process of fixing
2976           some, I also moved pieces of docs, and removed some deprecated
2977           documentation
2979 2005-04-17  Thomas Vander Stichele  <thomas at apestaart dot org>
2981         * buildbot/process/builder.py:
2982         * buildbot/process/interlock.py:
2983         * buildbot/process/process_twisted.py:
2984         * buildbot/process/step.py:
2985           BuildProcess -> Build, as it looks like that's what happened
2986         * buildbot/process/base.py:
2987         * buildbot/process/factory.py:
2988           update epydoc stuff
2990 2005-04-17  Brian Warner  <warner@lothar.com>
2992         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
2993         update compile command to accomodate the Twisted split.. now
2994         instead of './setup.py build_ext -i', you do './setup.py all
2995         build_ext -i', to run build_ext over all sub-projects.
2996         (FullTwistedBuildFactory): same
2997         (TwistedReactorsBuildFactory): same
2999         * buildbot/status/html.py (TextLog.finished): null out self.req
3000         when we're done, otherwise the reference cycle of TextLog to .req
3001         to .notifications to a Deferred to TextLog.stop keeps them from
3002         being collected, and consumes a huge (610MB on pyramid at last
3003         check) amount of memory.
3005 2005-04-11  Brian Warner  <warner@lothar.com>
3007         * buildbot/test/test_vc.py (VCSupport.__init__): use abspath() to
3008         normalize the VC-repository location.. makes SVN happier with
3009         certain test environments.
3011         * buildbot/process/step.py (RemoteShellCommand.__init__): let each
3012         RemoteShellCommand gets its own .env dictionary, so that code in
3013         start() doesn't mutate the original. I think this should fix the
3014         step_twisted.Trial problem where multiple identical components
3015         kept getting added to PYTHONPATH= over and over again.
3017         * general: merge org.apestaart@thomas/buildbot--doc--0--patch-3,
3018         adding epydoc-format docstrings to many classes. Thanks to Thomas
3019         Vander Stichele for the patches.
3020         * docs/epyrun, docs/gen-reference: add epydoc-generating tools
3021         * buildbot/status/mail.py, buildbot/process/step_twisted.py: same
3022         * buildbot/slave/bot.py, commands.py, registry.py: same
3024 2005-04-05  Brian Warner  <warner@lothar.com>
3026         * buildbot/slave/commands.py (SourceBase.doCopy): use cp -p to
3027         preserve timestamps, helps incremental builds of large trees.
3028         Patch from Rene Rivera.
3030         * buildbot/slave/bot.py (SlaveBuilder.commandComplete): oops, log
3031         'failure' and not the non-existent 'why'. Thanks to Rene Rivera
3032         for the catch.
3034 2005-04-03  Brian Warner  <warner@lothar.com>
3036         * buildbot/master.py (BuildMaster.loadConfig): only call exec()
3037         with one dict, apparently exec has some scoping bugs when used
3038         with both global/local dicts. Thanks to Nathaniel Smith for the
3039         catch.
3041 2005-04-02  Brian Warner  <warner@lothar.com>
3043         * buildbot/process/step_twisted.py (countFailedTests): the new
3044         trial in Twisted-2.0 emits a slightly different status line than
3045         old trial ("PASSED.." instead of "OK.."). Handle it so we don't
3046         mistakenly think the test count is unparseable.
3047         (Trial.start): note that for some reason each build causes another
3048         copy of self.testpath to be prepended to PYTHONPATH. This needs to
3049         be fixed but I'm not sure quite where the problem is.
3051 2005-04-01  Brian Warner  <warner@lothar.com>
3053         * buildbot/test/test_run.py (Run.testMaster): change some uses of
3054         deferredResult to avoid hangs/warnings under twisted-2.0
3055         (RunMixin.tearDown): same
3056         (RunMixin.shutdownSlave): same
3057         (Disconnect.testIdle1): same
3058         (Disconnect.testBuild2): same: wait one second after the build
3059         finishes for test to really be done.. this should be cleaned up to
3060         avoid wasting that second. Builder.detach uses a callLater(0),
3061         either that should be done in-line (something else needed that
3062         behavior), or it should return a Deferred that fires when the
3063         builder is really offline.
3064         (Disconnect.testBuild3): same
3065         (Disconnect.testDisappear): same
3067         * buildbot/test/test_web.py: rearrange server-setup and teardown
3068         code to remove unclean-reactor warnings from twisted-2.0
3070         * buildbot/test/test_vc.py: rearrange probe-for-VC-program routine
3071         so the tests don't hang under twisted-2.0
3073 2005-03-31  Brian Warner  <warner@lothar.com>
3075         * buildbot/slave/bot.py (Bot.remote_setBuilderList): fix typo that
3076         caused a warning each time the master changed our set of builders
3078         * buildbot/status/builder.py (BuildStatus.saveYourself): under
3079         w32, don't unlink the file unless it already exists. Thanks to
3080         Baptiste Lepilleur for the catch.
3081         (BuilderStatus.saveYourself): same
3083 2005-02-01  Brian Warner  <warner@lothar.com>
3085         * buildbot/status/html.py (TextLog.getChild): use a /text child
3086         URL, such as http://foo.com/svn-hello/builds/1/test/0/text instead
3087         of http://foo.com/svn-hello/builds/1/test/0 , to retrieve the
3088         logfile as text/plain (no markup, no headers). This replaces the
3089         previous scheme (which used an ?text=1 argument), and gets us back
3090         to a relative link (which works better when the buildbot lives
3091         behind another web server, such as Apache configured as a reverse
3092         proxy). Thanks to Gerald Combs for spotting the problem.
3094         * buildbot/__init__.py (version): bump to 0.6.2+ while between
3095         releases
3097 2004-12-13  Brian Warner  <warner@lothar.com>
3099         * buildbot/__init__.py (version): Releasing buildbot-0.6.2
3101         * debian/changelog: update for 0.6.2
3102         * NEWS: finalize for 0.6.2
3104 2004-12-11  Brian Warner  <warner@lothar.com>
3106         * NEWS: bring it up to date
3108         * buildbot/slave/bot.py (BotFactory): revamp keepalive/lost-master
3109         detection code. Require some sign of life from the buildmaster
3110         every BotFactory.keepaliveInterval seconds. Provoke this
3111         indication at BotFactory.keepaliveTimeout seconds before the
3112         deadline by sending a keepalive request. We don't actually care if
3113         that request is answered in a timely fashion, what we care about
3114         is that .activity() is called before the deadline. .activity() is
3115         triggered by any PB message from the master (including an ack to
3116         one of the slave's status-update messages). With this new scheme,
3117         large status messages over slow pipes are OK, as long as any given
3118         message can be sent (and thus acked) within .keepaliveTimeout
3119         seconds (which defaults to 30).
3120         (SlaveBuilder.remote_startCommand): record activity
3121         (SlaveBuilder.ackUpdate): same
3122         (SlaveBuilder.ackComplete): same
3123         (BotFactory.gotPerspective): same
3124         * buildbot/test/test_run.py (Disconnect.testSlaveTimeout): test it
3126 2004-12-09  Brian Warner  <warner@lothar.com>
3128         * buildbot/status/html.py (StatusResourceBuilder.getChild): remove
3129         debug message
3131         * buildbot/process/step_twisted.py (Trial._commandComplete):
3132         update self.cmd when we start the 'cat test.log' transfer. Without
3133         this, we cannot interrupt the correct RemoteCommand when we lose
3134         the connection.
3136         * buildbot/process/step.py (RemoteCommand.interrupt): don't bother
3137         trying to tell the slave to stop the command if we're already
3138         inactive, or if we no longer have a .remote
3140         * buildbot/process/builder.py (Builder._detached): don't let an
3141         exception in currentBuild.stopBuild() prevent the builder from
3142         being marked offline
3144 2004-12-07  Brian Warner  <warner@lothar.com>
3146         * buildbot/status/words.py (IrcStatusBot.getBuilder): catch the
3147         KeyError that happens when you ask for a non-existent Builder, and
3148         translate it into a UsageError.
3150         * buildbot/test/test_run.py (Disconnect.testBuild4): validate that
3151         losing the slave in the middle of a remote step is handled too
3153         * buildbot/process/step.py (ShellCommand.interrupt): 'reason' can
3154         be a Failure, so be sure to stringify it before using it as the
3155         contents of the 'interrupt' logfile
3156         (RemoteCommand.interrupt): use stringified 'why' in
3157         remote_interruptCommand too, just in case
3159 2004-12-06  Brian Warner  <warner@lothar.com>
3161         * buildbot/slave/commands.py (Arch.doVCUpdate): use 'tla replay'
3162         instead of 'tla update', which is more efficient in case we've
3163         missed a couple of patches since the last update.
3165         * debian/changelog: update for previous (0.6.1) release. Obviously
3166         this needs to be handled better.
3168 2004-12-05  Brian Warner  <warner@lothar.com>
3170         * NEWS: update for stuff since last release
3172         * buildbot/master.py (DebugPerspective.attached): return 'self', to
3173         match the maybeDeferred change in Dispatcher.requestAvatar
3174         * buildbot/changes/pb.py (ChangePerspective.attached): same
3175         * buildbot/status/client.py (StatusClientPerspective.attached): same
3176         * buildbot/process/builder.py (Builder._attached3): same
3177         * buildbot/pbutil.py (NewCredPerspective.attached): same
3179         * buildbot/status/html.py (WaterfallStatusResource.phase2): Add
3180         the date to the top-most box, if it is not the same as today's
3181         date.
3183         * docs/slave.xhtml: provide a buildslave setup checklist
3185         * docs/source.xhtml (Arch): correct terminology
3187 2004-12-04  Brian Warner  <warner@lothar.com>
3189         * buildbot/test/test_slavecommand.py: use sys.executable instead
3190         of hard-coding 'python' for child commands, might help portability
3192         * docs/examples/twisted_master.cfg: update to current usage
3194         * buildbot/status/words.py (IrcStatusBot.command_STOP): add a
3195         'stop build' command to the IRC bot
3197         * buildbot/master.py (Dispatcher.requestAvatar): remove debug
3198         message that broke PBChangeSource
3200         * buildbot/slave/bot.py: clean up shutdown/lose-master code
3201         (SlaveBuilder): make some attributes class-level, remove the old
3202         "update queue" which existed to support resuming a build after the
3203         master connection was lost. Try to reimplement that feature later.
3204         (SlaveBuilder.stopCommand): clear self.command when the
3205         SlaveCommand finishes, so that we don't try to kill a leftover one
3206         at shutdown time.
3207         (SlaveBuilder.commandComplete): same, merge with commandFailed and
3208         .finishCommand
3210         * buildbot/slave/commands.py (SourceBase): set self.command for
3211         all VC commands, so they can be interrupted.
3213 2004-12-03  Brian Warner  <warner@lothar.com>
3215         * buildbot/master.py: clean up slave-handling code, to handle
3216         slave-disconnect and multiple-connect better
3217         (BotPerspective): make these long-lasting, exactly one per bot
3218         listed in the config file.
3219         (BotPerspective.attached): if a slave connects while an existing
3220         one appears to still be connected, disconnect the old one first.
3221         (BotPerspective.disconnect): new method to forcibly disconnect a
3222         buildslave. Use some hacks to empty the transmit buffer quickly to
3223         avoid the long (20-min?) TCP timeout that could occur if the old
3224         slave has dropped off the net.
3225         (BotMaster): Keep persistent BotPerspectives in .slaves, let them
3226         own their own SlaveStatus objects. Remove .attached/.detached, add
3227         .addSlave/.removeSlave, treat slaves like Builders (config file
3228         parsing sends deltas to the BotMaster). Inform the slave
3229         instances, i.e. the BotPerspective, about addBuilder and
3230         removeBuilder.
3231         (BotMaster.getPerspective): turns into a single dict lookup
3232         (Dispatcher.requestAvatar): allow .attached to return a Deferred,
3233         which gives BotPerspective.attached a chance to disconnect the old
3234         slave first.
3235         (BuildMaster.loadConfig): add code (disabled) to validate that all
3236         builders use known slaves (listed in c['bots']). The check won't
3237         work with tuple-specified builders, which are deprecated but not
3238         yet invalid, so the check is disabled for now.
3239         (BuildMaster.loadConfig_Slaves): move slave-config into a separate
3240         routine, do the add/changed/removed dance with them like we do
3241         with builders.
3242         (BuildMaster.loadConfig_Sources): move source-config into a
3243         separate routine too
3245         * buildbot/status/builder.py (Status.getSlave): get the
3246         SlaveStatus object from the BotPerspective, not the BotMaster.
3248         * buildbot/test/test_run.py: bunch of new tests for losing the
3249         buildslave at various points in the build, handling a slave that
3250         connects multiple times, and making sure we can interrupt a
3251         running build
3253         * buildbot/slave/bot.py (BuildSlave): make it possible to use
3254         something other than 'Bot' for the Bot object, to make certain
3255         test cases easier to write.
3256         (BuildSlave.waitUntilDisconnected): utility method for testing
3258 2004-11-30  Brian Warner  <warner@lothar.com>
3260         * buildbot/test/test_run.py (RunMixin): refactor, remove debug msg
3262         * buildbot/interfaces.py (IBuilderControl.ping): add timeout=
3263         argument, return a Deferred that always fires with True or False.
3264         I don't use an errback to indicate 'ping failed' so that callers
3265         are free to ignore the deferred without causing spurious errors in
3266         the logs.
3267         * buildbot/process/builder.py (BuilderControl.ping): implement it
3269         * buildbot/test/test_run.py (Status.testDisappear): test ping
3270         (Status.disappearSlave): fix it
3272 2004-11-30  Brian Warner  <warner@lothar.com>
3274         * buildbot/interfaces.py (IBuildControl): add .stopBuild
3275         (IBuilderControl): add .getBuild(num), only works for the current
3276         build, of course, although it might be interesting to offer
3277         something for builds in the .waiting or .interlocked state.
3279         * buildbot/process/base.py (Build): have .stopBuild just do the
3280         interrupt, then let the build die by itself.
3281         (BuildControl): add .stopBuild, and add a point-event named
3282         'interrupt' just after the build so status viewers can tell that
3283         someone killed it.
3284         (BuilderControl): add .getBuild
3286         * buildbot/process/step.py (Dummy): use haltOnFailure so it really
3287         stops when you kill it, good for testing
3288         (ShellCommand.interrupt): add a logfile named 'interrupt' which
3289         contains the 'reason' text.
3291         * buildbot/status/html.py: Add Stop Build button, if the build can
3292         still be stopped. Send a Redirect (to the top page) one second
3293         later, hopefully long enough for the interrupt to have an effect.
3294         Move make_row() up to top-level to share it between Stop Build and
3295         Force Build.
3297         * buildbot/slave/commands.py: only kill the child process once
3299         * buildbot/test/test_run.py: add testInterrupt
3301 2004-11-29  Brian Warner  <warner@lothar.com>
3303         * buildbot/process/base.py: Refactor command interruption. The
3304         Build is now responsible for noticing that the slave has gone
3305         away: Build.lostRemote() interrupts the current step and makes
3306         sure that no further ones will be started.
3307         
3308         * buildbot/process/builder.py: When the initial remote_startBuild
3309         message fails, log it: this usually indicates that the slave has
3310         gone away, but we don't really start paying attention until they
3311         fail to respond to the first step's command.
3313         * buildbot/process/step.py (RemoteCommand): Does *not* watch for
3314         slave disconnect. Now sports a new interrupt() method. Error
3315         handling was simplified a lot by chaining deferreds, so
3316         remoteFailed/remoteComplete were merged into a single
3317         remoteComplete method (which can now get a Failure object).
3318         Likewise failed/finished were merged into just _finished.
3319         (BuildStep): Add interrupt(why) method, and if why is a
3320         ConnectionLost Failure then the step is failed with some useful
3321         error text.
3323         * buildbot/slave/bot.py: stop the current command when the remote
3324         Step reference is lost, and when the slave is shut down.
3325         (Bot): make it a MultiService, so it can have children. Use
3326         stopService to tell when the slave is shutting down.
3327         (SlaveBuilder): make it a Service, and a child of the Bot. Add
3328         remote_interruptCommand (which asks the current SlaveCommand to
3329         stop but allows it to keep emitting status messages), and
3330         stopCommand (which tells it to shut up and die).
3332         * buildbot/slave/commands.py: make commands interruptible
3333         (ShellCommand.kill): factor out os.kill logic
3334         (Command): factor out setup()
3335         (Command.sendStatus): don't send status if .running is false, this
3336         happens when the command has been halted.
3337         (Command.interrupt): new method, used to tell the command to die
3338         (SlaveShellCommand): implement .interrupt
3339         (DummyCommand): implement .interrupt
3340         (SourceBase, etc): factor out setup(), don't continue substeps if
3341         .interrupted is set
3343         * buildbot/status/builder.py: fix all waitUntilFinished() methods
3344         so they can be called after finishing
3346         * buildbot/test/test_run.py: new tests for disconnect behavior,
3347         refactor slave-shutdown routines, add different kinds of
3348         slave-shutdown
3350 2004-11-27  Brian Warner  <warner@lothar.com>
3352         * buildbot/status/words.py (IrcStatusBot.convertTime): utility
3353         method to express ETA time like "2m45s" instead of "165 seconds"
3355 2004-11-24  Brian Warner  <warner@lothar.com>
3357         * buildbot/test/test_vc.py (VC.testArch): unregister the test
3358         archive after the test completes, to avoid cluttering the user's
3359         'tla archives' listing with a bogus entry. Arch doesn't happen to
3360         provide any way to override the use of ~/.arch-params/, so there
3361         isn't a convenient way to avoid touching the setup of the user who
3362         runs the test.
3363         (VC_HTTP.testArchHTTP): same
3365 2004-11-23  Brian Warner  <warner@lothar.com>
3367         * buildbot/status/html.py (TextLog): split render() up into
3368         render_HEAD and render_GET. Use a Producer when sending log
3369         chunks, to reduce memory requirements and avoid sending huge
3370         non-Banana-able strings over web.distrib connections. Requires
3371         peeking under the covers of IStatusLog.
3372         (TextLog.resumeProducing): fix the "as text" link, handle client
3373         disconnects that occur while we're still sending old chunks.
3375         * buildbot/status/builder.py (HTMLLogFile.waitUntilFinished): oops,
3376         use defer.succeed, not the non-existent defer.success
3377         (LogFile.waitUntilFinished): same
3378         (LogFile.subscribe): don't add watchers to a finished logfile
3380         * buildbot/__init__.py (version): bump to 0.6.1+ while between
3381         releases
3383 2004-11-23  Brian Warner  <warner@lothar.com>
3385         * buildbot/__init__.py (version): Releasing buildbot-0.6.1
3387 2004-11-23  Brian Warner  <warner@lothar.com>
3389         * NEWS: update for the 0.6.1 release
3390         * MANIFEST.in: add new files
3392         * README (INSTALLATION): explain how to enable the extra VC tests
3394         * buildbot/status/builder.py (LogFile): add .runEntries at the class
3395         level to, so old pickled builds can be displayed ok
3397 2004-11-22  Brian Warner  <warner@lothar.com>
3399         * NEWS: summarize updates since last release
3401         * README (SLAVE): fix usage of 'buildbot slave' command. Thanks to
3402         Yoz Grahame. Closes SF#1050138.
3404         * docs/changes.xhtml (FreshCVSSourceNewcred): fix typo. Closes
3405         SF#1042563.
3407         * buildbot/process/step_twisted.py (Trial): update docs a bit
3409         * docs/factories.xhtml: fix Trial factory docs to match reality.
3410         Closes: SF#1049758.
3412         * buildbot/process/factory.py (Trial.__init__): add args for
3413         randomly= and recurse=, making them available to instantiators
3414         instead of only to subclassers. Closes: SF#1049759.
3416 2004-11-15  Brian Warner  <warner@lothar.com>
3418         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
3419         try to teach the Quick factory to use multiple versions of python
3421 2004-11-12  Brian Warner  <warner@lothar.com>
3423         * buildbot/status/builder.py (BuilderStatus.saveYourself): use a
3424         safer w32-compatible approach, and only use it on windows
3425         (BuildStatus.saveYourself): same
3427 2004-11-11  Brian Warner  <warner@lothar.com>
3429         * buildbot/status/builder.py (LogFile.addEntry): smarter way to do
3430         it: one string merge per chunk. There are now separate .entries
3431         and .runEntries lists: when enumerating over all chunks, make sure
3432         to look at both.
3433         * buildbot/test/test_status.py (Log): more tests
3435         * buildbot/status/builder.py (LogFile.addEntry): Merge string
3436         chunks together, up to 10kb per chunk. This ought to cut down on
3437         the CPU-burning overhead of large log files. Thanks to Alexander
3438         Staubo for spotting the problem.
3439         * buildbot/test/test_status.py (Log): tests for same
3441 2004-11-10  Brian Warner  <warner@lothar.com>
3443         * buildbot/status/mail.py (MailNotifier.buildMessage): add a Date
3444         header to outbound mail
3445         * buildbot/test/test_status.py (Mail.testBuild1): test for same
3447 2004-11-08  Brian Warner  <warner@lothar.com>
3449         * buildbot/status/builder.py (BuilderStatus.saveYourself): w32
3450         can't do os.rename() onto an existing file, so catch the exception
3451         and unlink the target file first. This introduces a slight window
3452         where the existing file could be lost, but the main failure case
3453         (disk full) should still be handled safely.
3454         (BuildStatus.saveYourself): same
3456         * buildbot/changes/pb.py (ChangePerspective): use a configurable
3457         separator character instead of os.sep, because the filenames being
3458         split here are coming from the VC system, which can have a
3459         different pathname convention than the local host. This should
3460         help a buildmaster running on windows that uses a CVS repository
3461         which runs under unix.
3462         * buildbot/changes/mail.py (MaildirSource): same, for all parsers
3464         * buildbot/process/step_twisted.py (Trial.createSummary): survive
3465         when there are no test failures to be parsed
3467         * buildbot/scripts/runner.py (createMaster): use shutil.copy()
3468         instead of the unix-specific os.system("cp"), thanks to Elliot
3469         Murphy for this and the other buildbot-vs-windows catches.
3470         * buildbot/test/test_maildir.py (MaildirTest.deliverMail): same
3472         * contrib/windows/buildbot.bat: prefix a '@', apparently to not
3473         echo the command as it is run
3475         * setup.py: install sample.mk too, not just sample.cfg
3476         (scripts): install contrib/windows/buildbot.bat on windows
3478 2004-11-07  Brian Warner  <warner@lothar.com>
3480         * buildbot/process/builder.py (Builder._detached): clear the
3481         self.currentBuild reference, otherwise the next build will be
3482         skipped because we think the Builder is already in use.
3484         * docs/examples/twisted_master.cfg: update to match current usage
3485         on the Twisted buildbot
3487 2004-10-29  Brian Warner  <warner@lothar.com>
3489         * buildbot/status/mail.py (MailNotifier): fix typo in docs
3491 2004-10-28  Brian Warner  <warner@lothar.com>
3493         * buildbot/slave/commands.py (SourceBase): refactor subclasses to
3494         have separate doVCUpdate/doVCFull methods. Catch an update failure
3495         and respond by clobbering the source directory and re-trying. This
3496         will handle local changes (like replacing a file with a directory)
3497         that will cause CVS and SVN updates to fail.
3498         * buildbot/test/test_vc.py (SetupMixin.do_vc): test the same
3500         * buildbot/process/step.py (LoggedRemoteCommand.__repr__): avoid a
3501         python-2.4 warning
3503 2004-10-19  Brian Warner  <warner@lothar.com>
3505         * buildbot/process/step_twisted.py (Trial.createSummary): bugfixes
3507         * buildbot/status/html.py (StatusResourceTestResults): display any
3508         TestResults that the Build might have
3509         (StatusResourceTestResult): and the logs for each TestResult
3510         (StatusResourceBuild): add link from the per-build page
3512 2004-10-15  Brian Warner  <warner@lothar.com>
3514         * buildbot/process/step_twisted.py (Trial.createSummary): parse
3515         the 'problems' portion of stdout, add TestResults to our build
3516         * buildbot/test/test_twisted.py (Parse.testParse): test it
3518         * buildbot/interfaces.py (IBuildStatus.getTestResults): new method
3519         to retrieve a dict of accumulated test results
3520         (ITestResult): define what a single test result can do
3521         * buildbot/status/builder.py (TestResult): implement ITestResult
3522         (BuildStatus.getTestResults): retrieve dict of TestResults
3523         (BuildStatus.addTestResult): add TestResults
3524         * buildbot/test/test_status.py (Results.testAddResults): test it
3526 2004-10-14  Brian Warner  <warner@lothar.com>
3528         * buildbot/test/test_maildir.py (MaildirTest): use shutil.rmtree
3529         instead of os.system("rm -rf") for win32 portability
3531         * buildbot/test/test_slavecommand.py (SlaveCommandTestCase): use
3532         SignalMixin instead of starting/stopping the reactor, which is
3533         likely to cause problems with other tests
3535         * buildbot/slave/commands.py (SourceBase.doCopy): remove leftover
3536         self.copyComplete() call. Yoz Grahame makes the catch.
3538         * contrib/windows/buildbot.bat: helper script to deal with path
3539         issues. Thanks to Yoz Grahame.
3541         * buildbot/master.py (BuildMaster.startService): don't register a
3542         SIGHUP handler if the signal module has no SIGHUP attribute.
3543         Apparently win32 does this.
3545         * buildbot/scripts/runner.py (start): add --reactor=win32 on win32
3547         * buildbot/test/test_web.py (WebTest.test_webPathname): skip the
3548         test if the reactor can't offer UNIX sockets
3550         * buildbot/status/html.py (StatusResourceBuild.body): fix syntax
3551         error introduced in the last commit. We really need that
3552         metabuildbot :).
3554 2004-10-12  Brian Warner  <warner@lothar.com>
3556         * buildbot/changes/mail.py (MaildirSource.describe): fix exception
3557         when describing a maildir source. Thanks to Stephen Davis.
3559         * buildbot/status/words.py (IrcStatusBot.command_WATCH): round off
3560         ETA seconds
3562         * buildbot/scripts/runner.py (createMaster): install Makefile too
3563         (start): add --no_save to 'start' command
3564         * buildbot/scripts/sample.mk: simple convenience Makefile with 
3565         start/stop/reload targets
3567         * buildbot/__init__.py (version): bump to 0.6.0+ while between
3568         releases
3570 2004-09-30  Brian Warner  <warner@lothar.com>
3572         * setup.py: Releasing buildbot-0.6.0
3574 2004-09-30  Brian Warner  <warner@lothar.com>
3576         * MANIFEST.in: add debian/*, sample.cfg, more docs files. Remove
3577         test_trial.py from the source tarball until support is complete.
3579         * NEWS: update for 0.6.0 release
3580         * buildbot/__init__.py (version): same
3581         * README: same
3583         * buildbot/status/words.py (IrcStatusBot.command_SOURCE): add
3584         'source' command to tell users where to get the Buildbot source
3586         * docs/examples/*.cfg: update to modern standards
3588         * NEWS: update for release
3590         * buildbot/scripts/runner.py (createMaster): remove the
3591         -shutdown.tap stuff now that it isn't necessary
3592         (createSlave): same
3593         (start): launch buildbot.tap, not buildbot-shutdown.tap
3596         * buildbot/status/mail.py (Domain): shorten class name
3597         (MailNotifier): if lookup= is a string, pass it to Domain()
3598         * buildbot/test/test_status.py (Mail.testBuild1): new class name
3599         (Mail.testBuild2): test the string-to-Domain shortcut
3600         (Mail.testMail): fix test
3603         * buildbot/scripts/sample.cfg: improve the build-the-buildbot
3604         example config file
3606         * buildbot/status/builder.py (BuildStatus.__setstate__): re-set
3607         more attributes on load
3608         (BuilderStatus.stubBuildCacheSize): bump to 30, this was too low
3609         to accomodate the whole waterfall page at once, and the thrashing
3610         results in a lot of unnecessary loads
3611         (BuildStatus.saveYourself): use binary pickles, not fluffy text
3612         (BuilderStatus.saveYourself): same
3613         (BuilderStatus.eventGenerator): stop generating on the first missing
3614         build. We assume that saved builds are deleted oldest-first.
3615         (BuildStepStatus.__getstate__): .progress might not exist
3617         * buildbot/changes/changes.py (ChangeMaster): make it
3618         serializable, in $masterdir/changes.pck
3619         (ChangeMaster.stopService): save on shutdown
3620         * buildbot/master.py (BuildMaster.loadChanges): load at startup
3621         * buildbot/test/test_config.py: load Changes before config file
3624         * buildbot/slave/commands.py (ShellCommand.doTimeout): put the
3625         "Oh my god, you killed the command" header on a separate line
3627         * buildbot/status/builder.py (BuilderStatus.getStubBuildByNumber):
3628         skip over corrupted build pickles
3629         (BuilderStatus.getFullBuildByNumber): same
3630         (BuilderStatus.eventGenerator): skip over unavailable builds
3631         (BuildStatus.saveYourself): save builds to a .tmp file first, then
3632         do an atomic rename. This prevents a corrupted pickle when some
3633         internal serialization error occurs.
3634         (BuilderStatus.saveYourself): same
3636         * buildbot/slave/commands.py (SlaveShellCommand): oops, restore
3637         the timeout for shell commands, it got lost somehow
3639         * buildbot/status/builder.py (BuilderStatus.eventGenerator): if we
3640         run out of build steps, return the rest of the builder events
3642         * buildbot/interfaces.py (IBuilderControl.ping): add method
3644         * buildbot/process/builder.py (BuilderControl.ping): move
3645         slave-ping to BuilderControl, and fix the failure case in the
3646         process (Event.finish() is the verb, Event.finished is the noun).
3648         * buildbot/status/html.py (StatusResourceBuilder.ping): ping
3649         through the BuilderControl instead of the BuilderStatus
3650         (EventBox): add adapter for builder.Event, allowing builder events to
3651         be displayed in the waterfall display
3653         * buildbot/master.py (BotMaster.stopService): add a 'master
3654         shutdown' event to the builder's log
3655         (BuildMaster.startService): and a 'master started' on startup
3657         * buildbot/status/builder.py (BuilderStatus.eventGenerator): merge
3658         builder events into the BuildStep event stream
3659         (Status.builderAdded): add a 'builder created' event
3662         * buildbot/status/words.py (IrcStatusBot.command_WATCH): new
3663         command to announce the completion of a running build
3664         (IrcStatusBot.command_FORCE): announce when the build finishes
3666         * buildbot/status/builder.py (BuilderStatus.addFullBuildToCache):
3667         don't evict unfinished builds from the cache: they must stay in
3668         the full-cache until their logfiles have stopped changing. Make
3669         sure the eviction loop terminates if an unfinished build was hit.
3670         (HTMLLogFile.getTextWithHeaders): return HTML as if it were text.
3671         This lets exceptions be dumped in an email status message. Really
3672         we need LogFiles which contain both text and HTML, instead of two
3673         separate classes.
3674         (BuildStatus.__getstate__): handle self.finished=False
3675         (Status.builderAdded): if the pickle is corrupted, abandon the
3676         history and create a new BuilderStatus object.
3678         * buildbot/process/base.py (Build.stopBuild): tolerate lack of a
3679         self.progress attribute, helped one test which doesn't fully set
3680         up the Build object.
3682         * buildbot/interfaces.py (IStatusLogStub): split out some of the
3683         IStatusLog methods into an Interface that is implemented by "stub"
3684         logs, for which all the actual text chunks are on disk (in the
3685         pickled Build instance). To show the log contents, you must first
3686         adapt the stub log to a full IStatusLog object.
3688         * buildbot/status/builder.py (LogFileStub): create separate stub
3689         log objects, which can be upgraded to a real one if necessary.
3690         (LogFile): make them persistable, and let them stubify themselves
3691         (HTMLLogFile): same
3692         (BuildStepStatus): same
3693         (BuildStatus): same
3694         (BuildStatus.saveYourself): save the whole build out to disk
3695         (BuilderStatus): make it persistable
3696         (BuilderStatus.saveYourself): save the builder to disk
3697         (BuilderStatus.addFullBuildToCache): implement two caches which
3698         hold Build objects: a small one which holds full Builds, and a
3699         larger one which holds "stubbed" Builds (ones with their LogFiles
3700         turned into LogFileStubs). This reduces memory usage by the
3701         buildmaster by not keeping more than a few (default is 2) whole
3702         build logs in RAM all the time.
3703         (BuilderStatus.getBuild): rewrite to pull from disk (through the
3704         cache)
3705         (BuilderStatus.eventGenerator): rewrite since .builds went away
3706         (BuilderStatus.buildStarted): remove the .builds array. Add the
3707         build to the "full" cache when it starts.
3708         (BuilderStatus._buildFinished): save the build to disk when it
3709         finishes
3710         (Status): give it a basedir (same as the BuildMaster's basedir)
3711         where the builder pickles can be saved
3712         (Status.builderAdded): create the BuilderStatus ourselves, by
3713         loading a pickle from disk (or creating a new instance if there
3714         was none on disk). Return the BuilderStatus so the master can glue
3715         it into the new Builder object.
3717         * buildbot/master.py (BotMaster.stopService): on shutdown, tell
3718         all BuilderStatuses to save themselves out to disk. This is in
3719         lieu of saving anything important in the main Application pickle
3720          (the -shutdown.tap file).
3721         (BuildMaster.__init__): give Status() a basedir for its files
3722         (BuildMaster.loadConfig_Builders): do status.builderAdded first,
3723         to get the BuilderStatus, then give it to the Builder (instead of
3724         doing it the other way around). It's ok if the status announces
3725         the new Builder before it's really ready, as the outside world can
3726         only see the BuilderStatus object anyway (and it is ready before
3727         builderAdded returns). Use the builder's "builddir" (which
3728         normally specifies where the slave will run the builder) as the
3729         master's basedir (for saving serialized builds).
3731         * buildbot/status/html.py (StatusResourceBuildStep.getChild):
3732         coerce the logfile to IStatusLog before trying to get the text
3733         chunks out of it. This will pull the full (non-stubified) Build in
3734         from disk if necessary.
3735         (TextLog): fix the adapter registration
3737         * buildbot/test/test_control.py (Force.setUp): create the basedir
3738         * buildbot/test/test_web.py: same
3739         * buildbot/test/test_vc.py (SetupMixin.setUp): same
3740         * buildbot/test/test_status.py (Mail.makeBuild): match new setup
3741         * buildbot/test/test_run.py (Run.testMaster): same
3742         (Status.setUp): same
3744 2004-09-29  Fred L. Drake, Jr.  <fdrake@acm.org>
3746         * buildbot/status/html.py (Waterfall.__init__): store actual
3747         allowForce flag passed in rather than using True for everyone;
3748         make sure setting it to False doesn't cause a NameError
3749         (Waterfall.setup).
3750         (StatusResourceBuilder.__init__) add the builder name to the page
3751         title.
3752         (StatusResourceBuilder.body) move HTML generation for a name/value
3753         row into a helper method (StatusResourceBuilder.make_row); only
3754         generate the "Force Build" form if allowForce was True and the
3755         slave is connected.  Use class attributes in the generated HTML to
3756         spread a little CSS-joy.
3758 2004-09-28  Brian Warner  <warner@lothar.com>
3760         * buildbot/process/step_twisted.py (Trial.createSummary): fix
3761         warning-scanner to not ignore things like
3762         'ComponentsDeprecationWarning' and 'exceptions.RuntimeWarning'
3764         * buildbot/status/html.py (StatusResource.control): add some
3765         class-level values for .control in an attempt to make upgrading
3766         smoother
3768         * buildbot/util.py (ComparableMixin): survive missing attributes,
3769         such as when a class is modified and we're comparing old instances
3770         against new ones
3772         * buildbot/status/words.py (IrcStatusBot.privmsg): clean up
3773         failure handling, remove a redundant try/except block. Don't
3774         return the full traceback to the IRC channel.
3775         (IrcStatusBot.command_FORCE): catch new exceptions, return useful
3776         error messages. Get ETA properly.
3778         * buildbot/status/html.py (StatusResourceBuild.body): html.escape
3779         the reason, since (at least) IRC message will have <> in them.
3780         (StatusResourceBuilder.__init__): take an IBuilderControl
3781         (StatusResourceBuilder.force): use the IBuilderControl we get in
3782         the constructor instead of trying to make our own. Catch the
3783         new exceptions and ignore them for now (until we make an
3784         intermediate web page where we could show the error message)
3785         (StatusResource): create with an IControl, use it to give an
3786         IBuilderControl to all children
3787         (Waterfall): take an allowForce= option, pass an IControl object
3788         to StatusResource if it is True
3790         * buildbot/test/test_web.py (ConfiguredMaster): handle IControl
3792         * buildbot/master.py (BotPerspective.perspective_forceBuild):
3793         catch new exceptions and return string forms
3795         * buildbot/interfaces.py: add NoSlaveError, BuilderInUseError
3796         * buildbot/process/builder.py (Builder.forceBuild): raise them
3797         * buildbot/test/test_control.py (Force.testNoSlave): new test
3798         (Force.testBuilderInUse): same
3801         * buildbot/status/words.py (IrcStatusBot): enable build-forcing
3803         * buildbot/test/test_run.py: use IControl
3804         * buildbot/test/test_vc.py: same
3806         * buildbot/status/html.py (StatusResourceBuilder.force): rewrite
3807         to use IControl. Still offline.
3808         * buildbot/status/words.py (IrcStatusBot.command_FORCE): same
3810         * buildbot/process/builder.py (Builder.doPeriodicBuild): set
3811         who=None so periodic builds don't send out status mail
3812         (Builder.forceBuild): include reason in the log message
3813         (BuilderControl.forceBuild): rename 'name' to 'who'
3815         * buildbot/master.py (BotPerspective.perspective_forceBuild): add
3816         'who' parameter, but make it None by default so builds forced by
3817         slave admins don't cause status mail to be sent to anybody
3818         (BotMaster.forceBuild): same. this method is deprecated.
3819         (DebugPerspective.perspective_forceBuild): same, use IControl.
3820         (DebugPerspective.perspective_fakeChange): use IControl..
3821         (Dispatcher.requestAvatar): .. so don't set .changemaster
3823         * buildbot/interfaces.py (IBuilderControl.forceBuild): rename 'who'
3824         parameter to avoid confusion with the name of the builder
3827         * buildbot/status/mail.py: refine comment about needing 2.3
3829         * buildbot/status/html.py: move all imports to the top
3831         * buildbot/test/test_control.py: test new interfaces
3832         * buildbot/test/test_run.py (Status): handle new interfaces
3833         * buildbot/test/test_vc.py (SetupMixin.doBuild): same
3835         * buildbot/process/base.py (BuildControl): implement IBuildControl
3836         and its lonely getStatus() method
3838         * buildbot/process/builder.py (BuilderControl): implement
3839         IBuilderControl, obtained by adapting the Builder instance
3840         (Builder.startBuild): return a BuilderControl instead of a
3841         Deferred. The caller can use bc.getStatus().waitUntilFinished() to
3842         accomplish the same thing.
3844         * buildbot/master.py: move all import statements to the top
3845         (Control): implement IControl, obtained by adapting the
3846         BuildMaster instance.
3848         * buildbot/interfaces.py: add IControl, IBuilderControl, and
3849         IBuildControl. These are used to force builds. Eventually they
3850         will provide ways to reconfigure the Builders, pause or abandon a
3851         Build, and perhaps control the BuildMaster itself.
3853 2004-09-26  Brian Warner  <warner@lothar.com>
3855         * buildbot/util.py (ComparableMixin): survive twisted>1.3.0 which
3856         ends up comparing us against something without a .__class__
3858 2004-09-24  Brian Warner  <warner@lothar.com>
3860         * buildbot/scripts/runner.py: rearrange option parsing a lot, to get
3861         usage text right.
3863         * Makefile: add 'deb-snapshot' target, to create a timestamped
3864         .deb package
3866         * debian/rules (binary-indep): skip CVS/ files in dh_installexamples
3868 2004-09-23  Brian Warner  <warner@lothar.com>
3870         * buildbot/__init__.py (version): move version string here
3871         * setup.py: get version string from buildbot.version
3872         * buildbot/status/html.py (WaterfallStatusResource.body): add
3873         buildbot version to the page footer
3874         * buildbot/status/words.py (IrcStatusBot.command_VERSION): provide
3875         version when asked
3877         * buildbot/master.py (BotMaster.getPerspective): detect duplicate
3878         slaves, let the second know where the first one is coming from
3879         (BuildMaster.__init__): turn on .unsafeTracebacks so the slave can
3880         see our exceptions. It would be nice if there were a way to just
3881         send them the exception type and value, not the full traceback.
3884         * buildbot/status/mail.py (MailNotifier): add a new argument
3885         sendToInterestedUsers=, which can be set to False to disable the
3886         usual send-to-blamelist behavior.
3887         (top): handle python-2.2 which has no email.MIMEMultipart
3888         (MailNotifier.buildMessage): don't send logs without MIMEMultipart
3889         (MailNotifier.disownServiceParent): unsubscribe on removal
3891         * buildbot/test/test_status.py (Mail.testBuild2): test it
3894         * buildbot/status/progress.py (Expectations.wavg): tolerate
3895         current=None, which happens when steps start failing badly
3896         * buildbot/test/test_status.py (Progress.testWavg): test for it
3898         * buildbot/process/step.py (SVN.startVC): when the (old) slave
3899         doesn't understand args['revision'], emit a warning instead of
3900         bailing completely. Updating to -rHEAD is probably close enough.
3902         * buildbot/process/step_twisted.py (Trial.start): fix sanity-check
3904         * buildbot/test/test_status.py: at least import bb.status.client
3905         even if we don't have any test coverage for it yet
3907         * contrib/svn_buildbot.py: don't require python2.3
3908         (main): wait, do require it (for sets.py), but explain how to
3909         make it work under python2.2
3911 2004-09-23  Brian Warner  <warner@lothar.com>
3913         * contrib/svn_buildbot.py: include the revision number in the Change
3915         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): use when=,
3916         using util.now() because FreshCVS is a realtime service
3918         * buildbot/status/event.py: delete dead code
3919         * buildbot/process/step.py: don't import dead Event class
3920         * buildbot/process/step_twisted.py: same
3921         * buildbot/status/builder.py: same
3922         * buildbot/status/client.py: same
3924         * buildbot/test/test_process.py: kill buggy out-of-date disabled test
3926         * buildbot/changes/changes.py (Change): set .when from an __init__
3927         argument (which defaults to now()), rather than having
3928         ChangeMaster.addChange set it later.
3929         (ChangeMaster.addChange): same
3931         * buildbot/changes/mail.py (parseFreshCVSMail): pass in when=
3932         (parseSyncmail): same. Just use util.now() for now.
3933         (parseBonsaiMail): parse the timestamp field for when=
3935         * buildbot/test/test_vc.py (SourceStamp.addChange): page in when=
3936         instead of setting .when after the fact
3938 2004-09-22  slyphon
3940         * buildbot/slave/trial.py: new SlaveCommand to machine-parse test
3941         results when the target project uses retrial. Still under
3942         development.
3943         * buildbot/test/test_trial.py: same
3945 2004-09-21  Brian Warner  <warner@lothar.com>
3947         * buildbot/status/mail.py (MailNotifier.__init__): include
3948         success/warnings/failure in the Subject line
3949         (MailNotifier.buildMessage): add the buildbot's URL to the body,
3950         use step.logname for the addLogs=True attachment filenames
3951         * buildbot/test/test_status.py (Mail): test Subject lines
3952         (Mail.testLogs): test attachment filenames
3954         * buildbot/master.py (DebugPerspective.perspective_fakeChange):
3955         accept a 'who' argument from the debug tool
3956         * contrib/debugclient.py (DebugWidget.do_commit): send 'who'
3957         * contrib/debug.glade: add text box to set 'who'
3959         * buildbot/interfaces.py (IBuildStatus.getBuilder): replace
3960         .getBuilderName with .getBuilder().getName(), more flexible
3961         (IStatusLog.getName): logs have short names, but you can prefix
3962         them with log.getStep().getName() to make them more useful
3963         * buildbot/status/builder.py: same
3964         * buildbot/status/client.py: same
3965         * buildbot/status/html.py: same
3966         * buildbot/test/test_run.py (Status.testSlave): same
3967         * buildbot/process/step.py: tweak logfile names
3969         * buildbot/status/mail.py (MailNotifier): add lookup, change
3970         argument to extraRecipients. The notifier is now aimed at sending
3971         mail to the people involved in a particular build, with additional
3972         constant recipients as a secondary function.
3974         * buildbot/test/test_status.py: add coverage for IEmailLookup,
3975         including slow-lookup and failing-lookup. Make sure the blamelist
3976         members are included.
3978         * buildbot/interfaces.py: new interfaces IEmailSender+IEmailLookup
3979         (IBuildStatus.getResponsibleUsers): rename from getBlamelist
3980         (IBuildStatus.getInterestedUsers): new method
3981         * buildbot/status/builder.py (BuildStatus.getResponsibleUsers): same
3982         * buildbot/status/client.py (remote_getResponsibleUsers): same
3983         * buildbot/status/html.py (StatusResourceBuild.body): same
3984         * buildbot/test/test_run.py (Status.testSlave): same
3986 2004-09-20  Brian Warner  <warner@lothar.com>
3988         * docs/users.xhtml: update concepts
3990         * Makefile: add a convenience makefile, for things like 'make
3991         test'. It is not included in the source tarball.
3993 2004-09-16  Brian Warner  <warner@lothar.com>
3995         * NEWS: mention /usr/bin/buildbot, debian/*
3997         * debian/*: add preliminary debian packaging. Many thanks to
3998         Kirill Lapshin (and Kevin Turner) for the hard work. I've mangled
3999         it considerably since it left their hands, I am responsible for
4000         all breakage that's resulted.
4002         * bin/buildbot: create a top-level 'buildbot' command, to be
4003         installed in /usr/bin/buildbot . For now it's just a simple
4004         frontend to mktap/twistd/kill, but eventually it will be the entry
4005         point to the 'try' command and also a status client. It is also
4006         intended to support the upcoming debian-packaging init.d scripts.
4007         * buildbot/scripts/runner.py: the real work is done here
4008         * buildbot/scripts/__init__.py: need this too
4009         * buildbot/scripts/sample.cfg: this is installed in new
4010         buildmaster directories
4011         * setup.py: install new stuff
4013 2004-09-15  Brian Warner  <warner@lothar.com>
4015         * buildbot/test/test_vc.py: skip SVN tests if svn can't handle the
4016         'file:' schema (the version shipped with OS-X was built without the
4017         ra_local plugin).
4018         (SetupMixin.tearDown): stop the goofy twisted.web timer which
4019         updates the log-timestamp, to make sure it isn't still running after
4020         the test finishes
4022         * docs/config.xhtml: Add projectName, projectURL, buildbotURL
4023         values to the config file.
4024         * docs/examples/hello.cfg: add examples
4025         * buildbot/interfaces.py (IStatus.getBuildbotURL): define accessors
4026         * buildbot/status/builder.py (Status.getProjectURL): implement them
4027         * buildbot/master.py (BuildMaster.loadConfig): set them from config
4028         * buildbot/test/test_config.py (ConfigTest.testSimple): test them
4029         * buildbot/status/html.py (WaterfallStatusResource): display them
4032         * buildbot/test/test_vc.py (FakeBuilder.name): add attribute so
4033         certain error cases don't suffer a secondary exception.
4034         (top): Skip tests if the corresponding VC tool is not installed.
4036         * buildbot/process/factory.py (Trial): introduce separate
4037         'buildpython' and 'trialpython' lists, since trialpython=[] is
4038         what you want to invoke /usr/bin/python, whereas ./setup.py is
4039         less likely to be executable. Add env= parameter to pass options
4040         to test cases (which is how I usually write tests, I don't know if
4041         anyone else does it this way).
4043         * buildbot/process/step_twisted.py (Trial): handle python=None.
4044         Require 'testpath' be a string, not a list. Fix tests= typo.
4045         (Trial.start): sanity-check any PYTHONPATH value for stringness.
4047         * buildbot/process/step.py (RemoteCommand._remoteFailed): goofy
4048         way to deal with the possibility of removing the disconnect notify
4049         twice.
4050         (CVS): add a 'login' parameter to give a password to 'cvs login',
4051         commonly used with pserver methods (where pw="" or pw="guest")
4053         * buildbot/slave/commands.py (SourceBase): move common args
4054         extraction and setup() to __init__, so everything is ready by the
4055         time setup() is called
4056         (CVS.start): call 'cvs login' if a password was supplied
4057         (ShellCommand): special-case PYTHONPATH: prepend the master's
4058         value to any existing slave-local value.
4060         * buildbot/process/builder.py (Builder.updateBigStatus): if we
4061         don't have a remote, mark the builder as Offline. This whole
4062         function should probably go away and be replaced by individual
4063         deltas.
4064         (Builder.buildFinished): return the results to the build-finished
4065         deferred callback, helps with testing
4067 2004-09-14  Brian Warner  <warner@lothar.com>
4069         * buildbot/test/test_vc.py: put all the repositories needed to run
4070         the complete tests into a single small (1.3MB) tarball, so I can
4071         make that tarball available on the buildbot web site. Test HTTP
4072         access (for Arch and Darcs) by spawning a temporary web server
4073         while the test runs.
4075         * docs/users.xhtml: new document, describe Buildbot's limited
4076         understanding of different human users
4078         * buildbot/test/test_vc.py: rearrange test cases a bit
4080         * buildbot/process/step_twisted.py (Trial): handle testpath=
4081         * buildbot/process/factory.py (Trial): update to use step.Trial
4083         * buildbot/slave/commands.py (ShellCommandPP): fix fatal typo
4085         * buildbot/status/builder.py (BuildStatus.getText): add text2 to
4086         the overall build text (which gives you 'failed 2 tests' rather
4087         than just 'failed')
4088         (BuildStepStatus.text2): default to [], not None
4090         * buildbot/process/step_twisted.py (Trial.commandComplete): text2
4091         must be a list
4093 2004-09-12  Brian Warner  <warner@lothar.com>
4095         * buildbot/master.py (BotPerspective._commandsUnavailable): don't
4096         log the whole exception if it's just an AttributeError (old slave)
4098         * buildbot/process/step.py (ShellCommand.__init__): stash .workdir
4099         so (e.g.) sub-commands can be run in the right directory.
4100         (ShellCommand.start): accept an optional errorMessage= argument
4101         to make life easier for SVN.start
4102         (SVN.startVC): put the "can't do mode=export" warning in the LogFile
4103         headers
4104         (ShellCommand.start): move ['dir'] compatibility hack..
4105         (RemoteShellCommand.start): .. to here so everyone can use it
4107         * buildbot/process/step_twisted.py (Trial): use .workdir
4109         * buildbot/process/step_twisted.py (BuildDebs.getText): fix the
4110         text displayed when debuild fails completely
4111         (Trial): snarf _trial_temp/test.log from the slave and display it
4113 2004-09-11  Brian Warner  <warner@lothar.com>
4115         * buildbot/process/step_twisted.py (ProcessDocs.getText): typo
4117         * buildbot/process/process_twisted.py (TwistedTrial.tests): oops,
4118         set to 'twisted', so --recurse can find twisted/web/test/*, etc
4120         * buildbot/process/step.py (ShellCommand): call .createSummary
4121         before .evaluateCommand instead of the other way around. This
4122         makes it slightly easier to count warnings and then use that to
4123         set results=WARNINGS
4124         * buildbot/process/step_twisted.py: cosmetic, swap the methods
4126         * buildbot/process/base.py (Build.buildFinished): update status
4127         before doing progress. It's embarrassing for the build to be stuck
4128         in the "building" state when an exceptions occurs elsewhere..
4130         * buildbot/status/progress.py (Expectations.expectedBuildTime):
4131         python2.2 doesn't have 'sum'
4133         * buildbot/status/builder.py (Status.getBuilderNames): return a copy,
4134         to prevent clients from accidentally sorting it
4136         * buildbot/master.py (Manhole): add username/password
4137         (BuildMaster.loadConfig): use c['manhole']=Manhole() rather than
4138         c['manholePort'], deprecate old usage
4139         * docs/config.xhtml: document c['manhole']
4140         * docs/examples/hello.cfg: show example of using a Manhole
4143         * buildbot/test/test_steps.py (FakeBuilder.getSlaveCommandVersion):
4144         pretend the slave is up to date
4146         * buildbot/status/builder.py (BuildStepStatus.stepFinished): 'log',
4147         the module, overlaps with 'log', the local variable
4149         * buildbot/status/html.py: oops, 2.2 needs __future__ for generators
4151         * buildbot/process/builder.py (Builder.getSlaveCommandVersion):
4152         new method to let Steps find out the version of their
4153         corresponding SlaveCommand.
4154         * buildbot/process/step.py (BuildStep.slaveVersion): utility method
4155         (ShellCommand.start): add 'dir' argument for <=0.5.0 slaves
4156         (CVS.startVC): backwards compatibility for <=0.5.0 slaves
4157         (SVN.startVC): same
4158         (Darcs.startVC): detect old slaves (missing the 'darcs' command)
4159         (Arch.startVC): same
4160         (P4Sync.startVC): same
4162         * buildbot/process/step.py (LoggedRemoteCommand.start): return the
4163         Deferred so we can catch errors in remote_startCommand
4164         (RemoteShellCommand.start): same
4166         * docs/examples/twisted_master.cfg: update sample config file
4168         * buildbot/slave/commands.py (ShellCommandPP): write to stdin
4169         after connectionMade() is called, not before. Close stdin at that
4170         point too.
4172         * buildbot/process/process_twisted.py: update to use Trial, clean
4173         up argument passing (move to argv arrays instead of string
4174         commands)
4176         * buildbot/process/step_twisted.py (Trial): new step to replace
4177         RunUnitTests, usable by any trial-using project (not just
4178         Twisted). Arguments have changed, see the docstring for details.
4180         * buildbot/process/base.py (Build.startBuild): this now returns a
4181         Deferred. Exceptions that occur during setupBuild are now
4182         caught better and lead to fewer build_status weirdnesses, like
4183         finishing a build that was never started.
4184         (Build.buildFinished): fire the Deferred instead of calling
4185         builder.buildFinished directly. The callback argument is this
4186         Build, everything else can be extracted from it, including the
4187         new build.results attribute.
4188         * buildbot/process/builder.py (Builder.startBuild): same
4189         (Builder.buildFinished): same, extract results from build
4191         * buildbot/process/step.py (ShellCommands): remove dead code
4193 2004-09-08  Brian Warner  <warner@lothar.com>
4195         * buildbot/test/test_vc.py (VC.doPatch): verify that a new build
4196         doesn't try to use the leftover patched workdir
4197         (SourceStamp): test source-stamp computation for CVS and SVN
4199         * buildbot/slave/commands.py (SourceBase.doPatch): mark the
4200         patched workdir ('touch .buildbot-patched') so we don't try to
4201         update it later
4202         (SourceBase.start): add ['revision'] for all Source steps
4203         (CVS): change args: use ['branch'] for -r, remove ['files']
4204         (CVS.buildVC): fix revision/branch stuff
4205         (SVN): add revision stuff
4207         * buildbot/process/step.py (BuildStep.__init__): reject unknown
4208         kwargs (except 'workdir') to avoid silent spelling errors
4209         (ShellCommand.__init__): same
4210         (Source): new base class for CVS/SVN/etc. Factor out everything
4211         common, add revision computation (perform the checkout with a -D
4212         DATE or -r REVISION that gets exactly the sources described by the
4213         last Change), overridable with step.alwaysUseLatest. Add patch
4214         handling (build.getSourceStamp can trigger the use of a base
4215         revision and a patch).
4216         (CVS, SVN, Darcs, Arch, P4Sync): refactor, remove leftover arguments
4217         * docs/steps.xhtml: update docs
4218         * docs/source.xhtml: mention .checkoutDelay
4219         * docs/examples/hello.cfg: show use of checkoutDelay, alwaysUseLatest
4221         * buildbot/process/base.py (Build.setSourceStamp): add a
4222         .sourceStamp attribute to each Build. If set, this indicates that
4223         the build should be done with something other than the most
4224         recent source tree. This will be used to implement "try" builds.
4225         (Build.allChanges): new support method
4226         (Build.lastChangeTime): remove, functionality moved to Source steps
4227         (Build.setupBuild): copy the Step args before adding ['workdir'],
4228         to avoid modifying the BuildFactory (and thus triggering spurious
4229         config changes)
4232         * buildbot/status/html.py: rename s/commits/changes/
4233         (StatusResourceChanges): same
4234         (CommitBox.getBox): same, update URL
4235         (WaterfallStatusResource): same
4236         (StatusResource.getChild): same
4238         * contrib/debugclient.py (DebugWidget.do_commit): send .revision
4239         * contrib/debug.glade: add optional 'revision' to the fakeChange
4241         * buildbot/changes/changes.py (html_tmpl): display .revision
4242         (ChangeMaster.addChange): note .revision in log
4243         * buildbot/changes/pb.py (ChangePerspective.perspective_addChange):
4244         accept a ['revision'] attribute
4246         * buildbot/process/factory.py (BuildFactory): use ComparableMixin
4248         * buildbot/master.py (BotMaster.getPerspective): update the
4249         .connected flag in SlaveStatus when it connects
4250         (BotMaster.detach): and when it disconnects
4251         (DebugPerspective.perspective_fakeChange): take a 'revision' attr
4252         (BuildMaster.loadConfig_Builders): walk old list correctly
4254         * buildbot/test/test_config.py: fix prefix= usage
4256 2004-09-06  Brian Warner  <warner@lothar.com>
4258         * NEWS: mention P4
4260         * buildbot/changes/p4poller.py (P4Source): New ChangeSource to
4261         poll a P4 depot looking for recent changes. Thanks to Dave
4262         Peticolas for the contribution. Probably needs some testing after
4263         I mangled it.
4265         * buildbot/process/step.py (P4Sync): simple P4 source-updater,
4266         requires manual client setup for each buildslave. Rather
4267         experimental. Thanks again to Dave Peticolas.
4268         * buildbot/slave/commands.py (P4Sync): slave-side source-updater
4270         * buildbot/changes/changes.py (Change): add a .revision attribute,
4271         which will eventually be used to generate source-stamp values.
4273         * buildbot/process/step.py (RemoteCommand.start): use
4274         notifyOnDisconnect to notice when we lose the slave, then treat it
4275         like an exception. This allows LogFiles to be closed and the build
4276         to be wrapped up normally. Be sure to remove the disconnect
4277         notification when the step completes so we don't accumulate a
4278         bazillion such notifications which will fire weeks later (when the
4279         slave finally disconnects normally). Fixes SF#915807, thanks to
4280         spiv (Andrew Bennetts) for the report.
4281         (LoggedRemoteCommand): move __init__ code to RemoteCommand, since it
4282         really isn't Logged- specific
4283         (LoggedRemoteCommand.remoteFailed): Add an extra newline to the
4284         header, since it's almost always going to be appended to an
4285         incomplete line
4286         * buildbot/test/test_steps.py (BuildStep.testShellCommand1):
4287         update test to handle use of notifyOnDisconnect
4289         * buildbot/status/builder.py (BuilderStatus.currentlyOffline):
4290         don't clear .ETA and .currentBuild when going offline, let the
4291         current build clean up after itself
4293         * buildbot/process/builder.py (Builder.detached): wait a moment
4294         before doing things like stopping the current build, because the
4295         current step will probably notice the disconnect and cleanup the
4296         build by itself
4297         * buildbot/test/test_run.py (Status.tearDown): update test to
4298         handle asynchronous build-detachment
4300         * buildbot/process/base.py (Build.stopBuild): minor shuffles
4302         * buildbot/status/html.py (WaterfallStatusResource.buildGrid):
4303         hush a debug message
4305 2004-09-05  Brian Warner  <warner@lothar.com>
4307         * buildbot/changes/maildir.py (Maildir.start): catch an IOError
4308         when the dnotify fcntl() fails and fall back to polling. Linux 2.2
4309         kernels do this: the fcntl module has the F_NOTIFY constant, but
4310         the kernel itself doesn't support the operation. Thanks to Olly
4311         Betts for spotting the problem.
4313         * buildbot/process/step.py (Darcs): new source-checkout command
4314         (Arch): new source-checkout command
4315         (todo_P4): fix constructor syntax, still just a placeholder
4316         * buildbot/test/test_vc.py (VC.testDarcs): test it
4317         (VC.testDarcsHTTP): same, via localhost HTTP
4318         (VC.testArch): same
4319         (VC.testArchHTTP): same
4320         * NEWS: mention new features
4322         * buildbot/slave/commands.py (ShellCommand): add .keepStdout,
4323         which tells the step to stash stdout text locally (in .stdout).
4324         Slave-side Commands can use this to make decisions based upon the
4325         output of the the ShellCommand (not just the exit code).
4326         (Darcs): New source-checkout command
4327         (Arch): New source-checkout command, uses .keepStdout in one place
4328         where it needs to discover the archive's default name.
4330         * docs/steps.xhtml: Document options taken by Darcs and Arch.
4331         * docs/source.xhtml: add brief descriptions of Darcs and Arch
4332         * docs/examples/hello.cfg: add examples of Darcs and Arch checkout
4334         * buildbot/process/step.py (ShellCommand.describe): add an
4335         alternate .descriptionDone attribute which provides descriptive
4336         text when the step is complete. .description can be ["compiling"],
4337         for use while the step is running, then .descriptionDone can be
4338         ["compile"], used alone when the step succeeds or with "failed" when
4339         it does not. Updated other steps to use the new text.
4340         * buildbot/process/step_twisted.py: same
4341         * buildbot/test/test_run.py: update tests to match
4343 2004-08-30  Brian Warner  <warner@lothar.com>
4345         * buildbot/process/step.py (ShellCommand.createSummary): fix docs
4346         (CVS.__init__): send 'patch' argument to slave
4347         (CVS.start): don't create the LoggedRemoteCommand until start(),
4348         so we can catch a .patch added after __init__
4349         (SVN.__init__): add 'patch' to SVN too
4350         (SVN.start): same
4352         * buildbot/slave/commands.py (ShellCommand): add a 'stdin'
4353         argument, to let commands push data into the process' stdin pipe.
4354         Move usePTY to a per-instance attribute, and clear it if 'stdin'
4355         is in use, since closing a PTY doesn't really affect the process
4356         in the right way (in particular, I couldn't run /usr/bin/patch
4357         under a pty).
4358         (SourceBase.doPatch): handle 'patch' argument
4360         * buildbot/test/test_vc.py (VC.doPatch): test 'patch' argument for
4361         both CVS and SVN
4363         * buildbot/slave/commands.py (cvs_ver): fix version-parsing goo
4364         * buildbot/slave/bot.py (Bot.remote_getCommands): send command
4365         versions to master
4366         * buildbot/master.py (BotPerspective.got_commands): get command
4367         versions from slave, give to each builder
4368         * buildbot/process/builder.py (Builder.attached): stash slave
4369         command versions in .remoteCommands
4371         * docs/steps.xhtml: bring docs in-line with reality
4373         * buildbot/process/step.py (CVS.__init__): more brutal
4374         compatibility code removal
4375         (SVN.__init__): same
4377         * buildbot/slave/commands.py (SlaveShellCommand): update docs
4378         (SlaveShellCommand.start): require ['workdir'] argument, remove
4379         the ['dir'] fallback (compatibility will come later)
4380         (SourceBase): update docs
4381         (SourceBase.start): remove ['directory'] fallback
4382         (CVS): update docs
4383         (SVN): update docs
4384         * buildbot/test/test_config.py (ConfigTest.testBuilders): update test
4385         * buildbot/test/test_steps.py (BuildStep.testShellCommand1): same
4386         * buildbot/test/test_slavecommand.py (SlaveCommandTestCase): same
4388         * buildbot/process/step.py (RemoteShellCommand.__init__): add
4389         want_stdout/want_stderr. remove old 'dir' keyword (to simplify the
4390         code.. I will figure out 0.5.0-compatibility hooks later)
4392 2004-08-30  Brian Warner  <warner@lothar.com>
4394         * buildbot/process/process_twisted.py: rewrite in terms of new
4395         BuildFactory base class. It got significantly shorter. Yay
4396         negative code days.
4398         * buildbot/process/step_twisted.py (HLint.start): fix to make it
4399         work with the new "self.build isn't nailed down until we call
4400         step.start()" scheme: specifically, __init__ is called before the
4401         build has decided on which Changes are going in, so we don't scan
4402         build.allFiles() for .xhtml files until start()
4403         (HLint.commandComplete): use getText(), not getStdout()
4404         (RunUnitTests.start): same: don't use .build until start()
4405         (RunUnitTests.describe): oops, don't report (None) when using
4406         the default reactor
4407         (RunUnitTests.commandComplete): use getText()
4408         (RunUnitTests.createSummary): same
4409         (BuildDebs.commandComplete): same
4411         * buildbot/process/step.py (RemoteShellCommand.__init__): don't
4412         set args['command'] until start(), since our BuildStep is allowed
4413         to change their mind up until that point
4414         (TreeSize.commandComplete): use getText(), not getStdout()
4416         * docs/examples/twisted_master.cfg: update to current standards
4418         * docs/factories.xhtml: update
4419         * buildbot/process/factory.py: implement all the common factories
4420         described in the docs. The Trial factory doesn't work yet, and
4421         I've probably broken all the process_twisted.py factories in the
4422         process. There are compatibility classes left in for things like
4423         the old BasicBuildFactory, but subclasses of them are unlikely to
4424         work.
4425         * docs/examples/glib_master.cfg: use new BuildFactories
4426         * docs/examples/hello.cfg: same
4428         * buildbot/test/test_config.py (ConfigTest.testBuilders): remove
4429         explicit 'workdir' args
4431         * buildbot/process/base.py (BuildFactory): move factories to ..
4432         * buildbot/process/factory.py (BuildFactory): .. here
4433         * buildbot/process/process_twisted.py: handle move
4434         * buildbot/test/test_config.py: same
4435         * buildbot/test/test_run.py: same
4436         * buildbot/test/test_steps.py: same
4437         * buildbot/test/test_vc.py: same
4438         * docs/factories.xhtml: same
4440         * NEWS: mention config changes that require updating master.cfg
4442         * buildbot/process/base.py (Build.setupBuild): add a 'workdir'
4443         argument to all steps that weren't given one already, pointing at
4444         the "build/" directory.
4446         * docs/examples/hello.cfg: remove explicit 'workdir' args
4448         * docs/factories.xhtml: document standard BuildFactory clases,
4449         including a bunch which are have not yet been written
4451 2004-08-29  Brian Warner  <warner@lothar.com>
4453         * buildbot/interfaces.py (IBuildStepStatus.getResults): move
4454         result constants (SUCCESS, WARNINGS, FAILURE, SKIPPED) to
4455         buildbot.status.builder so they aren't quite so internal
4456         * buildbot/process/base.py, buildbot/process/builder.py: same
4457         * buildbot/process/maxq.py, buildbot/process/step.py: same
4458         * buildbot/process/step_twisted.py, buildbot/status/builder.py: same
4459         * buildbot/status/mail.py, buildbot/test/test_run.py: same
4460         * buildbot/test/test_status.py, buildbot/test/test_vc.py: same
4462         * buildbot/status/html.py (StatusResourceBuildStep): oops, update
4463         to handle new getLogs()-returns-list behavior
4464         (StatusResourceBuildStep.getChild): same
4465         (StepBox.getBox): same
4466         (WaterfallStatusResource.phase0): same
4468         * docs/source.xhtml: document how Buildbot uses version-control
4469         systems (output side: how we get source trees)
4470         * docs/changes.xhtml: rename from sources.xhtml, documents VC
4471         systems (input side: how we learn about Changes)
4473         * buildbot/master.py (Manhole): use ComparableMixin
4474         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): same
4475         * buildbot/changes/mail.py (MaildirSource): same
4476         * buildbot/status/client.py (PBListener): same
4477         * buildbot/status/html.py (Waterfall): same
4478         * buildbot/status/words.py (IRC): same
4480         * NEWS: start describing new features
4482         * buildbot/status/mail.py (MailNotifier): finish implementation.
4483         The message body is still a bit sparse.
4484         * buildbot/test/test_status.py (Mail): test it
4486         * buildbot/util.py (ComparableMixin): class to provide the __cmp__
4487         and __hash__ methods I wind up adding everywhere. Specifically
4488         intended to support the buildbot config-file update scheme where
4489         we compare, say, the old list of IStatusTargets against the new
4490         one and don't touch something which shows up on both lists.
4491         * buildbot/test/test_util.py (Compare): test case for it
4493         * buildbot/interfaces.py (IBuildStatus): change .getLogs() to
4494         return a list instead of a dict
4495         (IBuildStepStatus.getLogs): same. The idea is that steps create
4496         logs with vaguely unique names (although their uniqueness is not
4497         guaranteed). Thus a compilation step should create its sole
4498         logfile with the name 'compile', and contribute it to the
4499         BuildStatus. If a step has two logfiles, try to create them with
4500         different names (like 'test.log' and 'test.summary'), and only
4501         contribute the important ones to the overall BuildStatus.
4502         * buildbot/status/builder.py (Event.getLogs): same
4503         (BuildStepStatus): fix default .text and .results
4504         (BuildStepStatus.addLog): switch to list-like .getLogs()
4505         (BuildStepStatus.stepFinished): same
4506         (BuildStatus.text): fix default .text
4507         (BuildStatus.getLogs): temporary hack to return all logs (from all
4508         child BuildStepStatus objects). Needs to be fixed to only report
4509         the significant ones (as contributed by the steps themselves)
4510         * buildbot/test/test_run.py: handle list-like .getLogs()
4511         * buildbot/test/test_steps.py (BuildStep.testShellCommand1): same
4513 2004-08-28  Brian Warner  <warner@lothar.com>
4515         * buildbot/process/builder.py (Builder.attached): serialize the
4516         attachment process, so the attach-watcher isn't called until the
4517         slave is really available. Add detached watchers too, which makes
4518         testing easier.
4520         * buildbot/test/test_vc.py: test VC modes (clobber/update/etc)
4522         * buildbot/test/test_swap.py: remove dead code
4524         * buildbot/slave/commands.py (ShellCommandPP): add debug messages
4525         (ShellCommand.start): treat errors in _startCommand/spawnProcess
4526         sort of as if the command being run exited with a -1. There may
4527         still be some holes in this scheme.
4528         (CVSCommand): add 'revision' tag to the VC commands, make sure the
4529         -r option appears before the module list
4530         * buildbot/process/step.py (CVS): add 'revision' argument
4532         * buildbot/slave/bot.py (SlaveBuilder._ackFailed): catch failures
4533         when sending updates or stepComplete messages to the master, since
4534         we don't currently care whether they arrive or not. When we revamp
4535         the master/slave protocol to really resume interrupted builds,
4536         this will need revisiting.
4537         (lostRemote): remove spurious print
4539         * buildbot/master.py (BotPerspective.attached): serialize the
4540         new-builder interrogation process, to make testing easier
4541         (BotMaster.waitUntilBuilderDetached): convenience function
4543         * buildbot/status/builder.py (BuilderStatus): prune old builds
4544         (BuildStatus.pruneSteps): .. and steps
4545         (BuildStepStatus.pruneLogs): .. and logs
4546         (BuilderStatus.getBuild): handle missing builds
4547         * buildbot/status/html.py (StatusResourceBuild.body): display build
4548         status in the per-build page
4549         (BuildBox.getBox): color finished builds in the per-build box
4551 2004-08-27  Brian Warner  <warner@lothar.com>
4553         * buildbot/status/mail.py (MailNotifier): new notification class,
4554         not yet finished
4556         * buildbot/slave/commands.py (SourceBase): refactor SVN and CVS into
4557         variants of a common base class which handles all the mode= logic
4559         * buildbot/interfaces.py (IBuildStatus.getPreviousBuild): add
4560         convenience method
4561         * buildbot/status/builder.py (BuildStatus.getPreviousBuild): same
4563 2004-08-26  Brian Warner  <warner@lothar.com>
4565         * buildbot/test/test_slavecommand.py: accomodate new slavecommand
4566         interfaces
4568         * buildbot/test/test_run.py: update to new Logfile interface, new
4569         buildbot.slave modules
4570         * buildbot/test/test_steps.py: same, remove Swappable, add timeouts
4572         * MANIFEST.in: new sample config file
4573         * docs/examples/hello.cfg: same
4575         * buildbot/process/step_twisted.py: remove dead import
4577         * buildbot/process/step.py (RemoteCommand.run): catch errors
4578         during .start
4579         (RemoteCommand.remote_update): ignore updates that arrive after
4580         we've shut down
4581         (RemoteCommand.remote_complete): ignore duplicate complete msgs
4582         (RemoteCommand._remoteComplete): cleanup failure handling, reduce
4583         the responsibilities of the subclass's methods
4584         (BuildStep.failed): catch errors during failure processing
4585         (BuildStep.addHTMLLog): provide all-HTML logfiles (from Failures)
4586         (CVS): move to a mode= argument (described in docstring), rather
4587         than the ungainly clobber=/export=/copydir= combination.
4588         (SVN): add mode= functionality to SVN too
4589         (todo_Darcs, todo_Arch, todo_P4): placeholders for future work
4591         * buildbot/process/base.py (Build.startNextStep): catch errors
4592         during s.startStep()
4594         * buildbot/clients/base.py: update to new PB client interface.
4595         gtkPanes is still broken
4597         * buildbot/bot.py, buildbot/slavecommand.py: move to..
4598         * buildbot/slave/bot.py, buildbot/slave/commands.py: .. new directory
4599         * setup.py: add buildbot.slave module
4600         * buildbot/bb_tap.py: handle move
4601         * buildbot/slave/registry.py: place to register commands, w/versions
4602         * buildbot/slave/bot.py: major simplifications
4603         (SlaveBuilder.remote_startCommand): use registry for slave commands,
4604         instead of a fixed table. Eventually this will make the slave more
4605         extensible. Use 'start' method on the command, not .startCommand.
4606         Fix unsafeTracebacks handling (I think).
4607         * buildbot/slave/commands.py: major cleanup. ShellCommand is now a
4608         helper class with a .start method that returns a Deferred.
4609         SlaveShellCommand is the form reached by the buildmaster. Commands
4610         which use multiple ShellCommands can just chain them as Deferreds,
4611         with some helper methods in Command (_abandonOnFailure and
4612         _checkAbandoned) to bail on rc!=0.
4613         (CVSCommand): prefer new mode= argument
4614         (SVNFetch): add mode= argument
4616         * buildbot/master.py (DebugPerspective.perspective_forceBuild):
4617         put a useful reason string on the build
4619         * buildbot/status/builder.py (LogFile): do LogFile right: move the
4620         core functionality into an IStatusLog object
4621         (BuildStatus.sendETAUpdate): don't send empty build-eta messages
4622         * buildbot/status/html.py (TextLog): HTML-rendering goes here
4623         (StatusResourceBuild.body): use proper accessor methods
4624         * buildbot/status/client.py (RemoteLog): PB-access goes here
4625         (StatusClientPerspective.perspective_subscribe): add "full" mode,
4626         which delivers log contents too
4627         (PBListener.__cmp__): make PBListeners comparable, thus removeable
4628         * buildbot/status/event.py: remove old Logfile completely
4630         * buildbot/interfaces.py (IStatusLog.subscribe): make the
4631         subscription interface for IStatusLog subscriptions just like all
4632         other the status subscriptions
4633         (IStatusReceiver.logChunk): method called on subscribers
4635 2004-08-24  Brian Warner  <warner@lothar.com>
4637         * buildbot/process/builder.py (Builder._pong): oops, ping response
4638         includes a result (the implicit None returned by remote_print).
4639         Accept it so the _pong method handles the response correctly.
4641 2004-08-06  Brian Warner  <warner@lothar.com>
4643         * buildbot/test/test_config.py: update IRC, PBListener tests
4645         * buildbot/status/client.py (StatusClientPerspective): total
4646         rewrite to match new IStatus interfaces. New subscription scheme.
4647         There are still a few optimizations to make (sending down extra
4648         information with event messages so the client doesn't have to do a
4649         round trip). The logfile-retrieval code is probably still broken.
4650         Moved the PB service into its own port, you can no longer share a
4651         TCP socket between a PBListener and, say, the slaveport (this
4652         should be fixed eventually).
4653         * buildbot/clients/base.py (Client): revamp to match. still needs
4654         a lot of work, but basic event reporting works fine. gtkPanes is
4655         completely broken.
4657         * buildbot/status/words.py (IRC): move to c['status']. Each IRC
4658         instance talks to a single irc server. Threw out all the old
4659         multi-server handling code. Still need to add back in
4660         builder-control (i.e. "force build")
4662         * buildbot/status/html.py (StatusResourceBuildStep.body): add some
4663         more random text to the as-yet-unreachable per-step page
4665         * buildbot/status/builder.py (BuildStepStatus.sendETAUpdate):
4666         rename to stepETAUpdate
4667         (BuildStatus.subscribe): add build-wide ETA updates
4668         (BuilderStatus.getState): remove more cruft
4669         (BuilderStatus.getCurrentBuild): remove more cruft
4670         (BuilderStatus.buildStarted): really handle tuple-subscription
4671         * buildbot/test/test_run.py (Status.testSlave): handle the
4672         stepETAUpdate rename
4674         * buildbot/master.py (BuildMaster): don't add a default
4675         StatusClientService. Don't add a default IrcStatusFactory. Both
4676         are now added through c['status'] in the config file. c['irc'] is
4677         accepted for backwards compatibility, the only quirk is you cannot
4678         use c['irc'] to specify IRC servers on ports other than 6667.
4680         * buildbot/interfaces.py (IBuildStatus.getCurrentStep): add method
4681         (IStatusReceiver.buildStarted): allow update-interval on subscribe
4682         (IStatusReceiver.buildETAUpdate): send build-wide ETA updates
4683         (IStatusReceiver.stepETAUpdate): rename since it's step-specific
4686         * buildbot/master.py (BuildMaster.startService): SIGHUP now causes
4687         the buildmaster to re-read its config file
4690         * buildbot/test/test_web.py (test_webPortnum): need a new hack to
4691         find out the port our server is running on
4692         (WebTest.test_webPathname_port): same
4694         * buildbot/test/test_config.py (testWebPortnum): test it
4695         (testWebPathname): ditto
4697         * docs/config.xhtml: document new c['status'] configuration option
4699         * buildbot/status/html.py (Waterfall): new top-level class which
4700         can be added to c['status']. This creates the Site as well as the
4701         necessary TCPServer/UNIXServer. It goes through the BuildMaster,
4702         reachable as .parent, for everything.
4704         * buildbot/master.py (Manhole): make it a normal service Child
4705         (BuildMaster.loadConfig_status): c['status'] replaces webPortnum and
4706         webPathname. It will eventually replace c['irc'] and the implicit
4707         PB listener as well. c['webPortnum'] and c['webPathname'] are left
4708         in as (deprecated) backward compatibility hooks for now.
4711         * buildbot/process/builder.py (Builder.buildFinished): don't
4712         inform out builder_status about a finished build, as it finds out
4713         through its child BuildStatus object
4715         * buildbot/status/html.py: extensive revamp. Use adapters to make
4716         Boxes out of BuildStepStatus and friends. Acknowledge that Steps
4717         have both starting and finishing times and adjust the waterfall
4718         display accordingly, using spacers if necessary. Use SlaveStatus
4719         to get buildslave info.
4720         (StatusResourceBuildStep): new just-one-step resource, used to get
4721         logfiles. No actual href to it yet.
4723         * buildbot/status/event.py (Logfile.doSwap): disable Swappable for
4724         the time being, until I get the file-naming scheme right
4726         * buildbot/status/builder.py (Event): clean started/finished names
4727         (BuildStatus.isFinished): .finished is not None is the right test
4728         (BuildStatus.buildStarted): track started/finished times ourselves
4729         (BuilderStatus.getSlave): provide access to SlaveStatus object
4730         (BuilderStatus.getLastFinishedBuild): all builds are now in
4731         .builds, even the currently-running one. Accomodate this change.
4732         (BuilderStatus.eventGenerator): new per-builder event generator.
4733         Returns BuildStepStatus and BuildStatus objects, since they can
4734         both be adapted as necessary.
4735         (BuilderStatus.addEvent): clean up started/finished attributes
4736         (BuilderStatus.startBuild,finishBuild): remove dead code
4737         (SlaveStatus): new object to provide ISlaveStatus
4739         * buildbot/process/step.py (ShellCommand.getColor): actually
4740         return the color instead of setting it ourselves
4741         (CVS.__init__): pull .timeout and .workdir options out of
4742         **kwargs, since BuildStep will ignore them. Without this neither
4743         will be sent to the slave correctly.
4744         (SVN.__init__): same
4746         * buildbot/process/builder.py (Builder): move flags to class-level
4747         attributes
4748         (Builder.attached): remove .remoteInfo, let the BotPerspective and
4749         SlaveStatus handle that
4751         * buildbot/process/base.py (Build.firstEvent): remove dead code
4752         (Build.stopBuild): bugfix
4754         * buildbot/changes/pb.py (PBChangeSource.describe): add method
4756         * buildbot/changes/changes.py (Change): add IStatusEvent methods
4757         (ChangeMaster.eventGenerator): yield Changes, since there are now
4758         Adapters to turn them into HTML boxes
4760         * buildbot/master.py (BotMaster): track SlaveStatus from BotMaster
4761         (BotPerspective.attached): feed a SlaveStatus object
4762         (BuildMaster.loadConfig): add a manhole port (debug over telnet)
4763         (BuildMaster.loadConfig_Builders): give BuilderStatus a parent
4765         * buildbot/interfaces.py: API additions
4766         (ISlaveStatus): place to get slave status
4768 2004-08-04  Brian Warner  <warner@lothar.com>
4770         * buildbot/slavecommand.py (DummyCommand.finished): send rc=0 when
4771         the delay finishes, so the step is marked as SUCCESS
4773         * buildbot/test/test_run.py (Status.testSlave): cover more of
4774         IBuildStatus and IBuildStepStatus
4776         * buildbot/status/progress.py (StepProgress): move some flags to
4777         class-level attributes
4778         (StepProgress.remaining): if there are no other progress metrics
4779         to go by, fall back to elapsed time
4780         (StepProgress.setExpectations): take a dict of metrics instead of
4781         a list
4782         (BuildProgress.setExpectationsFrom): pull expectations from the
4783         Expectations, instead of having it push them to the BuildProgress
4784         (Expectations): move some flags to class-level attributes
4785         (Expectations.__init__): copy per-step times from the
4786         BuildProgress too
4787         (Expectations.expectedBuildTime): new method for per-build ETA
4789         * buildbot/status/event.py (Logfile): move some flags to
4790         class-level attributes
4791         (Logfile.logProgressTo): better method name, let step set the
4792         progress axis name (instead of always being "output")
4794         * buildbot/status/builder.py (BuildStepStatus.getTimes): track the
4795         times directly, rather than depending upon the (possibly missing)
4796         .progress object. Use 'None' to indicate "not started/finished
4797         yet"
4798         (BuildStepStatus.getExpectations): oops, return the full list of
4799         expectations
4800         (BuilderStatus._buildFinished): append finished builds to .builds
4802         * buildbot/process/step.py (BuildStep): add separate .useProgress
4803         flag, since empty .progressMetrics[] still implies that time is a
4804         useful predictor
4805         (CVS): set up the cmd in __init__, instead of waiting for start()
4807         * buildbot/process/base.py (Build.startBuild): disable the 'when'
4808         calculation, this will eventually turn into a proper sourceStamp
4809         (Build.setupBuild): tell the Progress to load from the Expectations,
4810         instead of having the Expectations stuff things into the Progress
4811         (Build.buildException): add a build-level errback to make sure the
4812         build's Deferred fires even in case of exceptions
4814         * buildbot/master.py (BotMaster.forceBuild): convey the reason into
4815         the forced build
4816         * buildbot/process/builder.py (Builder.forceBuild): convey the
4817         reason instead of creating a fake Change
4819         * docs/examples/twisted_master.cfg: update to match reality
4821         * buildbot/test/test_config.py, buildbot/test/test_process.py:
4822         * buildbot/test/test_run.py, buildbot/test/test_steps.py:
4823         fix or remove broken/breaking tests
4825         * buildbot/status/event.py (Logfile.__len__): remove evil method
4827         * buildbot/status/builder.py (BuildStepStatus.stepStarted): tolerate
4828         missing .build, for test convenience
4830         * buildbot/process/step_twisted.py: import fixes
4832         * buildbot/process/step.py (BuildStep.failed): exception is FAILURE
4834         * buildbot/master.py (BuildMaster.loadConfig_Builders): leftover
4835         .statusbag reference
4837         * buildbot/bot.py (BuildSlave.stopService): tear down the TCP
4838         connection at shutdown, and stop it from reconnecting
4840         * buildbot/test/test_run.py (Run.testSlave): use a RemoteDummy to
4841         chase down remote-execution bugs
4843         * buildbot/process/step.py: more fixes, remove
4844         BuildStep.setStatus()
4845         * buildbot/status/builder.py: move setStatus() functionality into
4846         BuildStatus.addStep
4847         * buildbot/status/event.py: minor fixes
4849 2004-08-03  Brian Warner  <warner@lothar.com>
4851         * buildbot/process/base.py, buildbot/process/builder.py
4852         * buildbot/process/step.py, buildbot/status/builder.py
4853         * buildbot/status/event.py, buildbot/test/test_run.py:
4854         fix status delivery, get a basic test case working
4855         * buildbot/master.py: finish implementing basic status delivery,
4856         temporarily disable HTML/IRC/PB status sources
4858         * buildbot/bot.py (Bot.remote_setBuilderList): remove debug noise
4860         * buildbot/status/progress.py (BuildProgress): remove dead code
4862         * buildbot/interfaces.py
4863         * buildbot/process/base.py, buildbot/process/builder.py
4864         * buildbot/process/step.py, buildbot/process/step_twisted.py
4865         * buildbot/status/builder.py: Complete overhaul of the all
4866         status-delivery code, unifying all types of status clients (HTML,
4867         IRC, PB). See interfaces.IBuildStatus for an idea of what it will
4868         look like. This commit is a checkpointing of the work-in-progress:
4869         the input side is mostly done (Builders/Builds sending status
4870         to the BuilderStatus/BuildStatus objects), but the output side has
4871         not yet been started (HTML resources querying BuilderStatus
4872         objects). Things are probably very broken right now and may remain
4873         so for several weeks, I apologize for the disruption.
4875         * buildbot/status/event.py: add a setHTML method to use pre-rendered
4876         HTML as the log's contents. Currently used for exception tracebacks.
4877         * buildbot/status/progress.py: minor spelling changes
4879 2004-08-02  Brian Warner  <warner@lothar.com>
4881         * docs/config.xhtml: XHTML fixes, makes raw .xhtml files viewable
4882         in mozilla. Also added stylesheets copied from Twisted's docs.
4883         Remember that these files are meant to be run through Lore first.
4884         Thanks to Philipp Frauenfelder for the fixes.
4885         * docs/factories.xhtml, docs/sources.xhtml, docs/steps.xhtml: same
4886         * docs/stylesheet-unprocessed.css, docs/stylesheet.css: same
4887         * docs/template.tpl: added a Lore template
4889 2004-07-29  Brian Warner  <warner@lothar.com>
4891         * buildbot/interfaces.py: revamp status delivery. This is the
4892         preview: these are the Interfaces that will be provided by new
4893         Builder code, and to which the current HTML/IRC/PB status
4894         displayers will be adapted.
4896         * buildbot/slavecommand.py (ShellCommand.start): look for .usePTY
4897         on the SlaveBuilder, not the Bot.
4898         * buildbot/bot.py (Bot.remote_setBuilderList): copy Bot.usePTY to
4899         SlaveBuilder.usePTY
4900         * buildbot/test/test_slavecommand.py (FakeSlaveBuilder.usePTY):
4901         set .usePTY on the FakeSlaveBuilder
4903 2004-07-25  Brian Warner  <warner@lothar.com>
4905         * buildbot/changes/freshcvs.py: add some debug log messages
4906         (FreshCVSConnectionFactory.gotPerspective): pre-emptively fix the
4907         disabled 'setFilter' syntax
4908         (FreshCVSSourceNewcred.__init__): warn about prefix= values that
4909         don't end with a slash
4911         * buildbot/process/base.py (Builder._pong_failed): add TODO note
4913         * setup.py: bump to 0.5.0+ while between releases
4915 2004-07-23  Brian Warner  <warner@lothar.com>
4917         * setup.py (version): Releasing buildbot-0.5.0
4919 2004-07-23  Brian Warner  <warner@lothar.com>
4921         * README: update for 0.5.0 release
4923         * NEWS: update for 0.5.0 release
4925 2004-07-22  Brian Warner  <warner@lothar.com>
4927         * buildbot/slavecommand.py (ShellCommand): make usePTY a
4928         mktap-time configuration flag (--usepty=1, --usepty=0)
4929         * buildbot/bot.py: same
4931         * buildbot/master.py (BotPerspective.got_dirs): don't complain about
4932         an 'info' directory being unwanted
4934         * buildbot/changes/freshcvs.py (FreshCVSSource): flip the
4935         newcred/oldcred switch. Newcred (for CVSToys-1.0.10 and later) is now
4936         the default. To communicate with an oldcred daemond (CVSToys-1.0.9
4937         and earlier), use a FreshCVSSourceOldcred instead.
4938         (test): simple test routine: connect to server, print changes
4940         * buildbot/changes/changes.py (Change.getTime): make it possible
4941         to print un-timestamped changes
4943         * buildbot/master.py (makeApp): delete ancient dead code
4944         (BuildMaster.loadTheConfigFile): make "master.cfg" name configurable
4945         * buildbot/test/test_config.py (testFindConfigFile): test it
4947         * docs/examples/twisted_master.cfg (b22w32): use iocp reactor
4948         instead of win32 one
4951         * buildbot/master.py (BuildMaster.loadConfig_Builders): config file
4952         now takes a dictionary instead of a tuple. See docs/config.xhtml for
4953         details.
4955         * buildbot/process/base.py (Builder.__init__): change constructor
4956         to accept a dictionary of config data, rather than discrete
4957         name/slave/builddir/factory arguments
4959         * docs/examples/twisted_master.cfg: update to new syntax
4960         * docs/examples/glib_master.cfg: same
4961         * buildbot/test/test_config.py (ConfigTest.testBuilders): some
4962         rough tests of the new syntax
4964         
4965         * buildbot/master.py (BuildMaster.loadConfig): allow webPathname
4966         to be an int, which means "run a web.distrib sub-server on a TCP
4967         port". This lets you publish the buildbot status page to a remote
4968         twisted.web server (using distrib.ResourceSubscription). Also
4969         rename the local attributes used to hold these web things so
4970         they're more in touch with reality.
4971         * buildbot/test/test_web.py: test webPortnum and webPathname
4972         * docs/config.xhtml: document this new use of webPathname
4974         * docs/config.xhtml: new document, slightly ahead of reality
4975         
4976         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred.notify): fix
4977         'prefix' handling: treat it as a simple string to check with
4978         .startswith, instead of treating it as a directory. This allows
4979         sub-directories to be used. If you use prefix=, you should give it
4980         a string that starts just below the CVSROOT and ends with a slash.
4981         This prefix will be stripped from all filenames, and filenames
4982         which do not start with it will be ignored.
4984 2004-07-20  Cory Dodt  <corydodt@twistedmatrix.com>
4986         * contrib/svn_buildbot.py: Add --include (synonym for --filter)
4987         and --exclude (inverse of --include).  SVN post-commit hooks
4988         now have total control over which changes get sent to buildbot and which
4989         do not.
4991 2004-07-10  Brian Warner  <warner@lothar.com>
4993         * buildbot/test/test_twisted.py (Case1.testCountFailedTests): fix
4994         test case to match new API
4996         * buildbot/status/event.py (Logfile.getEntries): fix silly bug
4997         which crashed HTML display when self.entries=[] (needed to
4998         distinguish between [], which means "no entries yet", and None,
4999         which means "the entries have been swapped out to disk, go fetch
5000         them").
5002 2004-07-04  Brian Warner  <warner@lothar.com>
5004         * buildbot/process/step_twisted.py (countFailedTests): Count
5005         skips, expectedFailures, and unexpectedSuccesses. Start scanning
5006         10kb from the end because any import errors are wedged there and
5007         they would make us think the test log was unparseable.
5008         (RunUnitTests.finishStatus): add skip/todo counts to the event box
5010 2004-06-26  Brian Warner  <warner@lothar.com>
5012         * buildbot/process/step_twisted.py (RemovePYCs): turn the
5013         delete-*.pyc command into an actual BuildStep, so we can label it
5014         nicely
5015         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
5016         (FullTwistedBuildFactory): same
5018 2004-06-25  Cory Dodt  <corydodt@twistedmatrix.com>
5020         * contrib/fakechange.py: Add an errback when sending the fake 
5021         change, so we know it didn't work.
5023 2004-06-25  Christopher Armstrong  <radix@twistedmatrix.com>
5025         * buildbot/process/step_twisted.py: Delete *.pyc files before
5026         calling trial, so it doesn't catch any old .pyc files whose .py
5027         files have been moved or deleted.
5029         * buildbot/process/step_twisted.py (RunUnitTests): 1) Add a new
5030         parameter, 'recurse', that passes -R to trial. 2) have 'runAll'
5031         imply 'recurse'. 3) Make the default 'allTests' be ["twisted"]
5032         instead of ["twisted.test"], so that the end result is "trial -R
5033         twisted".
5035         * contrib/svn_buildbot.py: Add a --filter parameter that accepts a
5036         regular expression to match filenames that should be ignored when
5037         changed. Also add a --revision parameter that specifies the
5038         revision to examine, which is useful for debugging.
5040 2004-06-25  Brian Warner  <warner@lothar.com>
5042         * buildbot/process/step_twisted.py (trialTextSummarizer): create a
5043         summary of warnings (like DeprecationWarnings), next to the
5044         "summary" file
5046 2004-05-13  Brian Warner  <warner@lothar.com>
5048         * docs/examples/twisted_master.cfg: enable the win32 builder, as
5049         we now have a w32 build slave courtesy of Mike Taylor.
5051         * buildbot/process/base.py (Build.checkInterlocks): OMG this was
5052         so broken. Fixed a race condition that tripped up interlocked
5053         builds and caused the status to be stuck at "Interlocked" forever.
5054         The twisted buildbot's one interlocked build just so happened to
5055         never hit this case until recently (the feeding builds both pass
5056         before the interlocked build is attempted.. usually it has to wait
5057         a while).
5058         (Builder._pong_failed): fix method signature
5060         * setup.py: bump to 0.4.3+ while between releases
5062 2004-04-30  Brian Warner  <warner@lothar.com>
5064         * setup.py (version): Releasing buildbot-0.4.3
5066 2004-04-30  Brian Warner  <warner@lothar.com>
5068         * MANIFEST.in: add the doc fragments in  docs/*.xhtml
5070         * README: update for 0.4.3 release
5072         * NEWS: update for 0.4.3 release
5074         * buildbot/master.py (BuildMaster.__getstate__): make sure
5075         Versioned.__getstate__ is invoked, for upgrade from 0.4.2
5077         * buildbot/process/step_twisted.py (RunUnitTests.trial): add
5078         .trial as a class attribute, for upgrade from 0.4.2
5080         * buildbot/changes/changes.py (Change.links): add .links for
5081         upgrade from 0.4.2
5083         * buildbot/status/event.py (Logfile.__getstate__): get rid of both
5084         .textWatchers and .htmlWatchers at save time, since they are both
5085         volatile, should allow smooth 0.4.2 upgrade
5087         * buildbot/process/step.py (CVS.finishStatus): catch failed
5088         CVS/SVN commands so we can make the status box red
5090 2004-04-29  Brian Warner  <warner@lothar.com>
5092         * buildbot/changes/freshcvs.py
5093         (FreshCVSConnectionFactory.gotPerspective): add (commented-out)
5094         code to do setFilter(), which tells the freshcvs daemon to not
5095         send us stuff that we're not interested in. I will uncomment it
5096         when a new version of CVSToys is available in which setFilter()
5097         actually works, and I get a chance to test it better.
5099         * docs/examples/twisted_master.cfg: start using a PBChangeSource
5101         * buildbot/master.py (Dispatcher): use a registration scheme
5102         instead of hardwired service names
5103         (BuildMaster): keep track of the Dispatcher to support
5104         registration
5106         * buildbot/changes/changes.py (ChangeMaster): create a distinct
5107         PBChangeSource class instead of having it be an undocumented
5108         internal feature of the ChangeMaster. Split out the code into a
5109         new file.
5110         * buildbot/changes/pb.py (PBChangeSource): same
5111         * buildbot/test/test_changes.py: a few tests for PBChangeSource
5113         * docs/{factories|sources|steps}.xhtml: document some pieces
5115         * docs/examples/twisted_master.cfg: use SVN instead of CVS, stop
5116         using FCMaildirSource
5117         (f23osx): update OS-X builder to use python2.3, since the slave
5118         was updated to Panther (10.3.3)
5120 2004-03-21  Brian Warner  <warner@lothar.com>
5122         * buildbot/process/process_twisted.py: factor out doCheckout, change
5123         to use SVN instead of CVS
5125         * buildbot/process/base.py (BasicBuildFactory): refactor to make
5126         an SVN subclass easier
5127         (BasicSVN): subclass which uses Subversion instead of CVS
5129 2004-03-15  Christopher Armstrong  <radix@twistedmatrix.com>
5131         * buildbot/slavecommand.py (ShellCommand.start): use COMSPEC instead
5132         of /bin/sh on win32
5133         (CVSCommand.cvsComplete): don't assume chdir worked on win32
5135 2004-02-25  Brian Warner  <warner@lothar.com>
5137         * buildbot/slavecommand.py (ShellCommand): ['commands'] argument
5138         is now either a list (which is passed to spawnProcess directly) or
5139         a string (which gets passed to /bin/sh -c). This removes the useSH
5140         flag and the ArgslistCommand class. Also send status header at the
5141         start and end of each command, instead of having the master-side
5142         code do that.
5143         (CVSCommand): fix the doUpdate command, it failed to do the 'cp
5144         -r'. Update to use list-based arguments.
5145         (SVNFetch): use list-based arguments, use ['dir'] argument to
5146         simplify code.
5147         * buildbot/test/test_steps.py (Commands): match changes
5149         * buildbot/process/step.py (InternalShellCommand.words): handle
5150         command lists
5151         (SVN): inherit from CVS, cleanup
5153         * buildbot/status/event.py (Logfile.content): render in HTML, with
5154         stderr in red and headers (like the name of the command we're
5155         about to run) in blue. Add link to a second URL (url + "?text=1")
5156         to get just stdout/stderr in text/plain without markup. There is
5157         still a problem with .entries=None causing a crash, it seems to occur
5158         when the logfile is read before it is finished.
5160         * buildbot/bot.py (BotFactory.doKeepalive): add a 30-second
5161         timeout to the keepalives, and use it to explicitly do a
5162         loseConnection instead of waiting for TCP to notice the loss. This
5163         ought to clear up the silent-lossage problem.
5164         (unsafeTracebacks): pass exception tracebacks back to the master,
5165         makes it much easier to debug problems
5167 2004-02-23  Brian Warner  <warner@lothar.com>
5169         * buildbot/slavecommand.py (ShellCommand): add useSH flag to pass
5170         the whole command to /bin/sh instead of execve [Johan Dahlin]
5171         (CVSCommand): drop '-r BRANCH' if BRANCH==None instead of usiing
5172         '-r HEAD' [Johan Dahlin]
5173         (CVSCommand.start2): fix cvsdir calculation [Johan Dahlin]
5175         * buildbot/changes/changes.py (Change): add links= argument, add
5176         asHTML method [Johan Dahlin]. Modified to make a bit more
5177         XHTMLish. Still not sure how to best use links= .
5179         * buildbot/status/html.py (StatusResourceCommits.getChild): use 
5180         Change.asHTML to display the change, not asText
5182         * buildbot/status/html.py (StatusResourceBuilder): web button to
5183         ping slave
5185         * buildbot/test/test_run.py: test to actually start a buildmaster
5186         and poke at it
5188         * MANIFEST.in: bring back accidentally-dropped test helper files
5190         * buildbot/test/test_config.py (ConfigTest.testSources): skip tests
5191         that require cvstoys if it is not installed
5193         * buildbot/process/step_twisted.py (RunUnitTests): allow other
5194         values of "bin/trial" [Dave Peticolas]
5195         (RunUnitTests.finishStatus): say "no tests run" instead of "0
5196         tests passed" when we didn't happen to run any tests
5198         * buildbot/process/step.py (Compile): use haltOnFailure instead of
5199         flunkOnFailure [Johan Dahlin]
5201         * buildbot/process/base.py (ConfigurableBuild.setSteps): allow
5202         multiple instances of the same Step class by suffixing "_2", etc,
5203         to the name until it is unique. This name needs to be unique
5204         because it is used as a key in the dictionary that tracks build
5205         progress.
5206         * buildbot/test/test_steps.py (Steps.testMultipleStepInstances):
5207         add test for it
5209         * buildbot/process/base.py (Builder.ping): add "ping slave" command
5211 2004-01-14  Brian Warner  <warner@lothar.com>
5213         * buildbot/status/words.py (IrcStatusBot): when we leave or get
5214         kicked from a channel, log it
5216         * buildbot/master.py (Dispatcher): add "poke IRC" command to say
5217         something over whatever IRC channels the buildmaster is currently
5218         connected to. Added to try and track down a problem in which the
5219         master thinks it is still connected but the IRCd doesn't see it. I
5220         used a styles.Versioned this time, so hopefully users won't have
5221         to rebuild their .tap files this time.
5222         * contrib/debug.glade: add a "Poke IRC" button
5223         * contrib/debugclient.py: same
5225         * setup.py: bump to 0.4.2+ while between releases
5227 2004-01-08  Brian Warner  <warner@lothar.com>
5229         * setup.py (version): Releasing buildbot-0.4.2
5231 2004-01-08  Brian Warner  <warner@lothar.com>
5233         * NEWS: update for 0.4.2 release
5235         * README: document how to run the tests, now that they all pass
5237         * buildbot/changes/maildir.py (Maildir.poll): minor comment
5239         * buildbot/process/step.py (CVS): add a global_options= argument,
5240         which lets you set CVS global options for the command like "-r"
5241         for read-only checkout, or "-R" to avoid writing in the
5242         repository.
5243         * buildbot/slavecommand.py (CVSCommand): same
5245         * buildbot/status/event.py (Logfile): add a .doSwap switch to make
5246         testing easier (it is turned off when testing, to avoid the
5247         leftover timer)
5249         * buildbot/process/step.py (InternalBuildStep): shuffle code a bit
5250         to make it easier to test: break generateStepID() out to a
5251         separate function, only update statusbag if it exists.
5252         (ShellCommands): create useful text for dict-based commands too.
5254         * test/*, buildbot/test/*: move unit tests under the buildbot/
5255         directory
5256         * setup.py (packages): install buildbot.test too
5258         * buildbot/test/test_slavecommand.py: fix it, tests pass now
5259         * buildbot/test/test_steps.py: fix it, tests pass now
5261 2004-01-06  Brian Warner  <warner@lothar.com>
5263         * buildbot/changes/mail.py (parseFreshCVSMail): looks like new
5264         freshcvs mail uses a slightly different syntax for new
5265         directories. Update parser to handle either.
5266         * test/test_mailparse.py (Test1.testMsg9): test for same
5268 2003-12-21  Brian Warner  <warner@lothar.com>
5270         * buildbot/process/process_twisted.py (TwistedDebsBuildFactory): set
5271         'warnOnWarnings' so that lintian errors mark the build orange
5273 2003-12-17  Brian Warner  <warner@lothar.com>
5275         * buildbot/changes/mail.py (parseBonsaiMail): parser for commit
5276         messages emitted by Bonsai, contributed by Stephen Davis.
5278         * test/*: moved all tests to use trial instead of unittest. Some
5279         still fail (test_steps, test_slavecommand, and test_process).
5281         * setup.py (version): bump to 0.4.1+ while between releases
5283 2003-12-09  Brian Warner  <warner@lothar.com>
5285         * setup.py (version): Releasing buildbot-0.4.1
5287 2003-12-09  Brian Warner  <warner@lothar.com>
5289         * NEWS: update for 0.4.1 release
5291         * docs/examples/twisted_master.cfg: add netbsd builder, shuffle
5292         freebsd builder code a little bit
5294         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred.__cmp__):
5295         don't try to compare attributes of different classes
5296         * buildbot/changes/mail.py (MaildirSource.__cmp__): same
5297         (MaildirSource.messageReceived): fix Change delivery
5299         * buildbot/master.py (BuildMaster.loadConfig): insert 'basedir'
5300         into the config file's namespace before loading it, like the
5301         documentation claims it does
5302         * docs/examples/twisted_master.cfg: remove explicit 'basedir'
5303         (useFreshCVS): switch to using a maildir until Twisted's freshcvs
5304         daemon comes back online
5306 2003-12-08  Brian Warner  <warner@lothar.com>
5308         * docs/examples/twisted_master.cfg: provide an explicit 'basedir'
5309         so the example will work with online=0 as well
5311         * buildbot/changes/mail.py (FCMaildirSource, SyncmailMaildirSource):
5312         fix the __implements__ line
5314         * buildbot/changes/maildirtwisted.py (MaildirTwisted): make this
5315         class a twisted.application.service.Service, use startService to
5316         get it moving.
5318         * buildbot/changes/dnotify.py (DNotify): use os.open to get the
5319         directory fd instead of simple open(). I'm sure this used to work,
5320         but the current version of python refuses to open directories with
5321         open().
5323 2003-12-05  Brian Warner  <warner@lothar.com>
5325         * setup.py (version): bump to 0.4.0+ while between releases
5327 2003-12-05  Brian Warner  <warner@lothar.com>
5329         * setup.py (version): Releasing buildbot-0.4.0
5331 2003-12-05  Brian Warner  <warner@lothar.com>
5333         * docs/examples/glib_master.cfg: replace old sample scripts with
5334         new-style config files
5335         * MANIFEST.in: include .cfg files in distribution tarball
5337         * buildbot/changes/freshcvs.py (FreshCVSListener.remote_goodbye):
5338         implement a dummy method to avoid the exception that occurs when
5339         freshcvs sends this to us.
5341         * buildbot/pbutil.py (ReconnectingPBClientFactory.stopFactory):
5342         removed the method, as it broke reconnection. Apparently
5343         stopFactory is called each time the connection attempt fails. Must
5344         rethink this.
5345         (ReconnectingPBClientFactory.__getstate__): squash the _callID
5346         attribute before serialization, since without stopFactory the
5347         reconnect timer may still be active and they aren't serializable.
5349         * test/test_mailparse.py (ParseTest): test with 'self' argument
5351         * buildbot/changes/mail.py (parseFreshCVSMail): add (silly) 'self'
5352         argument, as these "functions" are invoked like methods from class
5353         attributes and therefore always get an instance as the first
5354         argument.
5356         * buildbot/changes/maildir.py (Maildir.start): fix error in error
5357         message: thanks to Stephen Davis for the catch
5359 2003-12-04  Brian Warner  <warner@lothar.com>
5361         * buildbot/pbutil.py: complete rewrite using PBClientFactory and
5362         twisted's standard ReconnectingClientFactory. Handles both oldcred
5363         and newcred connections. Also has a bug-workaround for
5364         ReconnectingClientFactory serializing its connector when it
5365         shouldn't.
5367         * buildbot/bot.py (BotFactory): rewrite connection layer with new
5368         pbutil. Replace makeApp stuff with proper newcred/mktap
5369         makeService(). Don't serialize Ephemerals on shutdown.
5371         * buildbot/changes/changes.py (ChangeMaster): make it a
5372         MultiService and add the sources as children, to get startService
5373         and stopService for free. This also gets rid of the .running flag.
5375         * buildbot/changes/freshcvs.py (FreshCVSSource): rewrite to use
5376         new pbutil, turn into a TCPClient at the same time (to get
5377         startService for free). Two variants exist: FreshCVSSourceOldcred
5378         and FreshCVSSourceNewcred (CVSToys doesn't actualy support newcred
5379         yet, but when it does, we'll be ready).
5380         (FreshCVSSource.notify): handle paths which are empty after the
5381         prefix is stripped. This only happens when the top-level (prefix)
5382         directory is added, at the very beginning of a Repository's life.
5384         * buildbot/clients/base.py: use new pbutil, clean up startup code.
5385         Now the only reconnecting code is in the factory where it belongs.
5386         (Builder.unsubscribe): unregister the disconnect callback when we
5387         delete the builder on command from the master (i.e. when the
5388         buildmaster is reconfigured and that builder goes away). This
5389         fixes a multiple-delete exception when the status client is shut
5390         down afterwards.
5391         * buildbot/clients/gtkPanes.py (GtkClient): cleanup, match the
5392         base Client. 
5394         * buildbot/status/words.py (IrcStatusBot): add some more sillyness
5395         (IrcStatusBot.getBuilderStatus): fix minor exception in error message
5397 2003-10-20  Christopher Armstrong  <radix@twistedmatrix.com>
5399         * contrib/run_maxq.py: Accept a testdir as an argument rather than
5400         a list of globs (ugh). The testdir will be searched for files
5401         named *.tests and run the tests in the order specified in each of
5402         those files. This allows for "dependancies" between tests to be
5403         codified.
5405         * buildbot/process/maxq.py (MaxQ.__init__): Accept a testdir
5406         argument to pass to run_maxq.py, instead of a glob.
5408 2003-10-17  Brian Warner  <warner@lothar.com>
5410         * buildbot/process/step_twisted.py (HLint.start): ignore .xhtml
5411         files that live in the sandbox
5413 2003-10-15  Brian Warner  <warner@lothar.com>
5415         * buildbot/process/step_twisted.py (ProcessDocs.finished): fix
5416         spelling error in "docs" count-warnings output
5417         (HLint.start): stupid thinko meant .xhtml files were ignored
5419         * docs/examples/twisted_master.cfg (reactors): disable cReactor
5420         tests now that cReactor is banished to the sandbox
5422 2003-10-10  Brian Warner  <warner@lothar.com>
5424         * buildbot/process/step_twisted.py (ProcessDocs, HLint): new Twisted
5425         scheme: now .xhtml are sources and .html are generated
5427 2003-10-08  Brian Warner  <warner@lothar.com>
5429         * buildbot/process/step_twisted.py (RunUnitTests.__init__): oops,
5430         we were ignoring the 'randomly' parameter.
5432 2003-10-01  Brian Warner  <warner@lothar.com>
5434         * buildbot/slavecommand.py (ShellCommand.start): set usePTY=1 on
5435         posix, to kill sub-children of aborted slavecommands.
5437         * buildbot/status/builder.py: rename Builder to BuilderStatus.
5438         Clean up initialization: lastBuildStatus remains None until the
5439         first build has been completed.
5441         * buildbot/status/html.py (WaterfallStatusResource.body): handle
5442         None as a lastBuildStatus
5443         * buildbot/clients/gtkPanes.py: same
5445         * buildbot/status/client.py (StatusClientService): keep
5446         BuilderStatus objects in self.statusbags . These objects now live
5447         here in the StatusClientService and are referenced by the Builder
5448         object, rather than the other way around.
5449         * buildbot/status/words.py (IrcStatusBot.getBuilderStatus): same
5450         * buildbot/process/base.py (Builder): same
5451         * test/test_config.py (ConfigTest.testBuilders): same
5453         * buildbot/master.py (BuildMaster.loadConfig_Builders): when modifying
5454         an existing builder, leave the statusbag alone. This will preserve the
5455         event history.
5457         * buildbot/pbutil.py (ReconnectingPB.connect): add initial newcred
5458         hook. This will probably go away in favor of a class in upcoming
5459         Twisted versions.
5461         * buildbot/changes/freshcvs.py (FreshCVSSource.start): Remove old
5462         serviceName from newcred FreshCVSNotifiee setup
5464 2003-09-29  Brian Warner  <warner@lothar.com>
5466         * buildbot/process/process_twisted.py: switch to new reactor
5467         abbreviations
5468         * docs/examples/twisted_master.cfg: same
5470         * README (REQUIREMENTS): mention twisted-1.0.8a3 requirement
5472         * buildbot/status/words.py (IrcStatusBot.getBuilder): use the
5473         botmaster reference instead of the oldapp service lookup
5475         * buildbot/master.py (BuildMaster.__init__): give the
5476         StatusClientService a reference to the botmaster to make it easier to
5477         force builds
5479 2003-09-24  Christopher Armstrong  <radix@twistedmatrix.com>
5481         * buildbot/status/html.py (Box.td): escape hreffy things so you
5482         can have spaces in things like builder names
5483         (StatusResourceBuilder.body)
5484         (WaterfallStatusResource.body)
5485         (WaterfallStatusResource.body0): same
5487 2003-09-25  Brian Warner  <warner@lothar.com>
5489         * buildbot/master.py (BuildMaster.loadConfig_Builders): don't
5490         rearrange the builder list when adding or removing builders: keep
5491         them in the order the user requested.
5492         * test/test_config.py (ConfigTest.testBuilders): verify it
5494         * contrib/debug.glade: give the debug window a name
5496         * buildbot/process/base.py (Builder.buildTimerFired): builders can
5497         now wait on multiple interlocks. Fix code relating to that.
5498         (Builder.checkInterlocks): same
5499         * buildbot/status/builder.py (Builder.currentlyInterlocked): same
5501         * buildbot/master.py (BuildMaster.loadConfig): move from
5502         deprecated pb.BrokerFactory to new pb.PBServerFactory
5503         * test/test_config.py (ConfigTest.testWebPathname): same
5505         * docs/examples/twisted_master.cfg: fix interlock declaration
5507         * buildbot/master.py (BotMaster.addInterlock): move code to attach
5508         Interlocks to their Builders into interlock.py .
5509         (BuildMaster.loadConfig_Interlocks): fix interlock handling
5511         * test/test_config.py (ConfigTest.testInterlocks): validate
5512         interlock handling
5514         * buildbot/process/base.py (Builder.__init__): better comments
5515         * buildbot/process/interlock.py (Interlock.__repr__): same
5516         (Interlock.deactivate): add .active flag, move the code that
5517         attaches/detaches builders into the Interlock
5519 2003-09-24  Christopher Armstrong  <radix@twistedmatrix.com>
5521         * buildbot/process/maxq.py (MaxQ): support for running a set of MaxQ
5522         tests using the new run_maxq.py script, and reporting failures by
5523         parsing its output.
5525         * contrib/run_maxq.py: Hacky little script for running a set of maxq
5526         tests, reporting their success or failure in a buildbot-friendly 
5527         manner.
5529 2003-09-24  Brian Warner  <warner@lothar.com>
5531         * docs/examples/twisted_master.cfg: example of a new-style config
5532         file. This lives in the buildmaster base directory as
5533         "master.cfg".
5535         * contrib/debugclient.py (DebugWidget.do_rebuild): add 'reload'
5536         button to make the master re-read its config file
5538         * buildbot/master.py (BuildMaster.loadConfig): new code to load
5539         buildmaster configuration from a file. This file can be re-read
5540         later, and the buildmaster will update itself to match the new
5541         desired configuration. Also use new Twisted Application class.
5542         * test/Makefile, test/test_config.py: unit tests for same
5544         * buildbot/changes/freshcvs.py (FreshCVSSource.__cmp__): make
5545         FreshCVSSources comparable, to support reload.
5546         * buildbot/changes/mail.py (MaildirSource.__cmp__): same
5548         * buildbot/process/base.py (Builder): make them comparable, make
5549         Interlocks easier to attach, to support reload. Handle
5550         re-attachment of remote slaves.
5551         * buildbot/process/interlock.py (Interlock): same
5553         * buildbot/bot.py, bb_tap.py, changes/changes.py: move to
5554         Twisted's new Application class. Requires Twisted >= 1.0.8 .
5555         buildmaster taps are now constructed with mktap.
5556         * buildbot/status/client.py (StatusClientService): same
5558         * buildbot/status/words.py: move to new Services, add support to
5559         connect to multiple networks, add reload support, allow nickname
5560         to be configured on a per-network basis
5562 2003-09-20  Brian Warner  <warner@lothar.com>
5564         * docs/examples/twisted_master.py (twisted_app): use python2.3 for
5565         the freebsd builder, now that the machine has been upgraded and no
5566         longer has python2.2
5568         * setup.py (version): bump to 0.3.5+ while between releases
5570 2003-09-19  Brian Warner  <warner@lothar.com>
5572         * setup.py (version): Releasing buildbot-0.3.5
5574 2003-09-19  Brian Warner  <warner@lothar.com>
5576         * NEWS: add post-0.3.4 notes
5578         * README (REQUIREMENTS): note twisted-1.0.7 requirement
5580         * MANIFEST.in: add contrib/*
5582         * docs/examples/twisted_master.py (twisted_app): all build slaves must
5583         use a remote root now: cvs.twistedmatrix.com
5585         * buildbot/changes/freshcvs.py (FreshCVSNotifiee.connect): update
5586         to newcred
5587         (FreshCVSNotifieeOldcred): but retain a class that uses oldcred for
5588         compatibility with old servers
5589         (FreshCVSSource.start): and provide a way to use it
5590         (FreshCVSNotifiee.disconnect): handle unconnected notifiee
5592         * docs/examples/twisted_master.py (twisted_app): update to new
5593         makeApp interface.
5594         (twisted_app): listen on new ~buildbot socket
5595         (twisted_app): Twisted CVS has moved to cvs.twistedmatrix.com
5597         * buildbot/process/process_twisted.py: Use 'copydir' on CVS steps
5598         to reduce cvs bandwidth (update instead of full checkout)
5600 2003-09-11  Brian Warner  <warner@lothar.com>
5602         * contrib/fakechange.py: demo how to connect to the changemaster
5603         port. You can use this technique to submit changes to the
5604         buildmaster from source control systems that offer a hook to run a
5605         script when changes are committed.
5607         * contrib/debugclient.py: tool to connect to the debug port. You
5608         can use it to force builds, submit fake changes, and wiggle the
5609         builder state
5611         * buildbot/master.py: the Big NewCred Reorganization. Use a single
5612         'Dispatcher' realm to handle all the different kinds of
5613         connections and Perspectives: buildslaves, the changemaster port,
5614         the debug port, and the status client port. NewCredPerspectives
5615         now have .attached/.detached methods called with the remote 'mind'
5616         reference, much like old perspectives did. All the pb.Services
5617         turned into ordinary app.ApplicationServices .
5618         (DebugService): went away, DebugPerspectives are now created
5619         directly by the Dispatcher.
5620         (makeApp): changed interface a little bit
5622         * buildbot/changes/changes.py: newcred
5623         * buildbot/status/client.py: newcred
5625         * buildbot/clients/base.py: newcred client side changes
5626         * buildbot/bot.py: ditto
5628         * docs/examples/glib_master.py: handle new makeApp() interface
5629         * docs/examples/twisted_master.py: ditto
5631         * buildbot/pbutil.py (NewCredPerspective): add a helper class to
5632         base newcred Perspectives on. This should go away once Twisted
5633         itself provides something sensible.
5636 2003-09-11  Christopher Armstrong  <radix@twistedmatrix.com>
5638         * contrib/svn_buildbot.py: A program that you can call from your
5639         SVNREPO/hooks/post-commit file that will notify a BuildBot master
5640         when a change in an SVN repository has happened. See the top of
5641         the file for some minimal usage info.
5643 2003-09-10  Christopher Armstrong  <radix@twistedmatrix.com>
5645         * buildbot/slavecommand.py (ArglistCommand): Add new
5646         ArglistCommand that takes an argument list rather than a string as
5647         a parameter. Using a st.split() for argv is very bad.
5649         * buildbot/slavecommand.py (SVNFetch): Now has the ability to
5650         update to a particular revision rather than always checking out
5651         (still not very smart about it, there may be cases where the
5652         checkout becomes inconsistent).
5654 2003-09-10  Christopher Armstrong  <radix@twistedmatrix.com>
5656         * buildbot/{bot.py,slavecommand.py,process/step.py}: Rudimentary
5657         SVN fetch support. It can checkout (not update!) a specified
5658         revision from a specified repository to a specified directory.
5660         * buildbot/status/progress.py (Expectations.update): Fix an
5661         obvious bug (apparently created by the change described in the
5662         previous ChangeLog message) by moving a check to *after* the
5663         variable it checks is defined.
5666 2003-09-08  Brian Warner  <warner@lothar.com>
5668         * buildbot/status/progress.py (Expectations.update): hack to catch
5669         an exception TTimo sees: sometimes the update() method seems to
5670         get called before the step has actually finished, so the .stopTime
5671         is not set, so no totalTime() is available and we average None
5672         with the previous value. Catch this and just don't update the
5673         metrics, and emit a log message.
5675 2003-08-24  Brian Warner  <warner@lothar.com>
5677         * buildbot/process/base.py (BasicBuildFactory): accept 'cvsCopy'
5678         parameter to set copydir='original' in CVS commands.
5680         * buildbot/process/step.py (CVS): accept 'copydir' parameter.
5682         * buildbot/slavecommand.py (CVSCommand): add 'copydir' parameter,
5683         which tells the command to maintain a separate original-source CVS
5684         workspace. For each build, this workspace will be updated, then
5685         the tree copied into a new workdir. This reduces CVS bandwidth
5686         (from a full checkout to a mere update) while doubling the local
5687         disk usage (to keep two copies of the tree).
5689 2003-08-21  Brian Warner  <warner@lothar.com>
5691         * buildbot/status/event.py (Logfile.addEntry): if the master web
5692         server dies while we're serving a page, request.write raises
5693         pb.DeadReferenceError . Catch this and treat it like a
5694         notifyFinish event by dropping the request.
5696 2003-08-18  Brian Warner  <warner@lothar.com>
5698         * buildbot/status/words.py (IrcStatusBot.command_FORCE): complain
5699         (instead of blowing up) if a force-build command is given without
5700         a reason field
5702         * buildbot/changes/changes.py (ChangeMaster.getChangeNumbered):
5703         don't blow up if there aren't yet any Changes in the list
5705 2003-08-02  Brian Warner  <warner@lothar.com>
5707         * buildbot/bot.py (updateApplication): don't set the .tap name,
5708         since we shouldn't assume we own the whole .tap file
5710         * buildbot/bb_tap.py (updateApplication): clean up code, detect
5711         'mktap buildbot' (without a subcommand) better
5713 2003-07-29  Brian Warner  <warner@lothar.com>
5715         * buildbot/status/words.py
5716         (IrcStatusFactory.clientConnectionLost): when we lose the
5717         connection to the IRC server, schedule a reconnection attempt.
5719         * buildbot/slavecommand.py (CVSCommand.doClobber): on non-posix,
5720         use shutil.rmtree instead of forking off an "rm -rf" command.
5721         rmtree may take a while and will block until it finishes, so we
5722         use "rm -rf" if available.
5724         * docs/examples/twisted_master.py: turn off kqreactor, it hangs
5725         freebsd buildslave badly
5727         * setup.py (version): bump to 0.3.4+ while between releases
5729 2003-07-28  Brian Warner  <warner@lothar.com>
5731         * setup.py (version): Releasing buildbot-0.3.4
5733 2003-07-28  Brian Warner  <warner@lothar.com>
5735         * NEWS: update in preparation for release
5737         * buildbot/slavecommand.py (ShellCommand.doTimeout): use
5738         process.signalProcess instead of os.kill, to improve w32
5739         portability
5741         * docs/examples/twisted_master.py (twisted_app): turn off
5742         win32eventreactor: the tests hang the buildslave badly
5744         * buildbot/process/base.py (Build.buildFinished): update ETA even on
5745         failed builds, since usually the failures are consistent
5747         * buildbot/process/process_twisted.py (TwistedReactorsBuildFactory):
5748         add compileOpts/compileOpts2 to reactors build
5750         * docs/examples/twisted_master.py (twisted_app): add "-c mingw32"
5751         (twisted_app): use both default and win32eventreactor on w32 build.
5752         Use both default and kqreactor on freebsd build.
5754         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
5755         add compileOpts2, which is put after the build_ext argument. w32
5756         needs "-c mingw32" here.
5758         * buildbot/status/html.py (StatusResourceBuilder.getChild): don't
5759         touch .acqpath, it goes away in recent Twisted releases
5761         * docs/examples/twisted_master.py (twisted_app): use "python" for
5762         the w32 buildslave, not "python2.2"
5764         * buildbot/bot.py (Bot.remote_getSlaveInfo): only look in info/ if
5765         the directory exists.. should hush an exception under w32
5767         * buildbot/slavecommand.py (ShellCommandPP.processEnded): use
5768         ProcessTerminated -provided values for signal and exitCode rather
5769         than parsing the unix status code directly. This should remove one
5770         more roadblock for a w32-hosted buildslave.
5772         * test/test_mailparse.py: add test cases for Syncmail parser
5774         * Buildbot/changes/freshcvsmail.py: remove leftover code, leave a
5775         temporary compatibility import. Note! Start importing
5776         FCMaildirSource from changes.mail instead of changes.freshcvsmail
5778         * buildbot/changes/mail.py (parseSyncmail): finish Syncmail parser
5780 2003-07-27  Brian Warner  <warner@lothar.com>
5782         * NEWS: started adding new features
5784         * buildbot/changes/mail.py: start work on Syncmail parser, move
5785         mail sources into their own file
5787         * buildbot/changes/freshcvs.py (FreshCVSNotifiee): mark the class
5788         as implementing IChangeSource
5789         * buildbot/changes/freshcvsmail.py (FCMaildirSource): ditto
5791         * buildbot/interfaces.py: define the IChangeSource interface
5793 2003-07-26  Brian Warner  <warner@lothar.com>
5795         * buildbot/master.py (makeApp): docstring (thanks to Kevin Turner)
5797 2003-06-25  Brian Warner  <warner@lothar.com>
5799         * buildbot/status/words.py (IrcStatusBot.emit_last): round off
5800         seconds display
5802 2003-06-17  Brian Warner  <warner@lothar.com>
5804         * buildbot/status/words.py: clean up method usage to avoid error
5805         in silly IRC command
5806         (IrcStatusBot.emit_status): round off seconds display
5808         * buildbot/process/base.py (Build): delete the timer when saving
5809         to the .tap file, and restore it (if it should still be running)
5810         upon restore. This should fix the "next build in -34 seconds"
5811         messages that result when the master is restarted while builds are
5812         sitting in the .waiting slot. If the time for the build has
5813         already passed, start it very soon (in 1 second).
5815         * buildbot/status/words.py: more silly commands
5817         * README (REQUIREMENTS): add URLs to all required software
5819         * buildbot/status/words.py ('last'): mention results of, and time
5820         since last build
5822 2003-05-28  Brian Warner  <warner@lothar.com>
5824         * buildbot/status/words.py: add 'last' command
5825         (IrcStatusBot.emit_status): add current-small text to 'status' output
5827         * docs/examples/twisted_master.py (twisted_app): turn on IRC bot
5828         (twisted_app): remove spaces from OS-X builder name
5830         * buildbot/master.py (makeApp): add knob to turn on IRC bot
5831         * buildbot/status/words.py: IRC bot should actually be useful now
5833 2003-05-23  Brian Warner  <warner@lothar.com>
5835         * buildbot/bot.py (Bot.remote_getSlaveInfo): add routines to get
5836         "slave information" from $(slavedir)/info/* . These files are
5837         maintained by the slave administrator, and describe the
5838         machine/environment that is hosting the slave. Information from
5839         them is put into the "Builder" HTML page. Still need to establish
5840         a set of well-known filenames and meanings for this data: at the
5841         moment, *all* info/* files are sent to the master, but only
5842         'admin' and 'host' are used on that end.
5843         * buildbot/status/html.py (StatusResourceBuilder.body): ditto
5844         * buildbot/process/base.py (Builder.setRemoteInfo):  ditto
5845         * buildbot/master.py (BotPerspective.got_info):  ditto
5847 2003-05-22  Brian Warner  <warner@lothar.com>
5849         * setup.py (version): bump version to 0.3.3+ while between releases
5851 2003-05-21  Brian Warner  <warner@lothar.com>
5853         * setup.py: Releasing buildbot-0.3.3
5855 2003-05-21  Brian Warner  <warner@lothar.com>
5857         * NEWS: 0.3.3 news items
5859         * README: describe --keepalive and life behind a NAT box
5861         * buildbot/bot.py (Bot.connected): implement application-level
5862         keepalives to deal with NAT timeouts, turn them on with
5863         --keepalive option or when SO_KEEPALIVE doesn't work.
5865         * buildbot/master.py (BotPerspective): accept keepalives silently
5867         * buildbot/process/base.py (Build.buildException): CopiedFailures
5868         don't carry as much information as local ones, so don't try to
5869         create a big HTMLized version of them.
5871         * buildbot/process/step.py (InternalShellCommand.stepFailed): close
5872         log file when step fails due to an exception, such as when the slave
5873         becomes unreachable
5875         * buildbot/process/step_twisted.py (RunUnitTests): use trial's new
5876         --testmodule argument instead of grepping for test-case-name tags
5877         ourselves. Remove FindUnitTests code.
5878         * buildbot/slavecommand.py, buildbot/bot.py: remove old code
5880         * MANIFEST.in: Add docs/examples, files under test/ . Oops!
5882 2003-05-16  Brian Warner  <warner@lothar.com>
5884         * buildbot/process/base.py (BasicBuildFactory): add 'configureEnv'
5885         argument to allow things like CFLAGS=-O0 to be passed without relying
5886         upon /bin/sh processing on the slave.
5888         * buildbot/process/step.py (InternalShellCommand.start): send
5889         'env' dict to slave
5890         * buildbot/slavecommand.py (ShellCommand.start): create argv with
5891         'split' instead of letting /bin/sh do it. This should also remove
5892         the need for /bin/sh on the buildslave, making it more likely to
5893         work with win32.
5895         * buildbot/status/html.py: html-escape text in blamelist.
5896         Add "force build" button to the Builder page.
5898         * buildbot/process/step_twisted.py (countFailedTests): look at
5899         last 1000 characters for status line, as import errors can put it
5900         before the -200 point.
5902 2003-05-15  Brian Warner  <warner@lothar.com>
5904         * docs/examples/twisted_master.py: use clobber=0 for remote builds
5906         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
5907         make 'clobber' a parameter, so it is possible to have builds which
5908         do full tests but do a cvs update instead of hammering the CVS
5909         server with a full checkout each build
5911         * buildbot/process/step.py (InternalShellCommand): bump default
5912         timeout to 20 minutes
5914         * buildbot/bot.py (Bot.debug_forceBuild): utility method to ask
5915         the master to trigger a build. Run it via manhole.
5917         * buildbot/master.py (BotPerspective.perspective_forceBuild):
5918         allow slaves to trigger any build that they host, to make life
5919         easier for slave admins who are testing out new build processes
5921         * buildbot/process/process_twisted.py (TwistedReactorsBuildFactory):
5922         don't flunk cReactor or qtreactor on failure, since they fail alot
5923         these days. Do warnOnFailure instead.
5925         * buildbot/process/base.py: change Builder.buildable from a list
5926         into a single slot. When we don't have a slave, new builds (once
5927         they make it past the timeout) are now merged into an existing
5928         buildable one instead of being queued. With this change, a slave
5929         which has been away for a while doesn't get pounded with all the
5930         builds it missed, but instead just does a single build.
5932 2003-05-07  Brian Warner  <warner@lothar.com>
5934         * setup.py (version): bump version to 0.3.2+ while between releases
5936 2003-05-07  Brian Warner  <warner@lothar.com>
5938         * setup.py: Releasing buildbot-0.3.2
5940 2003-05-07  Brian Warner  <warner@lothar.com>
5942         * setup.py: fix major packaging error: include subdirectories!
5943         
5944         * NEWS: add changes since last release
5946         * README (REQUIREMENTS): update twisted/python dependencies
5948         * buildbot/status/builder.py (Builder.startBuild): change
5949         BuildProcess API: now they should call startBuild/finishBuild
5950         instead of pushing firstEvent / setLastBuildStatus. Moving towards
5951         keeping a list of builds in the statusbag, to support other kinds of
5952         status delivery.
5953         (Builder.addClient): send current-activity-small to new clients
5954         * buildbot/process/base.py (Build.startBuild, .buildFinished): use
5955         new API
5957         * buildbot/status/client.py: drop RemoteReferences at shutdown
5959         * buildbot/status/event.py (Event.stoppedObserving): oops, add it
5961         * buildbot/status/progress.py (BuildProgress.remote_subscribe):
5962         more debug messages for remote status client
5964         * buildbot/process/step.py (InternalBuildStep.stepComplete)
5965         (.stepFailed): only fire the Deferred once, even if both
5966         stepComplete and stepFailed are called. I think this can happen if
5967         an exception occurs at a weird time.
5969         * buildbot/status/words.py: work-in-progress: IRC status delivery
5971 2003-05-05  Brian Warner  <warner@lothar.com>
5973         * docs/examples/twisted_master.py (twisted_app): hush internal
5974         python2.3 distutils deprecation warnings
5975         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
5976         add compileOpts= argument which inserts extra args before the
5977         "setup.py build_ext" command. This can be used to give -Wignore
5978         warnings, to hush some internal python-2.3 deprecation messages.
5980         * buildbot/process/step_twisted.py (RunUnitTests): parameterize
5981         the ['twisted.test'] default test case to make it easier to change
5982         in subclasses
5984         * buildbot/clients/base.py: switch to pb.Cacheable-style Events
5985         * buildbot/clients/gtkPanes.py: ditto
5987         * buildbot/process/step_twisted.py (RunUnitTests): use randomly=
5988         arg to collapse RunUnitTestsRandomly into RunUnitTests
5989         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
5990         use RunUnitTests(randomly=1) instead of RunUnitTestsRandomly
5992         * buildbot/status/html.py (StatusResource): shuffle Resources
5993         around to fix a bug: both 'http://foo:8080' and 'http://foo:8080/'
5994         would serve the waterfall display, but the internal links were
5995         only valid on the trailing-slash version. The correct behavior is
5996         for the non-slashed one to serve a Redirect to the slashed one.
5997         This only shows up when the buildbot page is hanging off another
5998         server, like a Twisted-Web distributed server.
6000         * buildbot/status/event.py (Event, RemoteEvent): make Events
6001         pb.Cacheable, with RemoteEvent as the cached version. This removes
6002         a lot of explicit send-an-update code.
6003         * buildbot/status/builder.py (Builder): remove send-update code
6004         * buildbot/status/client.py (ClientBuilder): remove send-update
6005         code, and log errors that occur during callRemote (mostly to catch
6006         InsecureJelly exceptions)
6008         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
6009         run Lore with the same python used in the rest of the build
6011         * buildbot/process/step_twisted2.py (RunUnitTestsJelly): moved
6013         * buildbot/process/step_twisted.py (HLint): accept 'python'
6014         argument. Catch rc!=0 and mark the step as failed. This marks the
6015         build orange ("has warnings").
6016         (RunUnitTestsJelly): move out to step_twisted2.py
6018         * buildbot/util.py (ignoreStaleRefs): add utility function
6020         * buildbot/master.py (DebugPerspective.perspective_setCurrentState):
6021         don't fake ETA object, it's too hard to get right
6023 2003-05-02  Brian Warner  <warner@lothar.com>
6025         * docs/examples/twisted_master.py (twisted_app): add FreeBSD builder
6027 2003-05-01  Brian Warner  <warner@lothar.com>
6029         * buildbot/status/html.py (StatusResource.body): oops, I was
6030         missing a <tr>, causing the waterfall page to be misrendered in
6031         everything except Galeon.
6033 2003-04-29  Brian Warner  <warner@lothar.com>
6035         * docs/examples/twisted_master.py: make debuild use python-2.2
6036         explicitly, now that Twisted stopped supporting 2.1
6038         * buildbot/process/step_twisted.py (BuildDebs.finishStatus): oops,
6039         handle tuple results too. I keep forgetting this, which suggests
6040         it needs to be rethought.
6042         * setup.py (setup): bump version to 0.3.1+ while between releases
6043         
6044 2003-04-29  Brian Warner  <warner@lothar.com>
6046         * setup.py: Releasing buildbot-0.3.1
6048 2003-04-29  Brian Warner  <warner@lothar.com>
6050         * README (SUPPORT): add plea to send questions to the mailing list
6052         * NEWS, MANIFEST.in: add description of recent changes
6054         * docs/examples/twisted_master.py: add the code used to create the
6055         Twisted buildmaster, with passwords and such removed out to a
6056         separate file.
6058         * buildbot/changes/changes.py, freshcvs.py, freshcvsmail.py: split
6059         out cvstoys-using bits from generic changes.py, to allow non-cvstoys
6060         buildmasters to not require CVSToys be installed.
6061         * README, docs/examples/glib_master: update to match the change
6063         * buildbot/clients/base.py, buildbot/bot.py,
6064         buildbot/changes/changes.py, buildbot/pbutil.py: copy
6065         ReconnectingPB from CVSToys distribution to remove CVSToys
6066         dependency for build slaves and status clients. Buildmasters which
6067         use FreshCVSSources still require cvstoys be installed, of course.
6069 2003-04-25  Brian Warner  <warner@lothar.com>
6071         * buildbot/process/process_twisted.py (FullTwistedBuildFactory): add
6072         runTestsRandomly arg to turn on trial -z
6074         * buildbot/process/step_twisted.py (TwistedJellyTestResults):
6075         experimental code to use trial's machine-parseable output to get
6076         more detailed test results. Still has some major issues.
6077         (RunUnitTestsRandomly): subclass to add "-z 0" option, runs tests
6078         in random sequence
6080         * buildbot/status/builder.py (Builder.setCurrentBuild):
6081         anticipating moving build history into statusbag, not used yet
6083         * buildbot/status/tests.py: code to centralize test results,
6084         doesn't work quite yet
6086         * buildbot/status/event.py (Event): use hasattr("setName") instead
6087         of isinstance for now.. need better long-term solution
6089         * buildbot/status/html.py: Remove old imports
6091 2003-04-24  Brian Warner  <warner@lothar.com>
6093         * buildbot/process/process_twisted.py (TwistedBuild.isFileImportant):
6094         ignore changes under doc/fun/ and sandbox/
6096         * buildbot/process/step_twisted.py: update pushEvent and friends.
6098         * buildbot/status/html.py (Box.td): replace event.buildername with
6099         event.parent.getSwappableName(). Needs more thought.
6101         * buildbot/status/builder.py (Builder): Replace pushEvent and
6102         getLastEvent with {set|update|addFileTo|finish}CurrentActivity.
6103         Tell events they are being pruned with event.delete().
6105         * buildbot/process/base.py (Build): Remove Builder status-handling
6106         methods. s/pushEvent/setCurrentActivity/.
6108         * buildbot/process/step.py (BuildStep): clean up status delivery.
6109         Gouse builder.statusbag methods instead of intermediate builder
6110         methods. s/updateLastEvent/updateCurrentActivity/.
6111         s/finalizeLastEvent/finishCurrentActivity/. Use
6112         addFileToCurrentActivity for summaryFunction.
6114         * buildbot/status/event.py (Logfile): put data in a Swappable when
6115         .finish is called.
6116         (Event): add more setter methods. Remove .buildername, use .parent
6117         and getSwappableName instead (needs more thought).
6119         * buildbot/util.py (Swappable):
6120         * test/test_swap.py: don't bother setting filename at __init__
6121         time, do it later. Change setFilename args to take parent first,
6122         since it provides the most significant part of the filename.
6124 2003-04-23  Brian Warner  <warner@lothar.com>
6126         * buildbot/status/event.py (Logfile.addEntry): append to previous
6127         entry, if possible
6129         * buildbot/process/step.py (BuildStep.finalizeLastEvent):
6130         anticipating Swappable
6131         (InternalShellCommand.remoteUpdate): split out various log-adding
6132         methods so subclasses can snarf stdout separately
6134         * buildbot/process/base.py (Builder.finalizeLastEvent): more code
6135         in anticipation of Swappable build logs
6136         (Builder.testsFinished): anticipating TestResults, still disabled
6138         * buildbot/status/builder.py (Builder.pruneEvents): only keep the
6139         last 100 events
6141         * buildbot/status/event.py (Logfile): add (disabled) support for
6142         Swappable, not ready for use yet
6144         * buildbot/util.py (Swappable): object which is swapped out to
6145         disk after some period of no use.
6146         * test/test_swap.py: test buildbot.utils.Swappable
6148 2003-04-14  Brian Warner  <warner@lothar.com>
6150         * buildbot/process/base.py (Builder.doPeriodicBuild): add simple
6151         periodic-build timer. Set the .periodicBuildTime on a builder
6152         instance to some number of seconds to activate it.
6154         * buildbot/master.py (BotMaster.forceBuild): change forceBuild API
6156         * buildbot/process/step.py (ShellCommand.finishStatus): use log.msg in
6157         a way that survives result tuples
6159 2003-04-12  Brian Warner  <warner@lothar.com>
6161         * buildbot/process/step.py (ShellCommand.finishStatusSummary):
6162         return a dict instead of a tuple: allow summarizers to provide
6163         multiple summaries if they want
6164         * buildbot/process/step_twisted.py (trialTextSummarizer): return dict
6165         (debuildSummarizer): summarize lintian warnings/errors
6167 2003-04-10  Brian Warner  <warner@lothar.com>
6169         * README (REQUIREMENTS): slave requires twisted-1.0.4a2
6171 2003-04-09  Brian Warner  <warner@lothar.com>
6173         * buildbot/process/step_twisted.py (trialTextSummarizer): Don't create
6174         empty summaries: happens when the tests fail so hard they don't emit
6175         a parseable summary line.
6177         * buildbot/process/step.py (ShellCommand.finishStatusSummary):
6178         Allow summaryFunction to return None to indicate no summary should
6179         be added.
6181         * buildbot/status/event.py (Logfile.removeHtmlWatcher): avoid
6182         writing to stale HTTP requests: notice when they disconnect and
6183         remove the request from the list. Also add CacheToFile from
6184         moshez, will be used later.
6186 2003-04-08  Brian Warner  <warner@lothar.com>
6188         * buildbot/process/step_twisted.py (ProcessDocs.finished): warnings
6189         should be an int, not a list of strings
6191         * buildbot/changes/changes.py (FreshCVSSource.stop): don't disconnect
6192         if we weren't actually connected
6194         * buildbot/process/step_twisted.py (trialTextSummarizer): function
6195         to show the tail end of the trial text output
6197         * buildbot/process/step.py (ShellCommand.finishStatusSummary): add
6198         hook to summarize the results of a ShellCommand
6200 2003-04-07  Brian Warner  <warner@lothar.com>
6202         * buildbot/process/step_twisted.py (RunUnitTests): consolidate all
6203         twisted test suite code into a single class.
6204         * buildbot/process/process_twisted.py: same
6206 2003-04-04  Brian Warner  <warner@lothar.com>
6208         * setup.py, MANIFEST.in: hack to make sure plugins.tml gets installed
6210         * README (SLAVE): document use of mktap to create slave .tap file
6211         (REQUIREMENTS): describe dependencies
6213         * buildbot/bb_tap.py, buildbot/plugins.tml:
6214         * buildbot/bot.py (updateApplication): Add mktap support for creating
6215         buildslave .tap files
6217 2003-03-28  Brian Warner  <warner@lothar.com>
6219         * buildbot/process/step.py (InternalShellCommand.finished): handle
6220         new tuple result values (fix embarrasing bug that appeared during
6221         PyCon demo)
6223 2003-03-27  Brian Warner  <warner@lothar.com>
6225         * docs/examples/glib_master.py, README: add sample buildmaster.tap
6226         -making program
6228 2003-03-25  Brian Warner  <warner@lothar.com>
6230         * buildbot/process/step.py (CVS, ShellCommand): add reason for failure
6231         to overall build status
6232         * buildbot/clients/base.py (Builder): improve event printing
6233         * buildbot/process/base.py (BasicBuildFactory): use specific steps
6234         instead of generic ShellCommand
6235         (Build): Add .stopBuild, use it when slave is detached
6237         * buildbot/process/step.py (Configure,Test): give the steps their
6238         own names and status strings
6240         * buildbot/status/html.py (StatusResource): add "show" argument,
6241         lets you limit the set of Builders being displayed.
6243 2003-03-20  Brian Warner  <warner@lothar.com>
6245         * buildbot/process/basic.py: removed
6247 2003-03-19  Brian Warner  <warner@lothar.com>
6249         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
6250         turn off process-docs by default
6252         * buildbot/process/base.py (Builder.getBuildNumbered): Don't blow up
6253         when displaying build information without anything in allBuilds[]
6255         * buildbot/bot.py (makeApp): really take password from sys.argv
6257 2003-03-18  Brian Warner  <warner@lothar.com>
6259         * buildbot/bot.py (buildApp): take password from sys.argv
6261         * README: replace with more useful text
6263         * setup.py: add a real one
6264         * MANIFEST.in, .cvsignore: more distutils packaging stuff
6265         
6266         * docs/PyCon-2003/: added sources for PyCon paper.
6268         * buildbot/process/base.py, step.py: revamp. BuildProcess is gone,
6269         now Build objects control the process and Builder only handles
6270         slave stuff and distribution of changes/status. A new BuildFactory
6271         class creates Build objects on demand.
6273         Created ConfigurableBuild which takes a list of steps to run. This
6274         makes it a lot easier to set up a new kind of build and moves us
6275         closer to being able to configure a build from a web page.
6277         * buildbot/process/step_twisted.py, process_twisted.py: move to
6278         new model. A lot of code went away.
6279         
6280         * buildbot/status/progress.py (BuildProgress.newProgress): Don't
6281         send lots of empty progress messages to the client.
6283         * buildbot/master.py (makeApp): enforce builder-name uniqueness
6285 2003-02-20  Brian Warner  <warner@lothar.com>
6287         * buildbot/process/step_twisted.py (BuildDebs): count lintian hits
6289         * buildbot/slavecommand.py (ShellCommand): back to usePTY=0. The
6290         Twisted bug that prevented non-pty processes from working just got
6291         fixed, and the bug that leaks ptys is still being investigated.
6293         * buildbot/process/step.py (CVS): send timeout arg to slave
6295         * buildbot/clients/gtkPanes.py: add connection-status row, handle
6296         builders coming and going
6297         * buildbot/clients/base.py: clean up protocol, move to ReconnectingPB
6298         from CVSToys, handle lost-buildmaster
6300         * buildbot/status/client.py (StatusClientService.removeBuilder):
6301         Clean up status client protocol: send builders (with references)
6302         as they are created, rather than sending a list and requiring the
6303         client to figure out which ones are new.
6304         * buildbot/master.py (BotMaster.forceBuild): Log debugclient
6305         attempts to force a build on an unknown builder
6307 2003-02-19  Brian Warner  <warner@lothar.com>
6309         * buildbot/slavecommand.py (CVSCommand): add timeout to sub-commands
6310         * buildbot/slavecommand.py (ShellCommand.start): stop using PTYs until
6311         Twisted stops leaking them.
6312         * buildbot/clients/gtkPanes.py (CompactBuilder): forget ETA when the
6313         builder goes to an idle state.
6315         * buildbot/slavecommand.py (ShellCommand.start): bring back PTYs until
6316         I figure out why CVS commands hang without them, and/or I fix the
6317         hung-command timeout
6319 2003-02-16  Brian Warner  <warner@lothar.com>
6321         * buildbot/process/step_twisted.py: bin/hlint went away, replace
6322         with 'bin/lore --output lint'. Use 'bin/trial -o' to remove
6323         ansi-color markup. Remove GenerateLore step. Count hlint warnings in
6324         GenerateDocs now that they are prefixed with WARNING:.
6326         * buildbot/status/html.py (StatusResource.body): Fix Builder link,
6327         use manual href target instead of request.childLink
6329         * buildbot/clients/gtkPanes.py: Fix progress countdown: update the
6330         display every second, but update the ETA every 5 seconds (or
6331         whenever) as remote_progress messages arrive.
6334 2003-02-12  Brian Warner  <warner@lothar.com>
6336         * *: import current sources from home CVS repository
6337         
6339 # Local Variables:
6340 # add-log-time-format: add-log-iso8601-time-string
6341 # End: