TAG buildbot-0.7.3
[buildbot.git] / ChangeLog
blob89f9fb7a958ac97364b3af5bd9ea4e8aee6f9d6a
1 2006-05-23  Brian Warner  <warner@lothar.com>
3         * buildbot/__init__.py (version): Releasing buildbot-0.7.3
4         * docs/buildbot.texinfo: set version to match
5         * NEWS: update for 0.7.3
7         * docs/buildbot.texinfo (Change Sources): mention hg_buildbot.py,
8         give a quick mapping from VC system to possible ChangeSources
9         (Build Properties): add 'buildername'
11         * buildbot/process/base.py (Build.setupStatus): oops, set
12         'buildername' and 'buildnumber' properties
13         * buildbot/test/test_properties.py (Interpolate.testBuildNumber):
14         test them
16 2006-05-22  Brian Warner  <warner@lothar.com>
18         * docs/buildbot.texinfo (Build Properties): explain the syntax of
19         property interpolation better
21         * README (INSTALLATION): remove old '-v' argument from recommended
22         trial command line
24         * docs/buildbot.texinfo (ShellCommand): add docs for description=
25         and descriptionDone= arguments. Thanks to Niklaus Giger for the
26         patch. SF#1475494.
28         * buildbot/slave/commands.py (SVN.parseGotRevision._parse): use
29         'svnversion' instead of grepping the output of 'svn info', much
30         simpler and avoids CR/LF problems on windows. Thanks to Olivier
31         Bonnet for the suggestion.
32         (SVN.parseGotRevision): oops, older verisons of 'svnversion'
33         require the WC_PATH argument, so run 'svnversion .' instead.
35         * buildbot/interfaces.py (IChangeSource): methods in Interfaces
36         aren't supposed to have 'self' in their argument list
38 2006-05-21  Brian Warner  <warner@lothar.com>
40         * buildbot/process/step.py (ShellCommand.start): make
41         testInterpolate pass. I was passing the uninterpolated command to
42         the RemoteShellCommand constructor
43         (ShellCommand._interpolateProperties): oops, handle non-list
44         commands (i.e. strings with multiple words separated by spaces in
45         them) properly, instead of forgetting about them.
47         * buildbot/test/test_properties.py (Run.testInterpolate): new test
48         to actually try to use build properties in a real build. This test
49         fails.
50         * buildbot/test/runutils.py (RunMixin.requestBuild): utility methods
51         to start and evaluate builds
53         * buildbot/test/test__versions.py: add a pseudo-test to record
54         what version of Twisted/Python/Buildbot are running. This should
55         show up at the beginning of _trial_tmp/test.log, and exists to help
56         debug other problems.
58         * buildbot/status/html.py (Waterfall): add 'robots_txt=' argument,
59         a filename to be served as 'robots.txt' to discourage web spiders.
60         Adapted from a patch by Tobi Vollebregt, thanks!
61         * buildbot/test/test_web.py (Waterfall._test_waterfall_5): test it
62         (Waterfall.test_waterfall): tweak the way that filenames are put
63         into the config file, to accomodate windows pathnames better.
65         * docs/buildbot.texinfo (HTML Waterfall): document it
67         * buildbot/process/process_twisted.py
68         (QuickTwistedBuildFactory.__init__): recent versions of Twisted
69         changed the build process. The new setup.py no longer takes the
70         'all' argument.
71         (FullTwistedBuildFactory.__init__): same
72         (TwistedReactorsBuildFactory.__init__): same
74         * contrib/hg_buildbot.py: wrote a commit script for mercurial, to
75         be placed in the [hooks] section of the central repository (the
76         one that everybody pushes changes to).
78 2006-05-20  Brian Warner  <warner@lothar.com>
80         * buildbot/slave/commands.py (Darcs.doVCFull): when writing the
81         .darcs-context file, use binary mode. I think this was causing a
82         Darcs failure under windows.
84 2006-05-19  Brian Warner  <warner@lothar.com>
86         * buildbot/scripts/tryclient.py (CVSExtractor.getBaseRevision):
87         use a timezone string of +0000 and gmtime, since this timestamp is
88         sent to a buildmaster and %z is broken.
90         * buildbot/test/test_vc.py (CVSHelper.getdate): use no timezone
91         string and localtime, since this timestamp will only be consumed
92         locally, and %z is broken.
94         * buildbot/slave/commands.py (CVS.parseGotRevision): use +0000 and
95         gmtime, since this timestamp is returned to the buildmaster, and
96         %z is broken.
98 2006-05-18  Brian Warner  <warner@lothar.com>
100         * NEWS: update in preparation for next release
102         * buildbot/test/test_vc.py (VCS_Helper): factor out all the
103         setup-repository and do-we-have-the-vc-tools code into a separate
104         "helper" class, which sticks around in a single module-level
105         object. This seems more likely to continue to work in the future
106         than having it hide in the TestCase and hope that TestCases stick
107         around for a long time.
109         * buildbot/test/test_vc.py (MercurialSupport.vc_create): 'hg
110         addremove' has been deprecated in recent versions of mercurial, so
111         use 'hg add' instead
113 2006-05-07  Brian Warner  <warner@lothar.com>
115         * buildbot/scheduler.py (Try_Jobdir.messageReceived): when
116         operating under windows, move the file before opening it, since
117         you can't rename a file that somebody has open.
119         * buildbot/process/base.py (Build.setupBuild): if something goes
120         wrong while creating a Step, log the name and arguments, since the
121         error message when you get the number of arguments wrong is really
122         opaque.
124 2006-05-06  Brian Warner  <warner@lothar.com>
126         * buildbot/process/step_twisted.py (Trial.setupEnvironment): more
127         bugs in twisted-specific code not covered by my unit tests, this
128         time use 'cmd' argument instead of self.cmd
130         * buildbot/process/process_twisted.py (TwistedBuild.isFileImportant):
131         fix stupid braino: either use startwith or find()==0, not both.
132         (TwistedReactorsBuildFactory.__init__): another dumb typo
134         * buildbot/test/test_slavecommand.py (ShellBase.testInterrupt1): 
135         mark this test as TODO under windows, since process-killing seems
136         dodgy there. We'll come back to this later and try to fix it
137         properly.
139         * buildbot/test/test_vc.py (CVSSupport.getdate): use localtime,
140         and don't include a timezone
141         (CVSSupport.vc_try_checkout): stop trying to strip the timezone.
142         This should avoid the windows-with-verbose-timezone-name problem
143         altogether.
144         (Patch.testPatch): add a test which runs 'patch' with less
145         overhead than the full VCBase.do_patch sequence, to try to isolate
146         a windows test failure. This one uses slave.commands.ShellCommand
147         and 'patch', but none of the VC code.
149         * buildbot/slave/commands.py (getCommand): use which() to find the
150         executables for 'cvs', 'svn', etc. This ought to help under
151         windows.
153         * buildbot/test/test_vc.py (VCBase.do_getpatch): Delete the
154         working directory before starting. If an earlier test failed, the
155         leftover directory would mistakenly flunk a later test.
156         (ArchCommon.registerRepository): fix some tla-vs-baz problems.
157         Make sure that we use the right commandlines if which("tla") picks
158         up "tla.exe" (as it does under windows).
159         (TlaSupport.do_get): factor out this tla-vs-baz difference
160         (TlaSupport.vc_create): more tla-vs-baz differences
162         * buildbot/test/test_slavecommand.py
163         (ShellBase.testShellMissingCommand): stop trying to assert
164         anything about the error message: different shells on different
165         OSes with different languages makes it hard, and it really isn't
166         that interesting of a thing to test anyway.
168         * buildbot/test/test_vc.py (CVSSupport.capable): skip CVS tests if
169         we detect cvs-1.10 (which is the version shipped with OS-X 10.3
170         "Panther"), because it has a bug which flunks a couple tests in
171         weird ways. I've checked that cvs-1.12.9 (as shipped with debian)
172         is ok. OS-X 10.4 "Tiger" ships with cvs-1.11, but I haven't been
173         able to test that yet.
175 2006-04-30  Brian Warner  <warner@lothar.com>
177         * buildbot/test/test_vc.py (VCBase.runCommand): set $LC_ALL="C" to
178         make sure child commands emit messages in english, so our regexps
179         will match. Thanks to Nikaus Giger for identifying the problems.
180         (VCBase._do_vctest_export_1): mode="export" is not responsible
181         for setting the "got_revision" property, since in many cases it is
182         not convenient to determine.
183         (SVNSupport.capable): when running 'svn --version' to check for
184         ra_local, we want error messages in english
185         * buildbot/test/test_slavecommand.py 
186         (ShellBase.testShellMissingCommand): set $LC_ALL="C" to get bash
187         to emit the error message in english
189         * buildbot/slave/commands.py (SourceBase.setup): stash a copy of
190         the environment with $LC_ALL="C" so that Commands which need to
191         parse the output of their child processes can obtain it in
192         english.
193         (SVN.parseGotRevision): call "svn info" afterwards instead of
194         watching the output of the "svn update" or "svn checkout".
195         (Darcs.parseGotRevision): use $LC_ALL="C" when running the command
196         (Arch.parseGotRevision): same
197         (Bazaar.parseGotRevision): same
198         (Mercurial.parseGotRevision): same
200         * buildbot/scripts/tryclient.py (SourceStampExtractor.dovc): set
201         $LC_ALL="C" when running commands under 'buildbot try', too
203         * buildbot/test/__init__.py: remove the global os.environ()
204         setting, instead we do it just for the tests that run commands and
205         need to parse their output.
207         * buildbot/test/test_scheduler.py (Scheduling.testTryJobdir):
208         remove the overly-short .timeout on this test, because non-DNotify
209         platforms must fall back to polling which happens at 10 second
210         intervals, so a 5 second timeout would never succeed.
212 2006-04-24  Brian Warner  <warner@lothar.com>
214         * docs/buildbot.texinfo (Installing the code): update trial
215         invocation, SF#1469116 by Niklaus Giger.
216         (Attributes of Changes): updated branch-name examples to be
217         a bit more realistic, SF#1475240 by Stephen Davis.
219         * contrib/windows/buildbot2.bat: utility wrapper for windows
220         developers, contributed by Nick Trout (after a year of neglect..
221         sorry!). SF#1194231.
223         * buildbot/test/test_vc.py (*.capable): store the actual VC
224         binary's pathname in VCS[vcname], so it can be retrieved later
225         (CVSSupport.vc_try_checkout): incorporate Niklaus Giger's patch to
226         strip out non-numeric timezone information, specifically the funky
227         German string that his system produced that confuses CVS.
228         (DarcsSupport.vc_create): use dovc() instead of vc(), this should
229         allow Darcs tests to work on windows
230         * buildbot/scripts/tryclient.py (SourceStampExtractor): use
231         procutils.which() everywhere, to allow tryclient to work under
232         windows. Also from Niklaus Giger, SF#1463394.
234         * buildbot/twcompat.py (which): move the replacement for a missing
235         twisted.python.procutils.which from test_vc.py to here, so it can
236         be used in other places too (specifically tryclient.py)
238 2006-04-23  Brian Warner  <warner@lothar.com>
240         * buildbot/status/html.py (StatusResourceBuild.body): replace the
241         bare buildbotURL/projectName line with a proper DIV, along with a
242         CSS class of "title", from Stefan Seefeld (SF#1461675).
243         (WaterfallStatusResource.body0): remove the redundant 'table'
244         class from the table
245         (WaterfallStatusResource.body): same. Also add class="LastBuild"
246         to the top-row TR, and class="Activity" to the second-row TR,
247         rather than putting them in the individual TD nodes.
249         * buildbot/test/test_vc.py (VCBase.checkGotRevision): test
250         'got_revision' build property for all VC systems that implement
251         accurate ones: SVN, Darcs, Arch, Bazaar, Mercurial.
253         * buildbot/slave/commands.py (SourceBase._handleGotRevision): try
254         to determine which revision we actually obtained
255         (CVS.parseGotRevision): implement this for CVS, which just means
256         to grab a timestamp. Not ideal, and it depends upon the buildslave
257         having a clock that is reasonably well syncronized with the server,
258         but it's better than nothing.
259         (SVN.parseGotRevision): implement it for SVN, which is accurate
260         (Darcs.parseGotRevision): same
261         (Arch.parseGotRevision): same
262         (Bazaar.parseGotRevision): same
263         (Mercurial.parseGotRevision): same
265         * buildbot/process/step.py (LoggedRemoteCommand.remoteUpdate):
266         keep a record of all non-stdout/stderr/header/rc status updates,
267         for the benefit of RemoteCommands that send other useful things,
268         like got_revision
269         (Source.commandComplete): put any 'got_revision' status values
270         into a build property of the same name
273         * buildbot/process/step_twisted.py (Trial): update to deal with
274         new ShellCommand refactoring
276         * docs/buildbot.texinfo (Build Properties): document new feature
277         that allows BuildSteps to get/set Build-wide properties like which
278         revision was requested and/or checked out.
280         * buildbot/interfaces.py (IBuildStatus.getProperty): new method
281         * buildbot/status/builder.py (BuildStatus.getProperty): implement
282         it. Note that this bumps the persistenceVersion of the saved Build
283         object, so add the necessary upgrade-old-version logic to include
284         an empty properties dict.
286         * buildbot/process/base.py (Build.setProperty): implement it
287         (Build.getProperty): same
288         (Build.startBuild): change build startup to set 'branch',
289         'revision', and 'slavename' properties at the right time
291         * buildbot/process/step.py (BuildStep.__init__): change setup to
292         require 'build' argument in a better way
293         (LoggingBuildStep): split ShellCommand into two pieces, for better
294         subclassing elsewhere. LoggingBuildStep is a BuildStep which runs
295         a single RemoteCommand that sends stdout/stderr status text. It
296         also provides the usual commandComplete / createSummary /
297         evaluateCommand / getText methods to be overridden...
298         (ShellCommand): .. whereas ShellCommand is specifically for
299         running RemoteShellCommands. Other shell-like BuildSteps (like
300         Source) can inherit from LoggingBuildStep instead of ShellCommand
301         (WithProperties): marker class to do build-property interpolation
302         (Source): inherit from LoggingBuildStep instead of ShellCommand
303         (RemoteDummy): same
305         * buildbot/test/test_properties.py: test new functionality
307 2006-04-21  Brian Warner  <warner@lothar.com>
309         * buildbot/test/test_vc.py: rename testBranch to
310         testCheckoutBranch to keep the tests in about the right
311         alphabetical order
313 2006-04-18  Brian Warner  <warner@lothar.com>
315         * docs/buildbot.texinfo (PBListener): improve cross-references
316         between PBListener and 'buildbot statusgui', thanks to John Pye
317         for the suggestion.
319 2006-04-17  Brian Warner  <warner@lothar.com>
321         * buildbot/twcompat.py (maybeWait): handle SkipTest properly when
322         running under Twisted-1.3.0, otherwise skipped tests are reported
323         as errors.
325         * all: use isinstance() instead of 'type(x) is foo', suggested by
326         Neal Norwitz
328         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
329         oops, fix a brain-fade from the other week, when making the
330         addStep changes. I changed all the __init__ upcalls to use the
331         wrong superclass name.
332         (FullTwistedBuildFactory.__init__): same
333         (TwistedDebsBuildFactory.__init__): same
334         (TwistedReactorsBuildFactory.__init__): same
335         (TwistedBuild.isFileImportant): use .startswith for clarity,
336         thanks to Neal Norwitz for the suggestions.
338         * contrib/viewcvspoll.py: script to poll a viewcvs database for
339         changes, then deliver them over PB to a remote buildmaster.
341         * contrib/svnpoller.py: added script by John Pye to poll a remote
342         SVN repository (by running 'svn log') from a cronjob, and run
343         'buildbot sendchange' to deliver the changes to a remote
344         buildmaster.
345         * contrib/svn_watcher.py: added script by Niklaus Giger (a
346         modification of svnpoller.py), same purpose, but this one loops
347         internally (rather than expecting to run from a cronjob) and works
348         under windows.
349         * contrib/README.txt: same
351 2006-04-11  Brian Warner  <warner@lothar.com>
353         * all: fix a number of incorrect names and missing imports, thanks
354         to Anthony Baxter for the patch.
355         * buildbot/status/html.py (WaterfallStatusResource.statusToHTML): 
356         remove unused buggy method.
357         * buildbot/status/builder.py (BuildStatus.saveYourself): rmtree
358         comes from shutil, not "shutils"
359         * buildbot/process/step.py (TreeSize.evaluateCommand): fix bad name
360         (Arch.checkSlaveVersion): same
361         * buildbot/process/step_twisted.py (Trial.commandComplete): same, in
362         some disabled code
363         * buildbot/process/step_twisted2.py: add some missing imports
364         * buildbot/twcompat.py (_deferGenerator): fix cut-and-paste error,
365         this code used to live in twisted.internet.defer
367 2006-04-10  Brian Warner  <warner@lothar.com>
369         * buildbot/process/step.py (Mercurial): add Mercurial support
370         * buildbot/slave/commands.py (Mercurial): same
371         * buildbot/scripts/tryclient.py (MercurialExtractor): same
372         * buildbot/test/test_vc.py (Mercurial): same, checkout over HTTP is
373         not yet tested, but 'try' support *is* covered
374         * docs/buildbot.texinfo (Mercurial): document it
376         * buildbot/process/step.py (LoggedRemoteCommand.remoteUpdate): add
377         some debugging messages (turned off)
378         * buildbot/test/test_vc.py: improve debug messages
380 2006-04-07  Brian Warner  <warner@lothar.com>
382         * buildbot/test/test_vc.py (which): define our own which() in case
383         we can't import twisted.python.procutils, because procutils doesn't
384         exist in Twisted-1.3
386         * docs/buildbot.texinfo (Interlocks): fix some typos, mention use
387         of SlaveLocks for performance tests
389         * docs/examples/twisted_master.cfg: update to match current usage
391         * buildbot/changes/p4poller.py (P4Source): add new arguments:
392         password, p4 binary, pollinterval, maximum history to check.
393         Patch from an anonymous sf.net contributor, SF#1219384.
394         * buildbot/process/step.py (P4Sync.__init__): add username,
395         password, and client arguments.
396         * buildbot/slave/commands.py (P4Sync): same
398 2006-04-05  Brian Warner  <warner@lothar.com>
400         * buildbot/process/factory.py (BuildFactory.addStep): new method
401         to add steps to a BuildFactory. Use it instead of f.steps.append,
402         and you can probably avoid using the s() convenience function.
403         Patch from Neal Norwitz, sf.net #1412605.
404         (other): update all factories to use addStep
405         * buildbot/process/process_twisted.py: update all factories to use
406         addStep.
408 2006-04-03  Brian Warner  <warner@lothar.com>
410         * buildbot/test/test_vc.py: modified find-the-VC-command logic to
411         work under windows too. Adapted from a patch by Niklaus Giger,
412         addresses SF#1463399.
414         * buildbot/test/__init__.py: set $LANG to 'C', to insure that
415         spawned commands emit parseable results in english and not some
416         other language. Patch from Niklaus Giger, SF#1463395.
418         * README (INSTALLATION): discourage users from running unit tests on
419         a "network drive", patch from Niklaus Giger, SF#1463394.
421 2006-03-22  Brian Warner  <warner@lothar.com>
423         * contrib/svn_buildbot.py: rearrange, add an easy-to-change
424         function to turn a repository-relative pathname into a (branch,
425         branch-relative-filename) tuple. Change this function to handle
426         the branch naming policy used by your Subversion repository.
427         Thanks to AllMyData.com for sponsoring this work.
429 2006-03-16  Brian Warner  <warner@lothar.com>
431         * buildbot/scripts/sample.cfg: add python-mode declaration for
432         vim. Thanks to John Pye for the patch.
434         * docs/buildbot.texinfo (Launching the daemons): fix @reboot job
435         command line, mention the importance of running 'crontab' as the
436         buildmaster/buildslave user. Thanks to John Pye for the catch.
438 2006-03-13  Brian Warner  <warner@lothar.com>
440         * buildbot/status/words.py (IRC): add an optional password=
441         argument, which will be sent to Nickserv in an IDENTIFY message at
442         login, to claim the nickname. freenode requires this before the
443         bot can sent (or reply to) private messages. Thanks to Clement
444         Stenac for the patch.
445         * docs/buildbot.texinfo (IRC Bot): document it
447         * buildbot/status/builder.py (LogFile.merge): don't write chunks
448         larger than chunkSize. Fixes SF#1349253.
449         * buildbot/test/test_status.py (Log.testLargeSummary): test it
450         (Log.testConsumer): update to match new internal chunking behavior
452 2006-03-12  Brian Warner  <warner@lothar.com>
454         * buildbot/test/test_vc.py: remove the last use of waitForDeferred
456         * buildbot/test/test_maildir.py (MaildirTest): rename the
457         'timeout' method, as it collides with trial's internals
459         * buildbot/scripts/runner.py: add 'buildbot restart' command
460         (stop): don't sys.exit() out of here, otherwise restart can't work
461         * docs/buildbot.texinfo (Shutdown): document it
463         * buildbot/buildset.py (BuildSet.__init__): clean up docstring
464         * buildbot/status/html.py (Waterfall.__init__): same
465         * buildbot/process/builder.py (Builder.startBuild): same
466         * buildbot/process/base.py (BuildRequest): same
467         * buildbot/sourcestamp.py (SourceStamp): same
468         * buildbot/scheduler.py (Nightly): same
470         * buildbot/__init__.py (version): bump to 0.7.2+ while between
471         releases
472         * docs/buildbot.texinfo: same
474 2006-02-17  Brian Warner  <warner@lothar.com>
476         * buildbot/__init__.py (version): Releasing buildbot-0.7.2
477         * docs/buildbot.texinfo: set version number to match
478         * NEWS: update for 0.7.2
480 2006-02-16  Brian Warner  <warner@lothar.com>
482         * docs/buildbot.texinfo (Build Dependencies): add cindex tag
484 2006-02-09  Brian Warner  <warner@lothar.com>
486         * docs/buildbot.texinfo (How Different VC Systems Specify Sources):
487         add text to explain per-build branch parameters
488         * NEWS: mention --umask
490 2006-02-08  Brian Warner  <warner@lothar.com>
492         * buildbot/scripts/runner.py (Maker.makeSlaveTAC): remove unused
493         method
494         (SlaveOptions.optParameters): add --umask, to make it possible to
495         make buildslave-generated files (including build products) be
496         world-readable
497         (slaveTAC): same
498         * buildbot/slave/bot.py (BuildSlave.startService): same
500 2006-01-23  Brian Warner  <warner@lothar.com>
502         * buildbot/status/builder.py: urllib.quote() all URLs that include
503         Builder names, so that builders can include characters like '/'
504         and ' ' without completely breaking the resulting HTML. Thanks to
505         Kevin Turner for the patch.
506         * buildbot/status/html.py: same
507         * buildbot/test/test_web.py (GetURL.testBuild): match changes
509         * NEWS: update in preparation for upcoming release
511 2006-01-18  Brian Warner  <warner@lothar.com>
513         * docs/examples/twisted_master.cfg: update to match the Twisted
514         buildbot: remove python2.2, switch to exarkun's buildslaves,
515         disable the .deb builder until we figure out how to build twisted
516         .debs from SVN, add some ktrace debugging to the OS-X build
517         process and remove the qt build, remove threadless builders,
518         change freebsd builder to use landonf's buildslave.
520 2006-01-12  Brian Warner  <warner@lothar.com>
522         * buildbot/master.py (Manhole.__init__): let port= be a strports
523         specification string, but handle a regular int for backwards
524         compatibility. This allows "tcp:12345:interface=127.0.0.1" to be
525         used in master.cfg to limit connections to just the local host.
526         (BuildMaster.loadConfig): same for c['slavePortnum']
527         * buildbot/scheduler.py (Try_Userpass.__init__): same
528         * buildbot/status/client.py (PBListener.__init__): same
529         * buildbot/status/html.py (Waterfall.__init__): same, for both
530         http_port and distrib_port. Include backwards-compatibility checks
531         so distrib_port can be a filename string and still mean unix:/foo
532         * docs/buildbot.texinfo (Setting the slaveport): document it
533         (Debug options): same
534         (HTML Waterfall): same
535         (PBListener): same
536         (try): same
537         * buildbot/test/test_config.py (ConfigTest): test it
539         * buildbot/master.py (BuildMaster.loadConfig): wait for the
540         slaveport's disownServiceParent deferred to fire before opening
541         the new one. Fixes an annoying bug in the unit tests.
543 2006-01-03  Brian Warner  <warner@lothar.com>
545         * buildbot/master.py (BuildMaster): remove the .schedulers
546         attribute, replacing it with an allSchedulers() method that looks
547         for all IService children that implement IScheduler. Having only
548         one parent/child relationship means fewer opportunities for bugs.
549         (BuildMaster.allSchedulers): new method
550         (BuildMaster.loadConfig_Schedulers): update to use allSchedulers,
551         also fix ugly bug that caused any config-file reload to
552         half-forget about the earlier Schedulers, causing an exception
553         when a Change arrived and was handed to a half-connected
554         Scheduler. The exception was in scheduler.py line 54ish:
555           self.parent.submitBuildSet(bs)
556           exceptions.AttributeError: 'NoneType' object has no attribute
557           'submitBuildSet'
558         (BuildMaster.addChange): update to use allSchedulers()
560         * buildbot/scheduler.py (BaseScheduler.__implements__): fix this
561         to work properly with twisted-1.3.0, where you must explicitly
562         include the __implements__ from parent classes
563         (BaseScheduler.__repr__): make it easier to distinguish distinct
564         instances
565         (BaseUpstreamScheduler.__implements__): same
567         * buildbot/status/builder.py (Status.getSchedulers): update to
568         use allSchedulers()
569         * buildbot/test/test_run.py (Run.testMaster): same
570         * buildbot/test/test_dependencies.py (Dependencies.findScheduler): same
571         * buildbot/test/test_config.py (ConfigTest.testSchedulers): same,
572         make sure Scheduler instances are left alone when an identical
573         config file is reloaded
574         (ConfigElements.testSchedulers): make sure Schedulers are properly
575         comparable
577         * Makefile (TRIALARGS): my local default Twisted version is now
578         2.1.0, update the trial arguments accordingly
580 2005-12-22  Brian Warner  <warner@lothar.com>
582         * docs/examples/twisted_master.cfg: merge changes from pyr: add
583         new win32 builders
585         * buildbot/scheduler.py (BaseScheduler.addChange): include a dummy
586         addChange in the parent class, although I suspect this should be
587         fixed better in the future.
589 2005-11-26  Brian Warner  <warner@lothar.com>
591         * buildbot/scheduler.py (AnyBranchScheduler.addChange): don't
592         explode when branch==None, thanks to Kevin Turner for the catch
593         * buildbot/test/test_scheduler.py (Scheduling.testAnyBranch): test
594         it
596         * buildbot/__init__.py (version): bump to 0.7.1+ while between
597         releases
598         * docs/buildbot.texinfo: same
600 2005-11-26  Brian Warner  <warner@lothar.com>
602         * buildbot/__init__.py (version): Releasing buildbot-0.7.1
603         * docs/buildbot.texinfo: set version number to match
605 2005-11-26  Brian Warner  <warner@lothar.com>
607         * NEWS: update for 0.7.1
609         * buildbot/status/builder.py (BuildStepStatus.unsubscribe): make
610         sure that unsubscribe works even if we never sent an ETA update.
611         Also, don't explode on duplicate unsubscribe.
612         (BuildStepStatus.addLog): make the convenience "return self"-added
613         watcher automatically unsubscribe when the Step finishes.
614         (BuildStatus.unsubscribe): same handle-duplicate-unsubscribe
615         (BuildStatus.stepStarted): same auto-unsubscribe
616         (BuilderStatus.buildStarted): same auto-unsubscribe
618         * buildbot/interfaces.py (IStatusReceiver.buildStarted): document
619         auto-unsubscribe
620         (IStatusReceiver.stepStarted): same
621         (IStatusReceiver.logStarted): same
623         * buildbot/test/test_run.py (Status): move the Status test..
624         * buildbot/test/test_status.py (Subscription): .. to here
626 2005-11-25  Brian Warner  <warner@lothar.com>
628         * NEWS: more updates
630         * buildbot/locks.py: fix the problem in which loading a master.cfg
631         file that changes some Builders (but not all of them) can result
632         in having multiple copies of the same Lock. Now, the real Locks
633         are kept in a table inside the BotMaster, and the Builders/Steps
634         use "LockIDs", which are still instances of MasterLock and
635         SlaveLock. The real Locks are instances of the new RealMasterLock
636         and RealSlaveLock classes.
637         * buildbot/master.py (BotMaster.getLockByID): new method to
638         convert LockIDs into real Locks.
639         * buildbot/process/base.py (Build.startBuild): convert LockIDs
640         into real Locks before building
641         * buildbot/process/step.py (BuildStep.startStep): same
642         * buildbot/test/test_locks.py (Locks.testLock1a): add a test which
643         exercises the problem
646         * docs/buildbot.texinfo (Scheduler Types): give a few hints about
647         what Schedulers are available
649         * buildbot/scheduler.py (Nightly): add new Scheduler based upon
650         work by Dobes Vandermeer and hacked mercilessly by me. This offers
651         'cron'-style build scheduling at certain times of day, week,
652         month, or year.
653         * buildbot/test/test_scheduler.py (Scheduling.testNightly): test it
655         * buildbot/scheduler.py (Scheduler): change fileIsImportant
656         handling: treat self.fileIsImportant more as an attribute that
657         contains a callable than as a method. If the attribute is None,
658         don't call it and assume all filenames are important. It is still
659         possible to provide a fileIsImportant method in a subclass,
660         however.
661         (AnyBranchScheduler): handle fileIsImportant=None, previously it
662         was broken
663         * buildbot/test/test_scheduler.py (Scheduling.testAnyBranch2):
664         test using AnyBranchScheduler with fileIsImportant=None
666 2005-11-24  Brian Warner  <warner@lothar.com>
668         * buildbot/test/test_config.py (StartService): don't claim a fixed
669         port number, instead set slavePort=0 on the first pass, figure out
670         what port was allocated, then switch to a config file that uses
671         the allocated port.
673         * buildbot/master.py (BuildMaster.loadConfig): close the old
674         slaveport before opening the new one, because unit tests might
675         replace slavePort=0 with the same allocated portnumber, and if we
676         don't wait for the old port to close first, we get a "port already
677         in use" error. There is a tiny race condition here, but the only
678         threat is from other programs that bind (statically) to the same
679         port number we happened to be allocated, and only if those
680         programs use SO_REUSEADDR, and only if they get control in between
681         reactor turns.
683         * Makefile (TRIALARGS): update to handle Twisted > 2.1.0
685         * buildbot/master.py (BuildMaster.loadConfig_Sources): remove all
686         deleted ChangeSources before adding any new ones
687         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): fix
688         compare_attrs, to make sure that a config-file reload does not
689         unnecessarily replace an unmodified ChangeSource instance
690         * buildbot/test/test_config.py (ConfigTest.testSources): update
692         * buildbot/scheduler.py (AnyBranchScheduler): fix branches=[] to
693         mean "don't build anything", and add a warning if it gets used
694         because it isn't actually useful.
696         * contrib/svn_buildbot.py: update example usage to match the port
697         number that gets used by the PBChangeSource
698         * buildbot/scripts/sample.cfg: add example of PBChangeSource
700 2005-11-22  Brian Warner  <warner@lothar.com>
702         * NEWS: start collecting items for next release
704         * buildbot/process/step.py (SVN.computeSourceRevision): assume
705         revisions are strings
706         (P4Sync.computeSourceRevision): same
708         * buildbot/status/html.py (StatusResourceBuild.body): add a link
709         to the Buildbot's overall status page
710         (StatusResourceBuilder.body): same
712 2005-11-15  Brian Warner  <warner@lothar.com>
714         * buildbot/master.py (BuildMaster.loadConfig): serialize the
715         config-file loading, specifically to make sure old StatusTargets
716         are finished shutting down before new ones start up (thus
717         resolving a bug in which changing the Waterfall object would fail
718         because both new and old instances were claiming the same
719         listening port). Also load new Schedulers after all the new
720         Builders are set up, in case they fire off a new build right away.
721         * buildbot/test/test_config.py (StartService): test it
723         * buildbot/status/mail.py (MailNotifier.buildMessage): oops, add
724         the branch name to the mail body
726         * buildbot/changes/pb.py (PBChangeSource.compare_attrs): add this.
727         Without it, a config-file reload fails to update an existing
728         PBChangeSource.
729         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): add
730         username/passwd to compare_attrs, for the same reason
731         * buildbot/status/html.py (Waterfall): add favicon to
732         compare_attrs, same reason
734 2005-11-05  Brian Warner  <warner@lothar.com>
736         * buildbot/scripts/tryclient.py (createJobfile): stringify the
737         baserev before stuffing it in the jobfile. This resolves problems
738         under SVN (and probably Arch) where revisions are expressed as
739         numbers. I'm inclined to use string-based revisions everywhere in
740         the future, but this fix should be safe for now. Thanks to Steven
741         Walter for the patch.
743         * buildbot/changes/changes.py (ChangeMaster.saveYourself): use
744         binary mode when opening pickle files, to make windows work
745         better. Thanks to Dobes Vandermeer for the catch.
746         * buildbot/status/builder.py (BuildStatus.saveYourself): same
747         (BuilderStatus.getBuildByNumber): same
748         (Status.builderAdded): same
749         * buildbot/master.py (BuildMaster.loadChanges): same
751         * buildbot/util.py (Swappable): delete unused leftover code
753         * buildbot/process/step.py (SVN): when building on a non-default
754         branch, add the word "[branch]" to the VC step's description, so
755         it is obvious that we're not building the usual stuff. Likewise,
756         when we are building a specific revision, add the text "rNNN" to
757         indicate what that revision number is. Thanks to Brad Hards and
758         Nathaniel Smith for the suggestion.
759         (Darcs.startVC): same
760         (Arch.startVC): same
761         (Bazaar.startVC): same
763         * buildbot/process/factory.py (GNUAutoconf.__init__): fix a silly
764         typo, caught by Mark Dillavou, closes SF#1216636.
766         * buildbot/test/test_status.py (Log.TODO_testDuplicate): add notes
767         about a test to add some day
769         * docs/examples/twisted_master.cfg: update: bot1 can now handle
770         the 'full-2.3' build, and the 'reactors' build is now run under
771         python-2.4 because the buildslave no longer has gtk/etc bindings
772         for earlier versions.
774 2005-11-03  Brian Warner  <warner@lothar.com>
776         * buildbot/interfaces.py (IBuilderControl.resubmitBuild): new
777         method, takes an IBuildStatus and rebuilds it. It might make more
778         sense to add this to IBuildControl instead, but that instance goes
779         away completely once the build has finished, and resubmitting
780         builds can take place weeks later.
781         * buildbot/process/builder.py (BuilderControl.resubmitBuild): same
782         * buildbot/status/html.py (StatusResourceBuild): also stash an
783         IBuilderControl so we can use resubmitBuild.
784         (StatusResourceBuild.body): render "resubmit" button if we can.
785         Also add hrefs for each BuildStep
786         (StatusResourceBuild.rebuild): add action for "resubmit" button
787         (StatusResourceBuilder.getChild): give it an IBuilderControl
789         * buildbot/status/builder.py (Status.getURLForThing): change the
790         URL for BuildSteps to have a "step-" prefix, so the magic URLs
791         that live as targets of buttons like "stop" and "rebuild" can't
792         collide with them.
793         * buildbot/status/builder.py (Status.getURLForThing): same
794         * buildbot/status/html.py (StatusResourceBuild.getChild): same
795         (StepBox.getBox): same
796         * buildbot/test/test_web.py (GetURL): same
797         (Logfile): same
799         * buildbot/process/step.py (SVN.__init__): put svnurl/baseURL
800         exclusivity checks after Source.__init__ upcall, so misspelled
801         arguments will be reported more usefully
802         (Darcs.__init__): same
804 2005-10-29  Brian Warner  <warner@lothar.com>
806         * docs/examples/twisted_master.cfg: don't double-fire the 'quick'
807         builder. Move the Try scheduler off to a separate port.
809 2005-10-27  Brian Warner  <warner@lothar.com>
811         * buildbot/clients/gtkPanes.py
812         (TwoRowClient.remote_builderRemoved): disappearing Builders used
813         to cause the app to crash, now they don't.
815         * buildbot/clients/debug.py: display the buildmaster's location
816         in the window's title bar
818 2005-10-26  Brian Warner  <warner@lothar.com>
820         * buildbot/status/mail.py (MailNotifier): urllib.escape the URLs
821         in case they have spaces or whatnot. Patch from Dobes Vandermeer.
822         * buildbot/test/test_status.py (MyStatus.getURLForThing): fix it
824         * buildbot/status/html.py (td): put a single non-breaking space
825         inside otherwise empty <td> elements, as a workaround for buggy
826         browsers which would optimize them away (along with any associated
827         styles, like the kind that create the waterfall grid borders).
828         Patch from Frerich Raabe.
830         * buildbot/process/step_twisted.py (Trial): expose the trialMode=
831         argv-list as an argument, defaulting to ["-to"], which is
832         appropriate for the Trial that comes with Twisted-2.1.0 and
833         earlier. The Trial in current Twisted SVN wants
834         ["--reporter=bwverbose"] instead. Also expose trialArgs=, which
835         defaults to an empty list.
836         * buildbot/process/process_twisted.py (TwistedTrial.trialMode):
837         match it, now that trialMode= is a list instead of a single string
839         * buildbot/__init__.py (version): bump to 0.7.0+ while between
840         releases
841         * docs/buildbot.texinfo: same
843 2005-10-24  Brian Warner  <warner@lothar.com>
845         * buildbot/__init__.py (version): Releasing buildbot-0.7.0
846         * docs/buildbot.texinfo: set version number to match
848 2005-10-24  Brian Warner  <warner@lothar.com>
850         * README: update for 0.7.0
851         * NEWS: same
852         * docs/buildbot.texinfo: move the freshcvs stuff out of the README
854         * buildbot/clients/debug.glade: add 'branch' box to fake-commit
855         * buildbot/clients/debug.py (DebugWidget.do_commit): same. Don't
856         send the branch= argument unless the user really provided one, to
857         retain compatibility with older buildmasters that don't accept
858         that argument.
859         * buildbot/master.py (DebugPerspective.perspective_fakeChange):
860         same
862         * docs/buildbot.texinfo: update lots of stuff
864         * buildbot/scripts/runner.py (sendchange): add a --branch argument
865         to the 'buildbot sendchange' command
866         * buildbot/clients/sendchange.py (Sender.send): same
867         * buildbot/changes/pb.py (ChangePerspective): same
868         * buildbot/test/test_changes.py (Sender.testSender): test it
870         * buildbot/process/step.py (SVN.__init__): change 'base_url' and
871         'default_branch' argument names to 'baseURL' and 'defaultBranch',
872         for consistency with other BuildStep arguments that use camelCase.
873         Well, at least more of them use camelCase (like flunkOnWarnings)
874         than don't.. I wish I'd picked one style and stuck with it
875         earlier. Annoying, but it's best done before the release, since
876         these arguments didn't exist at all in 0.6.6 .
877         (Darcs): same
878         * buildbot/test/test_vc.py (SVN.testCheckout): same
879         (Darcs.testPatch): same
880         * docs/buildbot.texinfo (SVN): document the change
881         (Darcs): same, add some build-on-branch docs
882         * docs/examples/twisted_master.cfg: match change
884         * buildbot/process/step.py (BuildStep): rename
885         slaveVersionNewEnough to slaveVersionIsOlderThan, because that's
886         how it is normally used.
887         * buildbot/test/test_steps.py (Version.checkCompare): same
889         * buildbot/process/step.py (CVS.startVC): refuse to build
890         update/copy -style builds on a non-default branch with an old
891         buildslave (<=0.6.6) that doesn't know how to do it properly. The
892         concern is that it will do a VC 'update' in an existing tree when
893         it is supposed to be switching branches (and therefore clobbering
894         the tree to do a full checkout), thus building the wrong source.
895         This used to be a warning, but I think the confusion it is likely
896         to cause warrants making it an error.
897         (SVN.startVC): same, also make mode=export on old slaves an error
898         (Darcs.startVC): same
899         (Git.startVC): improve error message for non-Git-enabled slaves
900         (Arch.checkSlaveVersion): same. continue to emit a warning when a
901         specific revision is built on a slave that doesn't pay attention
902         to args['revision'], because for slowly-changing trees it will
903         probably do the right thing, and because we have no way to tell
904         whether we're asking it to build the most recent version or not.
905         * buildbot/interfaces.py (BuildSlaveTooOldError): new exception
907         * buildbot/scripts/runner.py (SlaveOptions.postOptions): assert
908         that 'master' is in host:portnum format, to catch errors sooner
910 2005-10-23  Brian Warner  <warner@lothar.com>
912         * buildbot/process/step_twisted.py (ProcessDocs.createSummary):
913         when creating the list of warning messages, include the line
914         immediately after each WARNING: line, since that's usually where
915         the file and line number wind up.
917         * docs/examples/twisted_master.cfg: OS-X slave now does QT, add a
918         TryScheduler
920         * NEWS: update
922 2005-10-22  Brian Warner  <warner@lothar.com>
924         * buildbot/status/html.py (HtmlResource): incorporate valid-HTML
925         patch from Brad Hards
926         * buildbot/status/classic.css: same
927         * buildbot/test/test_web.py (Waterfall): match changes
929         * buildbot/test/test_steps.py (BuildStep.setUp): set
930         nextBuildNumber so the test passes
931         * buildbot/test/test_status.py (MyBuilder): same
933         * buildbot/status/html.py (StatusResourceBuild.body): revision
934         might be numeric, so stringify it before html-escapifying it
935         (CurrentBox.getBox): add a "waiting" state, and show a countdown
936         timer for the upcoming build
937         * buildbot/status/classic.css: add background-color attributes for
938         offline/waiting/building classes
940         * buildbot/status/builder.py (BuildStatus): derive from
941         styles.Versioned, fix upgrade of .sourceStamp attribute. Also set
942         the default (i.e. unknown) .slavename to "???" instead of None,
943         since even unknown slavenames need to be printed eventually.
944         (BuilderStatus): also derive from styles.Versioned . More
945         importantly, determine .nextBuildNumber at creation/unpickling
946         time by scanning the directory of saved BuildStatus instances and
947         choosing one larger than the highest-numbered one found. This
948         should fix the problem where random errors during upgrades cause
949         the buildbot to forget about earlier builds. .nextBuildNumber is
950         no longer stored in the pickle.
951         (Status.builderAdded): if we can't unpickle the BuilderStatus,
952         at least log the error. Also call Builder.determineNextBuildNumber
953         once the basedir is set.
955         * buildbot/master.py (BuildMaster.loadChanges): do
956         styles.doUpgrade afterwards, in case I decide to make Changes
957         derived from styles.Versioned some day and forget to make this
958         change later.
961         * buildbot/test/test_runner.py (Options.testForceOptions): skip
962         when running under older pythons (<2.3) in which the shlex module
963         doesn't have a 'split' function.
965         * buildbot/process/step.py (ShellCommand.start): make
966         errorMessages= be a list of strings to stuff in the log before the
967         command actually starts. This makes it easier to flag multiple
968         warning messages, e.g. when the Source steps have to deal with an
969         old buildslave.
970         (CVS.startVC): handle slaves that don't handle multiple branches
971         by switching into 'clobber' mode
972         (SVN.startVC): same. Also reject branches without base_url
973         (Darcs.startVC): same. Also reject revision= in older slaves
974         (Arch.checkSlaveVersion): same (just the multiple-branches stuff)
975         (Bazaar.startVC): same, and test for baz separately than for arch
977         * buildbot/slave/commands.py (cvs_ver): document new features
979         * buildbot/process/step.py (BuildStep.slaveVersion): document it
980         (BuildStep.slaveVersionNewEnough): more useful utility method
981         * buildbot/test/test_steps.py (Version): start testing it
983         * buildbot/status/words.py (IrcStatusBot.command_FORCE): note that
984         the 'force' command requires python2.3, for the shlex.split method
986         * docs/examples/twisted_master.cfg: remove old freshcvs stuff,
987         since we don't use it anymore. The Twisted buildbot uses a
988         PBChangeSource now.
990 2005-10-21  Brian Warner  <warner@lothar.com>
992         * buildbot/process/process_twisted.py: rework all BuildFactory
993         classes to take a 'source' step as an argument, instead of
994         building up the SVN instance in the factory.
995         * docs/examples/twisted_master.cfg: enable build-on-branch by
996         providing a base_url and default_branch
998         * buildbot/status/words.py (IrcStatusBot.command_FORCE): add
999         control over --branch and --revision, not that they are always
1000         legal to provide
1001         * buildbot/status/html.py (StatusResourceBuilder.force): same
1002         (StatusResourceBuild.body): display SourceStamp components
1004         * buildbot/scripts/runner.py (ForceOptions): option parser for the
1005         IRC 'force' command, so it can be shared with an eventual
1006         command-line-tool 'buildbot force' mode.
1007         * buildbot/test/test_runner.py (Options.testForceOptions): test it
1009 2005-10-20  Brian Warner  <warner@lothar.com>
1011         * buildbot/status/mail.py (MailNotifier.buildMessage): reformat
1013         * docs/examples/twisted_master.cfg: update to use Schedulers
1015         * buildbot/scripts/sample.cfg: update with Schedulers
1017         * buildbot/interfaces.py (IBuilderControl.requestBuildSoon): new
1018         method specifically for use by HTML "force build" button and the
1019         IRC "force" command. Raises an immediate error if there are no
1020         slaves available.
1021         (IBuilderControl.requestBuild): make this just submit a build, not
1022         try to check for existing slaves or set up any when-finished
1023         Deferreds or anything.
1024         * buildbot/process/builder.py (BuilderControl): same
1025         * buildbot/status/html.py (StatusResourceBuilder.force): same
1026         * buildbot/status/words.py (IrcStatusBot.command_FORCE): same
1027         * buildbot/test/test_slaves.py: same
1028         * buildbot/test/test_web.py: same
1030 2005-10-19  Brian Warner  <warner@lothar.com>
1032         * docs/examples/twisted_master.cfg: re-sync with reality: bring
1033         back python2.2 tests, turn off OS-X threadedselect-reactor tests
1035 2005-10-18  Brian Warner  <warner@lothar.com>
1037         * buildbot/status/html.py: provide 'status' argument to most
1038         StatusResourceFOO objects
1039         (StatusResourceBuild.body): href-ify the Builder name, add "Steps
1040         and Logfiles" section to make the Build page into a more-or-less
1041         comprehensive source of status information about the build
1043         * buildbot/status/mail.py (MailNotifier): include the Build's URL
1044         * buildbot/status/words.py (IrcStatusBot.buildFinished): same
1046 2005-10-17  Brian Warner  <warner@lothar.com>
1048         * buildbot/process/process_twisted.py (TwistedTrial): update Trial
1049         arguments to accomodate Twisted >=2.1.0 . I will have to figure
1050         out what to do about other projects: the correct options for
1051         recent Twisteds will not work for older ones.
1053 2005-10-15  Brian Warner  <warner@lothar.com>
1055         * buildbot/status/builder.py (Status.getURLForThing): add method
1056         to provide a URL for arbitrary IStatusFoo objects. The idea is to
1057         use this in email/IRC status clients to make them more useful, by
1058         providing the end user with hints on where to learn more about the
1059         object being reported on.
1060         * buildbot/test/test_web.py (GetURL): tests for it
1062 2005-10-14  Brian Warner  <warner@lothar.com>
1064         * buildbot/test/test_config.py (ConfigTest._testSources_1): oops,
1065         fix bug resulting from deferredResult changes
1067 2005-10-13  Brian Warner  <warner@lothar.com>
1069         * buildbot/test/test_changes.py: remove use of deferredResult
1070         * buildbot/test/test_config.py: same
1071         * buildbot/test/test_control.py: same
1072         * buildbot/test/test_status.py: same
1073         * buildbot/test/test_vc.py: this is the only remaining use, since
1074         it gets used at module level. This needs to be replaced by some
1075         sort of class-level run-once routine.
1077         * buildbot/status/words.py (IrcStatusBot.command_WATCH): fix typo
1079         * lots: implement multiple slaves per Builder, which means multiple
1080         current builds per Builder. Some highlights:
1081         * buildbot/interfaces.py (IBuilderStatus.getState): return a tuple
1082         of (state,currentBuilds) instead of (state,currentBuild)
1083         (IBuilderStatus.getCurrentBuilds): replace getCurrentBuild()
1084         (IBuildStatus.getSlavename): new method, so you can tell which
1085         slave got used. This only gets set when the build completes.
1086         (IBuildRequestStatus.getBuilds): new method
1088         * buildbot/process/builder.py (SlaveBuilder): add a .state
1089         attribute to track things like ATTACHING and IDLE and BUILDING,
1090         instead of..
1091         (Builder): .. the .slaves attribute here, which has been turned
1092         into a simple list of available slaves. Added a separate
1093         attaching_slaves list to track ones that are not yet ready for
1094         builds.
1095         (Builder.fireTestEvent): put off the test-event callback for a
1096         reactor turn, to make tests a bit more consistent.
1097         (Ping): cleaned up the slaveping a bit, now it disconnects if the
1098         ping fails due to an exception. This needs work, I'm worried that
1099         a code error could lead to a constantly re-connecting slave.
1100         Especially since I'm trying to move to a distinct remote_ping
1101         method, separate from the remote_print that we currently use.
1102         (BuilderControl.requestBuild): return a convenience Deferred that
1103         provides an IBuildStatus when the build finishes.
1104         (BuilderControl.ping): ping all connected slaves, only return True
1105         if they all respond.
1107         * buildbot/slave/bot.py (BuildSlave.stopService): stop trying to
1108         reconnect when we shut down.
1110         * buildbot/status/builder.py: implement new methods, convert
1111         one-build-at-a-time methods to handle multiple builds
1112         * buildbot/status/*.py: do the same in all default status targets
1113         * buildbot/status/html.py: report the build's slavename in the
1114         per-Build page, report all buildslaves on the per-Builder page
1116         * buildbot/test/test_run.py: update/create tests
1117         * buildbot/test/test_slaves.py: same
1118         * buildbot/test/test_scheduler.py: remove stale test
1120         * docs/buildbot.texinfo: document the new builder-specification
1121         'slavenames' parameter
1123 2005-10-12  Brian Warner  <warner@lothar.com>
1125         * buildbot/buildset.py (BuildSet): fix bug where BuildSet did not
1126         report failure correctly, causing Dependent builds to run when
1127         they shouldn't have.
1128         * buildbot/status/builder.py (BuildSetStatus): same
1129         * buildbot/test/test_buildreq.py (Set.testBuildSet): verify it
1130         (Set.testSuccess): test the both-pass case too
1131         * buildbot/test/test_dependencies.py (Dependencies.testRun_Fail):
1132         fix this test: it was ending too early, masking the failure before
1133         (Logger): specialized StatusReceiver to make sure the dependent
1134         builds aren't even started, much less completed.
1136 2005-10-07  Brian Warner  <warner@lothar.com>
1138         * buildbot/slave/bot.py (SlaveBuilder.activity): survive
1139         bot.SlaveBuilder being disowned in the middle of a build
1141         * buildbot/status/base.py (StatusReceiverMultiService): oops, make
1142         this inherit from StatusReceiver. Also upcall in __init__. This
1143         fixes the embarrasing crash when the new buildSetSubmitted method
1144         is invoked and Waterfall/etc don't implement their own.
1145         * buildbot/test/test_run.py: add a TODO note about a test to catch
1146         just this sort of thing.
1148         * buildbot/process/builder.py (Builder.attached): remove the
1149         already-attached warning, this situation is normal. Add some
1150         comments explaining it.
1152 2005-10-02  Brian Warner  <warner@lothar.com>
1154         * buildbot/changes/maildir.py (Maildir.start): Tolerate
1155         OverflowError when setting up dnotify, because some 64-bit systems
1156         have problems with signed-vs-unsigned constants and trip up on the
1157         DN_MULTISHOT flag. Patch from Brad Hards.
1159 2005-09-06  Fred Drake  <fdrake@users.sourceforge.net>
1161         * buildbot/process/step.py (BuildStep, ShellCommand): Add
1162         progressMetrics, description, descriptionDone to the 'parms' list,
1163         and make use the 'parms' list from the implementation class
1164         instead of only BuildStep to initialize the parameters.  This
1165         allows buildbot.process.factory.s() to initialize all the parms,
1166         not just those defined in directly by BuildStep.
1168 2005-09-03  Brian Warner  <warner@lothar.com>
1170         * NEWS: start adding items for the next release
1172         * docs/examples/twisted_master.cfg: (sync with reality) turn off
1173         python2.2 tests, change 'Quick' builder to only use python2.3
1175 2005-09-02  Fred Drake  <fdrake@users.sourceforge.net>
1177         * buildbot/status/html.py (StatusResourceBuilder.body): only show
1178         the "Ping Builder" button if the build control is available; the
1179         user sees an exception otherwise
1181         * docs/buildbot.texinfo (PBChangeSource): fix a typo
1183 2005-09-01  Brian Warner  <warner@lothar.com>
1185         * buildbot/interfaces.py (IBuilderStatus.getState): update
1186         signature, point out that 'build' can be None
1187         (IBuildStatus.getETA): point out ETA can be none
1189         * buildbot/status/html.py (CurrentBox.getBox): tolerate build/ETA
1190         being None
1191         * buildbot/status/words.py (IrcStatusBot.emit_status): same
1193 2005-08-31  Brian Warner  <warner@lothar.com>
1195         * buildbot/status/base.py (StatusReceiver.builderChangedState):
1196         update to match correct signature: removed 'eta' argument
1197         * buildbot/status/mail.py (MailNotifier.builderChangedState): same
1199 2005-08-30  Brian Warner  <warner@lothar.com>
1201         * buildbot/status/builder.py (LogFile): remove the assertion that
1202         blows up when you try to overwrite an existing logfile, instead
1203         just emit a warning. This case gets hit when the buildmaster is
1204         killed and doesn't get a chance to write out the serialized
1205         BuilderStatus object, so the .nextBuildNumber attribute gets out
1206         of date.
1208         * buildbot/scripts/runner.py (sendchange): add --revision_file to
1209         the 'buildbot sendchange' arguments, for the Darcs context file
1210         * docs/buildbot.texinfo (sendchange): document it
1212         * buildbot/status/html.py: add pending/upcoming builds to CurrentBox
1213         * buildbot/interfaces.py (IScheduler.getPendingBuildTimes): new method
1214         (IStatus.getSchedulers): new method
1215         * buildbot/status/builder.py (BuilderStatus): track pendingBuilds
1216         (Status.getSchedulers): implement
1217         * buildbot/process/builder.py (Builder): maintain
1218         BuilderStatus.pendingBuilds
1219         * buildbot/scheduler.py (Scheduler.getPendingBuildTimes): new method
1220         (TryBase.addChange): Try schedulers should ignore Changes
1222         * buildbot/scripts/tryclient.py (getTopdir): implement getTopdir
1223         for 'try' on CVS/SVN
1224         * buildbot/test/test_runner.py (Try.testGetTopdir): test case
1226         * buildbot/scripts/tryclient.py (Try): make jobdir-style 'try'
1227         report status properly.
1228         (Try.createJob): implement unique buildset IDs
1230         * buildbot/status/client.py (StatusClientPerspective): add a
1231         perspective_getBuildSets method for the benefit of jobdir-style
1232         'try'.
1233         * docs/buildbot.texinfo (try): more docs
1234         * buildbot/test/test_scheduler.py (Scheduling.testGetBuildSets):
1235         new test case
1237 2005-08-18  Brian Warner  <warner@lothar.com>
1239         * buildbot/scripts/tryclient.py (Try): make 'try' status reporting
1240         actually work. It's functional but still kind of clunky. Also, it
1241         only works with the pb-style.. needs to be made to work with the
1242         jobdir-style too.
1244         * buildbot/status/client.py (RemoteBuildSet): new class
1245         (RemoteBuildRequest): same
1246         (RemoteBuild.remote_waitUntilFinished): return the RemoteBuild
1247         object, not the internal BuildStatus object.
1248         (RemoteBuild.remote_subscribe): new method to subscribe to builds
1249         outside of the usual buildStarted() return value.
1250         (BuildSubscriber): support class for RemoteBuild.remote_subscribe
1252         * buildbot/scheduler.py (Try_Jobdir): convey buildsetID properly
1253         (Try_Userpass_Perspective.perspective_try): return a remotely
1254         usable BuildSetStatus object
1256         * buildbot/interfaces.py (IBuildStatus): remove obsolete
1257         isStarted()/waitUntilStarted()
1259 2005-08-16  Brian Warner  <warner@lothar.com>
1261         * buildbot/status/builder.py: implement IBuildSetStatus and
1262         IBuildRequestStatus, wire them into place.
1263         * buildbot/buildset.py: same. Add ID, move wait-until-finished
1264         methods into the BuildSetStatus object.
1265         * buildbot/interfaces.py: same
1266         (IStatus.getBuildSets): new method to get pending BuildSets
1267         (IStatusReceiver.buildsetSubmitted): new method which hears about
1268         new BuildSets
1269         * buildbot/master.py (BuildMaster.submitBuildSet): same
1270         * buildbot/process/base.py (BuildRequest): same, replace
1271         waitUntilStarted with subscribe/unsubscribe
1272         * buildbot/process/builder.py (BuilderControl.forceBuild): use
1273         subscribe instead of waitUntilStarted
1274         * buildbot/status/base.py (StatusReceiver.buildsetSubmitted): stub
1275         for new method
1276         * buildbot/status/client.py (StatusClientPerspective.builderRemoved): 
1277         same
1278         * buildbot/test/test_buildreq.py: update for new code
1279         * buildbot/test/test_control.py (Force.testRequest): same
1282         * buildbot/slave/commands.py (Darcs.doVCFull): fix get-revision
1283         for Darcs to not use the tempfile module, so it works under
1284         python-2.2 too. We really didn't need the full cleverness of that
1285         module, since the slave has exclusive control of its own builddir.
1287 2005-08-15  Brian Warner  <warner@lothar.com>
1289         * buildbot/scripts/tryclient.py (CVSExtractor): implement 'try'
1290         for CVS trees. It doesn't work for non-trunk branches,
1291         unfortunately.
1292         * buildbot/test/test_vc.py (CVS.testTry): test it, but skip the
1293         branch test
1295         * Makefile: make it easier to test against python2.2
1297         * buildbot/test/test_vc.py (VCBase.tearDown): provide for
1298         tearDown2, so things like Arch can unregister archives as they're
1299         shutting down. The previous subclass-override-tearDown technique
1300         resulted in a nested maybeWait() and test failures under
1301         Twisted-1.3.0
1303         * buildbot/scripts/tryclient.py (getSourceStamp): extract branches
1304         where we can (Arch), add a branch= argument to set the branch used
1305         when we can't
1306         (BazExtractor): extract the branch too
1307         (TlaExtractor): same
1308         * buildbot/scripts/runner.py (TryOptions): add --branch
1309         * docs/buildbot.texinfo (try): document --branch/try_branch
1311         * buildbot/slave/commands.py (Darcs): implement get-revision for
1312         Darcs, so that 'try' will work. This requires the tempfile module
1313         from python-2.3 .
1315         * buildbot/test/test_vc.py: rewrite tests, getting better coverage
1316         of revisions, branches, and 'try' in the process.
1318 2005-08-11  Brian Warner  <warner@lothar.com>
1320         * buildbot/master.py (DebugPerspective.perspective_pokeIRC): fix
1321         this, it got broken at some point in the last few releases
1322         * buildbot/status/words.py (IrcBuildRequest): reply was broken
1323         (IrcStatusBot.emit_status): handle new IBuilderStatus.getState,
1324         specifically the removal of ETA information from the tuple
1326         * buildbot/locks.py: use %d for id() instead of %x, avoid a silly
1327         warning message
1329         * docs/buildbot.texinfo (try): document both --builder and
1330         'try_builders' in .buildbot/options
1331         * buildbot/scripts/runner.py (TryOptions): add --builder,
1332         accumulate the values into opts['builders']
1333         * buildbot/scripts/tryclient.py (Try.__init__): set builders
1334         * buildbot/test/test_runner.py (Try): add some quick tests to make
1335         sure 'buildbot try --options' and .buildbot/options get parsed
1336         * buildbot/test/test_scheduler.py (Scheduling.testTryUserpass):
1337         use --builder control
1339         * docs/buildbot.texinfo (try): add --port argument to PB style
1341         * buildbot/scripts/tryclient.py (SourceStampExtractor): return an
1342         actual SourceStamp. Still need to extract a branch name, somehow.
1343         (Try): finish implementing the try client side, still need a UI
1344         for specifying which builders to use
1345         (Try.getopt): factor our options/config-file reading
1346         * buildbot/test/test_scheduler.py (Scheduling.testTryUserpass):
1347         test it
1348         * buildbot/test/test_vc.py: match SourceStampExtractor change
1350         * buildbot/scripts/runner.py (Options.opt_verbose): --verbose
1351         causes the twisted log to be sent to stderr
1353         * buildbot/scheduler.py (Try_Userpass): implement the PB style
1355 2005-08-10  Brian Warner  <warner@lothar.com>
1357         * buildbot/scripts/runner.py: Add 'buildbot try' command, jobdir
1358         style is 90% done, still missing status reporting or waiting for
1359         the buildsets to finish, and it is completely untested.
1361         * buildbot/trybuild.py: delete file, move contents to ..
1362         * buildbot/scripts/tryclient.py (getSourceStamp): .. here
1363         * buildbot/test/test_vc.py: match the move
1365         * buildbot/scheduler.py (Try_Jobdir): implement the jobdir style
1366         of the TryScheduler, no buildsetID or status-tracking support yet
1367         * buildbot/test/test_scheduler.py (Scheduling.testTryJobdir): test it
1369         * buildbot/changes/maildir.py (Maildir.setBasedir): make it
1370         possible to set the basedir after __init__ time, so it is easier
1371         to use as a Service-child of the BuildMaster instance
1373         * buildbot/changes/maildirtwisted.py (MaildirService): make a form
1374         that delivers messages to its Service parent instead of requiring
1375         a subclass to be useful. This turns out to be much easier to build
1376         unit tests around.
1378         * buildbot/scripts/tryclient.py (createJob): utility code to
1379         create jobfiles, will eventually be used by 'buildbot try'
1381 2005-08-08  Brian Warner  <warner@lothar.com>
1383         * docs/buildbot.texinfo (try): add docs on the
1384         as-yet-unimplemented Try scheduler
1386         * buildbot/test/test_buildreq.py: move Scheduling tests out to ..
1387         * buildbot/test/test_scheduler.py: .. here
1388         (Scheduling.testTryJobdir): add placeholder test for 'try'
1390         * buildbot/test/test_status.py (Log.testMerge3): update to match new
1391         addEntry merging (>=chunkSize) behavior
1392         (Log.testConsumer): update to handle new callLater(0) behavior
1394         * buildbot/test/test_web.py: rearrange tests a bit, add test for
1395         both the MAX_LENGTH bugfix and the resumeProducing hang.
1397         * buildbot/status/builder.py (LogFileProducer.resumeProducing):
1398         put off the actual resumeProducing for a moment with
1399         reactor.callLater(0). This works around a twisted-1.3.0 bug which
1400         causes large logfiles to hang midway through.
1402         * buildbot/process/step.py (BuildStep.addCompleteLog): break the
1403         logfile up into chunks, both to avoid NetstringReceiver.MAX_LENGTH
1404         and to improve memory usage when streaming the file out to a web
1405         browser.
1406         * buildbot/status/builder.py (LogFile.addEntry): change > to >= to
1407         make this work cleanly
1409 2005-08-03  Brian Warner  <warner@lothar.com>
1411         * buildbot/trybuild.py: new file for 'try' utilities
1412         (getSourceStamp): run in a tree, find out the baserev+patch
1413         * buildbot/test/test_vc.py (VCBase.do_getpatch): test it,
1414         implemented for SVN and Darcs, still working on Arch. I don't know
1415         how to make CVS work yet.
1417         * docs/buildbot.texinfo: document the 'buildbot' command-line
1418         tool, including the not-yet-implemented 'try' feature, and the
1419         in-flux .buildbot/ options directory.
1421 2005-07-20  Brian Warner  <warner@lothar.com>
1423         * buildbot/locks.py: added temporary id() numbers to Lock
1424         descriptions, to track down a not-really-sharing-the-Lock bug
1426         * buildbot/test/runutils.py: must import errno, cut-and-paste bug
1428         * buildbot/test/test_slavecommand.py (ShellBase.failUnlessIn):
1429         needed for python2.2 compatibility
1430         * buildbot/test/test_vc.py: python2.2 compatibility: generators
1431         are from the __future__
1433 2005-07-19  Brian Warner  <warner@lothar.com>
1435         * buildbot/master.py (BuildMaster.loadConfig): give a better error
1436         message when schedulers use unknown builders
1438         * buildbot/process/builder.py (Builder.compareToSetup): make sure
1439         SlaveLock('name') and MasterLock('name') are distinct
1441         * buildbot/master.py (BuildMaster.loadConfig): oops, sanity-check
1442         c['schedulers'] in such a way that we can actually accept
1443         Dependent instances
1444         * buildbot/test/test_config.py: check it
1446         * buildbot/scheduler.py (Dependent.listBuilderNames): oops, add
1447         utility method to *all* the Schedulers
1448         (Periodic.listBuilderNames): same
1450         * docs/buildbot.texinfo (Interlocks): update chapter to match
1451         reality
1453         * buildbot/master.py (BuildMaster.loadConfig): Add sanity checks
1454         to make sure that c['sources'], c['schedulers'], and c['status']
1455         are all lists of the appropriate objects, and that the Schedulers
1456         all point to real Builders
1457         * buildbot/interfaces.py (IScheduler, IUpstreamScheduler): add
1458         'listBuilderNames' utility method to support this
1459         * buildbot/scheduler.py: implement the utility method
1460         * buildbot/test/test_config.py (ConfigTest.testSchedulers): test it
1462         * docs/buildbot.texinfo: add some @cindex entries
1464         * buildbot/test/test_vc.py (Arch.createRepository): set the tla ID
1465         if it wasn't already set: most tla commands will fail unless one
1466         has been set.
1467         (Arch.createRepository): and disable bazaar's revision cache, since
1468         they cause test failures (the multiple repositories we create all
1469         interfere with each other through the cache)
1471         * buildbot/test/test_web.py (WebTest): remove use of deferredResult,
1472         bring it properly up to date with twisted-2.0 test guidelines
1474         * buildbot/master.py (BuildMaster): remove references to old
1475         'interlock' module, this caused a bunch of post-merge test
1476         failures
1477         * buildbot/test/test_config.py: same
1478         * buildbot/process/base.py (Build): same
1480         * buildbot/test/test_slaves.py: stubs for new test case
1482         * buildbot/scheduler.py: add test-case-name tag
1483         * buildbot/test/test_buildreq.py: same
1485         * buildbot/slave/bot.py (SlaveBuilder.__init__): remove some
1486         unnecessary init code
1487         (Bot.remote_setBuilderList): match it
1489         * docs/buildbot.texinfo (@settitle): don't claim version 1.0
1491         * buildbot/changes/mail.py (parseSyncmail): update comment
1493         * buildbot/test/test_slavecommand.py: disable Shell tests on
1494         platforms that don't suport IReactorProcess
1496         * buildbot/status/builder.py (LogFile): remove the 't' mode from
1497         all places where we open logfiles. It causes OS-X to open the file
1498         in some weird mode that that prevents us from mixing reads and
1499         writes to the same filehandle, which we depend upon to implement
1500         _generateChunks properly. This change doesn't appear to break
1501         win32, on which "b" and "t" are treated differently but a missing
1502         flag seems to be interpreted as "t".
1504 2005-07-18  Brian Warner  <warner@lothar.com>
1506         * buildbot/slave/commands.py (ShellCommand): overhaul
1507         error-handling code, to try and make timeout/interrupt work
1508         properly, and make win32 happier
1509         * buildbot/test/test_slavecommand.py: clean up, stop using
1510         reactor.iterate, add tests for timeout and interrupt
1511         * buildbot/test/sleep.py: utility for a new timeout test
1513         * buildbot/twcompat.py: copy over twisted 1.3/2.0 compatibility
1514         code from the local-usebranches branch
1516 2005-07-17  Brian Warner  <warner@lothar.com>
1518         * buildbot/process/process_twisted.py
1519         (TwistedReactorsBuildFactory): change the treeStableTimer to 5
1520         minutes, to match the other twisted BuildFactories, and don't
1521         excuse failures in c/qt/win32 reactors any more.
1523         * docs/examples/twisted_master.cfg: turn off the 'threadless' and
1524         'freebsd' builders, since the buildslaves have been unavailable
1525         for quite a while
1527 2005-07-13  Brian Warner  <warner@lothar.com>
1529         * buildbot/test/test_vc.py (VCBase.do_branch): test the new
1530         build-on-branch feature
1532         * buildbot/process/step.py (Darcs.__init__): add base_url and
1533         default_branch arguments, just like SVN
1534         (Arch.__init__): note that the version= argument is really the
1535         default branch name
1537         * buildbot/slave/commands.py (SourceBase): keep track of the
1538         repository+branch that was used for the last checkout in
1539         SRCDIR/.buildbot-sourcedata . If the contents of this file do not
1540         match, we clobber the directory and perform a fresh checkout
1541         rather than trying to do an in-place update. This should protect
1542         us against trying to get to branch B by doing an update in a tree
1543         obtained from branch A.
1544         (CVS.setup): add CVS-specific sourcedata: root, module, and branch
1545         (SVN.setup): same, just the svnurl
1546         (Darcs.setup): same, just the repourl
1547         (Arch.setup): same, arch coordinates (url), version, and
1548         buildconfig. Also pull the buildconfig from the args dictionary,
1549         which we weren't doing before, so the build-config was effectively
1550         disabled.
1551         (Arch.sourcedirIsUpdateable): don't try to update when we're
1552         moving to a specific revision: arch can't go backwards, so it is
1553         safer to just clobber the tree and checkout a new one at the
1554         desired revision.
1555         (Bazaar.setup): same sourcedata as Arch
1557         * buildbot/test/test_dependencies.py (Dependencies.testRun_Fail):
1558         use maybeWait, to work with twisted-1.3.0 and twcompat
1559         (Dependencies.testRun_Pass): same
1561         * buildbot/test/test_vc.py: rearrange, cleanup
1563         * buildbot/twcompat.py: add defer.waitForDeferred and
1564         utils.getProcessOutputAndValue, so test_vc.py (which uses them)
1565         can work under twisted-1.3.0 .
1567         * buildbot/test/test_vc.py: rewrite. The sample repositories are
1568         now created at setUp time. This increases the runtime of the test
1569         suite considerably (from 91 seconds to 151), but it removes the
1570         need for an offline tarball, which should solve a problem I've
1571         seen where the test host has a different version of svn than the
1572         tarball build host. The new code also validates that mode=update
1573         really picks up recent commits. This approach will also make it
1574         easier to test out branches, because the code which creates the VC
1575         branches is next to the code which uses them. It will also make it
1576         possible to test some change-notification hooks, by actually
1577         performing a VC commit and watching to see the ChangeSource get
1578         notified.
1580 2005-07-12  Brian Warner  <warner@lothar.com>
1582         * docs/buildbot.texinfo (SVN): add branches example
1583         * docs/Makefile (buildbot.ps): add target for postscript manual
1585         * buildbot/test/test_dependencies.py: s/test_interlocks/test_locks/ 
1586         * buildbot/test/test_locks.py: same
1588         * buildbot/process/step.py (Darcs): comment about default branches
1590         * buildbot/master.py (BuildMaster.loadConfig): don't look for
1591         c['interlocks'] in the config file, complain if it is present.
1592         Scan all locks in c['builders'] to make sure the Locks they use
1593         are uniquely named.
1594         * buildbot/test/test_config.py: remove old c['interlocks'] test,
1595         add some tests to check for non-uniquely-named Locks
1596         * buildbot/test/test_vc.py (Patch.doPatch): fix factory.steps,
1597         since the unique-Lock validation code requires it now
1599         * buildbot/locks.py: fix test-case-name
1601         * buildbot/interlock.py: remove old file
1603 2005-07-11  Brian Warner  <warner@lothar.com>
1605         * buildbot/test/test_interlock.py: rename to..
1606         * buildbot/test/test_locks.py: .. something shorter
1608         * buildbot/slave/bot.py (BuildSlave.stopService): newer Twisted
1609         versions (after 2.0.1) changed internet.TCPClient to shut down the
1610         connection in stopService. Change the code to handle this
1611         gracefully.
1613         * buildbot/process/base.py (Build): handle whole-Build locks
1614         * buildbot/process/builder.py (Builder.compareToSetup): same
1615         * buildbot/test/test_interlock.py: make tests work
1617         * buildbot/process/step.py (BuildStep.startStep): complain if a
1618         Step tries to claim a lock that's owned by its own Build
1619         (BuildStep.releaseLocks): typo
1621         * buildbot/locks.py (MasterLock): use ComparableMixin so config
1622         file reloads don't replace unchanged Builders
1623         (SlaveLock): same
1624         * buildbot/test/test_config.py (ConfigTest.testInterlocks):
1625         rewrite to cover new Locks instead of old c['interlocks']
1626         * buildbot/test/runutils.py (RunMixin.connectSlaves): remember
1627         slave2 too
1630         * buildbot/test/test_dependencies.py (Dependencies.setUp): always
1631         start the master and connect the buildslave
1633         * buildbot/process/step.py (FailingDummy.done): finish with a
1634         FAILURE status rather than raising an exception
1636         * buildbot/process/base.py (BuildRequest.mergeReasons): don't try to
1637         stringify a BuildRequest.reason that is None
1639         * buildbot/scheduler.py (BaseUpstreamScheduler.buildSetFinished):
1640         minor fix
1641         * buildbot/status/builder.py (BuildSetStatus): implement enough to
1642         allow scheduler.Dependent to work
1643         * buildbot/buildset.py (BuildSet): set .reason and .results
1645         * buildbot/test/test_interlock.py (Locks.setUp): connect both
1646         slaves, to make the test stop hanging. It still fails, of course,
1647         because I haven't even started to implement Locks.
1649         * buildbot/test/runutils.py (RunMixin.connectSlaves): new utility
1651         * docs/buildbot.texinfo (Build-Dependencies): redesign the feature
1652         * buildbot/interfaces.py (IUpstreamScheduler): new Interface
1653         * buildbot/scheduler.py (BaseScheduler): factor out common stuff
1654         (Dependent): new class for downstream build dependencies
1655         * buildbot/test/test_dependencies.py: tests (still failing)
1657         * buildbot/buildset.py (BuildSet.waitUntilSuccess): minor notes
1659 2005-07-07  Brian Warner  <warner@lothar.com>
1661         * buildbot/test/runutils.py (RunMixin): factored this class out..
1662         * buildbot/test/test_run.py: .. from here
1663         * buildbot/test/test_interlock.py: removed old c['interlock'] tests,
1664         added new buildbot.locks tests (which all hang right now)
1665         * buildbot/locks.py (SlaveLock, MasterLock): implement Locks
1666         * buildbot/process/step.py: claim/release per-BuildStep locks
1668         * docs/Makefile: add 'buildbot.html' target
1670         * buildbot/process/step.py (CVS.__init__): allow branch=None to be
1671         interpreted as "HEAD", so that all VC steps can accept branch=None
1672         and have it mean the "default branch".
1674         * docs/buildbot.texinfo: add Schedulers, Dependencies, and Locks
1676 2005-07-07  Brian Warner  <warner@lothar.com>
1678         * docs/examples/twisted_master.cfg: update to match current usage
1680         * docs/buildbot.texinfo (System Architecture): comment out the
1681         image, it doesn't exist yet and just screws up the HTML manual.
1683 2005-07-05  Brian Warner  <warner@lothar.com>
1685         * debian/.cvsignore: oops, missed one. Removing leftover file.
1687 2005-06-17  Brian Warner  <warner@lothar.com>
1689         * buildbot/test/test_vc.py (VCSupport.__init__): svn --version
1690         changed its output in 1.2.0, don't mistakenly think that the
1691         subversion we find isn't capable of supporting our tests.
1693         * debian/*: remove the debian/ directory and its contents, to make
1694         life easier for the proper Debian maintainer
1695         * MANIFEST.in: same
1696         * Makefile (release): same
1698 2005-06-07  Brian Warner  <warner@lothar.com>
1700         * everything: create a distinct SourceStamp class to replace the
1701         ungainly 4-tuple, let it handle merging instead of BuildRequest.
1702         Changed the signature of Source.startVC to include the revision
1703         information (instead of passing it through self.args). Implement
1704         branches for SVN (now only Darcs/Git is missing support). Add more
1705         Scheduler tests.
1707 2005-06-06  Brian Warner  <warner@lothar.com>
1709         * everything: rearrange build scheduling. Create a new Scheduler
1710         object (configured in c['schedulers'], which submit BuildSets to a
1711         set of Builders. Builders can now use multiple slaves. Builds can
1712         be run on alternate branches, either requested manually or driven
1713         by changes. This changed some of the Status classes. Interlocks
1714         are out of service until they've been properly split into Locks
1715         and Dependencies. treeStableTimer, isFileImportant, and
1716         periodicBuild have all been moved from the Builder to the
1717         Scheduler.
1718         (BuilderStatus.currentBigState): removed the 'waiting' and
1719         'interlocked' states, removed the 'ETA' argument.
1721 2005-05-24  Brian Warner  <warner@lothar.com>
1723         * buildbot/pbutil.py (ReconnectingPBClientFactory): Twisted-1.3
1724         erroneously abandons the connection (in clientConnectionFailed)
1725         for non-UserErrors, which means that if we lose the connection due
1726         to a network problem or a timeout, we'll never try to reconnect.
1727         Fix this by not upcalling to the buggy parent method. Note:
1728         twisted-2.0 fixes this, but the function only has 3 lines so it
1729         makes more sense to copy it than to try and detect the buggyness
1730         of the parent class. Fixes SF#1207588.
1732         * buildbot/changes/changes.py (Change.branch): doh! Add a
1733         class-level attribute to accomodate old Change instances that were
1734         pickled before 0.6.5 (where .branch was added for new Changes).
1735         This fixes the exception that occurs when you try to look at an
1736         old Change (through asHTML).
1738         * buildbot/__init__.py (version): bump to 0.6.6+ while between
1739         releases
1741 2005-05-23  Brian Warner  <warner@lothar.com>
1743         * buildbot/__init__.py (version): release 0.6.6
1745 2005-05-23  Brian Warner  <warner@lothar.com>
1747         * NEWS: update for 0.6.6 release
1748         * debian/changelog: same
1750         * buildbot/scripts/runner.py (start): put the basedir in sys.path
1751         before starting: this was done by twistd back when we spawned it,
1752         now that we're importing the pieces and running them in the
1753         current process, we have to do it ourselves. This allows
1754         master.cfg to import files from the same directory without
1755         explicitly manipulating PYTHONPATH. Thanks to Thomas Vander
1756         Stichele for the catch.
1757         (Options.opt_version): Add a --version command (actually, just make
1758         the existing --version command emit Buildbot's version too)
1760         * buildbot/status/builder.py (HTMLLogFile.upgrade): oops! second
1761         fix to make this behave like other LogFiles, this time to handle
1762         existing LogFiles on disk. (add the missing .upgrade method)
1763         * buildbot/test/test_status.py (Log.testHTMLUpgrade): test it
1765 2005-05-21  Brian Warner  <warner@lothar.com>
1767         * buildbot/test/test_runner.py (Create.testMaster): match the
1768         rawstring change in runner.py:masterTAC
1770         * buildbot/test/test_config.py (ConfigTest.testIRC): skip unless
1771         TwistedWords is installed
1772         * buildbot/test/test_status.py: same, with TwistedMail
1774         * buildbot/master.py: remove old IRC/Waterfall imports (used by
1775         some old, deprecated, and removed config keys). This should enable
1776         you to use the base buildbot functionality with Twisted-2.0.0 when
1777         you don't also have TwistedWeb and TwistedWords installed
1779 2005-05-20  Brian Warner  <warner@lothar.com>
1781         * buildbot/scripts/runner.py (run): call sendchange(), not
1782         do_sendchange(): thus 'buildbot sendchange' was broken in 0.6.5
1783         (run): call stop("HUP"), not "-HUP", 'buildbot stop' was broken.
1784         (stop): don't wait for process to die when sending SIGHUP
1785         (masterTAC): use a rawstring for basedir=, otherwise '\' in the
1786         directory name gets interpreted, which you don't want
1787         (slaveTAC): same
1789         * buildbot/__init__.py (version): bump to 0.6.5+ while between
1790         releases
1792 2005-05-18  Brian Warner  <warner@lothar.com>
1794         * buildbot/__init__.py (version): Releasing buildbot-0.6.5
1796 2005-05-18  Brian Warner  <warner@lothar.com>
1798         * README: update for 0.6.5
1799         * debian/changelog: same
1801         * buildbot/changes/changes.py: rename tag= to branch=, since
1802         that's how we're using it, and my design for the upcoming "build a
1803         specific branch" feature wants it. also, tag= was too CVS-centric
1804         * buildbot/changes/mail.py (parseSyncmail): same
1805         * buildbot/process/base.py (Build.isBranchImportant): same
1806         * buildbot/test/test_mailparse.py (Test3.testMsgS4): same
1807         * docs/buildbot.texinfo (Attributes of Changes): same
1809         * NEWS: update tag=, update for upcoming release
1811 2005-05-17  Brian Warner  <warner@lothar.com>
1813         * buildbot/scripts/runner.py (stop): actually poll once per
1814         second, instead of re-killing the poor daemon once per second.
1815         Sleep briefly (0.1s) before the first poll, since there's a good
1816         chance we can avoid waiting the full second if the daemon shuts
1817         down quickly. Also remove the sys.exit() at the end.
1818         (start): remove the unneighborly sys.exit()
1820         * Makefile: improve permission-setting to not kick Arch so badly
1822         * buildbot/scripts/runner.py (SlaveOptions.optParameters): set a
1823         default --keepalive=600, since it doesn't hurt very much, and it's
1824         a hassle to discover that you need it.
1825         * buildbot/test/test_runner.py (Create.testSlave): test it
1827         * buildbot/status/words.py (IrcStatusBot.buildFinished): Teach the
1828         IRC bot about EXCEPTION
1830         * buildbot/status/client.py (PBListener): upcall more correctly
1832         * buildbot/process/base.py (Build.allStepsDone): if a step caused
1833         an exception mark the overall build with EXCEPTION, not SUCCESS
1835         * buildbot/scripts/runner.py (makefile_sample): remove the leading
1836         newline
1837         * buildbot/status/mail.py (MailNotifier): oops, forgot to upcall
1838         * Makefile: update some release-related stuff
1840         * buildbot/slave/commands.py (ShellCommand.kill): if somehow this
1841         gets called when there isn't actually an active process, just end
1842         the Command instead of blowing up. I don't know how it gets into
1843         this state, but the twisted win32 buildslave will sometimes hang,
1844         and when it shakes its head and comes back, it thinks it's still
1845         running a Command. The next build causes this command to be
1846         interrupted, but the lack of self.process.pid breaks the interrupt
1847         attempt.
1849         * NEWS: document changes since the last release
1851         * buildbot/scripts/runner.py (start): change 'buildbot start' to
1852         look for Makefile.buildbot instead of a bare Makefile . The
1853         'buildbot start' does not install this file, so you have to
1854         manually copy it if you want to customize startup behavior.
1855         (createMaster): change 'buildbot master' command to create
1856         Makefile.sample instead of Makefile, to create master.cfg.sample
1857         instead of master.cfg (requiring you to copy it before the
1858         buildmaster can be started). Both sample files are kept up to
1859         date, i.e. they are overwritten if they have been changed. The
1860         'buildbot.tac' file is *not* overwritten, but if the new contents
1861         don't match the old, a 'buildbot.tac.new' file is created and the
1862         user is warned. This seems to be a much more sane way to handle
1863         startup files. Also, don't sys.exit(0) when done, so we can run
1864         unit tests against it.
1865         (createSlave): same. Don't overwrite the sample info/ files.
1866         * buildbot/scripts/sample.mk: remove. the contents were pulled
1867         into runner.py, since they need to match the behavior of start()
1868         * setup.py: same
1869         * MANIFEST.in: same
1871         * docs/buildbot.texinfo (Launching the daemons): document it
1872         * buildbot/test/test_runner.py (Create): test it
1874         * buildbot/test/test_vc.py (SetupMixin.failUnlessIn): Add a
1875         version that can handle string-in-string tests, because otherwise
1876         python-2.2 fails the tests. It'd be tremendous if Trial's test
1877         took two strings under 2.2 too.
1879         * everything: fixed all deprecation warnings when running against
1880         Twisted-2.0 . (at least all the ones in buildbot code, there are a
1881         few that come from Twisted itself). This involved putting most of
1882         the Twisted-version specific code in the new buildbot.twcompat
1883         module, and creating some abstract base classes in
1884         buildbot.changes.base and buildbot.status.base (which might be
1885         useful anyway). __implements__ is a nuisance and requires an ugly
1886         'if' clause everywhere.
1888         * buildbot/test/test_status.py (Mail.testMail): add a 0.1 second
1889         delay before finishing the test: it seems that smtp.sendmail
1890         doesn't hang up on the server, so we must wait a moment so it can
1891         hang up on us. This removes the trial warning about an unclean
1892         reactor.
1894 2005-05-16  Brian Warner  <warner@lothar.com>
1896         * buildbot/process/step.py (Source): add 'retry' argument. It is a
1897         tuple of (delay, repeats).
1898         * buildbot/test/test_vc.py (Retry): test it
1899         * docs/buildbot.texinfo (Source Checkout): document it
1900         * buildbot/slave/commands.py (SourceBase): add 'retry' parameter.
1901         (SourceBase.maybeDoVCRetry): If 'retry' is set, failures in
1902         doVCFull() are handled by re-trying the checkout (after a delay)
1903         some number of times.
1904         (ShellCommand._startCommand): make header lines easier to read
1906         * buildbot/test/test_web.py (WebTest.tearDown): factor out master
1907         shutdown
1908         (WebTest.test_logfile): make sure master gets shut down, silences
1909         some "unclean reactor" test errors
1911         * buildbot/test/test_changes.py (Sender.tearDown): spin the
1912         reactor once after shutdown, something in certain versions of
1913         Twisted trigger a test failure. 1.3.0 is ok, 2.0.0 fails, 2.0.1pre
1914         fails, svn-trunk is ok.
1916         * buildbot/test/test_slavecommand.py (Shell.testShellZ): add a
1917         second win32 error message
1919         * buildbot/test/test_run.py (Status.testSlave): be smarter about
1920         validating the ETA, so the tests don't fail on slow systems
1922 2005-05-15  Brian Warner  <warner@lothar.com>
1924         * buildbot/status/builder.py (HTMLLogFile): make this behave like
1925         the new LogFile class, so upgrading works properly
1926         (LogFileProducer.resumeProducing): survive resumeProducing after
1927         we've exhausted the chunkGenerator
1929         * buildbot/test/test_web.py (WebTest.test_logfile): validate HTML
1930         logs too
1931         * buildbot/test/test_status.py (Log.testAdd): validate hasContents
1932         (Log.testUpgrade): same
1934         * docs/buildbot.texinfo (Maintenance): describe how to delete old
1935         Builds and logs with a cron job.
1937         * buildbot/status/builder.py (LogFile): revamp LogFiles. Got rid
1938         of the old non-offline LogFile, added code to upgrade these to
1939         new-style contents-live-on-disk instances at load time (in a way
1940         that doesn't invalidate the old Build pickles, so upgrading to
1941         0.6.5 is not a one-way operation). Got rid of everything related
1942         to 'stub' builds.
1943         (LogFile.__init__): create LogFiles with the parent step status,
1944         the log's name, and a builder-relative filename where it can keep
1945         the contents on disk.
1946         (LogFile.hasContents): new method, clients are advised to call it
1947         before getText or getChunks and friends. If it returns False, the
1948         log's contents have been deleted and getText() will raise an
1949         error.
1950         (LogFile.getChunks): made it a generator
1951         (LogFile.subscribeConsumer): new method, takes a Twisted-style
1952         Consumer (except one that takes chunks instead of strings). This
1953         enables streaming of very large logfiles without storing the whole
1954         thing in memory.
1955         (BuildStatus.generateLogfileName): create names like
1956         12-log-compile-output, with a _0 suffix if required to be unique
1957         (BuildStatus.upgradeLogfiles): transform any old-style (from 0.6.4
1958         or earlier) logfiles into new-style ones
1959         (BuilderStatus): remove everything related to 'stub' builds. There
1960         is now only one build cache, and we don't strip logs from old
1961         builds anymore.
1962         (BuilderStatus.getBuildByNumber): check self.currentBuild too,
1963         since we no longer fight to keep it in the cache
1965         * buildbot/status/html.py (TextLog.render_GET): use a
1966         ChunkConsumer to stream the log entries efficiently.
1967         (ChunkConsumer): wrapper which consumes chunks and writes
1968         formatted HTML.
1970         * buildbot/test/test_twisted.py (Parse.testParse): use a
1971         LogFile-like object instead of a real one
1973         * buildbot/test/test_status.py (MyLog): handle new LogFile code
1974         (Log.testMerge3): validate more merge behavior
1975         (Log.testChunks): validate LogFile.getChunks
1976         (Log.testUpgrade): validate old-style LogFile upgrading
1977         (Log.testSubscribe): validate LogFile.subscribe
1978         (Log.testConsumer): validate LogFile.subscribeConsumer
1980         * buildbot/interfaces.py (IStatusLogStub): remove
1981         (IStatusLog.subscribeConsumer): new method
1982         (IStatusLog.hasContents): new method
1983         (IStatusLogConsumer): describes things passed to subscribeConsumer
1985         * buildbot/status/html.py (StepBox.getBox): Don't offer an href to
1986         the log contents if it does not have any contents.
1987         (StatusResourceBuildStep.body): same
1988         (StatusResourceBuildStep.getChild): give a 404 for empty logs
1990 2005-05-14  Brian Warner  <warner@lothar.com>
1992         * buildbot/test/test_web.py (WebTest.test_logfile): add 5-second
1993         timeouts to try and make the windows metabuildslave not hang
1995 2005-05-13  Mike Taylor  <bear@code-bear.com>
1997         * buildbot/slave/commands.py (rmdirRecursive): added a check
1998         to ensure the path passed into rmdirRecursive actually exists.
1999         On win32 a non-existant path would generate an exception.
2001 2005-05-13  Brian Warner  <warner@lothar.com>
2003         * buildbot/slave/commands.py (rmdirRecursive): replacement for
2004         shutil.rmtree which behaves correctly on windows in the face of
2005         files that you have to chmod before deleting. Thanks to Bear at
2006         the OSAF for the routine.
2007         (SourceBase.doClobber): use rmdirRecursive
2009 2005-05-12  Brian Warner  <warner@lothar.com>
2011         * buildbot/status/builder.py (OfflineLogFile.getChunks): have this
2012         method generate chunks instead of returning a big list. This
2013         allows the same method to be used for both old LogFile and new
2014         OfflineLogFile.
2015         (OfflineLogFile.getText): use the generator
2016         (OfflineLogFile.subscribe): same
2017         * buildbot/status/html.py (TextLog.resumeProducing): same
2018         * buildbot/interfaces.py (IStatusLog.getChunks): document it
2020         * buildbot/test/test_web.py (WebTest.test_logfile): Add a test to
2021         point out that OfflineLogFile does not currently work with
2022         html.Waterfall . Fixing this is high-priority.
2024         * buildbot/scripts/runner.py (start): add --logfile=twistd.log, since
2025         apparently windows defaults to using stdout
2027         * buildbot/test/test_slavecommand.py (Shell.testShellZ): log a
2028         better message on failure so I can figure out the win32 problem
2030         * buildbot/slave/commands.py (ShellCommand._startCommand): update
2031         log messages to include more useful copies of the command being
2032         run, the argv array, and the child command's environment.
2033         (Git.doVCFull): update cg-close usage, patch from Brandon Philips.
2035 2005-05-11  Brian Warner  <warner@lothar.com>
2037         * setup.py: oops, install debug.glade so 'buildbot debugclient'
2038         will actually work
2039         * Makefile: update the deb-snapshot version
2041         * docs/buildbot.texinfo: move all .xhtml docs into a new
2042         .texinfo-format document, adding a lot of material in the process.
2043         This is starting to look like a real user's manual. Removed all
2044         the Lore-related files: *.xhtml, *.css, template.tpl .
2045         * docs/Makefile: simple makefile to run 'makeinfo'
2046         * buildbot/scripts/sample.cfg: rearrange slightly
2047         * MANIFEST.in: include .info and .textinfo, don't include *.xhtml
2049 2005-05-10  Brian Warner  <warner@lothar.com>
2051         * buildbot/scripts/runner.py (start): Twisted-1.3.0 used a
2052         different name for the internal twistw module, handle it.
2054         * MANIFEST.in: we deleted plugins.tml, so stop shipping it
2055         * setup.py: .. and stop trying to install it
2057         * buildbot/process/step.py (Git): added support for 'cogito' (aka
2058         'git'), the new linux kernel VC system (http://kernel.org/git/).
2059         Thanks to Brandon Philips for the patch.
2060         * buildbot/slave/commands.py (Git): same
2062 2005-05-06  Brian Warner  <warner@lothar.com>
2064         * buildbot/status/builder.py (OfflineLogFile): replace the default
2065         LogFile with a form that appends its new contents to a disk file
2066         as they arrive. The complete log data is never kept in RAM. This
2067         is the first step towards handling very large (100MB+) logfiles
2068         without choking quite so badly. (The other half is
2069         producer/consumer on the HTML pages).
2070         (BuildStepStatus.addLog): use OfflineLogFile by default
2071         (BuildStatus.getLogfileName): helper code to give the
2072         OfflineLogFile a filename to work with
2074         * buildbot/test/test_status.py (Results.testAddResults): update
2075         tests to handle new asserts
2076         * buildbot/test/test_vc.py (Patch.doPatch): same
2077         * buildbot/test/test_steps.py (BuildStep.setUp): same
2079 2005-05-05  Brian Warner  <warner@lothar.com>
2081         * buildbot/scripts/runner.py (start): if there is no Makefile,
2082         launch the app by importing twistd's internals and calling run(),
2083         rather than spawning a new twistd process. This stands a much
2084         better chance of working under windows.
2085         (stop): kill the process with os.kill instead of spawning
2086         /bin/kill, again to reduce the number of external programs which
2087         windows might not have in the PATH. Also wait up to 5 seconds for
2088         the process to go away, allowing things like 'buildbot stop;
2089         buildbot start' to be reliable in the face of slow shutdowns.
2091         * buildbot/master.py (Dispatcher.__getstate__): remove old
2092         .tap-related methods
2093         (BuildMaster.__getstate__): same
2094         (makeService): same
2095         * buildbot/slave/bot.py (makeService): same
2096         (Options.longdesc): same
2097         * buildbot/scripts/runner.py: copy over some old mktap option text
2099         * buildbot/scripts/runner.py (masterTAC): stop using mktap.
2100         'buildbot master' now creates a buildbot.tac file, so there is no
2101         longer a create-instance/save/reload sequence. mktap is dead, long
2102         live twistd -y.
2103         * buildbot/scripts/sample.mk: use twistd -y, not -f
2104         * buildbot/test/test_config.py: remove mktap-based test
2105         * buildbot/bb_tap.py, buildbot/plugins.tml: delete old files
2106         * README: don't reference mktap
2108         * docs/source.xhtml: document some of the attributes that Changes
2109         might have
2111         * docs/steps.xhtml (Bazaar): document the Bazaar checkout step
2113         * general: merge in Change(tag=) patch from Thomas Vander Stichele.
2114         [org.apestaart@thomas--buildbot/buildbot--cvstag--0-dev--patch-2]
2115         * buildbot/changes/changes.py (Change)
2116         * buildbot/changes/mail.py (parseSyncmail)
2117         * buildbot/test/test_mailparse.py (Test3.getNoPrefix)
2118         (Test3.testMsgS5)
2119         * buildbot/process/base.py (Build.isTagImportant)
2120         (Build.addChange)
2123 2005-05-04  Brian Warner  <warner@lothar.com>
2125         * buildbot/clients/sendchange.py (Sender.send): tear down the PB
2126         connection after sending the change, so that unit tests don't
2127         complain about sockets being left around
2129         * buildbot/status/html.py (WaterfallStatusResource.body): fix
2130         exception in phase=0 rendering
2131         * buildbot/test/test_web.py (WebTest.test_waterfall): test it
2133         * buildbot/changes/dnotify.py (DNotify.__init__): remove debug msg
2135         * buildbot/master.py (BuildMaster.loadConfig): finally remove
2136         deprecated config keys: webPortnum, webPathname, irc, manholePort,
2137         and configuring builders with tuples.
2138         * buildbot/test/test_config.py: stop testing compatibility with
2139         deprecated config keys
2140         * buildbot/test/test_run.py: same
2142 2005-05-03  Brian Warner  <warner@lothar.com>
2144         * contrib/arch_buildbot.py: survive if there are no logfiles
2145         (username): just use a string, os.getlogin isn't reliable
2147         * buildbot/scripts/runner.py (sendchange): oops, fix the command
2148         so 'buildbot sendchange' actually works. The earlier test only
2149         covered the internal (non-reactor-running) form.
2151         * contrib/arch_buildbot.py: utility that can run as an Arch hook
2152         script to notify the buildmaster about changes
2154         * buildbot/scripts/runner.py (sendchange): new command to send a
2155         change to a buildbot.changes.pb.PBChangeSource receiver.
2156         * buildbot/test/test_changes.py (Sender): test it
2158         * buildbot/master.py (BuildMaster.startService): mark .readConfig
2159         after any reading of the config file, not just when we do it in
2160         startService. This makes some tests a bit cleaner.
2162         * buildbot/changes/pb.py: add some log messages
2164         * buildbot/process/base.py (Build.startBuild): fix a bug that
2165         caused an exception when the build terminated in the very first
2166         step.
2167         (Build.stepDone): let steps return a status of EXCEPTION. This
2168         terminates the build right away, and sets the build's overall
2169         status to EXCEPTION too.
2170         * buildbot/process/step.py (BuildStep.failed): return a status of
2171         EXCEPTION when that is what has happened.
2173         * buildbot/process/step.py (Arch.computeSourceRevision): finally
2174         implement this, allowing Arch-based projects to get precise
2175         checkouts instead of always using the latest code
2176         (Bazaar): create variant of Arch to let folks use baz instead of
2177         tla. Requires a new buildslave too.
2178         * buildbot/slave/commands.py (Arch): add 'revision' argument
2179         (Bazaar): create variant of Arch that uses baz instead of tla.
2180         Remove the code that extracts the archive name from the
2181         register-archive output, since baz doesn't provide it, and require
2182         the user provide both the archive name and its location.
2183         * buildbot/test/test_vc.py (VC.testBazaar): added tests
2185 2005-05-02  Brian Warner  <warner@lothar.com>
2187         * buildbot/scripts/sample.cfg: improve docs for c['buildbotURL'],
2188         thanks to Nick Trout.
2190         * buildbot/scripts/runner.py (Maker.makefile): chmod before edit,
2191         deals better with source Makefile coming from a read-only CVS
2192         checkout. Thanks to Nick Trout for the catch.
2194         * buildbot/__init__.py (version): bump to 0.6.4+ while between
2195         releases
2197 2005-04-28  Brian Warner  <warner@lothar.com>
2199         * buildbot/__init__.py (version): Releasing buildbot-0.6.4
2201         * debian/changelog: update for 0.6.4
2203 2005-04-28  Brian Warner  <warner@lothar.com>
2205         * README.w32: add a checklist of steps for getting buildbot
2206         running on windows.
2207         * MANIFEST.in: include it in the tarball
2209         * NEWS: update
2211         * buildbot/master.py (BuildMaster.upgradeToVersion3): deal with
2212         broken .tap files from 0.6.3 by getting rid of .services,
2213         .namedServices, and .change_svc at load time.
2215 2005-04-27  Brian Warner  <warner@lothar.com>
2217         * NEWS: update in preparation for new release
2219         * buildbot/test/test_config.py (Save.testSave): don't pull in
2220         twisted.scripts.twistd, we don't need it and it isn't for windows
2221         anyway.
2223         * buildbot/changes/changes.py (ChangeMaster.saveYourself):
2224         accomodate win32 which can't do atomic-rename
2226 2005-04-27  Brian Warner  <warner@lothar.com>
2228         * buildbot/test/test_run.py (Disconnect.testBuild2): crank up some
2229         timeouts to help the slow metabuildbot not flunk them so much
2230         (Disconnect.testBuild3): same
2231         (Disconnect.testBuild4): same
2232         (Disconnect.testInterrupt): same
2234         * buildbot/master.py (BuildMaster.loadChanges): fix change_svc
2235         setup, it was completely broken for new buildmasters (those which
2236         did not have a 'change.pck' already saved. Thanks to Paul Warren
2237         for catching this (embarrassing!) bug.
2238         (Dispatcher.__getstate__): don't save our registered avatar
2239         factories, since they'll be re-populated when the config file is
2240         re-read.
2241         (BuildMaster.__init__): add a dummy ChangeMaster, used only by
2242         tests (since the real mktap-generated BuildMaster doesn't save
2243         this attribute).
2244         (BuildMaster.__getstate__): don't save any service children,
2245         they'll all be re-populated when the config file is re-read.
2246         * buildbot/test/test_config.py (Save.testSave): test for this
2248 2005-04-26  Brian Warner  <warner@lothar.com>
2250         * buildbot/buildbot.png: use a new, smaller (16x16) icon image,
2251         rendered with Blender.. looks a bit nicer.
2252         * buildbot/docs/images/icon.blend: add the Blender file for it
2254         * buildbot/slave/commands.py (ShellCommand._startCommand): prepend
2255         'cmd.exe' (or rather os.environ['COMSPEC']) to the argv list when
2256         running under windows. This appears to be the best way to allow
2257         BuildSteps to do something normal like 'trial -v buildbot.test' or
2258         'make foo' and still expect it to work. The idea is to make the
2259         BuildSteps look as much like what a developer would type when
2260         compiling or testing the tree by hand. This approach probably has
2261         problems when there are spaces in the arguments, so if you've got
2262         windows buildslaves, you'll need to pay close attention to your
2263         commands.
2265         * buildbot/status/html.py (WaterfallStatusResource.body): add the
2266         timezone to the timestamp column.
2267         * buildbot/test/test_web.py (WebTest.test_waterfall): test it
2269         * buildbot/scripts/runner.py (loadOptions): do something sane for
2270         windows, I think. We use %APPDATA%/buildbot instead of
2271         ~/.buildbot, but we still search everywhere from the current
2272         directory up to the root for a .buildbot/ subdir. The "is it under
2273         $HOME" security test was replaced with "is it owned by the current
2274         user", which is only performed under posix.
2275         * buildbot/test/test_runner.py (Options.testFindOptions): update
2276         tests to match. The "is it owned by the current user" check is
2277         untested. The test has been re-enabled for windows.
2279         * buildbot/test/test_slavecommand.py (Shell.checkOutput): replace
2280         any "\n" in the expected output with the platform-specific line
2281         separator. Make this separator "\r\n" on PTYs under unix, they
2282         seem to do that and I don't know why
2284         * buildbot/test/test_runner.py (Options.optionsFile): disable on
2285         windows for now, I don't know what ~/.buildbot/ should mean there.
2287         * buildbot/test/test_run.py (BuilderNames.testGetBuilderNames):
2288         win32 compatibility, don't use "/tmp"
2289         (Basedir.testChangeBuilddir): remove more unixisms
2291 2005-04-26  Brian Warner  <warner@lothar.com>
2293         * buildbot/test/test_control.py (Force.rmtree): python2.2
2294         compatibility, apparently its shutil.rmtree ignore_errors=
2295         argument is ignored.
2296         * buildbot/test/test_run.py (Run.rmtree): same
2297         (RunMixin.setUp): same
2299         * buildbot/test/test_runner.py (make): python2.2 has os.sep but
2300         not os.path.sep
2302         * buildbot/test/test_twisted.py (Parse.failUnlessIn): 2.2 has no
2303         'substring in string' operator, must use string.find(substr)!=-1
2304         * buildbot/test/test_vc.py (Patch.failUnlessIn): same
2305         * buildbot/test/test_web.py (WebTest.failUnlessIn): same
2307         * buildbot/scripts/runner.py (loadOptions): add code to search for
2308         ~/.buildbot/, a directory with things like 'options', containing
2309         defaults for various 'buildbot' subcommands. .buildbot/ can be in
2310         the current directory, your $HOME directory, or anywhere
2311         inbetween, as long as you're somewhere inside your home directory.
2312         (debugclient): look in ~/.buildbot/options for master and passwd
2313         (statuslog): look in ~/.buildbot/options for 'masterstatus'
2314         * buildbot/test/test_runner.py (Options.testFindOptions): test it
2316         * buildbot/status/client.py (makeRemote): new approach to making
2317         IRemote(None) be None, which works under Twisted-2.0
2318         * buildbot/test/test_status.py (Client.testAdaptation): test it
2320         * buildbot/status/builder.py (Status.builderAdded): when loading a
2321         pickled BuilderStatus in from disk, set its name after loading.
2322         The config file might have changed its name (but not its
2323         directory) while it wasn't looking.
2324         
2325         * buildbot/process/builder.py (Builder.attached): always return a
2326         Deferred, even if the builder was already attached
2327         * buildbot/test/test_run.py (Basedir.testChangeBuilddir): test it
2329 2005-04-25  Brian Warner  <warner@lothar.com>
2331         * buildbot/status/words.py (IrcStatusBot.buildFinished): fix a
2332         category-related exception when announcing a build has finished
2334         * buildbot/status/html.py (StatusResourceChanges.body): oops, don't
2335         reference no-longer-existent changemaster.sources
2336         * buildbot/test/test_web.py (WebTest.test_waterfall): test for it
2338         * buildbot/__init__.py (version): bump to 0.6.3+ while between
2339         releases
2341 2005-04-25  Brian Warner  <warner@lothar.com>
2343         * buildbot/__init__.py (version): Releasing buildbot-0.6.3
2345         * debian/changelog: update for 0.6.3
2347 2005-04-25  Brian Warner  <warner@lothar.com>
2349         * MANIFEST.in: make sure debug.glade is in the tarball
2351         * README (REQUIREMENTS): list necessary Twisted-2.0 packages
2353         * NEWS: update for the imminent 0.6.3 release
2355         * buildbot/status/html.py (HtmlResource.content): make the
2356         stylesheet <link> always point at "buildbot.css".
2357         (StatusResource.getChild): map "buildbot.css" to a static.File
2358         containing whatever css= argument was provided to Waterfall()
2359         (Waterfall): provide the "classic" css as the default.
2360         * docs/waterfall.classic.css: move default CSS from here ..
2361         * buildbot/status/classic.css: .. to here
2363         * MANIFEST.in: make sure classic.css is included in the tarball
2364         * setup.py: and that it is installed too, under buildbot/status/
2366         * buildbot/master.py (BuildMaster): oops, set .change_svc=None at
2367         the module level, because buildbot.tap files from 0.6.2 don't have
2368         it in their attribute dictionary.
2370         * buildbot/slave/bot.py (Bot.startService): make sure the basedir
2371         really exists at startup, might save some confusion somewhere.
2373 2005-04-24  Thomas Vander Stichele  <thomas at apestaart dot org>
2375         * docs/waterfall.classic.css:
2376           add a stylesheet that's almost the same as the "classic"
2377           buildbot style
2379         * buildbot/status/builder.py:
2380           add EXCEPTION as a result - this is a problem for the bot
2381           maintainer, not a build problem for the changers
2382         * buildbot/process/step.py:
2383           use EXCEPTION instead of FAILURE for exceptions
2384         * buildbot/status/html.py:
2385           add build_get_class to get a class out of a build/buildstep
2386           finish naming the classes
2387           split out sourceNames to changeNames and builderNames so we
2388           can style them separately
2389         * docs/config.xhtml:
2390           finish documenting classes as they are right now
2392         * buildbot/status/html.py:
2393           name the classes as we agreed on IRC
2394         * docs/config.xhtml:
2395           and document them
2397         * buildbot/status/html.py:
2398           same for cssclass->class_
2400         * buildbot/status/html.py:
2401           as decided on IRC, use class_ for the "class" attribute to not
2402           conflict with the class keyword, and clean up the messy **{} stuff.
2404         * buildbot/status/mail.py:
2405           put back "builders" argument, and fix docstring, because the
2406           code *ignores* builders listed in this argument
2408         * buildbot/process/builder.py:
2409           remove FIXME notes - category is now indeed a cvar of BuilderStatus
2411         * docs/config.xhtml:
2412           describe the category argument for builders
2414         * buildbot/status/builder.py:
2415           Fix a silly bug due to merging
2417         * buildbot/process/builder.py:
2418           remove category from the process Builder ...
2419         * buildbot/status/builder.py:
2420           ... and add it to BuilderStatus instead.
2421           Set category on unpickled builder statuses, they might not have it.
2422         * buildbot/master.py:
2423           include category when doing builderAdded
2424         * buildbot/status/mail.py:
2425           return None instead of self for builders we are not interested in.
2426         * buildbot/test/test_run.py:
2427           fix a bug due to only doing deferredResult on "dummy" waiting
2428         * buildbot/test/test_status.py:
2429           add checks for the Mail IStatusReceiver returning None or self
2431         * buildbot/status/html.py:
2432           fix testsuite by prefixing page title with BuildBot
2434         * buildbot/status/builder.py:
2435           have .category in builder status ...
2436         * buildbot/process/builder.py:
2437           ... and set it from Builder
2438         * buildbot/status/html.py:
2439           make .css a class variable 
2440         * buildbot/test/test_status.py:
2441           write more tests to cover our categories stuff ...
2442         * buildbot/status/mail.py:
2443           ... and fix the bug that this uncovered
2445         * buildbot/changes/mail.py:
2446         * buildbot/changes/pb.py:
2447         * buildbot/master.py:
2448         * buildbot/process/base.py:
2449         * buildbot/process/factory.py:
2450         * buildbot/process/interlock.py:
2451         * buildbot/process/step.py:
2452         * buildbot/process/step_twisted.py:
2453         * buildbot/slave/commands.py:
2454         * buildbot/status/builder.py:
2455         * buildbot/status/client.py:
2456         * buildbot/status/html.py:
2457         * buildbot/status/mail.py:
2458         * buildbot/status/progress.py:
2459         * buildbot/test/test_changes.py:
2460         * buildbot/test/test_config.py:
2461         * buildbot/test/test_control.py:
2462         * buildbot/test/test_interlock.py:
2463         * buildbot/test/test_maildir.py:
2464         * buildbot/test/test_mailparse.py:
2465         * buildbot/test/test_run.py:
2466         * buildbot/test/test_slavecommand.py:
2467         * buildbot/test/test_status.py:
2468         * buildbot/test/test_steps.py:
2469         * buildbot/test/test_twisted.py:
2470         * buildbot/test/test_util.py:
2471         * buildbot/test/test_vc.py:
2472         * buildbot/test/test_web.py:
2473         * buildbot/util.py:
2474           add test-case-name at the top of a whole set of files
2476         * buildbot/status/builder.py:
2477           keep order of addition when getting builder names
2478         * buildbot/status/words.py:
2479         * buildbot/test/test_run.py:
2480           add test for getBuilderNames
2482         * buildbot/process/base.py:
2483         * buildbot/process/step.py:
2484         * buildbot/status/builder.py:
2485         * buildbot/status/html.py:
2486           make buildbot css-able
2487           replace the color code for purple with purple, don't understand
2488           why it wasn't purple to start with
2490         * buildbot/status/words.py:
2491           ok, so it doesn't look like BuilderStatus.remote is still valid.
2492           Use what waterfall uses instead.
2494         * buildbot/interfaces.py:
2495         * buildbot/status/builder.py:
2496         * buildbot/status/html.py:
2497         * buildbot/status/mail.py:
2498         * buildbot/status/words.py:
2499         * buildbot/test/test_run.py:
2500           use categories everywhere and make it be a list.  More sensible
2501           for the future.  Also make words actually respect this in
2502           buildFinished.
2504         * buildbot/interfaces.py:
2505           add category argument to getBuilderNames
2506         * buildbot/process/builder.py:
2507         * buildbot/status/builder.py:
2508         * buildbot/status/html.py:
2509         * buildbot/status/mail.py:
2510         * buildbot/status/words.py:
2511         * buildbot/test/test_run.py:
2512           move from specifying builders by name to specifying the category
2514         * buildbot/status/html.py:
2515         * buildbot/status/words.py:
2516           add "builders=" to __init__ of status clients so they can
2517           limit themselves to the given list of builders to report on
2519         * buildbot/status/html.py: set the title to the product name
2521 2005-04-23  Thomas Vander Stichele  <thomas at apestaart dot org>
2523         * buildbot/interfaces.py:
2524         * buildbot/status/builder.py:
2525           more documentation.  Hm, not sure if ChangeLog entries make sense
2526           here...
2528 2005-04-23  Brian Warner  <warner@lothar.com>
2530         * buildbot/test/test_vc.py (SetupMixin.do_vc): increase timeouts
2532         * buildbot/test/test_slavecommand.py (Shell): increase timeouts
2534         * buildbot/scripts/runner.py: make 'statuslog' and 'statusgui' be
2535         the sub-commands that log buildmaster status to stdout and to a
2536         GUI window, respectively.
2538         * buildbot/clients/gtkPanes.py: overhaul. basic two-row
2539         functionality is working again, but all the step-status and ETA
2540         stuff is missing. Commented out a lot of code pending more
2541         overhaul work.
2543         * buildbot/status/client.py: make sure that IRemote(None) is None
2545         * buildbot/changes/changes.py: import defer, oops
2546         (ChangeMaster): remove the .sources list, rely upon the fact that
2547         MultiServices can be treated as sequences of their children. This
2548         cleans up the add/remove ChangeSource routines a lot, as we keep
2549         exactly one list of the current sources instead of three.
2551         * buildbot/master.py (BuildMaster.__init__): remove .sources, set
2552         up an empty ChangeMaster at init time.
2553         (BuildMaster.loadChanges): if there are changes to be had from
2554         disk, replace self.change_svc with the new ones. If not, keep
2555         using the empty ChangeMaster set up in __init__.
2556         (BuildMaster.loadConfig_Sources): use list(self.change_svc)
2557         instead of a separate list, makes the code a bit cleaner.
2558         * buildbot/test/test_config.py (ConfigTest.testSimple): match it
2559         (ConfigTest.testSources): same, also wait for loadConfig to finish.
2560         Extend the test to make sure we can get rid of the sources when
2561         we're done.
2563 2005-04-22  Brian Warner  <warner@lothar.com>
2565         * buildbot/scripts/runner.py (Maker.mkinfo): create the info/admin
2566         and info/host files when making the slave directory
2568         * buildbot/test/test_run.py (RunMixin.shutdownSlave): remove the
2569         whendone= argument, just return the Deferred and let the caller do
2570         what they want with it.
2571         (Disconnect.testBuild1): wait for shutdownSlave
2572         (Basedir.testChangeBuilddir): new test to make sure changes to the
2573         builddir actually get propagated to the slave
2575         * buildbot/slave/bot.py (SlaveBuilder.setBuilddir): use an
2576         explicit method, rather than passing the builddir in __init__ .
2577         Make sure to update self.basedir too, this was broken before.
2578         (Bot.remote_setBuilderList): use b.setBuilddir for both new
2579         builders and for ones that have just had their builddir changed.
2580         (BotFactory): add a class-level .perspective attribute, so
2581         BuildSlave.waitUntilDisconnected won't get upset when the
2582         connection hasn't yet been established
2583         (BuildSlave.__init__): keep track of the bot.Bot instance, so
2584         tests can reach through it to inspect the SlaveBuilders
2586         * buildbot/process/base.py (Build.buildException): explain the
2587         log.err with a log.msg
2588         * buildbot/process/builder.py (Builder.startBuild): same
2589         (Builder._startBuildFailed): improve error message
2591         * buildbot/pbutil.py (RBCP.failedToGetPerspective): if the failure
2592         occurred because we lost the brand-new connection, retry instead
2593         of giving up. If not, it's probably an authorization failure, and
2594         it makes sense to stop trying. Make sure we log.msg the reason
2595         that we're log.err'ing the failure, otherwise test failures are
2596         really hard to figure out.
2598         * buildbot/master.py: change loadConfig() to return a Deferred
2599         that doesn't fire until the change has been fully implemented.
2600         This means any connected slaves have been updated with the new
2601         builddir. This change makes it easier to test the code which
2602         actually implements this builddir-updating.
2603         (BotPerspective.addBuilder): return Deferred
2604         (BotPerspective.removeBuilder): same
2605         (BotPerspective.attached): same
2606         (BotPerspective._attached): same. finish with remote_print before
2607         starting the getSlaveInfo, instead of doing them in parallel
2608         (BotPerspective.list_done): same
2609         (BotMaster.removeSlave): same. Fix the typo that meant we weren't
2610         actually calling slave.disconnect()
2611         (BotMaster.addBuilder): same
2612         (BotMaster.removeBuilder): same
2613         (BuildMaster.loadConfig): same
2614         (BuildMaster.loadConfig_Slaves): same
2615         (BuildMaster.loadConfig_Sources): same
2616         (BuildMaster.loadConfig_Builders): same
2617         (BuildMaster.loadConfig_status): same
2619         * buildbot/changes/changes.py (ChangeMaster.removeSource): return
2620         a Deferred that fires when the source is finally removed
2622         * buildbot/slave/commands.py (SourceBase.doClobber): when removing
2623         the previous tree on win32, where we have to do it synchronously,
2624         make sure we return a Deferred anyway.
2625         (SourceBase.doCopy): same
2627         * buildbot/scripts/runner.py (statusgui): use the text client for
2628         now, while I rewrite the Gtk one
2629         * buildbot/clients/base.py: strip out old code, leaving just the
2630         basic print-message-on-event functionality. I also remove the
2631         ReconnectingPBClientFactory, but it does at least quit when it
2632         loses the connection instead of going silent
2634 2005-04-21  Brian Warner  <warner@lothar.com>
2636         * Makefile: minor tweaks
2638         * NEWS: point out deprecation warnings, new features for
2639         /usr/bin/buildbot
2641         * buildbot/master.py (BuildMaster.loadConfig): emit
2642         DeprecationWarnings for Builders defined with tuples. Rearrange
2643         code to facility removal of deprecated configuration keys in the
2644         next release.
2646         * buildbot/scripts/runner.py (createMaster,createSlave): rewrite
2647         'buildbot' command to put a little Makefile in the target that
2648         helps you re-create the buildbot.tap file, start or stop the
2649         master/slave, and reconfigure (i.e. SIGHUP) the master. Also chmod
2650         all the files 0600, since they contain passwords.
2651         (start): if there is a Makefile, and /usr/bin/make exists, use
2652         'make start' in preference to a raw twistd command. This lets
2653         slave admins put things like PYTHONPATH variables in their
2654         Makefiles and have them still work when the slave is started with
2655         'buildbot start ~/slave/foo'. The test is a bit clunky, it would
2656         be nice to first try the 'make' command and only fall back to
2657         twistd if it fails. TODO: the Makefile's "start" command does not
2658         add the --reactor=win32 argument when running under windows.
2659         (Options.debugclient, Options.statusgui): add sub-commands to launch
2660         the debug client (formerly in contrib/debugclient.py) and the
2661         Gtk status application (currently broken)
2662         * buildbot/clients/debug.py: move from contrib/debugclient.py
2663         * buildbot/clients/debug.glade: same
2665         * buildbot/test/test_trial.py: remove it. This requires some
2666         functionality out of Twisted that isn't there yet, and until then
2667         having it around just confuses things.
2669         * buildbot/test/test_slavecommand.py (Shell): test both with and
2670         without PTYs, and make sure that command output is properly
2671         interleaved in the with-PTY case. I think the without-PTY test
2672         should pass on windows, where we never use PTYs anyway.
2674 2005-04-20  Brian Warner  <warner@lothar.com>
2676         * README (REQUIREMENTS): mention Twisted-2.0.0 compatibility
2678         * MANIFEST.in: add epyrun, gen-reference, buildbot.png
2680         * NEWS: start creating entries for the next release
2682         * buildbot/slave/commands.py (ShellCommand.__init__): use os.pathsep
2684         * buildbot/test/test_web.py (WebTest.test_webPortnum): add timeout
2685         (WebTest.test_webPathname): same
2686         (WebTest.test_webPathname_port): same
2687         (WebTest.test_waterfall): use the default favicon rather than
2688         rooting around the filesystem for it. Open the expected-icon file
2689         in binary mode, to make win32 tests happier (thanks to Nick Trout
2690         for the catch)
2691         * buildbot/status/html.py (buildbot_icon): win32 portability
2693         * buildbot/test/test_slavecommand.py (SlaveCommandTestCase.testShellZ):
2694         win32-compatibility fixes from Nick Trout, the "file not found" message
2695         is different under windows
2696         (FakeSlaveBuilder.__init__): clean up setup a bit
2697         * buildbot/test/test_vc.py (VCSupport.__init__): win32: use os.pathsep
2699 2005-04-19  Brian Warner  <warner@lothar.com>
2701         * buildbot/test/test_vc.py (SetupMixin.setUpClass): fix the
2702         skip-if-repositories-are-unavailable test to not kill the trial
2703         that comes with Twisted-1.3.0
2705         * setup.py: install buildbot.png icon file when installing code
2707         * buildbot/slave/commands.py (ShellCommand._startCommand): log the
2708         environment used by the command, at least on the child side.
2710         * buildbot/status/html.py (TextLog.pauseProducing): add a note,
2711         this method needs to be added and implemented because it gets
2712         called under heavy load. I don't quite understand the
2713         producer/consumer API enough to write it.
2714         (StatusResource.getChild): add a resource for /favicon.ico
2715         (Waterfall.__init__): add favicon= argument
2716         * buildbot/test/test_web.py (WebTest.test_waterfall): test it
2717         (WebTest.test_webPortnum): stop using deprecated 'webPortnum'
2718         (WebTest.test_webPathname): same
2719         (WebTest.test_webPathname_port): same
2720         * docs/config.xhtml: mention favicon=
2721         * buildbot/buildbot.png: add a default icon, dorky as it is
2723 2005-04-18  Thomas Vander Stichele  <thomas at apestaart dot org>
2725         * buildbot/master.py:
2726         * buildbot/process/base.py:
2727         * buildbot/process/builder.py:
2728         * buildbot/process/interlock.py:
2729         * buildbot/status/builder.py:
2730         * buildbot/status/html.py:
2731         * buildbot/status/mail.py:
2732         * buildbot/status/words.py:
2733           new documentation while digging through the code
2735 2005-04-17  Brian Warner  <warner@lothar.com>
2737         * general: try to fix file modes on all .py files: a+r, a-x,
2738         but let buildbot/clients/*.py be +x since they're tools
2740         * docs/epyrun (addMod): when an import fails, say why
2742         * Makefile: Add a 'docs' target, hack on the PYTHONPATH stuff
2744 2005-04-17  Thomas Vander Stichele  <thomas at apestaart dot org>
2746         * buildbot/process/base.py:
2747         * buildbot/process/builder.py:
2748         * buildbot/status/builder.py:
2749           new documentation while digging through the code
2751 2005-04-17  Thomas Vander Stichele  <thomas at apestaart dot org>
2753         * buildbot/changes/changes.py:
2754         * buildbot/changes/p4poller.py:
2755         * buildbot/interfaces.py:
2756         * buildbot/process/base.py:
2757         * buildbot/process/builder.py:
2758         * buildbot/process/step.py:
2759         * buildbot/process/step_twisted.py:
2760         * buildbot/slave/bot.py:
2761         * buildbot/slave/commands.py:
2762         * buildbot/status/builder.py:
2763           fix all docstrings to make epydoc happy.  In the process of fixing
2764           some, I also moved pieces of docs, and removed some deprecated
2765           documentation
2767 2005-04-17  Thomas Vander Stichele  <thomas at apestaart dot org>
2769         * buildbot/process/builder.py:
2770         * buildbot/process/interlock.py:
2771         * buildbot/process/process_twisted.py:
2772         * buildbot/process/step.py:
2773           BuildProcess -> Build, as it looks like that's what happened
2774         * buildbot/process/base.py:
2775         * buildbot/process/factory.py:
2776           update epydoc stuff
2778 2005-04-17  Brian Warner  <warner@lothar.com>
2780         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
2781         update compile command to accomodate the Twisted split.. now
2782         instead of './setup.py build_ext -i', you do './setup.py all
2783         build_ext -i', to run build_ext over all sub-projects.
2784         (FullTwistedBuildFactory): same
2785         (TwistedReactorsBuildFactory): same
2787         * buildbot/status/html.py (TextLog.finished): null out self.req
2788         when we're done, otherwise the reference cycle of TextLog to .req
2789         to .notifications to a Deferred to TextLog.stop keeps them from
2790         being collected, and consumes a huge (610MB on pyramid at last
2791         check) amount of memory.
2793 2005-04-11  Brian Warner  <warner@lothar.com>
2795         * buildbot/test/test_vc.py (VCSupport.__init__): use abspath() to
2796         normalize the VC-repository location.. makes SVN happier with
2797         certain test environments.
2799         * buildbot/process/step.py (RemoteShellCommand.__init__): let each
2800         RemoteShellCommand gets its own .env dictionary, so that code in
2801         start() doesn't mutate the original. I think this should fix the
2802         step_twisted.Trial problem where multiple identical components
2803         kept getting added to PYTHONPATH= over and over again.
2805         * general: merge org.apestaart@thomas/buildbot--doc--0--patch-3,
2806         adding epydoc-format docstrings to many classes. Thanks to Thomas
2807         Vander Stichele for the patches.
2808         * docs/epyrun, docs/gen-reference: add epydoc-generating tools
2809         * buildbot/status/mail.py, buildbot/process/step_twisted.py: same
2810         * buildbot/slave/bot.py, commands.py, registry.py: same
2812 2005-04-05  Brian Warner  <warner@lothar.com>
2814         * buildbot/slave/commands.py (SourceBase.doCopy): use cp -p to
2815         preserve timestamps, helps incremental builds of large trees.
2816         Patch from Rene Rivera.
2818         * buildbot/slave/bot.py (SlaveBuilder.commandComplete): oops, log
2819         'failure' and not the non-existent 'why'. Thanks to Rene Rivera
2820         for the catch.
2822 2005-04-03  Brian Warner  <warner@lothar.com>
2824         * buildbot/master.py (BuildMaster.loadConfig): only call exec()
2825         with one dict, apparently exec has some scoping bugs when used
2826         with both global/local dicts. Thanks to Nathaniel Smith for the
2827         catch.
2829 2005-04-02  Brian Warner  <warner@lothar.com>
2831         * buildbot/process/step_twisted.py (countFailedTests): the new
2832         trial in Twisted-2.0 emits a slightly different status line than
2833         old trial ("PASSED.." instead of "OK.."). Handle it so we don't
2834         mistakenly think the test count is unparseable.
2835         (Trial.start): note that for some reason each build causes another
2836         copy of self.testpath to be prepended to PYTHONPATH. This needs to
2837         be fixed but I'm not sure quite where the problem is.
2839 2005-04-01  Brian Warner  <warner@lothar.com>
2841         * buildbot/test/test_run.py (Run.testMaster): change some uses of
2842         deferredResult to avoid hangs/warnings under twisted-2.0
2843         (RunMixin.tearDown): same
2844         (RunMixin.shutdownSlave): same
2845         (Disconnect.testIdle1): same
2846         (Disconnect.testBuild2): same: wait one second after the build
2847         finishes for test to really be done.. this should be cleaned up to
2848         avoid wasting that second. Builder.detach uses a callLater(0),
2849         either that should be done in-line (something else needed that
2850         behavior), or it should return a Deferred that fires when the
2851         builder is really offline.
2852         (Disconnect.testBuild3): same
2853         (Disconnect.testDisappear): same
2855         * buildbot/test/test_web.py: rearrange server-setup and teardown
2856         code to remove unclean-reactor warnings from twisted-2.0
2858         * buildbot/test/test_vc.py: rearrange probe-for-VC-program routine
2859         so the tests don't hang under twisted-2.0
2861 2005-03-31  Brian Warner  <warner@lothar.com>
2863         * buildbot/slave/bot.py (Bot.remote_setBuilderList): fix typo that
2864         caused a warning each time the master changed our set of builders
2866         * buildbot/status/builder.py (BuildStatus.saveYourself): under
2867         w32, don't unlink the file unless it already exists. Thanks to
2868         Baptiste Lepilleur for the catch.
2869         (BuilderStatus.saveYourself): same
2871 2005-02-01  Brian Warner  <warner@lothar.com>
2873         * buildbot/status/html.py (TextLog.getChild): use a /text child
2874         URL, such as http://foo.com/svn-hello/builds/1/test/0/text instead
2875         of http://foo.com/svn-hello/builds/1/test/0 , to retrieve the
2876         logfile as text/plain (no markup, no headers). This replaces the
2877         previous scheme (which used an ?text=1 argument), and gets us back
2878         to a relative link (which works better when the buildbot lives
2879         behind another web server, such as Apache configured as a reverse
2880         proxy). Thanks to Gerald Combs for spotting the problem.
2882         * buildbot/__init__.py (version): bump to 0.6.2+ while between
2883         releases
2885 2004-12-13  Brian Warner  <warner@lothar.com>
2887         * buildbot/__init__.py (version): Releasing buildbot-0.6.2
2889         * debian/changelog: update for 0.6.2
2890         * NEWS: finalize for 0.6.2
2892 2004-12-11  Brian Warner  <warner@lothar.com>
2894         * NEWS: bring it up to date
2896         * buildbot/slave/bot.py (BotFactory): revamp keepalive/lost-master
2897         detection code. Require some sign of life from the buildmaster
2898         every BotFactory.keepaliveInterval seconds. Provoke this
2899         indication at BotFactory.keepaliveTimeout seconds before the
2900         deadline by sending a keepalive request. We don't actually care if
2901         that request is answered in a timely fashion, what we care about
2902         is that .activity() is called before the deadline. .activity() is
2903         triggered by any PB message from the master (including an ack to
2904         one of the slave's status-update messages). With this new scheme,
2905         large status messages over slow pipes are OK, as long as any given
2906         message can be sent (and thus acked) within .keepaliveTimeout
2907         seconds (which defaults to 30).
2908         (SlaveBuilder.remote_startCommand): record activity
2909         (SlaveBuilder.ackUpdate): same
2910         (SlaveBuilder.ackComplete): same
2911         (BotFactory.gotPerspective): same
2912         * buildbot/test/test_run.py (Disconnect.testSlaveTimeout): test it
2914 2004-12-09  Brian Warner  <warner@lothar.com>
2916         * buildbot/status/html.py (StatusResourceBuilder.getChild): remove
2917         debug message
2919         * buildbot/process/step_twisted.py (Trial._commandComplete):
2920         update self.cmd when we start the 'cat test.log' transfer. Without
2921         this, we cannot interrupt the correct RemoteCommand when we lose
2922         the connection.
2924         * buildbot/process/step.py (RemoteCommand.interrupt): don't bother
2925         trying to tell the slave to stop the command if we're already
2926         inactive, or if we no longer have a .remote
2928         * buildbot/process/builder.py (Builder._detached): don't let an
2929         exception in currentBuild.stopBuild() prevent the builder from
2930         being marked offline
2932 2004-12-07  Brian Warner  <warner@lothar.com>
2934         * buildbot/status/words.py (IrcStatusBot.getBuilder): catch the
2935         KeyError that happens when you ask for a non-existent Builder, and
2936         translate it into a UsageError.
2938         * buildbot/test/test_run.py (Disconnect.testBuild4): validate that
2939         losing the slave in the middle of a remote step is handled too
2941         * buildbot/process/step.py (ShellCommand.interrupt): 'reason' can
2942         be a Failure, so be sure to stringify it before using it as the
2943         contents of the 'interrupt' logfile
2944         (RemoteCommand.interrupt): use stringified 'why' in
2945         remote_interruptCommand too, just in case
2947 2004-12-06  Brian Warner  <warner@lothar.com>
2949         * buildbot/slave/commands.py (Arch.doVCUpdate): use 'tla replay'
2950         instead of 'tla update', which is more efficient in case we've
2951         missed a couple of patches since the last update.
2953         * debian/changelog: update for previous (0.6.1) release. Obviously
2954         this needs to be handled better.
2956 2004-12-05  Brian Warner  <warner@lothar.com>
2958         * NEWS: update for stuff since last release
2960         * buildbot/master.py (DebugPerspective.attached): return 'self', to
2961         match the maybeDeferred change in Dispatcher.requestAvatar
2962         * buildbot/changes/pb.py (ChangePerspective.attached): same
2963         * buildbot/status/client.py (StatusClientPerspective.attached): same
2964         * buildbot/process/builder.py (Builder._attached3): same
2965         * buildbot/pbutil.py (NewCredPerspective.attached): same
2967         * buildbot/status/html.py (WaterfallStatusResource.phase2): Add
2968         the date to the top-most box, if it is not the same as today's
2969         date.
2971         * docs/slave.xhtml: provide a buildslave setup checklist
2973         * docs/source.xhtml (Arch): correct terminology
2975 2004-12-04  Brian Warner  <warner@lothar.com>
2977         * buildbot/test/test_slavecommand.py: use sys.executable instead
2978         of hard-coding 'python' for child commands, might help portability
2980         * docs/examples/twisted_master.cfg: update to current usage
2982         * buildbot/status/words.py (IrcStatusBot.command_STOP): add a
2983         'stop build' command to the IRC bot
2985         * buildbot/master.py (Dispatcher.requestAvatar): remove debug
2986         message that broke PBChangeSource
2988         * buildbot/slave/bot.py: clean up shutdown/lose-master code
2989         (SlaveBuilder): make some attributes class-level, remove the old
2990         "update queue" which existed to support resuming a build after the
2991         master connection was lost. Try to reimplement that feature later.
2992         (SlaveBuilder.stopCommand): clear self.command when the
2993         SlaveCommand finishes, so that we don't try to kill a leftover one
2994         at shutdown time.
2995         (SlaveBuilder.commandComplete): same, merge with commandFailed and
2996         .finishCommand
2998         * buildbot/slave/commands.py (SourceBase): set self.command for
2999         all VC commands, so they can be interrupted.
3001 2004-12-03  Brian Warner  <warner@lothar.com>
3003         * buildbot/master.py: clean up slave-handling code, to handle
3004         slave-disconnect and multiple-connect better
3005         (BotPerspective): make these long-lasting, exactly one per bot
3006         listed in the config file.
3007         (BotPerspective.attached): if a slave connects while an existing
3008         one appears to still be connected, disconnect the old one first.
3009         (BotPerspective.disconnect): new method to forcibly disconnect a
3010         buildslave. Use some hacks to empty the transmit buffer quickly to
3011         avoid the long (20-min?) TCP timeout that could occur if the old
3012         slave has dropped off the net.
3013         (BotMaster): Keep persistent BotPerspectives in .slaves, let them
3014         own their own SlaveStatus objects. Remove .attached/.detached, add
3015         .addSlave/.removeSlave, treat slaves like Builders (config file
3016         parsing sends deltas to the BotMaster). Inform the slave
3017         instances, i.e. the BotPerspective, about addBuilder and
3018         removeBuilder.
3019         (BotMaster.getPerspective): turns into a single dict lookup
3020         (Dispatcher.requestAvatar): allow .attached to return a Deferred,
3021         which gives BotPerspective.attached a chance to disconnect the old
3022         slave first.
3023         (BuildMaster.loadConfig): add code (disabled) to validate that all
3024         builders use known slaves (listed in c['bots']). The check won't
3025         work with tuple-specified builders, which are deprecated but not
3026         yet invalid, so the check is disabled for now.
3027         (BuildMaster.loadConfig_Slaves): move slave-config into a separate
3028         routine, do the add/changed/removed dance with them like we do
3029         with builders.
3030         (BuildMaster.loadConfig_Sources): move source-config into a
3031         separate routine too
3033         * buildbot/status/builder.py (Status.getSlave): get the
3034         SlaveStatus object from the BotPerspective, not the BotMaster.
3036         * buildbot/test/test_run.py: bunch of new tests for losing the
3037         buildslave at various points in the build, handling a slave that
3038         connects multiple times, and making sure we can interrupt a
3039         running build
3041         * buildbot/slave/bot.py (BuildSlave): make it possible to use
3042         something other than 'Bot' for the Bot object, to make certain
3043         test cases easier to write.
3044         (BuildSlave.waitUntilDisconnected): utility method for testing
3046 2004-11-30  Brian Warner  <warner@lothar.com>
3048         * buildbot/test/test_run.py (RunMixin): refactor, remove debug msg
3050         * buildbot/interfaces.py (IBuilderControl.ping): add timeout=
3051         argument, return a Deferred that always fires with True or False.
3052         I don't use an errback to indicate 'ping failed' so that callers
3053         are free to ignore the deferred without causing spurious errors in
3054         the logs.
3055         * buildbot/process/builder.py (BuilderControl.ping): implement it
3057         * buildbot/test/test_run.py (Status.testDisappear): test ping
3058         (Status.disappearSlave): fix it
3060 2004-11-30  Brian Warner  <warner@lothar.com>
3062         * buildbot/interfaces.py (IBuildControl): add .stopBuild
3063         (IBuilderControl): add .getBuild(num), only works for the current
3064         build, of course, although it might be interesting to offer
3065         something for builds in the .waiting or .interlocked state.
3067         * buildbot/process/base.py (Build): have .stopBuild just do the
3068         interrupt, then let the build die by itself.
3069         (BuildControl): add .stopBuild, and add a point-event named
3070         'interrupt' just after the build so status viewers can tell that
3071         someone killed it.
3072         (BuilderControl): add .getBuild
3074         * buildbot/process/step.py (Dummy): use haltOnFailure so it really
3075         stops when you kill it, good for testing
3076         (ShellCommand.interrupt): add a logfile named 'interrupt' which
3077         contains the 'reason' text.
3079         * buildbot/status/html.py: Add Stop Build button, if the build can
3080         still be stopped. Send a Redirect (to the top page) one second
3081         later, hopefully long enough for the interrupt to have an effect.
3082         Move make_row() up to top-level to share it between Stop Build and
3083         Force Build.
3085         * buildbot/slave/commands.py: only kill the child process once
3087         * buildbot/test/test_run.py: add testInterrupt
3089 2004-11-29  Brian Warner  <warner@lothar.com>
3091         * buildbot/process/base.py: Refactor command interruption. The
3092         Build is now responsible for noticing that the slave has gone
3093         away: Build.lostRemote() interrupts the current step and makes
3094         sure that no further ones will be started.
3095         
3096         * buildbot/process/builder.py: When the initial remote_startBuild
3097         message fails, log it: this usually indicates that the slave has
3098         gone away, but we don't really start paying attention until they
3099         fail to respond to the first step's command.
3101         * buildbot/process/step.py (RemoteCommand): Does *not* watch for
3102         slave disconnect. Now sports a new interrupt() method. Error
3103         handling was simplified a lot by chaining deferreds, so
3104         remoteFailed/remoteComplete were merged into a single
3105         remoteComplete method (which can now get a Failure object).
3106         Likewise failed/finished were merged into just _finished.
3107         (BuildStep): Add interrupt(why) method, and if why is a
3108         ConnectionLost Failure then the step is failed with some useful
3109         error text.
3111         * buildbot/slave/bot.py: stop the current command when the remote
3112         Step reference is lost, and when the slave is shut down.
3113         (Bot): make it a MultiService, so it can have children. Use
3114         stopService to tell when the slave is shutting down.
3115         (SlaveBuilder): make it a Service, and a child of the Bot. Add
3116         remote_interruptCommand (which asks the current SlaveCommand to
3117         stop but allows it to keep emitting status messages), and
3118         stopCommand (which tells it to shut up and die).
3120         * buildbot/slave/commands.py: make commands interruptible
3121         (ShellCommand.kill): factor out os.kill logic
3122         (Command): factor out setup()
3123         (Command.sendStatus): don't send status if .running is false, this
3124         happens when the command has been halted.
3125         (Command.interrupt): new method, used to tell the command to die
3126         (SlaveShellCommand): implement .interrupt
3127         (DummyCommand): implement .interrupt
3128         (SourceBase, etc): factor out setup(), don't continue substeps if
3129         .interrupted is set
3131         * buildbot/status/builder.py: fix all waitUntilFinished() methods
3132         so they can be called after finishing
3134         * buildbot/test/test_run.py: new tests for disconnect behavior,
3135         refactor slave-shutdown routines, add different kinds of
3136         slave-shutdown
3138 2004-11-27  Brian Warner  <warner@lothar.com>
3140         * buildbot/status/words.py (IrcStatusBot.convertTime): utility
3141         method to express ETA time like "2m45s" instead of "165 seconds"
3143 2004-11-24  Brian Warner  <warner@lothar.com>
3145         * buildbot/test/test_vc.py (VC.testArch): unregister the test
3146         archive after the test completes, to avoid cluttering the user's
3147         'tla archives' listing with a bogus entry. Arch doesn't happen to
3148         provide any way to override the use of ~/.arch-params/, so there
3149         isn't a convenient way to avoid touching the setup of the user who
3150         runs the test.
3151         (VC_HTTP.testArchHTTP): same
3153 2004-11-23  Brian Warner  <warner@lothar.com>
3155         * buildbot/status/html.py (TextLog): split render() up into
3156         render_HEAD and render_GET. Use a Producer when sending log
3157         chunks, to reduce memory requirements and avoid sending huge
3158         non-Banana-able strings over web.distrib connections. Requires
3159         peeking under the covers of IStatusLog.
3160         (TextLog.resumeProducing): fix the "as text" link, handle client
3161         disconnects that occur while we're still sending old chunks.
3163         * buildbot/status/builder.py (HTMLLogFile.waitUntilFinished): oops,
3164         use defer.succeed, not the non-existent defer.success
3165         (LogFile.waitUntilFinished): same
3166         (LogFile.subscribe): don't add watchers to a finished logfile
3168         * buildbot/__init__.py (version): bump to 0.6.1+ while between
3169         releases
3171 2004-11-23  Brian Warner  <warner@lothar.com>
3173         * buildbot/__init__.py (version): Releasing buildbot-0.6.1
3175 2004-11-23  Brian Warner  <warner@lothar.com>
3177         * NEWS: update for the 0.6.1 release
3178         * MANIFEST.in: add new files
3180         * README (INSTALLATION): explain how to enable the extra VC tests
3182         * buildbot/status/builder.py (LogFile): add .runEntries at the class
3183         level to, so old pickled builds can be displayed ok
3185 2004-11-22  Brian Warner  <warner@lothar.com>
3187         * NEWS: summarize updates since last release
3189         * README (SLAVE): fix usage of 'buildbot slave' command. Thanks to
3190         Yoz Grahame. Closes SF#1050138.
3192         * docs/changes.xhtml (FreshCVSSourceNewcred): fix typo. Closes
3193         SF#1042563.
3195         * buildbot/process/step_twisted.py (Trial): update docs a bit
3197         * docs/factories.xhtml: fix Trial factory docs to match reality.
3198         Closes: SF#1049758.
3200         * buildbot/process/factory.py (Trial.__init__): add args for
3201         randomly= and recurse=, making them available to instantiators
3202         instead of only to subclassers. Closes: SF#1049759.
3204 2004-11-15  Brian Warner  <warner@lothar.com>
3206         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
3207         try to teach the Quick factory to use multiple versions of python
3209 2004-11-12  Brian Warner  <warner@lothar.com>
3211         * buildbot/status/builder.py (BuilderStatus.saveYourself): use a
3212         safer w32-compatible approach, and only use it on windows
3213         (BuildStatus.saveYourself): same
3215 2004-11-11  Brian Warner  <warner@lothar.com>
3217         * buildbot/status/builder.py (LogFile.addEntry): smarter way to do
3218         it: one string merge per chunk. There are now separate .entries
3219         and .runEntries lists: when enumerating over all chunks, make sure
3220         to look at both.
3221         * buildbot/test/test_status.py (Log): more tests
3223         * buildbot/status/builder.py (LogFile.addEntry): Merge string
3224         chunks together, up to 10kb per chunk. This ought to cut down on
3225         the CPU-burning overhead of large log files. Thanks to Alexander
3226         Staubo for spotting the problem.
3227         * buildbot/test/test_status.py (Log): tests for same
3229 2004-11-10  Brian Warner  <warner@lothar.com>
3231         * buildbot/status/mail.py (MailNotifier.buildMessage): add a Date
3232         header to outbound mail
3233         * buildbot/test/test_status.py (Mail.testBuild1): test for same
3235 2004-11-08  Brian Warner  <warner@lothar.com>
3237         * buildbot/status/builder.py (BuilderStatus.saveYourself): w32
3238         can't do os.rename() onto an existing file, so catch the exception
3239         and unlink the target file first. This introduces a slight window
3240         where the existing file could be lost, but the main failure case
3241         (disk full) should still be handled safely.
3242         (BuildStatus.saveYourself): same
3244         * buildbot/changes/pb.py (ChangePerspective): use a configurable
3245         separator character instead of os.sep, because the filenames being
3246         split here are coming from the VC system, which can have a
3247         different pathname convention than the local host. This should
3248         help a buildmaster running on windows that uses a CVS repository
3249         which runs under unix.
3250         * buildbot/changes/mail.py (MaildirSource): same, for all parsers
3252         * buildbot/process/step_twisted.py (Trial.createSummary): survive
3253         when there are no test failures to be parsed
3255         * buildbot/scripts/runner.py (createMaster): use shutil.copy()
3256         instead of the unix-specific os.system("cp"), thanks to Elliot
3257         Murphy for this and the other buildbot-vs-windows catches.
3258         * buildbot/test/test_maildir.py (MaildirTest.deliverMail): same
3260         * contrib/windows/buildbot.bat: prefix a '@', apparently to not
3261         echo the command as it is run
3263         * setup.py: install sample.mk too, not just sample.cfg
3264         (scripts): install contrib/windows/buildbot.bat on windows
3266 2004-11-07  Brian Warner  <warner@lothar.com>
3268         * buildbot/process/builder.py (Builder._detached): clear the
3269         self.currentBuild reference, otherwise the next build will be
3270         skipped because we think the Builder is already in use.
3272         * docs/examples/twisted_master.cfg: update to match current usage
3273         on the Twisted buildbot
3275 2004-10-29  Brian Warner  <warner@lothar.com>
3277         * buildbot/status/mail.py (MailNotifier): fix typo in docs
3279 2004-10-28  Brian Warner  <warner@lothar.com>
3281         * buildbot/slave/commands.py (SourceBase): refactor subclasses to
3282         have separate doVCUpdate/doVCFull methods. Catch an update failure
3283         and respond by clobbering the source directory and re-trying. This
3284         will handle local changes (like replacing a file with a directory)
3285         that will cause CVS and SVN updates to fail.
3286         * buildbot/test/test_vc.py (SetupMixin.do_vc): test the same
3288         * buildbot/process/step.py (LoggedRemoteCommand.__repr__): avoid a
3289         python-2.4 warning
3291 2004-10-19  Brian Warner  <warner@lothar.com>
3293         * buildbot/process/step_twisted.py (Trial.createSummary): bugfixes
3295         * buildbot/status/html.py (StatusResourceTestResults): display any
3296         TestResults that the Build might have
3297         (StatusResourceTestResult): and the logs for each TestResult
3298         (StatusResourceBuild): add link from the per-build page
3300 2004-10-15  Brian Warner  <warner@lothar.com>
3302         * buildbot/process/step_twisted.py (Trial.createSummary): parse
3303         the 'problems' portion of stdout, add TestResults to our build
3304         * buildbot/test/test_twisted.py (Parse.testParse): test it
3306         * buildbot/interfaces.py (IBuildStatus.getTestResults): new method
3307         to retrieve a dict of accumulated test results
3308         (ITestResult): define what a single test result can do
3309         * buildbot/status/builder.py (TestResult): implement ITestResult
3310         (BuildStatus.getTestResults): retrieve dict of TestResults
3311         (BuildStatus.addTestResult): add TestResults
3312         * buildbot/test/test_status.py (Results.testAddResults): test it
3314 2004-10-14  Brian Warner  <warner@lothar.com>
3316         * buildbot/test/test_maildir.py (MaildirTest): use shutil.rmtree
3317         instead of os.system("rm -rf") for win32 portability
3319         * buildbot/test/test_slavecommand.py (SlaveCommandTestCase): use
3320         SignalMixin instead of starting/stopping the reactor, which is
3321         likely to cause problems with other tests
3323         * buildbot/slave/commands.py (SourceBase.doCopy): remove leftover
3324         self.copyComplete() call. Yoz Grahame makes the catch.
3326         * contrib/windows/buildbot.bat: helper script to deal with path
3327         issues. Thanks to Yoz Grahame.
3329         * buildbot/master.py (BuildMaster.startService): don't register a
3330         SIGHUP handler if the signal module has no SIGHUP attribute.
3331         Apparently win32 does this.
3333         * buildbot/scripts/runner.py (start): add --reactor=win32 on win32
3335         * buildbot/test/test_web.py (WebTest.test_webPathname): skip the
3336         test if the reactor can't offer UNIX sockets
3338         * buildbot/status/html.py (StatusResourceBuild.body): fix syntax
3339         error introduced in the last commit. We really need that
3340         metabuildbot :).
3342 2004-10-12  Brian Warner  <warner@lothar.com>
3344         * buildbot/changes/mail.py (MaildirSource.describe): fix exception
3345         when describing a maildir source. Thanks to Stephen Davis.
3347         * buildbot/status/words.py (IrcStatusBot.command_WATCH): round off
3348         ETA seconds
3350         * buildbot/scripts/runner.py (createMaster): install Makefile too
3351         (start): add --no_save to 'start' command
3352         * buildbot/scripts/sample.mk: simple convenience Makefile with 
3353         start/stop/reload targets
3355         * buildbot/__init__.py (version): bump to 0.6.0+ while between
3356         releases
3358 2004-09-30  Brian Warner  <warner@lothar.com>
3360         * setup.py: Releasing buildbot-0.6.0
3362 2004-09-30  Brian Warner  <warner@lothar.com>
3364         * MANIFEST.in: add debian/*, sample.cfg, more docs files. Remove
3365         test_trial.py from the source tarball until support is complete.
3367         * NEWS: update for 0.6.0 release
3368         * buildbot/__init__.py (version): same
3369         * README: same
3371         * buildbot/status/words.py (IrcStatusBot.command_SOURCE): add
3372         'source' command to tell users where to get the Buildbot source
3374         * docs/examples/*.cfg: update to modern standards
3376         * NEWS: update for release
3378         * buildbot/scripts/runner.py (createMaster): remove the
3379         -shutdown.tap stuff now that it isn't necessary
3380         (createSlave): same
3381         (start): launch buildbot.tap, not buildbot-shutdown.tap
3384         * buildbot/status/mail.py (Domain): shorten class name
3385         (MailNotifier): if lookup= is a string, pass it to Domain()
3386         * buildbot/test/test_status.py (Mail.testBuild1): new class name
3387         (Mail.testBuild2): test the string-to-Domain shortcut
3388         (Mail.testMail): fix test
3391         * buildbot/scripts/sample.cfg: improve the build-the-buildbot
3392         example config file
3394         * buildbot/status/builder.py (BuildStatus.__setstate__): re-set
3395         more attributes on load
3396         (BuilderStatus.stubBuildCacheSize): bump to 30, this was too low
3397         to accomodate the whole waterfall page at once, and the thrashing
3398         results in a lot of unnecessary loads
3399         (BuildStatus.saveYourself): use binary pickles, not fluffy text
3400         (BuilderStatus.saveYourself): same
3401         (BuilderStatus.eventGenerator): stop generating on the first missing
3402         build. We assume that saved builds are deleted oldest-first.
3403         (BuildStepStatus.__getstate__): .progress might not exist
3405         * buildbot/changes/changes.py (ChangeMaster): make it
3406         serializable, in $masterdir/changes.pck
3407         (ChangeMaster.stopService): save on shutdown
3408         * buildbot/master.py (BuildMaster.loadChanges): load at startup
3409         * buildbot/test/test_config.py: load Changes before config file
3412         * buildbot/slave/commands.py (ShellCommand.doTimeout): put the
3413         "Oh my god, you killed the command" header on a separate line
3415         * buildbot/status/builder.py (BuilderStatus.getStubBuildByNumber):
3416         skip over corrupted build pickles
3417         (BuilderStatus.getFullBuildByNumber): same
3418         (BuilderStatus.eventGenerator): skip over unavailable builds
3419         (BuildStatus.saveYourself): save builds to a .tmp file first, then
3420         do an atomic rename. This prevents a corrupted pickle when some
3421         internal serialization error occurs.
3422         (BuilderStatus.saveYourself): same
3424         * buildbot/slave/commands.py (SlaveShellCommand): oops, restore
3425         the timeout for shell commands, it got lost somehow
3427         * buildbot/status/builder.py (BuilderStatus.eventGenerator): if we
3428         run out of build steps, return the rest of the builder events
3430         * buildbot/interfaces.py (IBuilderControl.ping): add method
3432         * buildbot/process/builder.py (BuilderControl.ping): move
3433         slave-ping to BuilderControl, and fix the failure case in the
3434         process (Event.finish() is the verb, Event.finished is the noun).
3436         * buildbot/status/html.py (StatusResourceBuilder.ping): ping
3437         through the BuilderControl instead of the BuilderStatus
3438         (EventBox): add adapter for builder.Event, allowing builder events to
3439         be displayed in the waterfall display
3441         * buildbot/master.py (BotMaster.stopService): add a 'master
3442         shutdown' event to the builder's log
3443         (BuildMaster.startService): and a 'master started' on startup
3445         * buildbot/status/builder.py (BuilderStatus.eventGenerator): merge
3446         builder events into the BuildStep event stream
3447         (Status.builderAdded): add a 'builder created' event
3450         * buildbot/status/words.py (IrcStatusBot.command_WATCH): new
3451         command to announce the completion of a running build
3452         (IrcStatusBot.command_FORCE): announce when the build finishes
3454         * buildbot/status/builder.py (BuilderStatus.addFullBuildToCache):
3455         don't evict unfinished builds from the cache: they must stay in
3456         the full-cache until their logfiles have stopped changing. Make
3457         sure the eviction loop terminates if an unfinished build was hit.
3458         (HTMLLogFile.getTextWithHeaders): return HTML as if it were text.
3459         This lets exceptions be dumped in an email status message. Really
3460         we need LogFiles which contain both text and HTML, instead of two
3461         separate classes.
3462         (BuildStatus.__getstate__): handle self.finished=False
3463         (Status.builderAdded): if the pickle is corrupted, abandon the
3464         history and create a new BuilderStatus object.
3466         * buildbot/process/base.py (Build.stopBuild): tolerate lack of a
3467         self.progress attribute, helped one test which doesn't fully set
3468         up the Build object.
3470         * buildbot/interfaces.py (IStatusLogStub): split out some of the
3471         IStatusLog methods into an Interface that is implemented by "stub"
3472         logs, for which all the actual text chunks are on disk (in the
3473         pickled Build instance). To show the log contents, you must first
3474         adapt the stub log to a full IStatusLog object.
3476         * buildbot/status/builder.py (LogFileStub): create separate stub
3477         log objects, which can be upgraded to a real one if necessary.
3478         (LogFile): make them persistable, and let them stubify themselves
3479         (HTMLLogFile): same
3480         (BuildStepStatus): same
3481         (BuildStatus): same
3482         (BuildStatus.saveYourself): save the whole build out to disk
3483         (BuilderStatus): make it persistable
3484         (BuilderStatus.saveYourself): save the builder to disk
3485         (BuilderStatus.addFullBuildToCache): implement two caches which
3486         hold Build objects: a small one which holds full Builds, and a
3487         larger one which holds "stubbed" Builds (ones with their LogFiles
3488         turned into LogFileStubs). This reduces memory usage by the
3489         buildmaster by not keeping more than a few (default is 2) whole
3490         build logs in RAM all the time.
3491         (BuilderStatus.getBuild): rewrite to pull from disk (through the
3492         cache)
3493         (BuilderStatus.eventGenerator): rewrite since .builds went away
3494         (BuilderStatus.buildStarted): remove the .builds array. Add the
3495         build to the "full" cache when it starts.
3496         (BuilderStatus._buildFinished): save the build to disk when it
3497         finishes
3498         (Status): give it a basedir (same as the BuildMaster's basedir)
3499         where the builder pickles can be saved
3500         (Status.builderAdded): create the BuilderStatus ourselves, by
3501         loading a pickle from disk (or creating a new instance if there
3502         was none on disk). Return the BuilderStatus so the master can glue
3503         it into the new Builder object.
3505         * buildbot/master.py (BotMaster.stopService): on shutdown, tell
3506         all BuilderStatuses to save themselves out to disk. This is in
3507         lieu of saving anything important in the main Application pickle
3508          (the -shutdown.tap file).
3509         (BuildMaster.__init__): give Status() a basedir for its files
3510         (BuildMaster.loadConfig_Builders): do status.builderAdded first,
3511         to get the BuilderStatus, then give it to the Builder (instead of
3512         doing it the other way around). It's ok if the status announces
3513         the new Builder before it's really ready, as the outside world can
3514         only see the BuilderStatus object anyway (and it is ready before
3515         builderAdded returns). Use the builder's "builddir" (which
3516         normally specifies where the slave will run the builder) as the
3517         master's basedir (for saving serialized builds).
3519         * buildbot/status/html.py (StatusResourceBuildStep.getChild):
3520         coerce the logfile to IStatusLog before trying to get the text
3521         chunks out of it. This will pull the full (non-stubified) Build in
3522         from disk if necessary.
3523         (TextLog): fix the adapter registration
3525         * buildbot/test/test_control.py (Force.setUp): create the basedir
3526         * buildbot/test/test_web.py: same
3527         * buildbot/test/test_vc.py (SetupMixin.setUp): same
3528         * buildbot/test/test_status.py (Mail.makeBuild): match new setup
3529         * buildbot/test/test_run.py (Run.testMaster): same
3530         (Status.setUp): same
3532 2004-09-29  Fred L. Drake, Jr.  <fdrake@acm.org>
3534         * buildbot/status/html.py (Waterfall.__init__): store actual
3535         allowForce flag passed in rather than using True for everyone;
3536         make sure setting it to False doesn't cause a NameError
3537         (Waterfall.setup).
3538         (StatusResourceBuilder.__init__) add the builder name to the page
3539         title.
3540         (StatusResourceBuilder.body) move HTML generation for a name/value
3541         row into a helper method (StatusResourceBuilder.make_row); only
3542         generate the "Force Build" form if allowForce was True and the
3543         slave is connected.  Use class attributes in the generated HTML to
3544         spread a little CSS-joy.
3546 2004-09-28  Brian Warner  <warner@lothar.com>
3548         * buildbot/process/step_twisted.py (Trial.createSummary): fix
3549         warning-scanner to not ignore things like
3550         'ComponentsDeprecationWarning' and 'exceptions.RuntimeWarning'
3552         * buildbot/status/html.py (StatusResource.control): add some
3553         class-level values for .control in an attempt to make upgrading
3554         smoother
3556         * buildbot/util.py (ComparableMixin): survive missing attributes,
3557         such as when a class is modified and we're comparing old instances
3558         against new ones
3560         * buildbot/status/words.py (IrcStatusBot.privmsg): clean up
3561         failure handling, remove a redundant try/except block. Don't
3562         return the full traceback to the IRC channel.
3563         (IrcStatusBot.command_FORCE): catch new exceptions, return useful
3564         error messages. Get ETA properly.
3566         * buildbot/status/html.py (StatusResourceBuild.body): html.escape
3567         the reason, since (at least) IRC message will have <> in them.
3568         (StatusResourceBuilder.__init__): take an IBuilderControl
3569         (StatusResourceBuilder.force): use the IBuilderControl we get in
3570         the constructor instead of trying to make our own. Catch the
3571         new exceptions and ignore them for now (until we make an
3572         intermediate web page where we could show the error message)
3573         (StatusResource): create with an IControl, use it to give an
3574         IBuilderControl to all children
3575         (Waterfall): take an allowForce= option, pass an IControl object
3576         to StatusResource if it is True
3578         * buildbot/test/test_web.py (ConfiguredMaster): handle IControl
3580         * buildbot/master.py (BotPerspective.perspective_forceBuild):
3581         catch new exceptions and return string forms
3583         * buildbot/interfaces.py: add NoSlaveError, BuilderInUseError
3584         * buildbot/process/builder.py (Builder.forceBuild): raise them
3585         * buildbot/test/test_control.py (Force.testNoSlave): new test
3586         (Force.testBuilderInUse): same
3589         * buildbot/status/words.py (IrcStatusBot): enable build-forcing
3591         * buildbot/test/test_run.py: use IControl
3592         * buildbot/test/test_vc.py: same
3594         * buildbot/status/html.py (StatusResourceBuilder.force): rewrite
3595         to use IControl. Still offline.
3596         * buildbot/status/words.py (IrcStatusBot.command_FORCE): same
3598         * buildbot/process/builder.py (Builder.doPeriodicBuild): set
3599         who=None so periodic builds don't send out status mail
3600         (Builder.forceBuild): include reason in the log message
3601         (BuilderControl.forceBuild): rename 'name' to 'who'
3603         * buildbot/master.py (BotPerspective.perspective_forceBuild): add
3604         'who' parameter, but make it None by default so builds forced by
3605         slave admins don't cause status mail to be sent to anybody
3606         (BotMaster.forceBuild): same. this method is deprecated.
3607         (DebugPerspective.perspective_forceBuild): same, use IControl.
3608         (DebugPerspective.perspective_fakeChange): use IControl..
3609         (Dispatcher.requestAvatar): .. so don't set .changemaster
3611         * buildbot/interfaces.py (IBuilderControl.forceBuild): rename 'who'
3612         parameter to avoid confusion with the name of the builder
3615         * buildbot/status/mail.py: refine comment about needing 2.3
3617         * buildbot/status/html.py: move all imports to the top
3619         * buildbot/test/test_control.py: test new interfaces
3620         * buildbot/test/test_run.py (Status): handle new interfaces
3621         * buildbot/test/test_vc.py (SetupMixin.doBuild): same
3623         * buildbot/process/base.py (BuildControl): implement IBuildControl
3624         and its lonely getStatus() method
3626         * buildbot/process/builder.py (BuilderControl): implement
3627         IBuilderControl, obtained by adapting the Builder instance
3628         (Builder.startBuild): return a BuilderControl instead of a
3629         Deferred. The caller can use bc.getStatus().waitUntilFinished() to
3630         accomplish the same thing.
3632         * buildbot/master.py: move all import statements to the top
3633         (Control): implement IControl, obtained by adapting the
3634         BuildMaster instance.
3636         * buildbot/interfaces.py: add IControl, IBuilderControl, and
3637         IBuildControl. These are used to force builds. Eventually they
3638         will provide ways to reconfigure the Builders, pause or abandon a
3639         Build, and perhaps control the BuildMaster itself.
3641 2004-09-26  Brian Warner  <warner@lothar.com>
3643         * buildbot/util.py (ComparableMixin): survive twisted>1.3.0 which
3644         ends up comparing us against something without a .__class__
3646 2004-09-24  Brian Warner  <warner@lothar.com>
3648         * buildbot/scripts/runner.py: rearrange option parsing a lot, to get
3649         usage text right.
3651         * Makefile: add 'deb-snapshot' target, to create a timestamped
3652         .deb package
3654         * debian/rules (binary-indep): skip CVS/ files in dh_installexamples
3656 2004-09-23  Brian Warner  <warner@lothar.com>
3658         * buildbot/__init__.py (version): move version string here
3659         * setup.py: get version string from buildbot.version
3660         * buildbot/status/html.py (WaterfallStatusResource.body): add
3661         buildbot version to the page footer
3662         * buildbot/status/words.py (IrcStatusBot.command_VERSION): provide
3663         version when asked
3665         * buildbot/master.py (BotMaster.getPerspective): detect duplicate
3666         slaves, let the second know where the first one is coming from
3667         (BuildMaster.__init__): turn on .unsafeTracebacks so the slave can
3668         see our exceptions. It would be nice if there were a way to just
3669         send them the exception type and value, not the full traceback.
3672         * buildbot/status/mail.py (MailNotifier): add a new argument
3673         sendToInterestedUsers=, which can be set to False to disable the
3674         usual send-to-blamelist behavior.
3675         (top): handle python-2.2 which has no email.MIMEMultipart
3676         (MailNotifier.buildMessage): don't send logs without MIMEMultipart
3677         (MailNotifier.disownServiceParent): unsubscribe on removal
3679         * buildbot/test/test_status.py (Mail.testBuild2): test it
3682         * buildbot/status/progress.py (Expectations.wavg): tolerate
3683         current=None, which happens when steps start failing badly
3684         * buildbot/test/test_status.py (Progress.testWavg): test for it
3686         * buildbot/process/step.py (SVN.startVC): when the (old) slave
3687         doesn't understand args['revision'], emit a warning instead of
3688         bailing completely. Updating to -rHEAD is probably close enough.
3690         * buildbot/process/step_twisted.py (Trial.start): fix sanity-check
3692         * buildbot/test/test_status.py: at least import bb.status.client
3693         even if we don't have any test coverage for it yet
3695         * contrib/svn_buildbot.py: don't require python2.3
3696         (main): wait, do require it (for sets.py), but explain how to
3697         make it work under python2.2
3699 2004-09-23  Brian Warner  <warner@lothar.com>
3701         * contrib/svn_buildbot.py: include the revision number in the Change
3703         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): use when=,
3704         using util.now() because FreshCVS is a realtime service
3706         * buildbot/status/event.py: delete dead code
3707         * buildbot/process/step.py: don't import dead Event class
3708         * buildbot/process/step_twisted.py: same
3709         * buildbot/status/builder.py: same
3710         * buildbot/status/client.py: same
3712         * buildbot/test/test_process.py: kill buggy out-of-date disabled test
3714         * buildbot/changes/changes.py (Change): set .when from an __init__
3715         argument (which defaults to now()), rather than having
3716         ChangeMaster.addChange set it later.
3717         (ChangeMaster.addChange): same
3719         * buildbot/changes/mail.py (parseFreshCVSMail): pass in when=
3720         (parseSyncmail): same. Just use util.now() for now.
3721         (parseBonsaiMail): parse the timestamp field for when=
3723         * buildbot/test/test_vc.py (SourceStamp.addChange): page in when=
3724         instead of setting .when after the fact
3726 2004-09-22  slyphon
3728         * buildbot/slave/trial.py: new SlaveCommand to machine-parse test
3729         results when the target project uses retrial. Still under
3730         development.
3731         * buildbot/test/test_trial.py: same
3733 2004-09-21  Brian Warner  <warner@lothar.com>
3735         * buildbot/status/mail.py (MailNotifier.__init__): include
3736         success/warnings/failure in the Subject line
3737         (MailNotifier.buildMessage): add the buildbot's URL to the body,
3738         use step.logname for the addLogs=True attachment filenames
3739         * buildbot/test/test_status.py (Mail): test Subject lines
3740         (Mail.testLogs): test attachment filenames
3742         * buildbot/master.py (DebugPerspective.perspective_fakeChange):
3743         accept a 'who' argument from the debug tool
3744         * contrib/debugclient.py (DebugWidget.do_commit): send 'who'
3745         * contrib/debug.glade: add text box to set 'who'
3747         * buildbot/interfaces.py (IBuildStatus.getBuilder): replace
3748         .getBuilderName with .getBuilder().getName(), more flexible
3749         (IStatusLog.getName): logs have short names, but you can prefix
3750         them with log.getStep().getName() to make them more useful
3751         * buildbot/status/builder.py: same
3752         * buildbot/status/client.py: same
3753         * buildbot/status/html.py: same
3754         * buildbot/test/test_run.py (Status.testSlave): same
3755         * buildbot/process/step.py: tweak logfile names
3757         * buildbot/status/mail.py (MailNotifier): add lookup, change
3758         argument to extraRecipients. The notifier is now aimed at sending
3759         mail to the people involved in a particular build, with additional
3760         constant recipients as a secondary function.
3762         * buildbot/test/test_status.py: add coverage for IEmailLookup,
3763         including slow-lookup and failing-lookup. Make sure the blamelist
3764         members are included.
3766         * buildbot/interfaces.py: new interfaces IEmailSender+IEmailLookup
3767         (IBuildStatus.getResponsibleUsers): rename from getBlamelist
3768         (IBuildStatus.getInterestedUsers): new method
3769         * buildbot/status/builder.py (BuildStatus.getResponsibleUsers): same
3770         * buildbot/status/client.py (remote_getResponsibleUsers): same
3771         * buildbot/status/html.py (StatusResourceBuild.body): same
3772         * buildbot/test/test_run.py (Status.testSlave): same
3774 2004-09-20  Brian Warner  <warner@lothar.com>
3776         * docs/users.xhtml: update concepts
3778         * Makefile: add a convenience makefile, for things like 'make
3779         test'. It is not included in the source tarball.
3781 2004-09-16  Brian Warner  <warner@lothar.com>
3783         * NEWS: mention /usr/bin/buildbot, debian/*
3785         * debian/*: add preliminary debian packaging. Many thanks to
3786         Kirill Lapshin (and Kevin Turner) for the hard work. I've mangled
3787         it considerably since it left their hands, I am responsible for
3788         all breakage that's resulted.
3790         * bin/buildbot: create a top-level 'buildbot' command, to be
3791         installed in /usr/bin/buildbot . For now it's just a simple
3792         frontend to mktap/twistd/kill, but eventually it will be the entry
3793         point to the 'try' command and also a status client. It is also
3794         intended to support the upcoming debian-packaging init.d scripts.
3795         * buildbot/scripts/runner.py: the real work is done here
3796         * buildbot/scripts/__init__.py: need this too
3797         * buildbot/scripts/sample.cfg: this is installed in new
3798         buildmaster directories
3799         * setup.py: install new stuff
3801 2004-09-15  Brian Warner  <warner@lothar.com>
3803         * buildbot/test/test_vc.py: skip SVN tests if svn can't handle the
3804         'file:' schema (the version shipped with OS-X was built without the
3805         ra_local plugin).
3806         (SetupMixin.tearDown): stop the goofy twisted.web timer which
3807         updates the log-timestamp, to make sure it isn't still running after
3808         the test finishes
3810         * docs/config.xhtml: Add projectName, projectURL, buildbotURL
3811         values to the config file.
3812         * docs/examples/hello.cfg: add examples
3813         * buildbot/interfaces.py (IStatus.getBuildbotURL): define accessors
3814         * buildbot/status/builder.py (Status.getProjectURL): implement them
3815         * buildbot/master.py (BuildMaster.loadConfig): set them from config
3816         * buildbot/test/test_config.py (ConfigTest.testSimple): test them
3817         * buildbot/status/html.py (WaterfallStatusResource): display them
3820         * buildbot/test/test_vc.py (FakeBuilder.name): add attribute so
3821         certain error cases don't suffer a secondary exception.
3822         (top): Skip tests if the corresponding VC tool is not installed.
3824         * buildbot/process/factory.py (Trial): introduce separate
3825         'buildpython' and 'trialpython' lists, since trialpython=[] is
3826         what you want to invoke /usr/bin/python, whereas ./setup.py is
3827         less likely to be executable. Add env= parameter to pass options
3828         to test cases (which is how I usually write tests, I don't know if
3829         anyone else does it this way).
3831         * buildbot/process/step_twisted.py (Trial): handle python=None.
3832         Require 'testpath' be a string, not a list. Fix tests= typo.
3833         (Trial.start): sanity-check any PYTHONPATH value for stringness.
3835         * buildbot/process/step.py (RemoteCommand._remoteFailed): goofy
3836         way to deal with the possibility of removing the disconnect notify
3837         twice.
3838         (CVS): add a 'login' parameter to give a password to 'cvs login',
3839         commonly used with pserver methods (where pw="" or pw="guest")
3841         * buildbot/slave/commands.py (SourceBase): move common args
3842         extraction and setup() to __init__, so everything is ready by the
3843         time setup() is called
3844         (CVS.start): call 'cvs login' if a password was supplied
3845         (ShellCommand): special-case PYTHONPATH: prepend the master's
3846         value to any existing slave-local value.
3848         * buildbot/process/builder.py (Builder.updateBigStatus): if we
3849         don't have a remote, mark the builder as Offline. This whole
3850         function should probably go away and be replaced by individual
3851         deltas.
3852         (Builder.buildFinished): return the results to the build-finished
3853         deferred callback, helps with testing
3855 2004-09-14  Brian Warner  <warner@lothar.com>
3857         * buildbot/test/test_vc.py: put all the repositories needed to run
3858         the complete tests into a single small (1.3MB) tarball, so I can
3859         make that tarball available on the buildbot web site. Test HTTP
3860         access (for Arch and Darcs) by spawning a temporary web server
3861         while the test runs.
3863         * docs/users.xhtml: new document, describe Buildbot's limited
3864         understanding of different human users
3866         * buildbot/test/test_vc.py: rearrange test cases a bit
3868         * buildbot/process/step_twisted.py (Trial): handle testpath=
3869         * buildbot/process/factory.py (Trial): update to use step.Trial
3871         * buildbot/slave/commands.py (ShellCommandPP): fix fatal typo
3873         * buildbot/status/builder.py (BuildStatus.getText): add text2 to
3874         the overall build text (which gives you 'failed 2 tests' rather
3875         than just 'failed')
3876         (BuildStepStatus.text2): default to [], not None
3878         * buildbot/process/step_twisted.py (Trial.commandComplete): text2
3879         must be a list
3881 2004-09-12  Brian Warner  <warner@lothar.com>
3883         * buildbot/master.py (BotPerspective._commandsUnavailable): don't
3884         log the whole exception if it's just an AttributeError (old slave)
3886         * buildbot/process/step.py (ShellCommand.__init__): stash .workdir
3887         so (e.g.) sub-commands can be run in the right directory.
3888         (ShellCommand.start): accept an optional errorMessage= argument
3889         to make life easier for SVN.start
3890         (SVN.startVC): put the "can't do mode=export" warning in the LogFile
3891         headers
3892         (ShellCommand.start): move ['dir'] compatibility hack..
3893         (RemoteShellCommand.start): .. to here so everyone can use it
3895         * buildbot/process/step_twisted.py (Trial): use .workdir
3897         * buildbot/process/step_twisted.py (BuildDebs.getText): fix the
3898         text displayed when debuild fails completely
3899         (Trial): snarf _trial_temp/test.log from the slave and display it
3901 2004-09-11  Brian Warner  <warner@lothar.com>
3903         * buildbot/process/step_twisted.py (ProcessDocs.getText): typo
3905         * buildbot/process/process_twisted.py (TwistedTrial.tests): oops,
3906         set to 'twisted', so --recurse can find twisted/web/test/*, etc
3908         * buildbot/process/step.py (ShellCommand): call .createSummary
3909         before .evaluateCommand instead of the other way around. This
3910         makes it slightly easier to count warnings and then use that to
3911         set results=WARNINGS
3912         * buildbot/process/step_twisted.py: cosmetic, swap the methods
3914         * buildbot/process/base.py (Build.buildFinished): update status
3915         before doing progress. It's embarrassing for the build to be stuck
3916         in the "building" state when an exceptions occurs elsewhere..
3918         * buildbot/status/progress.py (Expectations.expectedBuildTime):
3919         python2.2 doesn't have 'sum'
3921         * buildbot/status/builder.py (Status.getBuilderNames): return a copy,
3922         to prevent clients from accidentally sorting it
3924         * buildbot/master.py (Manhole): add username/password
3925         (BuildMaster.loadConfig): use c['manhole']=Manhole() rather than
3926         c['manholePort'], deprecate old usage
3927         * docs/config.xhtml: document c['manhole']
3928         * docs/examples/hello.cfg: show example of using a Manhole
3931         * buildbot/test/test_steps.py (FakeBuilder.getSlaveCommandVersion):
3932         pretend the slave is up to date
3934         * buildbot/status/builder.py (BuildStepStatus.stepFinished): 'log',
3935         the module, overlaps with 'log', the local variable
3937         * buildbot/status/html.py: oops, 2.2 needs __future__ for generators
3939         * buildbot/process/builder.py (Builder.getSlaveCommandVersion):
3940         new method to let Steps find out the version of their
3941         corresponding SlaveCommand.
3942         * buildbot/process/step.py (BuildStep.slaveVersion): utility method
3943         (ShellCommand.start): add 'dir' argument for <=0.5.0 slaves
3944         (CVS.startVC): backwards compatibility for <=0.5.0 slaves
3945         (SVN.startVC): same
3946         (Darcs.startVC): detect old slaves (missing the 'darcs' command)
3947         (Arch.startVC): same
3948         (P4Sync.startVC): same
3950         * buildbot/process/step.py (LoggedRemoteCommand.start): return the
3951         Deferred so we can catch errors in remote_startCommand
3952         (RemoteShellCommand.start): same
3954         * docs/examples/twisted_master.cfg: update sample config file
3956         * buildbot/slave/commands.py (ShellCommandPP): write to stdin
3957         after connectionMade() is called, not before. Close stdin at that
3958         point too.
3960         * buildbot/process/process_twisted.py: update to use Trial, clean
3961         up argument passing (move to argv arrays instead of string
3962         commands)
3964         * buildbot/process/step_twisted.py (Trial): new step to replace
3965         RunUnitTests, usable by any trial-using project (not just
3966         Twisted). Arguments have changed, see the docstring for details.
3968         * buildbot/process/base.py (Build.startBuild): this now returns a
3969         Deferred. Exceptions that occur during setupBuild are now
3970         caught better and lead to fewer build_status weirdnesses, like
3971         finishing a build that was never started.
3972         (Build.buildFinished): fire the Deferred instead of calling
3973         builder.buildFinished directly. The callback argument is this
3974         Build, everything else can be extracted from it, including the
3975         new build.results attribute.
3976         * buildbot/process/builder.py (Builder.startBuild): same
3977         (Builder.buildFinished): same, extract results from build
3979         * buildbot/process/step.py (ShellCommands): remove dead code
3981 2004-09-08  Brian Warner  <warner@lothar.com>
3983         * buildbot/test/test_vc.py (VC.doPatch): verify that a new build
3984         doesn't try to use the leftover patched workdir
3985         (SourceStamp): test source-stamp computation for CVS and SVN
3987         * buildbot/slave/commands.py (SourceBase.doPatch): mark the
3988         patched workdir ('touch .buildbot-patched') so we don't try to
3989         update it later
3990         (SourceBase.start): add ['revision'] for all Source steps
3991         (CVS): change args: use ['branch'] for -r, remove ['files']
3992         (CVS.buildVC): fix revision/branch stuff
3993         (SVN): add revision stuff
3995         * buildbot/process/step.py (BuildStep.__init__): reject unknown
3996         kwargs (except 'workdir') to avoid silent spelling errors
3997         (ShellCommand.__init__): same
3998         (Source): new base class for CVS/SVN/etc. Factor out everything
3999         common, add revision computation (perform the checkout with a -D
4000         DATE or -r REVISION that gets exactly the sources described by the
4001         last Change), overridable with step.alwaysUseLatest. Add patch
4002         handling (build.getSourceStamp can trigger the use of a base
4003         revision and a patch).
4004         (CVS, SVN, Darcs, Arch, P4Sync): refactor, remove leftover arguments
4005         * docs/steps.xhtml: update docs
4006         * docs/source.xhtml: mention .checkoutDelay
4007         * docs/examples/hello.cfg: show use of checkoutDelay, alwaysUseLatest
4009         * buildbot/process/base.py (Build.setSourceStamp): add a
4010         .sourceStamp attribute to each Build. If set, this indicates that
4011         the build should be done with something other than the most
4012         recent source tree. This will be used to implement "try" builds.
4013         (Build.allChanges): new support method
4014         (Build.lastChangeTime): remove, functionality moved to Source steps
4015         (Build.setupBuild): copy the Step args before adding ['workdir'],
4016         to avoid modifying the BuildFactory (and thus triggering spurious
4017         config changes)
4020         * buildbot/status/html.py: rename s/commits/changes/
4021         (StatusResourceChanges): same
4022         (CommitBox.getBox): same, update URL
4023         (WaterfallStatusResource): same
4024         (StatusResource.getChild): same
4026         * contrib/debugclient.py (DebugWidget.do_commit): send .revision
4027         * contrib/debug.glade: add optional 'revision' to the fakeChange
4029         * buildbot/changes/changes.py (html_tmpl): display .revision
4030         (ChangeMaster.addChange): note .revision in log
4031         * buildbot/changes/pb.py (ChangePerspective.perspective_addChange):
4032         accept a ['revision'] attribute
4034         * buildbot/process/factory.py (BuildFactory): use ComparableMixin
4036         * buildbot/master.py (BotMaster.getPerspective): update the
4037         .connected flag in SlaveStatus when it connects
4038         (BotMaster.detach): and when it disconnects
4039         (DebugPerspective.perspective_fakeChange): take a 'revision' attr
4040         (BuildMaster.loadConfig_Builders): walk old list correctly
4042         * buildbot/test/test_config.py: fix prefix= usage
4044 2004-09-06  Brian Warner  <warner@lothar.com>
4046         * NEWS: mention P4
4048         * buildbot/changes/p4poller.py (P4Source): New ChangeSource to
4049         poll a P4 depot looking for recent changes. Thanks to Dave
4050         Peticolas for the contribution. Probably needs some testing after
4051         I mangled it.
4053         * buildbot/process/step.py (P4Sync): simple P4 source-updater,
4054         requires manual client setup for each buildslave. Rather
4055         experimental. Thanks again to Dave Peticolas.
4056         * buildbot/slave/commands.py (P4Sync): slave-side source-updater
4058         * buildbot/changes/changes.py (Change): add a .revision attribute,
4059         which will eventually be used to generate source-stamp values.
4061         * buildbot/process/step.py (RemoteCommand.start): use
4062         notifyOnDisconnect to notice when we lose the slave, then treat it
4063         like an exception. This allows LogFiles to be closed and the build
4064         to be wrapped up normally. Be sure to remove the disconnect
4065         notification when the step completes so we don't accumulate a
4066         bazillion such notifications which will fire weeks later (when the
4067         slave finally disconnects normally). Fixes SF#915807, thanks to
4068         spiv (Andrew Bennetts) for the report.
4069         (LoggedRemoteCommand): move __init__ code to RemoteCommand, since it
4070         really isn't Logged- specific
4071         (LoggedRemoteCommand.remoteFailed): Add an extra newline to the
4072         header, since it's almost always going to be appended to an
4073         incomplete line
4074         * buildbot/test/test_steps.py (BuildStep.testShellCommand1):
4075         update test to handle use of notifyOnDisconnect
4077         * buildbot/status/builder.py (BuilderStatus.currentlyOffline):
4078         don't clear .ETA and .currentBuild when going offline, let the
4079         current build clean up after itself
4081         * buildbot/process/builder.py (Builder.detached): wait a moment
4082         before doing things like stopping the current build, because the
4083         current step will probably notice the disconnect and cleanup the
4084         build by itself
4085         * buildbot/test/test_run.py (Status.tearDown): update test to
4086         handle asynchronous build-detachment
4088         * buildbot/process/base.py (Build.stopBuild): minor shuffles
4090         * buildbot/status/html.py (WaterfallStatusResource.buildGrid):
4091         hush a debug message
4093 2004-09-05  Brian Warner  <warner@lothar.com>
4095         * buildbot/changes/maildir.py (Maildir.start): catch an IOError
4096         when the dnotify fcntl() fails and fall back to polling. Linux 2.2
4097         kernels do this: the fcntl module has the F_NOTIFY constant, but
4098         the kernel itself doesn't support the operation. Thanks to Olly
4099         Betts for spotting the problem.
4101         * buildbot/process/step.py (Darcs): new source-checkout command
4102         (Arch): new source-checkout command
4103         (todo_P4): fix constructor syntax, still just a placeholder
4104         * buildbot/test/test_vc.py (VC.testDarcs): test it
4105         (VC.testDarcsHTTP): same, via localhost HTTP
4106         (VC.testArch): same
4107         (VC.testArchHTTP): same
4108         * NEWS: mention new features
4110         * buildbot/slave/commands.py (ShellCommand): add .keepStdout,
4111         which tells the step to stash stdout text locally (in .stdout).
4112         Slave-side Commands can use this to make decisions based upon the
4113         output of the the ShellCommand (not just the exit code).
4114         (Darcs): New source-checkout command
4115         (Arch): New source-checkout command, uses .keepStdout in one place
4116         where it needs to discover the archive's default name.
4118         * docs/steps.xhtml: Document options taken by Darcs and Arch.
4119         * docs/source.xhtml: add brief descriptions of Darcs and Arch
4120         * docs/examples/hello.cfg: add examples of Darcs and Arch checkout
4122         * buildbot/process/step.py (ShellCommand.describe): add an
4123         alternate .descriptionDone attribute which provides descriptive
4124         text when the step is complete. .description can be ["compiling"],
4125         for use while the step is running, then .descriptionDone can be
4126         ["compile"], used alone when the step succeeds or with "failed" when
4127         it does not. Updated other steps to use the new text.
4128         * buildbot/process/step_twisted.py: same
4129         * buildbot/test/test_run.py: update tests to match
4131 2004-08-30  Brian Warner  <warner@lothar.com>
4133         * buildbot/process/step.py (ShellCommand.createSummary): fix docs
4134         (CVS.__init__): send 'patch' argument to slave
4135         (CVS.start): don't create the LoggedRemoteCommand until start(),
4136         so we can catch a .patch added after __init__
4137         (SVN.__init__): add 'patch' to SVN too
4138         (SVN.start): same
4140         * buildbot/slave/commands.py (ShellCommand): add a 'stdin'
4141         argument, to let commands push data into the process' stdin pipe.
4142         Move usePTY to a per-instance attribute, and clear it if 'stdin'
4143         is in use, since closing a PTY doesn't really affect the process
4144         in the right way (in particular, I couldn't run /usr/bin/patch
4145         under a pty).
4146         (SourceBase.doPatch): handle 'patch' argument
4148         * buildbot/test/test_vc.py (VC.doPatch): test 'patch' argument for
4149         both CVS and SVN
4151         * buildbot/slave/commands.py (cvs_ver): fix version-parsing goo
4152         * buildbot/slave/bot.py (Bot.remote_getCommands): send command
4153         versions to master
4154         * buildbot/master.py (BotPerspective.got_commands): get command
4155         versions from slave, give to each builder
4156         * buildbot/process/builder.py (Builder.attached): stash slave
4157         command versions in .remoteCommands
4159         * docs/steps.xhtml: bring docs in-line with reality
4161         * buildbot/process/step.py (CVS.__init__): more brutal
4162         compatibility code removal
4163         (SVN.__init__): same
4165         * buildbot/slave/commands.py (SlaveShellCommand): update docs
4166         (SlaveShellCommand.start): require ['workdir'] argument, remove
4167         the ['dir'] fallback (compatibility will come later)
4168         (SourceBase): update docs
4169         (SourceBase.start): remove ['directory'] fallback
4170         (CVS): update docs
4171         (SVN): update docs
4172         * buildbot/test/test_config.py (ConfigTest.testBuilders): update test
4173         * buildbot/test/test_steps.py (BuildStep.testShellCommand1): same
4174         * buildbot/test/test_slavecommand.py (SlaveCommandTestCase): same
4176         * buildbot/process/step.py (RemoteShellCommand.__init__): add
4177         want_stdout/want_stderr. remove old 'dir' keyword (to simplify the
4178         code.. I will figure out 0.5.0-compatibility hooks later)
4180 2004-08-30  Brian Warner  <warner@lothar.com>
4182         * buildbot/process/process_twisted.py: rewrite in terms of new
4183         BuildFactory base class. It got significantly shorter. Yay
4184         negative code days.
4186         * buildbot/process/step_twisted.py (HLint.start): fix to make it
4187         work with the new "self.build isn't nailed down until we call
4188         step.start()" scheme: specifically, __init__ is called before the
4189         build has decided on which Changes are going in, so we don't scan
4190         build.allFiles() for .xhtml files until start()
4191         (HLint.commandComplete): use getText(), not getStdout()
4192         (RunUnitTests.start): same: don't use .build until start()
4193         (RunUnitTests.describe): oops, don't report (None) when using
4194         the default reactor
4195         (RunUnitTests.commandComplete): use getText()
4196         (RunUnitTests.createSummary): same
4197         (BuildDebs.commandComplete): same
4199         * buildbot/process/step.py (RemoteShellCommand.__init__): don't
4200         set args['command'] until start(), since our BuildStep is allowed
4201         to change their mind up until that point
4202         (TreeSize.commandComplete): use getText(), not getStdout()
4204         * docs/examples/twisted_master.cfg: update to current standards
4206         * docs/factories.xhtml: update
4207         * buildbot/process/factory.py: implement all the common factories
4208         described in the docs. The Trial factory doesn't work yet, and
4209         I've probably broken all the process_twisted.py factories in the
4210         process. There are compatibility classes left in for things like
4211         the old BasicBuildFactory, but subclasses of them are unlikely to
4212         work.
4213         * docs/examples/glib_master.cfg: use new BuildFactories
4214         * docs/examples/hello.cfg: same
4216         * buildbot/test/test_config.py (ConfigTest.testBuilders): remove
4217         explicit 'workdir' args
4219         * buildbot/process/base.py (BuildFactory): move factories to ..
4220         * buildbot/process/factory.py (BuildFactory): .. here
4221         * buildbot/process/process_twisted.py: handle move
4222         * buildbot/test/test_config.py: same
4223         * buildbot/test/test_run.py: same
4224         * buildbot/test/test_steps.py: same
4225         * buildbot/test/test_vc.py: same
4226         * docs/factories.xhtml: same
4228         * NEWS: mention config changes that require updating master.cfg
4230         * buildbot/process/base.py (Build.setupBuild): add a 'workdir'
4231         argument to all steps that weren't given one already, pointing at
4232         the "build/" directory.
4234         * docs/examples/hello.cfg: remove explicit 'workdir' args
4236         * docs/factories.xhtml: document standard BuildFactory clases,
4237         including a bunch which are have not yet been written
4239 2004-08-29  Brian Warner  <warner@lothar.com>
4241         * buildbot/interfaces.py (IBuildStepStatus.getResults): move
4242         result constants (SUCCESS, WARNINGS, FAILURE, SKIPPED) to
4243         buildbot.status.builder so they aren't quite so internal
4244         * buildbot/process/base.py, buildbot/process/builder.py: same
4245         * buildbot/process/maxq.py, buildbot/process/step.py: same
4246         * buildbot/process/step_twisted.py, buildbot/status/builder.py: same
4247         * buildbot/status/mail.py, buildbot/test/test_run.py: same
4248         * buildbot/test/test_status.py, buildbot/test/test_vc.py: same
4250         * buildbot/status/html.py (StatusResourceBuildStep): oops, update
4251         to handle new getLogs()-returns-list behavior
4252         (StatusResourceBuildStep.getChild): same
4253         (StepBox.getBox): same
4254         (WaterfallStatusResource.phase0): same
4256         * docs/source.xhtml: document how Buildbot uses version-control
4257         systems (output side: how we get source trees)
4258         * docs/changes.xhtml: rename from sources.xhtml, documents VC
4259         systems (input side: how we learn about Changes)
4261         * buildbot/master.py (Manhole): use ComparableMixin
4262         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): same
4263         * buildbot/changes/mail.py (MaildirSource): same
4264         * buildbot/status/client.py (PBListener): same
4265         * buildbot/status/html.py (Waterfall): same
4266         * buildbot/status/words.py (IRC): same
4268         * NEWS: start describing new features
4270         * buildbot/status/mail.py (MailNotifier): finish implementation.
4271         The message body is still a bit sparse.
4272         * buildbot/test/test_status.py (Mail): test it
4274         * buildbot/util.py (ComparableMixin): class to provide the __cmp__
4275         and __hash__ methods I wind up adding everywhere. Specifically
4276         intended to support the buildbot config-file update scheme where
4277         we compare, say, the old list of IStatusTargets against the new
4278         one and don't touch something which shows up on both lists.
4279         * buildbot/test/test_util.py (Compare): test case for it
4281         * buildbot/interfaces.py (IBuildStatus): change .getLogs() to
4282         return a list instead of a dict
4283         (IBuildStepStatus.getLogs): same. The idea is that steps create
4284         logs with vaguely unique names (although their uniqueness is not
4285         guaranteed). Thus a compilation step should create its sole
4286         logfile with the name 'compile', and contribute it to the
4287         BuildStatus. If a step has two logfiles, try to create them with
4288         different names (like 'test.log' and 'test.summary'), and only
4289         contribute the important ones to the overall BuildStatus.
4290         * buildbot/status/builder.py (Event.getLogs): same
4291         (BuildStepStatus): fix default .text and .results
4292         (BuildStepStatus.addLog): switch to list-like .getLogs()
4293         (BuildStepStatus.stepFinished): same
4294         (BuildStatus.text): fix default .text
4295         (BuildStatus.getLogs): temporary hack to return all logs (from all
4296         child BuildStepStatus objects). Needs to be fixed to only report
4297         the significant ones (as contributed by the steps themselves)
4298         * buildbot/test/test_run.py: handle list-like .getLogs()
4299         * buildbot/test/test_steps.py (BuildStep.testShellCommand1): same
4301 2004-08-28  Brian Warner  <warner@lothar.com>
4303         * buildbot/process/builder.py (Builder.attached): serialize the
4304         attachment process, so the attach-watcher isn't called until the
4305         slave is really available. Add detached watchers too, which makes
4306         testing easier.
4308         * buildbot/test/test_vc.py: test VC modes (clobber/update/etc)
4310         * buildbot/test/test_swap.py: remove dead code
4312         * buildbot/slave/commands.py (ShellCommandPP): add debug messages
4313         (ShellCommand.start): treat errors in _startCommand/spawnProcess
4314         sort of as if the command being run exited with a -1. There may
4315         still be some holes in this scheme.
4316         (CVSCommand): add 'revision' tag to the VC commands, make sure the
4317         -r option appears before the module list
4318         * buildbot/process/step.py (CVS): add 'revision' argument
4320         * buildbot/slave/bot.py (SlaveBuilder._ackFailed): catch failures
4321         when sending updates or stepComplete messages to the master, since
4322         we don't currently care whether they arrive or not. When we revamp
4323         the master/slave protocol to really resume interrupted builds,
4324         this will need revisiting.
4325         (lostRemote): remove spurious print
4327         * buildbot/master.py (BotPerspective.attached): serialize the
4328         new-builder interrogation process, to make testing easier
4329         (BotMaster.waitUntilBuilderDetached): convenience function
4331         * buildbot/status/builder.py (BuilderStatus): prune old builds
4332         (BuildStatus.pruneSteps): .. and steps
4333         (BuildStepStatus.pruneLogs): .. and logs
4334         (BuilderStatus.getBuild): handle missing builds
4335         * buildbot/status/html.py (StatusResourceBuild.body): display build
4336         status in the per-build page
4337         (BuildBox.getBox): color finished builds in the per-build box
4339 2004-08-27  Brian Warner  <warner@lothar.com>
4341         * buildbot/status/mail.py (MailNotifier): new notification class,
4342         not yet finished
4344         * buildbot/slave/commands.py (SourceBase): refactor SVN and CVS into
4345         variants of a common base class which handles all the mode= logic
4347         * buildbot/interfaces.py (IBuildStatus.getPreviousBuild): add
4348         convenience method
4349         * buildbot/status/builder.py (BuildStatus.getPreviousBuild): same
4351 2004-08-26  Brian Warner  <warner@lothar.com>
4353         * buildbot/test/test_slavecommand.py: accomodate new slavecommand
4354         interfaces
4356         * buildbot/test/test_run.py: update to new Logfile interface, new
4357         buildbot.slave modules
4358         * buildbot/test/test_steps.py: same, remove Swappable, add timeouts
4360         * MANIFEST.in: new sample config file
4361         * docs/examples/hello.cfg: same
4363         * buildbot/process/step_twisted.py: remove dead import
4365         * buildbot/process/step.py (RemoteCommand.run): catch errors
4366         during .start
4367         (RemoteCommand.remote_update): ignore updates that arrive after
4368         we've shut down
4369         (RemoteCommand.remote_complete): ignore duplicate complete msgs
4370         (RemoteCommand._remoteComplete): cleanup failure handling, reduce
4371         the responsibilities of the subclass's methods
4372         (BuildStep.failed): catch errors during failure processing
4373         (BuildStep.addHTMLLog): provide all-HTML logfiles (from Failures)
4374         (CVS): move to a mode= argument (described in docstring), rather
4375         than the ungainly clobber=/export=/copydir= combination.
4376         (SVN): add mode= functionality to SVN too
4377         (todo_Darcs, todo_Arch, todo_P4): placeholders for future work
4379         * buildbot/process/base.py (Build.startNextStep): catch errors
4380         during s.startStep()
4382         * buildbot/clients/base.py: update to new PB client interface.
4383         gtkPanes is still broken
4385         * buildbot/bot.py, buildbot/slavecommand.py: move to..
4386         * buildbot/slave/bot.py, buildbot/slave/commands.py: .. new directory
4387         * setup.py: add buildbot.slave module
4388         * buildbot/bb_tap.py: handle move
4389         * buildbot/slave/registry.py: place to register commands, w/versions
4390         * buildbot/slave/bot.py: major simplifications
4391         (SlaveBuilder.remote_startCommand): use registry for slave commands,
4392         instead of a fixed table. Eventually this will make the slave more
4393         extensible. Use 'start' method on the command, not .startCommand.
4394         Fix unsafeTracebacks handling (I think).
4395         * buildbot/slave/commands.py: major cleanup. ShellCommand is now a
4396         helper class with a .start method that returns a Deferred.
4397         SlaveShellCommand is the form reached by the buildmaster. Commands
4398         which use multiple ShellCommands can just chain them as Deferreds,
4399         with some helper methods in Command (_abandonOnFailure and
4400         _checkAbandoned) to bail on rc!=0.
4401         (CVSCommand): prefer new mode= argument
4402         (SVNFetch): add mode= argument
4404         * buildbot/master.py (DebugPerspective.perspective_forceBuild):
4405         put a useful reason string on the build
4407         * buildbot/status/builder.py (LogFile): do LogFile right: move the
4408         core functionality into an IStatusLog object
4409         (BuildStatus.sendETAUpdate): don't send empty build-eta messages
4410         * buildbot/status/html.py (TextLog): HTML-rendering goes here
4411         (StatusResourceBuild.body): use proper accessor methods
4412         * buildbot/status/client.py (RemoteLog): PB-access goes here
4413         (StatusClientPerspective.perspective_subscribe): add "full" mode,
4414         which delivers log contents too
4415         (PBListener.__cmp__): make PBListeners comparable, thus removeable
4416         * buildbot/status/event.py: remove old Logfile completely
4418         * buildbot/interfaces.py (IStatusLog.subscribe): make the
4419         subscription interface for IStatusLog subscriptions just like all
4420         other the status subscriptions
4421         (IStatusReceiver.logChunk): method called on subscribers
4423 2004-08-24  Brian Warner  <warner@lothar.com>
4425         * buildbot/process/builder.py (Builder._pong): oops, ping response
4426         includes a result (the implicit None returned by remote_print).
4427         Accept it so the _pong method handles the response correctly.
4429 2004-08-06  Brian Warner  <warner@lothar.com>
4431         * buildbot/test/test_config.py: update IRC, PBListener tests
4433         * buildbot/status/client.py (StatusClientPerspective): total
4434         rewrite to match new IStatus interfaces. New subscription scheme.
4435         There are still a few optimizations to make (sending down extra
4436         information with event messages so the client doesn't have to do a
4437         round trip). The logfile-retrieval code is probably still broken.
4438         Moved the PB service into its own port, you can no longer share a
4439         TCP socket between a PBListener and, say, the slaveport (this
4440         should be fixed eventually).
4441         * buildbot/clients/base.py (Client): revamp to match. still needs
4442         a lot of work, but basic event reporting works fine. gtkPanes is
4443         completely broken.
4445         * buildbot/status/words.py (IRC): move to c['status']. Each IRC
4446         instance talks to a single irc server. Threw out all the old
4447         multi-server handling code. Still need to add back in
4448         builder-control (i.e. "force build")
4450         * buildbot/status/html.py (StatusResourceBuildStep.body): add some
4451         more random text to the as-yet-unreachable per-step page
4453         * buildbot/status/builder.py (BuildStepStatus.sendETAUpdate):
4454         rename to stepETAUpdate
4455         (BuildStatus.subscribe): add build-wide ETA updates
4456         (BuilderStatus.getState): remove more cruft
4457         (BuilderStatus.getCurrentBuild): remove more cruft
4458         (BuilderStatus.buildStarted): really handle tuple-subscription
4459         * buildbot/test/test_run.py (Status.testSlave): handle the
4460         stepETAUpdate rename
4462         * buildbot/master.py (BuildMaster): don't add a default
4463         StatusClientService. Don't add a default IrcStatusFactory. Both
4464         are now added through c['status'] in the config file. c['irc'] is
4465         accepted for backwards compatibility, the only quirk is you cannot
4466         use c['irc'] to specify IRC servers on ports other than 6667.
4468         * buildbot/interfaces.py (IBuildStatus.getCurrentStep): add method
4469         (IStatusReceiver.buildStarted): allow update-interval on subscribe
4470         (IStatusReceiver.buildETAUpdate): send build-wide ETA updates
4471         (IStatusReceiver.stepETAUpdate): rename since it's step-specific
4474         * buildbot/master.py (BuildMaster.startService): SIGHUP now causes
4475         the buildmaster to re-read its config file
4478         * buildbot/test/test_web.py (test_webPortnum): need a new hack to
4479         find out the port our server is running on
4480         (WebTest.test_webPathname_port): same
4482         * buildbot/test/test_config.py (testWebPortnum): test it
4483         (testWebPathname): ditto
4485         * docs/config.xhtml: document new c['status'] configuration option
4487         * buildbot/status/html.py (Waterfall): new top-level class which
4488         can be added to c['status']. This creates the Site as well as the
4489         necessary TCPServer/UNIXServer. It goes through the BuildMaster,
4490         reachable as .parent, for everything.
4492         * buildbot/master.py (Manhole): make it a normal service Child
4493         (BuildMaster.loadConfig_status): c['status'] replaces webPortnum and
4494         webPathname. It will eventually replace c['irc'] and the implicit
4495         PB listener as well. c['webPortnum'] and c['webPathname'] are left
4496         in as (deprecated) backward compatibility hooks for now.
4499         * buildbot/process/builder.py (Builder.buildFinished): don't
4500         inform out builder_status about a finished build, as it finds out
4501         through its child BuildStatus object
4503         * buildbot/status/html.py: extensive revamp. Use adapters to make
4504         Boxes out of BuildStepStatus and friends. Acknowledge that Steps
4505         have both starting and finishing times and adjust the waterfall
4506         display accordingly, using spacers if necessary. Use SlaveStatus
4507         to get buildslave info.
4508         (StatusResourceBuildStep): new just-one-step resource, used to get
4509         logfiles. No actual href to it yet.
4511         * buildbot/status/event.py (Logfile.doSwap): disable Swappable for
4512         the time being, until I get the file-naming scheme right
4514         * buildbot/status/builder.py (Event): clean started/finished names
4515         (BuildStatus.isFinished): .finished is not None is the right test
4516         (BuildStatus.buildStarted): track started/finished times ourselves
4517         (BuilderStatus.getSlave): provide access to SlaveStatus object
4518         (BuilderStatus.getLastFinishedBuild): all builds are now in
4519         .builds, even the currently-running one. Accomodate this change.
4520         (BuilderStatus.eventGenerator): new per-builder event generator.
4521         Returns BuildStepStatus and BuildStatus objects, since they can
4522         both be adapted as necessary.
4523         (BuilderStatus.addEvent): clean up started/finished attributes
4524         (BuilderStatus.startBuild,finishBuild): remove dead code
4525         (SlaveStatus): new object to provide ISlaveStatus
4527         * buildbot/process/step.py (ShellCommand.getColor): actually
4528         return the color instead of setting it ourselves
4529         (CVS.__init__): pull .timeout and .workdir options out of
4530         **kwargs, since BuildStep will ignore them. Without this neither
4531         will be sent to the slave correctly.
4532         (SVN.__init__): same
4534         * buildbot/process/builder.py (Builder): move flags to class-level
4535         attributes
4536         (Builder.attached): remove .remoteInfo, let the BotPerspective and
4537         SlaveStatus handle that
4539         * buildbot/process/base.py (Build.firstEvent): remove dead code
4540         (Build.stopBuild): bugfix
4542         * buildbot/changes/pb.py (PBChangeSource.describe): add method
4544         * buildbot/changes/changes.py (Change): add IStatusEvent methods
4545         (ChangeMaster.eventGenerator): yield Changes, since there are now
4546         Adapters to turn them into HTML boxes
4548         * buildbot/master.py (BotMaster): track SlaveStatus from BotMaster
4549         (BotPerspective.attached): feed a SlaveStatus object
4550         (BuildMaster.loadConfig): add a manhole port (debug over telnet)
4551         (BuildMaster.loadConfig_Builders): give BuilderStatus a parent
4553         * buildbot/interfaces.py: API additions
4554         (ISlaveStatus): place to get slave status
4556 2004-08-04  Brian Warner  <warner@lothar.com>
4558         * buildbot/slavecommand.py (DummyCommand.finished): send rc=0 when
4559         the delay finishes, so the step is marked as SUCCESS
4561         * buildbot/test/test_run.py (Status.testSlave): cover more of
4562         IBuildStatus and IBuildStepStatus
4564         * buildbot/status/progress.py (StepProgress): move some flags to
4565         class-level attributes
4566         (StepProgress.remaining): if there are no other progress metrics
4567         to go by, fall back to elapsed time
4568         (StepProgress.setExpectations): take a dict of metrics instead of
4569         a list
4570         (BuildProgress.setExpectationsFrom): pull expectations from the
4571         Expectations, instead of having it push them to the BuildProgress
4572         (Expectations): move some flags to class-level attributes
4573         (Expectations.__init__): copy per-step times from the
4574         BuildProgress too
4575         (Expectations.expectedBuildTime): new method for per-build ETA
4577         * buildbot/status/event.py (Logfile): move some flags to
4578         class-level attributes
4579         (Logfile.logProgressTo): better method name, let step set the
4580         progress axis name (instead of always being "output")
4582         * buildbot/status/builder.py (BuildStepStatus.getTimes): track the
4583         times directly, rather than depending upon the (possibly missing)
4584         .progress object. Use 'None' to indicate "not started/finished
4585         yet"
4586         (BuildStepStatus.getExpectations): oops, return the full list of
4587         expectations
4588         (BuilderStatus._buildFinished): append finished builds to .builds
4590         * buildbot/process/step.py (BuildStep): add separate .useProgress
4591         flag, since empty .progressMetrics[] still implies that time is a
4592         useful predictor
4593         (CVS): set up the cmd in __init__, instead of waiting for start()
4595         * buildbot/process/base.py (Build.startBuild): disable the 'when'
4596         calculation, this will eventually turn into a proper sourceStamp
4597         (Build.setupBuild): tell the Progress to load from the Expectations,
4598         instead of having the Expectations stuff things into the Progress
4599         (Build.buildException): add a build-level errback to make sure the
4600         build's Deferred fires even in case of exceptions
4602         * buildbot/master.py (BotMaster.forceBuild): convey the reason into
4603         the forced build
4604         * buildbot/process/builder.py (Builder.forceBuild): convey the
4605         reason instead of creating a fake Change
4607         * docs/examples/twisted_master.cfg: update to match reality
4609         * buildbot/test/test_config.py, buildbot/test/test_process.py:
4610         * buildbot/test/test_run.py, buildbot/test/test_steps.py:
4611         fix or remove broken/breaking tests
4613         * buildbot/status/event.py (Logfile.__len__): remove evil method
4615         * buildbot/status/builder.py (BuildStepStatus.stepStarted): tolerate
4616         missing .build, for test convenience
4618         * buildbot/process/step_twisted.py: import fixes
4620         * buildbot/process/step.py (BuildStep.failed): exception is FAILURE
4622         * buildbot/master.py (BuildMaster.loadConfig_Builders): leftover
4623         .statusbag reference
4625         * buildbot/bot.py (BuildSlave.stopService): tear down the TCP
4626         connection at shutdown, and stop it from reconnecting
4628         * buildbot/test/test_run.py (Run.testSlave): use a RemoteDummy to
4629         chase down remote-execution bugs
4631         * buildbot/process/step.py: more fixes, remove
4632         BuildStep.setStatus()
4633         * buildbot/status/builder.py: move setStatus() functionality into
4634         BuildStatus.addStep
4635         * buildbot/status/event.py: minor fixes
4637 2004-08-03  Brian Warner  <warner@lothar.com>
4639         * buildbot/process/base.py, buildbot/process/builder.py
4640         * buildbot/process/step.py, buildbot/status/builder.py
4641         * buildbot/status/event.py, buildbot/test/test_run.py:
4642         fix status delivery, get a basic test case working
4643         * buildbot/master.py: finish implementing basic status delivery,
4644         temporarily disable HTML/IRC/PB status sources
4646         * buildbot/bot.py (Bot.remote_setBuilderList): remove debug noise
4648         * buildbot/status/progress.py (BuildProgress): remove dead code
4650         * buildbot/interfaces.py
4651         * buildbot/process/base.py, buildbot/process/builder.py
4652         * buildbot/process/step.py, buildbot/process/step_twisted.py
4653         * buildbot/status/builder.py: Complete overhaul of the all
4654         status-delivery code, unifying all types of status clients (HTML,
4655         IRC, PB). See interfaces.IBuildStatus for an idea of what it will
4656         look like. This commit is a checkpointing of the work-in-progress:
4657         the input side is mostly done (Builders/Builds sending status
4658         to the BuilderStatus/BuildStatus objects), but the output side has
4659         not yet been started (HTML resources querying BuilderStatus
4660         objects). Things are probably very broken right now and may remain
4661         so for several weeks, I apologize for the disruption.
4663         * buildbot/status/event.py: add a setHTML method to use pre-rendered
4664         HTML as the log's contents. Currently used for exception tracebacks.
4665         * buildbot/status/progress.py: minor spelling changes
4667 2004-08-02  Brian Warner  <warner@lothar.com>
4669         * docs/config.xhtml: XHTML fixes, makes raw .xhtml files viewable
4670         in mozilla. Also added stylesheets copied from Twisted's docs.
4671         Remember that these files are meant to be run through Lore first.
4672         Thanks to Philipp Frauenfelder for the fixes.
4673         * docs/factories.xhtml, docs/sources.xhtml, docs/steps.xhtml: same
4674         * docs/stylesheet-unprocessed.css, docs/stylesheet.css: same
4675         * docs/template.tpl: added a Lore template
4677 2004-07-29  Brian Warner  <warner@lothar.com>
4679         * buildbot/interfaces.py: revamp status delivery. This is the
4680         preview: these are the Interfaces that will be provided by new
4681         Builder code, and to which the current HTML/IRC/PB status
4682         displayers will be adapted.
4684         * buildbot/slavecommand.py (ShellCommand.start): look for .usePTY
4685         on the SlaveBuilder, not the Bot.
4686         * buildbot/bot.py (Bot.remote_setBuilderList): copy Bot.usePTY to
4687         SlaveBuilder.usePTY
4688         * buildbot/test/test_slavecommand.py (FakeSlaveBuilder.usePTY):
4689         set .usePTY on the FakeSlaveBuilder
4691 2004-07-25  Brian Warner  <warner@lothar.com>
4693         * buildbot/changes/freshcvs.py: add some debug log messages
4694         (FreshCVSConnectionFactory.gotPerspective): pre-emptively fix the
4695         disabled 'setFilter' syntax
4696         (FreshCVSSourceNewcred.__init__): warn about prefix= values that
4697         don't end with a slash
4699         * buildbot/process/base.py (Builder._pong_failed): add TODO note
4701         * setup.py: bump to 0.5.0+ while between releases
4703 2004-07-23  Brian Warner  <warner@lothar.com>
4705         * setup.py (version): Releasing buildbot-0.5.0
4707 2004-07-23  Brian Warner  <warner@lothar.com>
4709         * README: update for 0.5.0 release
4711         * NEWS: update for 0.5.0 release
4713 2004-07-22  Brian Warner  <warner@lothar.com>
4715         * buildbot/slavecommand.py (ShellCommand): make usePTY a
4716         mktap-time configuration flag (--usepty=1, --usepty=0)
4717         * buildbot/bot.py: same
4719         * buildbot/master.py (BotPerspective.got_dirs): don't complain about
4720         an 'info' directory being unwanted
4722         * buildbot/changes/freshcvs.py (FreshCVSSource): flip the
4723         newcred/oldcred switch. Newcred (for CVSToys-1.0.10 and later) is now
4724         the default. To communicate with an oldcred daemond (CVSToys-1.0.9
4725         and earlier), use a FreshCVSSourceOldcred instead.
4726         (test): simple test routine: connect to server, print changes
4728         * buildbot/changes/changes.py (Change.getTime): make it possible
4729         to print un-timestamped changes
4731         * buildbot/master.py (makeApp): delete ancient dead code
4732         (BuildMaster.loadTheConfigFile): make "master.cfg" name configurable
4733         * buildbot/test/test_config.py (testFindConfigFile): test it
4735         * docs/examples/twisted_master.cfg (b22w32): use iocp reactor
4736         instead of win32 one
4739         * buildbot/master.py (BuildMaster.loadConfig_Builders): config file
4740         now takes a dictionary instead of a tuple. See docs/config.xhtml for
4741         details.
4743         * buildbot/process/base.py (Builder.__init__): change constructor
4744         to accept a dictionary of config data, rather than discrete
4745         name/slave/builddir/factory arguments
4747         * docs/examples/twisted_master.cfg: update to new syntax
4748         * docs/examples/glib_master.cfg: same
4749         * buildbot/test/test_config.py (ConfigTest.testBuilders): some
4750         rough tests of the new syntax
4752         
4753         * buildbot/master.py (BuildMaster.loadConfig): allow webPathname
4754         to be an int, which means "run a web.distrib sub-server on a TCP
4755         port". This lets you publish the buildbot status page to a remote
4756         twisted.web server (using distrib.ResourceSubscription). Also
4757         rename the local attributes used to hold these web things so
4758         they're more in touch with reality.
4759         * buildbot/test/test_web.py: test webPortnum and webPathname
4760         * docs/config.xhtml: document this new use of webPathname
4762         * docs/config.xhtml: new document, slightly ahead of reality
4763         
4764         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred.notify): fix
4765         'prefix' handling: treat it as a simple string to check with
4766         .startswith, instead of treating it as a directory. This allows
4767         sub-directories to be used. If you use prefix=, you should give it
4768         a string that starts just below the CVSROOT and ends with a slash.
4769         This prefix will be stripped from all filenames, and filenames
4770         which do not start with it will be ignored.
4772 2004-07-20  Cory Dodt  <corydodt@twistedmatrix.com>
4774         * contrib/svn_buildbot.py: Add --include (synonym for --filter)
4775         and --exclude (inverse of --include).  SVN post-commit hooks
4776         now have total control over which changes get sent to buildbot and which
4777         do not.
4779 2004-07-10  Brian Warner  <warner@lothar.com>
4781         * buildbot/test/test_twisted.py (Case1.testCountFailedTests): fix
4782         test case to match new API
4784         * buildbot/status/event.py (Logfile.getEntries): fix silly bug
4785         which crashed HTML display when self.entries=[] (needed to
4786         distinguish between [], which means "no entries yet", and None,
4787         which means "the entries have been swapped out to disk, go fetch
4788         them").
4790 2004-07-04  Brian Warner  <warner@lothar.com>
4792         * buildbot/process/step_twisted.py (countFailedTests): Count
4793         skips, expectedFailures, and unexpectedSuccesses. Start scanning
4794         10kb from the end because any import errors are wedged there and
4795         they would make us think the test log was unparseable.
4796         (RunUnitTests.finishStatus): add skip/todo counts to the event box
4798 2004-06-26  Brian Warner  <warner@lothar.com>
4800         * buildbot/process/step_twisted.py (RemovePYCs): turn the
4801         delete-*.pyc command into an actual BuildStep, so we can label it
4802         nicely
4803         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
4804         (FullTwistedBuildFactory): same
4806 2004-06-25  Cory Dodt  <corydodt@twistedmatrix.com>
4808         * contrib/fakechange.py: Add an errback when sending the fake 
4809         change, so we know it didn't work.
4811 2004-06-25  Christopher Armstrong  <radix@twistedmatrix.com>
4813         * buildbot/process/step_twisted.py: Delete *.pyc files before
4814         calling trial, so it doesn't catch any old .pyc files whose .py
4815         files have been moved or deleted.
4817         * buildbot/process/step_twisted.py (RunUnitTests): 1) Add a new
4818         parameter, 'recurse', that passes -R to trial. 2) have 'runAll'
4819         imply 'recurse'. 3) Make the default 'allTests' be ["twisted"]
4820         instead of ["twisted.test"], so that the end result is "trial -R
4821         twisted".
4823         * contrib/svn_buildbot.py: Add a --filter parameter that accepts a
4824         regular expression to match filenames that should be ignored when
4825         changed. Also add a --revision parameter that specifies the
4826         revision to examine, which is useful for debugging.
4828 2004-06-25  Brian Warner  <warner@lothar.com>
4830         * buildbot/process/step_twisted.py (trialTextSummarizer): create a
4831         summary of warnings (like DeprecationWarnings), next to the
4832         "summary" file
4834 2004-05-13  Brian Warner  <warner@lothar.com>
4836         * docs/examples/twisted_master.cfg: enable the win32 builder, as
4837         we now have a w32 build slave courtesy of Mike Taylor.
4839         * buildbot/process/base.py (Build.checkInterlocks): OMG this was
4840         so broken. Fixed a race condition that tripped up interlocked
4841         builds and caused the status to be stuck at "Interlocked" forever.
4842         The twisted buildbot's one interlocked build just so happened to
4843         never hit this case until recently (the feeding builds both pass
4844         before the interlocked build is attempted.. usually it has to wait
4845         a while).
4846         (Builder._pong_failed): fix method signature
4848         * setup.py: bump to 0.4.3+ while between releases
4850 2004-04-30  Brian Warner  <warner@lothar.com>
4852         * setup.py (version): Releasing buildbot-0.4.3
4854 2004-04-30  Brian Warner  <warner@lothar.com>
4856         * MANIFEST.in: add the doc fragments in  docs/*.xhtml
4858         * README: update for 0.4.3 release
4860         * NEWS: update for 0.4.3 release
4862         * buildbot/master.py (BuildMaster.__getstate__): make sure
4863         Versioned.__getstate__ is invoked, for upgrade from 0.4.2
4865         * buildbot/process/step_twisted.py (RunUnitTests.trial): add
4866         .trial as a class attribute, for upgrade from 0.4.2
4868         * buildbot/changes/changes.py (Change.links): add .links for
4869         upgrade from 0.4.2
4871         * buildbot/status/event.py (Logfile.__getstate__): get rid of both
4872         .textWatchers and .htmlWatchers at save time, since they are both
4873         volatile, should allow smooth 0.4.2 upgrade
4875         * buildbot/process/step.py (CVS.finishStatus): catch failed
4876         CVS/SVN commands so we can make the status box red
4878 2004-04-29  Brian Warner  <warner@lothar.com>
4880         * buildbot/changes/freshcvs.py
4881         (FreshCVSConnectionFactory.gotPerspective): add (commented-out)
4882         code to do setFilter(), which tells the freshcvs daemon to not
4883         send us stuff that we're not interested in. I will uncomment it
4884         when a new version of CVSToys is available in which setFilter()
4885         actually works, and I get a chance to test it better.
4887         * docs/examples/twisted_master.cfg: start using a PBChangeSource
4889         * buildbot/master.py (Dispatcher): use a registration scheme
4890         instead of hardwired service names
4891         (BuildMaster): keep track of the Dispatcher to support
4892         registration
4894         * buildbot/changes/changes.py (ChangeMaster): create a distinct
4895         PBChangeSource class instead of having it be an undocumented
4896         internal feature of the ChangeMaster. Split out the code into a
4897         new file.
4898         * buildbot/changes/pb.py (PBChangeSource): same
4899         * buildbot/test/test_changes.py: a few tests for PBChangeSource
4901         * docs/{factories|sources|steps}.xhtml: document some pieces
4903         * docs/examples/twisted_master.cfg: use SVN instead of CVS, stop
4904         using FCMaildirSource
4905         (f23osx): update OS-X builder to use python2.3, since the slave
4906         was updated to Panther (10.3.3)
4908 2004-03-21  Brian Warner  <warner@lothar.com>
4910         * buildbot/process/process_twisted.py: factor out doCheckout, change
4911         to use SVN instead of CVS
4913         * buildbot/process/base.py (BasicBuildFactory): refactor to make
4914         an SVN subclass easier
4915         (BasicSVN): subclass which uses Subversion instead of CVS
4917 2004-03-15  Christopher Armstrong  <radix@twistedmatrix.com>
4919         * buildbot/slavecommand.py (ShellCommand.start): use COMSPEC instead
4920         of /bin/sh on win32
4921         (CVSCommand.cvsComplete): don't assume chdir worked on win32
4923 2004-02-25  Brian Warner  <warner@lothar.com>
4925         * buildbot/slavecommand.py (ShellCommand): ['commands'] argument
4926         is now either a list (which is passed to spawnProcess directly) or
4927         a string (which gets passed to /bin/sh -c). This removes the useSH
4928         flag and the ArgslistCommand class. Also send status header at the
4929         start and end of each command, instead of having the master-side
4930         code do that.
4931         (CVSCommand): fix the doUpdate command, it failed to do the 'cp
4932         -r'. Update to use list-based arguments.
4933         (SVNFetch): use list-based arguments, use ['dir'] argument to
4934         simplify code.
4935         * buildbot/test/test_steps.py (Commands): match changes
4937         * buildbot/process/step.py (InternalShellCommand.words): handle
4938         command lists
4939         (SVN): inherit from CVS, cleanup
4941         * buildbot/status/event.py (Logfile.content): render in HTML, with
4942         stderr in red and headers (like the name of the command we're
4943         about to run) in blue. Add link to a second URL (url + "?text=1")
4944         to get just stdout/stderr in text/plain without markup. There is
4945         still a problem with .entries=None causing a crash, it seems to occur
4946         when the logfile is read before it is finished.
4948         * buildbot/bot.py (BotFactory.doKeepalive): add a 30-second
4949         timeout to the keepalives, and use it to explicitly do a
4950         loseConnection instead of waiting for TCP to notice the loss. This
4951         ought to clear up the silent-lossage problem.
4952         (unsafeTracebacks): pass exception tracebacks back to the master,
4953         makes it much easier to debug problems
4955 2004-02-23  Brian Warner  <warner@lothar.com>
4957         * buildbot/slavecommand.py (ShellCommand): add useSH flag to pass
4958         the whole command to /bin/sh instead of execve [Johan Dahlin]
4959         (CVSCommand): drop '-r BRANCH' if BRANCH==None instead of usiing
4960         '-r HEAD' [Johan Dahlin]
4961         (CVSCommand.start2): fix cvsdir calculation [Johan Dahlin]
4963         * buildbot/changes/changes.py (Change): add links= argument, add
4964         asHTML method [Johan Dahlin]. Modified to make a bit more
4965         XHTMLish. Still not sure how to best use links= .
4967         * buildbot/status/html.py (StatusResourceCommits.getChild): use 
4968         Change.asHTML to display the change, not asText
4970         * buildbot/status/html.py (StatusResourceBuilder): web button to
4971         ping slave
4973         * buildbot/test/test_run.py: test to actually start a buildmaster
4974         and poke at it
4976         * MANIFEST.in: bring back accidentally-dropped test helper files
4978         * buildbot/test/test_config.py (ConfigTest.testSources): skip tests
4979         that require cvstoys if it is not installed
4981         * buildbot/process/step_twisted.py (RunUnitTests): allow other
4982         values of "bin/trial" [Dave Peticolas]
4983         (RunUnitTests.finishStatus): say "no tests run" instead of "0
4984         tests passed" when we didn't happen to run any tests
4986         * buildbot/process/step.py (Compile): use haltOnFailure instead of
4987         flunkOnFailure [Johan Dahlin]
4989         * buildbot/process/base.py (ConfigurableBuild.setSteps): allow
4990         multiple instances of the same Step class by suffixing "_2", etc,
4991         to the name until it is unique. This name needs to be unique
4992         because it is used as a key in the dictionary that tracks build
4993         progress.
4994         * buildbot/test/test_steps.py (Steps.testMultipleStepInstances):
4995         add test for it
4997         * buildbot/process/base.py (Builder.ping): add "ping slave" command
4999 2004-01-14  Brian Warner  <warner@lothar.com>
5001         * buildbot/status/words.py (IrcStatusBot): when we leave or get
5002         kicked from a channel, log it
5004         * buildbot/master.py (Dispatcher): add "poke IRC" command to say
5005         something over whatever IRC channels the buildmaster is currently
5006         connected to. Added to try and track down a problem in which the
5007         master thinks it is still connected but the IRCd doesn't see it. I
5008         used a styles.Versioned this time, so hopefully users won't have
5009         to rebuild their .tap files this time.
5010         * contrib/debug.glade: add a "Poke IRC" button
5011         * contrib/debugclient.py: same
5013         * setup.py: bump to 0.4.2+ while between releases
5015 2004-01-08  Brian Warner  <warner@lothar.com>
5017         * setup.py (version): Releasing buildbot-0.4.2
5019 2004-01-08  Brian Warner  <warner@lothar.com>
5021         * NEWS: update for 0.4.2 release
5023         * README: document how to run the tests, now that they all pass
5025         * buildbot/changes/maildir.py (Maildir.poll): minor comment
5027         * buildbot/process/step.py (CVS): add a global_options= argument,
5028         which lets you set CVS global options for the command like "-r"
5029         for read-only checkout, or "-R" to avoid writing in the
5030         repository.
5031         * buildbot/slavecommand.py (CVSCommand): same
5033         * buildbot/status/event.py (Logfile): add a .doSwap switch to make
5034         testing easier (it is turned off when testing, to avoid the
5035         leftover timer)
5037         * buildbot/process/step.py (InternalBuildStep): shuffle code a bit
5038         to make it easier to test: break generateStepID() out to a
5039         separate function, only update statusbag if it exists.
5040         (ShellCommands): create useful text for dict-based commands too.
5042         * test/*, buildbot/test/*: move unit tests under the buildbot/
5043         directory
5044         * setup.py (packages): install buildbot.test too
5046         * buildbot/test/test_slavecommand.py: fix it, tests pass now
5047         * buildbot/test/test_steps.py: fix it, tests pass now
5049 2004-01-06  Brian Warner  <warner@lothar.com>
5051         * buildbot/changes/mail.py (parseFreshCVSMail): looks like new
5052         freshcvs mail uses a slightly different syntax for new
5053         directories. Update parser to handle either.
5054         * test/test_mailparse.py (Test1.testMsg9): test for same
5056 2003-12-21  Brian Warner  <warner@lothar.com>
5058         * buildbot/process/process_twisted.py (TwistedDebsBuildFactory): set
5059         'warnOnWarnings' so that lintian errors mark the build orange
5061 2003-12-17  Brian Warner  <warner@lothar.com>
5063         * buildbot/changes/mail.py (parseBonsaiMail): parser for commit
5064         messages emitted by Bonsai, contributed by Stephen Davis.
5066         * test/*: moved all tests to use trial instead of unittest. Some
5067         still fail (test_steps, test_slavecommand, and test_process).
5069         * setup.py (version): bump to 0.4.1+ while between releases
5071 2003-12-09  Brian Warner  <warner@lothar.com>
5073         * setup.py (version): Releasing buildbot-0.4.1
5075 2003-12-09  Brian Warner  <warner@lothar.com>
5077         * NEWS: update for 0.4.1 release
5079         * docs/examples/twisted_master.cfg: add netbsd builder, shuffle
5080         freebsd builder code a little bit
5082         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred.__cmp__):
5083         don't try to compare attributes of different classes
5084         * buildbot/changes/mail.py (MaildirSource.__cmp__): same
5085         (MaildirSource.messageReceived): fix Change delivery
5087         * buildbot/master.py (BuildMaster.loadConfig): insert 'basedir'
5088         into the config file's namespace before loading it, like the
5089         documentation claims it does
5090         * docs/examples/twisted_master.cfg: remove explicit 'basedir'
5091         (useFreshCVS): switch to using a maildir until Twisted's freshcvs
5092         daemon comes back online
5094 2003-12-08  Brian Warner  <warner@lothar.com>
5096         * docs/examples/twisted_master.cfg: provide an explicit 'basedir'
5097         so the example will work with online=0 as well
5099         * buildbot/changes/mail.py (FCMaildirSource, SyncmailMaildirSource):
5100         fix the __implements__ line
5102         * buildbot/changes/maildirtwisted.py (MaildirTwisted): make this
5103         class a twisted.application.service.Service, use startService to
5104         get it moving.
5106         * buildbot/changes/dnotify.py (DNotify): use os.open to get the
5107         directory fd instead of simple open(). I'm sure this used to work,
5108         but the current version of python refuses to open directories with
5109         open().
5111 2003-12-05  Brian Warner  <warner@lothar.com>
5113         * setup.py (version): bump to 0.4.0+ while between releases
5115 2003-12-05  Brian Warner  <warner@lothar.com>
5117         * setup.py (version): Releasing buildbot-0.4.0
5119 2003-12-05  Brian Warner  <warner@lothar.com>
5121         * docs/examples/glib_master.cfg: replace old sample scripts with
5122         new-style config files
5123         * MANIFEST.in: include .cfg files in distribution tarball
5125         * buildbot/changes/freshcvs.py (FreshCVSListener.remote_goodbye):
5126         implement a dummy method to avoid the exception that occurs when
5127         freshcvs sends this to us.
5129         * buildbot/pbutil.py (ReconnectingPBClientFactory.stopFactory):
5130         removed the method, as it broke reconnection. Apparently
5131         stopFactory is called each time the connection attempt fails. Must
5132         rethink this.
5133         (ReconnectingPBClientFactory.__getstate__): squash the _callID
5134         attribute before serialization, since without stopFactory the
5135         reconnect timer may still be active and they aren't serializable.
5137         * test/test_mailparse.py (ParseTest): test with 'self' argument
5139         * buildbot/changes/mail.py (parseFreshCVSMail): add (silly) 'self'
5140         argument, as these "functions" are invoked like methods from class
5141         attributes and therefore always get an instance as the first
5142         argument.
5144         * buildbot/changes/maildir.py (Maildir.start): fix error in error
5145         message: thanks to Stephen Davis for the catch
5147 2003-12-04  Brian Warner  <warner@lothar.com>
5149         * buildbot/pbutil.py: complete rewrite using PBClientFactory and
5150         twisted's standard ReconnectingClientFactory. Handles both oldcred
5151         and newcred connections. Also has a bug-workaround for
5152         ReconnectingClientFactory serializing its connector when it
5153         shouldn't.
5155         * buildbot/bot.py (BotFactory): rewrite connection layer with new
5156         pbutil. Replace makeApp stuff with proper newcred/mktap
5157         makeService(). Don't serialize Ephemerals on shutdown.
5159         * buildbot/changes/changes.py (ChangeMaster): make it a
5160         MultiService and add the sources as children, to get startService
5161         and stopService for free. This also gets rid of the .running flag.
5163         * buildbot/changes/freshcvs.py (FreshCVSSource): rewrite to use
5164         new pbutil, turn into a TCPClient at the same time (to get
5165         startService for free). Two variants exist: FreshCVSSourceOldcred
5166         and FreshCVSSourceNewcred (CVSToys doesn't actualy support newcred
5167         yet, but when it does, we'll be ready).
5168         (FreshCVSSource.notify): handle paths which are empty after the
5169         prefix is stripped. This only happens when the top-level (prefix)
5170         directory is added, at the very beginning of a Repository's life.
5172         * buildbot/clients/base.py: use new pbutil, clean up startup code.
5173         Now the only reconnecting code is in the factory where it belongs.
5174         (Builder.unsubscribe): unregister the disconnect callback when we
5175         delete the builder on command from the master (i.e. when the
5176         buildmaster is reconfigured and that builder goes away). This
5177         fixes a multiple-delete exception when the status client is shut
5178         down afterwards.
5179         * buildbot/clients/gtkPanes.py (GtkClient): cleanup, match the
5180         base Client. 
5182         * buildbot/status/words.py (IrcStatusBot): add some more sillyness
5183         (IrcStatusBot.getBuilderStatus): fix minor exception in error message
5185 2003-10-20  Christopher Armstrong  <radix@twistedmatrix.com>
5187         * contrib/run_maxq.py: Accept a testdir as an argument rather than
5188         a list of globs (ugh). The testdir will be searched for files
5189         named *.tests and run the tests in the order specified in each of
5190         those files. This allows for "dependancies" between tests to be
5191         codified.
5193         * buildbot/process/maxq.py (MaxQ.__init__): Accept a testdir
5194         argument to pass to run_maxq.py, instead of a glob.
5196 2003-10-17  Brian Warner  <warner@lothar.com>
5198         * buildbot/process/step_twisted.py (HLint.start): ignore .xhtml
5199         files that live in the sandbox
5201 2003-10-15  Brian Warner  <warner@lothar.com>
5203         * buildbot/process/step_twisted.py (ProcessDocs.finished): fix
5204         spelling error in "docs" count-warnings output
5205         (HLint.start): stupid thinko meant .xhtml files were ignored
5207         * docs/examples/twisted_master.cfg (reactors): disable cReactor
5208         tests now that cReactor is banished to the sandbox
5210 2003-10-10  Brian Warner  <warner@lothar.com>
5212         * buildbot/process/step_twisted.py (ProcessDocs, HLint): new Twisted
5213         scheme: now .xhtml are sources and .html are generated
5215 2003-10-08  Brian Warner  <warner@lothar.com>
5217         * buildbot/process/step_twisted.py (RunUnitTests.__init__): oops,
5218         we were ignoring the 'randomly' parameter.
5220 2003-10-01  Brian Warner  <warner@lothar.com>
5222         * buildbot/slavecommand.py (ShellCommand.start): set usePTY=1 on
5223         posix, to kill sub-children of aborted slavecommands.
5225         * buildbot/status/builder.py: rename Builder to BuilderStatus.
5226         Clean up initialization: lastBuildStatus remains None until the
5227         first build has been completed.
5229         * buildbot/status/html.py (WaterfallStatusResource.body): handle
5230         None as a lastBuildStatus
5231         * buildbot/clients/gtkPanes.py: same
5233         * buildbot/status/client.py (StatusClientService): keep
5234         BuilderStatus objects in self.statusbags . These objects now live
5235         here in the StatusClientService and are referenced by the Builder
5236         object, rather than the other way around.
5237         * buildbot/status/words.py (IrcStatusBot.getBuilderStatus): same
5238         * buildbot/process/base.py (Builder): same
5239         * test/test_config.py (ConfigTest.testBuilders): same
5241         * buildbot/master.py (BuildMaster.loadConfig_Builders): when modifying
5242         an existing builder, leave the statusbag alone. This will preserve the
5243         event history.
5245         * buildbot/pbutil.py (ReconnectingPB.connect): add initial newcred
5246         hook. This will probably go away in favor of a class in upcoming
5247         Twisted versions.
5249         * buildbot/changes/freshcvs.py (FreshCVSSource.start): Remove old
5250         serviceName from newcred FreshCVSNotifiee setup
5252 2003-09-29  Brian Warner  <warner@lothar.com>
5254         * buildbot/process/process_twisted.py: switch to new reactor
5255         abbreviations
5256         * docs/examples/twisted_master.cfg: same
5258         * README (REQUIREMENTS): mention twisted-1.0.8a3 requirement
5260         * buildbot/status/words.py (IrcStatusBot.getBuilder): use the
5261         botmaster reference instead of the oldapp service lookup
5263         * buildbot/master.py (BuildMaster.__init__): give the
5264         StatusClientService a reference to the botmaster to make it easier to
5265         force builds
5267 2003-09-24  Christopher Armstrong  <radix@twistedmatrix.com>
5269         * buildbot/status/html.py (Box.td): escape hreffy things so you
5270         can have spaces in things like builder names
5271         (StatusResourceBuilder.body)
5272         (WaterfallStatusResource.body)
5273         (WaterfallStatusResource.body0): same
5275 2003-09-25  Brian Warner  <warner@lothar.com>
5277         * buildbot/master.py (BuildMaster.loadConfig_Builders): don't
5278         rearrange the builder list when adding or removing builders: keep
5279         them in the order the user requested.
5280         * test/test_config.py (ConfigTest.testBuilders): verify it
5282         * contrib/debug.glade: give the debug window a name
5284         * buildbot/process/base.py (Builder.buildTimerFired): builders can
5285         now wait on multiple interlocks. Fix code relating to that.
5286         (Builder.checkInterlocks): same
5287         * buildbot/status/builder.py (Builder.currentlyInterlocked): same
5289         * buildbot/master.py (BuildMaster.loadConfig): move from
5290         deprecated pb.BrokerFactory to new pb.PBServerFactory
5291         * test/test_config.py (ConfigTest.testWebPathname): same
5293         * docs/examples/twisted_master.cfg: fix interlock declaration
5295         * buildbot/master.py (BotMaster.addInterlock): move code to attach
5296         Interlocks to their Builders into interlock.py .
5297         (BuildMaster.loadConfig_Interlocks): fix interlock handling
5299         * test/test_config.py (ConfigTest.testInterlocks): validate
5300         interlock handling
5302         * buildbot/process/base.py (Builder.__init__): better comments
5303         * buildbot/process/interlock.py (Interlock.__repr__): same
5304         (Interlock.deactivate): add .active flag, move the code that
5305         attaches/detaches builders into the Interlock
5307 2003-09-24  Christopher Armstrong  <radix@twistedmatrix.com>
5309         * buildbot/process/maxq.py (MaxQ): support for running a set of MaxQ
5310         tests using the new run_maxq.py script, and reporting failures by
5311         parsing its output.
5313         * contrib/run_maxq.py: Hacky little script for running a set of maxq
5314         tests, reporting their success or failure in a buildbot-friendly 
5315         manner.
5317 2003-09-24  Brian Warner  <warner@lothar.com>
5319         * docs/examples/twisted_master.cfg: example of a new-style config
5320         file. This lives in the buildmaster base directory as
5321         "master.cfg".
5323         * contrib/debugclient.py (DebugWidget.do_rebuild): add 'reload'
5324         button to make the master re-read its config file
5326         * buildbot/master.py (BuildMaster.loadConfig): new code to load
5327         buildmaster configuration from a file. This file can be re-read
5328         later, and the buildmaster will update itself to match the new
5329         desired configuration. Also use new Twisted Application class.
5330         * test/Makefile, test/test_config.py: unit tests for same
5332         * buildbot/changes/freshcvs.py (FreshCVSSource.__cmp__): make
5333         FreshCVSSources comparable, to support reload.
5334         * buildbot/changes/mail.py (MaildirSource.__cmp__): same
5336         * buildbot/process/base.py (Builder): make them comparable, make
5337         Interlocks easier to attach, to support reload. Handle
5338         re-attachment of remote slaves.
5339         * buildbot/process/interlock.py (Interlock): same
5341         * buildbot/bot.py, bb_tap.py, changes/changes.py: move to
5342         Twisted's new Application class. Requires Twisted >= 1.0.8 .
5343         buildmaster taps are now constructed with mktap.
5344         * buildbot/status/client.py (StatusClientService): same
5346         * buildbot/status/words.py: move to new Services, add support to
5347         connect to multiple networks, add reload support, allow nickname
5348         to be configured on a per-network basis
5350 2003-09-20  Brian Warner  <warner@lothar.com>
5352         * docs/examples/twisted_master.py (twisted_app): use python2.3 for
5353         the freebsd builder, now that the machine has been upgraded and no
5354         longer has python2.2
5356         * setup.py (version): bump to 0.3.5+ while between releases
5358 2003-09-19  Brian Warner  <warner@lothar.com>
5360         * setup.py (version): Releasing buildbot-0.3.5
5362 2003-09-19  Brian Warner  <warner@lothar.com>
5364         * NEWS: add post-0.3.4 notes
5366         * README (REQUIREMENTS): note twisted-1.0.7 requirement
5368         * MANIFEST.in: add contrib/*
5370         * docs/examples/twisted_master.py (twisted_app): all build slaves must
5371         use a remote root now: cvs.twistedmatrix.com
5373         * buildbot/changes/freshcvs.py (FreshCVSNotifiee.connect): update
5374         to newcred
5375         (FreshCVSNotifieeOldcred): but retain a class that uses oldcred for
5376         compatibility with old servers
5377         (FreshCVSSource.start): and provide a way to use it
5378         (FreshCVSNotifiee.disconnect): handle unconnected notifiee
5380         * docs/examples/twisted_master.py (twisted_app): update to new
5381         makeApp interface.
5382         (twisted_app): listen on new ~buildbot socket
5383         (twisted_app): Twisted CVS has moved to cvs.twistedmatrix.com
5385         * buildbot/process/process_twisted.py: Use 'copydir' on CVS steps
5386         to reduce cvs bandwidth (update instead of full checkout)
5388 2003-09-11  Brian Warner  <warner@lothar.com>
5390         * contrib/fakechange.py: demo how to connect to the changemaster
5391         port. You can use this technique to submit changes to the
5392         buildmaster from source control systems that offer a hook to run a
5393         script when changes are committed.
5395         * contrib/debugclient.py: tool to connect to the debug port. You
5396         can use it to force builds, submit fake changes, and wiggle the
5397         builder state
5399         * buildbot/master.py: the Big NewCred Reorganization. Use a single
5400         'Dispatcher' realm to handle all the different kinds of
5401         connections and Perspectives: buildslaves, the changemaster port,
5402         the debug port, and the status client port. NewCredPerspectives
5403         now have .attached/.detached methods called with the remote 'mind'
5404         reference, much like old perspectives did. All the pb.Services
5405         turned into ordinary app.ApplicationServices .
5406         (DebugService): went away, DebugPerspectives are now created
5407         directly by the Dispatcher.
5408         (makeApp): changed interface a little bit
5410         * buildbot/changes/changes.py: newcred
5411         * buildbot/status/client.py: newcred
5413         * buildbot/clients/base.py: newcred client side changes
5414         * buildbot/bot.py: ditto
5416         * docs/examples/glib_master.py: handle new makeApp() interface
5417         * docs/examples/twisted_master.py: ditto
5419         * buildbot/pbutil.py (NewCredPerspective): add a helper class to
5420         base newcred Perspectives on. This should go away once Twisted
5421         itself provides something sensible.
5424 2003-09-11  Christopher Armstrong  <radix@twistedmatrix.com>
5426         * contrib/svn_buildbot.py: A program that you can call from your
5427         SVNREPO/hooks/post-commit file that will notify a BuildBot master
5428         when a change in an SVN repository has happened. See the top of
5429         the file for some minimal usage info.
5431 2003-09-10  Christopher Armstrong  <radix@twistedmatrix.com>
5433         * buildbot/slavecommand.py (ArglistCommand): Add new
5434         ArglistCommand that takes an argument list rather than a string as
5435         a parameter. Using a st.split() for argv is very bad.
5437         * buildbot/slavecommand.py (SVNFetch): Now has the ability to
5438         update to a particular revision rather than always checking out
5439         (still not very smart about it, there may be cases where the
5440         checkout becomes inconsistent).
5442 2003-09-10  Christopher Armstrong  <radix@twistedmatrix.com>
5444         * buildbot/{bot.py,slavecommand.py,process/step.py}: Rudimentary
5445         SVN fetch support. It can checkout (not update!) a specified
5446         revision from a specified repository to a specified directory.
5448         * buildbot/status/progress.py (Expectations.update): Fix an
5449         obvious bug (apparently created by the change described in the
5450         previous ChangeLog message) by moving a check to *after* the
5451         variable it checks is defined.
5454 2003-09-08  Brian Warner  <warner@lothar.com>
5456         * buildbot/status/progress.py (Expectations.update): hack to catch
5457         an exception TTimo sees: sometimes the update() method seems to
5458         get called before the step has actually finished, so the .stopTime
5459         is not set, so no totalTime() is available and we average None
5460         with the previous value. Catch this and just don't update the
5461         metrics, and emit a log message.
5463 2003-08-24  Brian Warner  <warner@lothar.com>
5465         * buildbot/process/base.py (BasicBuildFactory): accept 'cvsCopy'
5466         parameter to set copydir='original' in CVS commands.
5468         * buildbot/process/step.py (CVS): accept 'copydir' parameter.
5470         * buildbot/slavecommand.py (CVSCommand): add 'copydir' parameter,
5471         which tells the command to maintain a separate original-source CVS
5472         workspace. For each build, this workspace will be updated, then
5473         the tree copied into a new workdir. This reduces CVS bandwidth
5474         (from a full checkout to a mere update) while doubling the local
5475         disk usage (to keep two copies of the tree).
5477 2003-08-21  Brian Warner  <warner@lothar.com>
5479         * buildbot/status/event.py (Logfile.addEntry): if the master web
5480         server dies while we're serving a page, request.write raises
5481         pb.DeadReferenceError . Catch this and treat it like a
5482         notifyFinish event by dropping the request.
5484 2003-08-18  Brian Warner  <warner@lothar.com>
5486         * buildbot/status/words.py (IrcStatusBot.command_FORCE): complain
5487         (instead of blowing up) if a force-build command is given without
5488         a reason field
5490         * buildbot/changes/changes.py (ChangeMaster.getChangeNumbered):
5491         don't blow up if there aren't yet any Changes in the list
5493 2003-08-02  Brian Warner  <warner@lothar.com>
5495         * buildbot/bot.py (updateApplication): don't set the .tap name,
5496         since we shouldn't assume we own the whole .tap file
5498         * buildbot/bb_tap.py (updateApplication): clean up code, detect
5499         'mktap buildbot' (without a subcommand) better
5501 2003-07-29  Brian Warner  <warner@lothar.com>
5503         * buildbot/status/words.py
5504         (IrcStatusFactory.clientConnectionLost): when we lose the
5505         connection to the IRC server, schedule a reconnection attempt.
5507         * buildbot/slavecommand.py (CVSCommand.doClobber): on non-posix,
5508         use shutil.rmtree instead of forking off an "rm -rf" command.
5509         rmtree may take a while and will block until it finishes, so we
5510         use "rm -rf" if available.
5512         * docs/examples/twisted_master.py: turn off kqreactor, it hangs
5513         freebsd buildslave badly
5515         * setup.py (version): bump to 0.3.4+ while between releases
5517 2003-07-28  Brian Warner  <warner@lothar.com>
5519         * setup.py (version): Releasing buildbot-0.3.4
5521 2003-07-28  Brian Warner  <warner@lothar.com>
5523         * NEWS: update in preparation for release
5525         * buildbot/slavecommand.py (ShellCommand.doTimeout): use
5526         process.signalProcess instead of os.kill, to improve w32
5527         portability
5529         * docs/examples/twisted_master.py (twisted_app): turn off
5530         win32eventreactor: the tests hang the buildslave badly
5532         * buildbot/process/base.py (Build.buildFinished): update ETA even on
5533         failed builds, since usually the failures are consistent
5535         * buildbot/process/process_twisted.py (TwistedReactorsBuildFactory):
5536         add compileOpts/compileOpts2 to reactors build
5538         * docs/examples/twisted_master.py (twisted_app): add "-c mingw32"
5539         (twisted_app): use both default and win32eventreactor on w32 build.
5540         Use both default and kqreactor on freebsd build.
5542         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
5543         add compileOpts2, which is put after the build_ext argument. w32
5544         needs "-c mingw32" here.
5546         * buildbot/status/html.py (StatusResourceBuilder.getChild): don't
5547         touch .acqpath, it goes away in recent Twisted releases
5549         * docs/examples/twisted_master.py (twisted_app): use "python" for
5550         the w32 buildslave, not "python2.2"
5552         * buildbot/bot.py (Bot.remote_getSlaveInfo): only look in info/ if
5553         the directory exists.. should hush an exception under w32
5555         * buildbot/slavecommand.py (ShellCommandPP.processEnded): use
5556         ProcessTerminated -provided values for signal and exitCode rather
5557         than parsing the unix status code directly. This should remove one
5558         more roadblock for a w32-hosted buildslave.
5560         * test/test_mailparse.py: add test cases for Syncmail parser
5562         * Buildbot/changes/freshcvsmail.py: remove leftover code, leave a
5563         temporary compatibility import. Note! Start importing
5564         FCMaildirSource from changes.mail instead of changes.freshcvsmail
5566         * buildbot/changes/mail.py (parseSyncmail): finish Syncmail parser
5568 2003-07-27  Brian Warner  <warner@lothar.com>
5570         * NEWS: started adding new features
5572         * buildbot/changes/mail.py: start work on Syncmail parser, move
5573         mail sources into their own file
5575         * buildbot/changes/freshcvs.py (FreshCVSNotifiee): mark the class
5576         as implementing IChangeSource
5577         * buildbot/changes/freshcvsmail.py (FCMaildirSource): ditto
5579         * buildbot/interfaces.py: define the IChangeSource interface
5581 2003-07-26  Brian Warner  <warner@lothar.com>
5583         * buildbot/master.py (makeApp): docstring (thanks to Kevin Turner)
5585 2003-06-25  Brian Warner  <warner@lothar.com>
5587         * buildbot/status/words.py (IrcStatusBot.emit_last): round off
5588         seconds display
5590 2003-06-17  Brian Warner  <warner@lothar.com>
5592         * buildbot/status/words.py: clean up method usage to avoid error
5593         in silly IRC command
5594         (IrcStatusBot.emit_status): round off seconds display
5596         * buildbot/process/base.py (Build): delete the timer when saving
5597         to the .tap file, and restore it (if it should still be running)
5598         upon restore. This should fix the "next build in -34 seconds"
5599         messages that result when the master is restarted while builds are
5600         sitting in the .waiting slot. If the time for the build has
5601         already passed, start it very soon (in 1 second).
5603         * buildbot/status/words.py: more silly commands
5605         * README (REQUIREMENTS): add URLs to all required software
5607         * buildbot/status/words.py ('last'): mention results of, and time
5608         since last build
5610 2003-05-28  Brian Warner  <warner@lothar.com>
5612         * buildbot/status/words.py: add 'last' command
5613         (IrcStatusBot.emit_status): add current-small text to 'status' output
5615         * docs/examples/twisted_master.py (twisted_app): turn on IRC bot
5616         (twisted_app): remove spaces from OS-X builder name
5618         * buildbot/master.py (makeApp): add knob to turn on IRC bot
5619         * buildbot/status/words.py: IRC bot should actually be useful now
5621 2003-05-23  Brian Warner  <warner@lothar.com>
5623         * buildbot/bot.py (Bot.remote_getSlaveInfo): add routines to get
5624         "slave information" from $(slavedir)/info/* . These files are
5625         maintained by the slave administrator, and describe the
5626         machine/environment that is hosting the slave. Information from
5627         them is put into the "Builder" HTML page. Still need to establish
5628         a set of well-known filenames and meanings for this data: at the
5629         moment, *all* info/* files are sent to the master, but only
5630         'admin' and 'host' are used on that end.
5631         * buildbot/status/html.py (StatusResourceBuilder.body): ditto
5632         * buildbot/process/base.py (Builder.setRemoteInfo):  ditto
5633         * buildbot/master.py (BotPerspective.got_info):  ditto
5635 2003-05-22  Brian Warner  <warner@lothar.com>
5637         * setup.py (version): bump version to 0.3.3+ while between releases
5639 2003-05-21  Brian Warner  <warner@lothar.com>
5641         * setup.py: Releasing buildbot-0.3.3
5643 2003-05-21  Brian Warner  <warner@lothar.com>
5645         * NEWS: 0.3.3 news items
5647         * README: describe --keepalive and life behind a NAT box
5649         * buildbot/bot.py (Bot.connected): implement application-level
5650         keepalives to deal with NAT timeouts, turn them on with
5651         --keepalive option or when SO_KEEPALIVE doesn't work.
5653         * buildbot/master.py (BotPerspective): accept keepalives silently
5655         * buildbot/process/base.py (Build.buildException): CopiedFailures
5656         don't carry as much information as local ones, so don't try to
5657         create a big HTMLized version of them.
5659         * buildbot/process/step.py (InternalShellCommand.stepFailed): close
5660         log file when step fails due to an exception, such as when the slave
5661         becomes unreachable
5663         * buildbot/process/step_twisted.py (RunUnitTests): use trial's new
5664         --testmodule argument instead of grepping for test-case-name tags
5665         ourselves. Remove FindUnitTests code.
5666         * buildbot/slavecommand.py, buildbot/bot.py: remove old code
5668         * MANIFEST.in: Add docs/examples, files under test/ . Oops!
5670 2003-05-16  Brian Warner  <warner@lothar.com>
5672         * buildbot/process/base.py (BasicBuildFactory): add 'configureEnv'
5673         argument to allow things like CFLAGS=-O0 to be passed without relying
5674         upon /bin/sh processing on the slave.
5676         * buildbot/process/step.py (InternalShellCommand.start): send
5677         'env' dict to slave
5678         * buildbot/slavecommand.py (ShellCommand.start): create argv with
5679         'split' instead of letting /bin/sh do it. This should also remove
5680         the need for /bin/sh on the buildslave, making it more likely to
5681         work with win32.
5683         * buildbot/status/html.py: html-escape text in blamelist.
5684         Add "force build" button to the Builder page.
5686         * buildbot/process/step_twisted.py (countFailedTests): look at
5687         last 1000 characters for status line, as import errors can put it
5688         before the -200 point.
5690 2003-05-15  Brian Warner  <warner@lothar.com>
5692         * docs/examples/twisted_master.py: use clobber=0 for remote builds
5694         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
5695         make 'clobber' a parameter, so it is possible to have builds which
5696         do full tests but do a cvs update instead of hammering the CVS
5697         server with a full checkout each build
5699         * buildbot/process/step.py (InternalShellCommand): bump default
5700         timeout to 20 minutes
5702         * buildbot/bot.py (Bot.debug_forceBuild): utility method to ask
5703         the master to trigger a build. Run it via manhole.
5705         * buildbot/master.py (BotPerspective.perspective_forceBuild):
5706         allow slaves to trigger any build that they host, to make life
5707         easier for slave admins who are testing out new build processes
5709         * buildbot/process/process_twisted.py (TwistedReactorsBuildFactory):
5710         don't flunk cReactor or qtreactor on failure, since they fail alot
5711         these days. Do warnOnFailure instead.
5713         * buildbot/process/base.py: change Builder.buildable from a list
5714         into a single slot. When we don't have a slave, new builds (once
5715         they make it past the timeout) are now merged into an existing
5716         buildable one instead of being queued. With this change, a slave
5717         which has been away for a while doesn't get pounded with all the
5718         builds it missed, but instead just does a single build.
5720 2003-05-07  Brian Warner  <warner@lothar.com>
5722         * setup.py (version): bump version to 0.3.2+ while between releases
5724 2003-05-07  Brian Warner  <warner@lothar.com>
5726         * setup.py: Releasing buildbot-0.3.2
5728 2003-05-07  Brian Warner  <warner@lothar.com>
5730         * setup.py: fix major packaging error: include subdirectories!
5731         
5732         * NEWS: add changes since last release
5734         * README (REQUIREMENTS): update twisted/python dependencies
5736         * buildbot/status/builder.py (Builder.startBuild): change
5737         BuildProcess API: now they should call startBuild/finishBuild
5738         instead of pushing firstEvent / setLastBuildStatus. Moving towards
5739         keeping a list of builds in the statusbag, to support other kinds of
5740         status delivery.
5741         (Builder.addClient): send current-activity-small to new clients
5742         * buildbot/process/base.py (Build.startBuild, .buildFinished): use
5743         new API
5745         * buildbot/status/client.py: drop RemoteReferences at shutdown
5747         * buildbot/status/event.py (Event.stoppedObserving): oops, add it
5749         * buildbot/status/progress.py (BuildProgress.remote_subscribe):
5750         more debug messages for remote status client
5752         * buildbot/process/step.py (InternalBuildStep.stepComplete)
5753         (.stepFailed): only fire the Deferred once, even if both
5754         stepComplete and stepFailed are called. I think this can happen if
5755         an exception occurs at a weird time.
5757         * buildbot/status/words.py: work-in-progress: IRC status delivery
5759 2003-05-05  Brian Warner  <warner@lothar.com>
5761         * docs/examples/twisted_master.py (twisted_app): hush internal
5762         python2.3 distutils deprecation warnings
5763         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
5764         add compileOpts= argument which inserts extra args before the
5765         "setup.py build_ext" command. This can be used to give -Wignore
5766         warnings, to hush some internal python-2.3 deprecation messages.
5768         * buildbot/process/step_twisted.py (RunUnitTests): parameterize
5769         the ['twisted.test'] default test case to make it easier to change
5770         in subclasses
5772         * buildbot/clients/base.py: switch to pb.Cacheable-style Events
5773         * buildbot/clients/gtkPanes.py: ditto
5775         * buildbot/process/step_twisted.py (RunUnitTests): use randomly=
5776         arg to collapse RunUnitTestsRandomly into RunUnitTests
5777         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
5778         use RunUnitTests(randomly=1) instead of RunUnitTestsRandomly
5780         * buildbot/status/html.py (StatusResource): shuffle Resources
5781         around to fix a bug: both 'http://foo:8080' and 'http://foo:8080/'
5782         would serve the waterfall display, but the internal links were
5783         only valid on the trailing-slash version. The correct behavior is
5784         for the non-slashed one to serve a Redirect to the slashed one.
5785         This only shows up when the buildbot page is hanging off another
5786         server, like a Twisted-Web distributed server.
5788         * buildbot/status/event.py (Event, RemoteEvent): make Events
5789         pb.Cacheable, with RemoteEvent as the cached version. This removes
5790         a lot of explicit send-an-update code.
5791         * buildbot/status/builder.py (Builder): remove send-update code
5792         * buildbot/status/client.py (ClientBuilder): remove send-update
5793         code, and log errors that occur during callRemote (mostly to catch
5794         InsecureJelly exceptions)
5796         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
5797         run Lore with the same python used in the rest of the build
5799         * buildbot/process/step_twisted2.py (RunUnitTestsJelly): moved
5801         * buildbot/process/step_twisted.py (HLint): accept 'python'
5802         argument. Catch rc!=0 and mark the step as failed. This marks the
5803         build orange ("has warnings").
5804         (RunUnitTestsJelly): move out to step_twisted2.py
5806         * buildbot/util.py (ignoreStaleRefs): add utility function
5808         * buildbot/master.py (DebugPerspective.perspective_setCurrentState):
5809         don't fake ETA object, it's too hard to get right
5811 2003-05-02  Brian Warner  <warner@lothar.com>
5813         * docs/examples/twisted_master.py (twisted_app): add FreeBSD builder
5815 2003-05-01  Brian Warner  <warner@lothar.com>
5817         * buildbot/status/html.py (StatusResource.body): oops, I was
5818         missing a <tr>, causing the waterfall page to be misrendered in
5819         everything except Galeon.
5821 2003-04-29  Brian Warner  <warner@lothar.com>
5823         * docs/examples/twisted_master.py: make debuild use python-2.2
5824         explicitly, now that Twisted stopped supporting 2.1
5826         * buildbot/process/step_twisted.py (BuildDebs.finishStatus): oops,
5827         handle tuple results too. I keep forgetting this, which suggests
5828         it needs to be rethought.
5830         * setup.py (setup): bump version to 0.3.1+ while between releases
5831         
5832 2003-04-29  Brian Warner  <warner@lothar.com>
5834         * setup.py: Releasing buildbot-0.3.1
5836 2003-04-29  Brian Warner  <warner@lothar.com>
5838         * README (SUPPORT): add plea to send questions to the mailing list
5840         * NEWS, MANIFEST.in: add description of recent changes
5842         * docs/examples/twisted_master.py: add the code used to create the
5843         Twisted buildmaster, with passwords and such removed out to a
5844         separate file.
5846         * buildbot/changes/changes.py, freshcvs.py, freshcvsmail.py: split
5847         out cvstoys-using bits from generic changes.py, to allow non-cvstoys
5848         buildmasters to not require CVSToys be installed.
5849         * README, docs/examples/glib_master: update to match the change
5851         * buildbot/clients/base.py, buildbot/bot.py,
5852         buildbot/changes/changes.py, buildbot/pbutil.py: copy
5853         ReconnectingPB from CVSToys distribution to remove CVSToys
5854         dependency for build slaves and status clients. Buildmasters which
5855         use FreshCVSSources still require cvstoys be installed, of course.
5857 2003-04-25  Brian Warner  <warner@lothar.com>
5859         * buildbot/process/process_twisted.py (FullTwistedBuildFactory): add
5860         runTestsRandomly arg to turn on trial -z
5862         * buildbot/process/step_twisted.py (TwistedJellyTestResults):
5863         experimental code to use trial's machine-parseable output to get
5864         more detailed test results. Still has some major issues.
5865         (RunUnitTestsRandomly): subclass to add "-z 0" option, runs tests
5866         in random sequence
5868         * buildbot/status/builder.py (Builder.setCurrentBuild):
5869         anticipating moving build history into statusbag, not used yet
5871         * buildbot/status/tests.py: code to centralize test results,
5872         doesn't work quite yet
5874         * buildbot/status/event.py (Event): use hasattr("setName") instead
5875         of isinstance for now.. need better long-term solution
5877         * buildbot/status/html.py: Remove old imports
5879 2003-04-24  Brian Warner  <warner@lothar.com>
5881         * buildbot/process/process_twisted.py (TwistedBuild.isFileImportant):
5882         ignore changes under doc/fun/ and sandbox/
5884         * buildbot/process/step_twisted.py: update pushEvent and friends.
5886         * buildbot/status/html.py (Box.td): replace event.buildername with
5887         event.parent.getSwappableName(). Needs more thought.
5889         * buildbot/status/builder.py (Builder): Replace pushEvent and
5890         getLastEvent with {set|update|addFileTo|finish}CurrentActivity.
5891         Tell events they are being pruned with event.delete().
5893         * buildbot/process/base.py (Build): Remove Builder status-handling
5894         methods. s/pushEvent/setCurrentActivity/.
5896         * buildbot/process/step.py (BuildStep): clean up status delivery.
5897         Gouse builder.statusbag methods instead of intermediate builder
5898         methods. s/updateLastEvent/updateCurrentActivity/.
5899         s/finalizeLastEvent/finishCurrentActivity/. Use
5900         addFileToCurrentActivity for summaryFunction.
5902         * buildbot/status/event.py (Logfile): put data in a Swappable when
5903         .finish is called.
5904         (Event): add more setter methods. Remove .buildername, use .parent
5905         and getSwappableName instead (needs more thought).
5907         * buildbot/util.py (Swappable):
5908         * test/test_swap.py: don't bother setting filename at __init__
5909         time, do it later. Change setFilename args to take parent first,
5910         since it provides the most significant part of the filename.
5912 2003-04-23  Brian Warner  <warner@lothar.com>
5914         * buildbot/status/event.py (Logfile.addEntry): append to previous
5915         entry, if possible
5917         * buildbot/process/step.py (BuildStep.finalizeLastEvent):
5918         anticipating Swappable
5919         (InternalShellCommand.remoteUpdate): split out various log-adding
5920         methods so subclasses can snarf stdout separately
5922         * buildbot/process/base.py (Builder.finalizeLastEvent): more code
5923         in anticipation of Swappable build logs
5924         (Builder.testsFinished): anticipating TestResults, still disabled
5926         * buildbot/status/builder.py (Builder.pruneEvents): only keep the
5927         last 100 events
5929         * buildbot/status/event.py (Logfile): add (disabled) support for
5930         Swappable, not ready for use yet
5932         * buildbot/util.py (Swappable): object which is swapped out to
5933         disk after some period of no use.
5934         * test/test_swap.py: test buildbot.utils.Swappable
5936 2003-04-14  Brian Warner  <warner@lothar.com>
5938         * buildbot/process/base.py (Builder.doPeriodicBuild): add simple
5939         periodic-build timer. Set the .periodicBuildTime on a builder
5940         instance to some number of seconds to activate it.
5942         * buildbot/master.py (BotMaster.forceBuild): change forceBuild API
5944         * buildbot/process/step.py (ShellCommand.finishStatus): use log.msg in
5945         a way that survives result tuples
5947 2003-04-12  Brian Warner  <warner@lothar.com>
5949         * buildbot/process/step.py (ShellCommand.finishStatusSummary):
5950         return a dict instead of a tuple: allow summarizers to provide
5951         multiple summaries if they want
5952         * buildbot/process/step_twisted.py (trialTextSummarizer): return dict
5953         (debuildSummarizer): summarize lintian warnings/errors
5955 2003-04-10  Brian Warner  <warner@lothar.com>
5957         * README (REQUIREMENTS): slave requires twisted-1.0.4a2
5959 2003-04-09  Brian Warner  <warner@lothar.com>
5961         * buildbot/process/step_twisted.py (trialTextSummarizer): Don't create
5962         empty summaries: happens when the tests fail so hard they don't emit
5963         a parseable summary line.
5965         * buildbot/process/step.py (ShellCommand.finishStatusSummary):
5966         Allow summaryFunction to return None to indicate no summary should
5967         be added.
5969         * buildbot/status/event.py (Logfile.removeHtmlWatcher): avoid
5970         writing to stale HTTP requests: notice when they disconnect and
5971         remove the request from the list. Also add CacheToFile from
5972         moshez, will be used later.
5974 2003-04-08  Brian Warner  <warner@lothar.com>
5976         * buildbot/process/step_twisted.py (ProcessDocs.finished): warnings
5977         should be an int, not a list of strings
5979         * buildbot/changes/changes.py (FreshCVSSource.stop): don't disconnect
5980         if we weren't actually connected
5982         * buildbot/process/step_twisted.py (trialTextSummarizer): function
5983         to show the tail end of the trial text output
5985         * buildbot/process/step.py (ShellCommand.finishStatusSummary): add
5986         hook to summarize the results of a ShellCommand
5988 2003-04-07  Brian Warner  <warner@lothar.com>
5990         * buildbot/process/step_twisted.py (RunUnitTests): consolidate all
5991         twisted test suite code into a single class.
5992         * buildbot/process/process_twisted.py: same
5994 2003-04-04  Brian Warner  <warner@lothar.com>
5996         * setup.py, MANIFEST.in: hack to make sure plugins.tml gets installed
5998         * README (SLAVE): document use of mktap to create slave .tap file
5999         (REQUIREMENTS): describe dependencies
6001         * buildbot/bb_tap.py, buildbot/plugins.tml:
6002         * buildbot/bot.py (updateApplication): Add mktap support for creating
6003         buildslave .tap files
6005 2003-03-28  Brian Warner  <warner@lothar.com>
6007         * buildbot/process/step.py (InternalShellCommand.finished): handle
6008         new tuple result values (fix embarrasing bug that appeared during
6009         PyCon demo)
6011 2003-03-27  Brian Warner  <warner@lothar.com>
6013         * docs/examples/glib_master.py, README: add sample buildmaster.tap
6014         -making program
6016 2003-03-25  Brian Warner  <warner@lothar.com>
6018         * buildbot/process/step.py (CVS, ShellCommand): add reason for failure
6019         to overall build status
6020         * buildbot/clients/base.py (Builder): improve event printing
6021         * buildbot/process/base.py (BasicBuildFactory): use specific steps
6022         instead of generic ShellCommand
6023         (Build): Add .stopBuild, use it when slave is detached
6025         * buildbot/process/step.py (Configure,Test): give the steps their
6026         own names and status strings
6028         * buildbot/status/html.py (StatusResource): add "show" argument,
6029         lets you limit the set of Builders being displayed.
6031 2003-03-20  Brian Warner  <warner@lothar.com>
6033         * buildbot/process/basic.py: removed
6035 2003-03-19  Brian Warner  <warner@lothar.com>
6037         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
6038         turn off process-docs by default
6040         * buildbot/process/base.py (Builder.getBuildNumbered): Don't blow up
6041         when displaying build information without anything in allBuilds[]
6043         * buildbot/bot.py (makeApp): really take password from sys.argv
6045 2003-03-18  Brian Warner  <warner@lothar.com>
6047         * buildbot/bot.py (buildApp): take password from sys.argv
6049         * README: replace with more useful text
6051         * setup.py: add a real one
6052         * MANIFEST.in, .cvsignore: more distutils packaging stuff
6053         
6054         * docs/PyCon-2003/: added sources for PyCon paper.
6056         * buildbot/process/base.py, step.py: revamp. BuildProcess is gone,
6057         now Build objects control the process and Builder only handles
6058         slave stuff and distribution of changes/status. A new BuildFactory
6059         class creates Build objects on demand.
6061         Created ConfigurableBuild which takes a list of steps to run. This
6062         makes it a lot easier to set up a new kind of build and moves us
6063         closer to being able to configure a build from a web page.
6065         * buildbot/process/step_twisted.py, process_twisted.py: move to
6066         new model. A lot of code went away.
6067         
6068         * buildbot/status/progress.py (BuildProgress.newProgress): Don't
6069         send lots of empty progress messages to the client.
6071         * buildbot/master.py (makeApp): enforce builder-name uniqueness
6073 2003-02-20  Brian Warner  <warner@lothar.com>
6075         * buildbot/process/step_twisted.py (BuildDebs): count lintian hits
6077         * buildbot/slavecommand.py (ShellCommand): back to usePTY=0. The
6078         Twisted bug that prevented non-pty processes from working just got
6079         fixed, and the bug that leaks ptys is still being investigated.
6081         * buildbot/process/step.py (CVS): send timeout arg to slave
6083         * buildbot/clients/gtkPanes.py: add connection-status row, handle
6084         builders coming and going
6085         * buildbot/clients/base.py: clean up protocol, move to ReconnectingPB
6086         from CVSToys, handle lost-buildmaster
6088         * buildbot/status/client.py (StatusClientService.removeBuilder):
6089         Clean up status client protocol: send builders (with references)
6090         as they are created, rather than sending a list and requiring the
6091         client to figure out which ones are new.
6092         * buildbot/master.py (BotMaster.forceBuild): Log debugclient
6093         attempts to force a build on an unknown builder
6095 2003-02-19  Brian Warner  <warner@lothar.com>
6097         * buildbot/slavecommand.py (CVSCommand): add timeout to sub-commands
6098         * buildbot/slavecommand.py (ShellCommand.start): stop using PTYs until
6099         Twisted stops leaking them.
6100         * buildbot/clients/gtkPanes.py (CompactBuilder): forget ETA when the
6101         builder goes to an idle state.
6103         * buildbot/slavecommand.py (ShellCommand.start): bring back PTYs until
6104         I figure out why CVS commands hang without them, and/or I fix the
6105         hung-command timeout
6107 2003-02-16  Brian Warner  <warner@lothar.com>
6109         * buildbot/process/step_twisted.py: bin/hlint went away, replace
6110         with 'bin/lore --output lint'. Use 'bin/trial -o' to remove
6111         ansi-color markup. Remove GenerateLore step. Count hlint warnings in
6112         GenerateDocs now that they are prefixed with WARNING:.
6114         * buildbot/status/html.py (StatusResource.body): Fix Builder link,
6115         use manual href target instead of request.childLink
6117         * buildbot/clients/gtkPanes.py: Fix progress countdown: update the
6118         display every second, but update the ETA every 5 seconds (or
6119         whenever) as remote_progress messages arrive.
6122 2003-02-12  Brian Warner  <warner@lothar.com>
6124         * *: import current sources from home CVS repository
6125         
6127 # Local Variables:
6128 # add-log-time-format: add-log-iso8601-time-string
6129 # End: