implement manhole (ssh-based, colorized/line-editing terminal)
[buildbot.git] / ChangeLog
blob04abacbb2c06543559cc32552405e94deced2fbe
1 2006-07-15  Brian Warner  <warner@lothar.com>
3         * buildbot/manhole.py: move all Manhole-related code out to this
4         module. Implement SSH-based manholes (with TwistedConch), and move
5         to conch's nifty line-editing syntax-coloring REPL shell instead
6         of the boring non-editing monochromatic (and deprecated) old
7         'telnet' protocol.
8         * buildbot/master.py: remove all Manhole-related code
9         (BuildMaster.loadConfig._add): make sure the old manhole is
10         removed before we add the new one
11         * docs/buildbot.texinfo (Debug options): document new Manhole options
13         * buildbot/twcompat.py (_which): fix some epydoc issues
14         * buildbot/status/html.py (Waterfall.__init__): same
16 2006-06-29  Brian Warner  <warner@lothar.com>
18         * buildbot/interfaces.py: get Interface from b.twcompat to hush
19         deprecation warnings under newer Twisteds (by using
20         zope.interface.Interface instead of old twisted.python.components
21         stuff)
22         * buildbot/slave/interfaces.py: same
24 2006-06-28  Brian Warner  <warner@lothar.com>
26         * buildbot/slave/commands.py (SVN): add --non-interactive to all
27         svn commands, so it will fail immediately instead of hanging while
28         it waits for a username/password to be typed in.
30         * buildbot/slave/bot.py (SlaveBuilder.commandComplete): add minor
31         log message if the step was shut down
33         * buildbot/scripts/runner.py (SlaveOptions.longdesc): remove
34         obsolete reference to mktap.
36 2006-06-20  Brian Warner  <warner@lothar.com>
38         * buildbot/test/test_steps.py (BuildStep.testShellCommand1): update
39         test to include new 'logfiles' argument sent from master to slave
41 2006-06-19  Brian Warner  <warner@lothar.com>
43         * buildbot/process/step_twisted.py (Trial): track Progress from
44         _trial_temp/test.log too
46         * buildbot/process/step.py (OutputProgressObserver): generalize
47         the earlier StdioProgressObserver into an OutputProgressObserver
48         that can track LogFiles other than stdio.
49         (LoggingBuildStep.__init__): same
51         * buildbot/process/step_twisted.py (Trial): use logfiles= to track
52         _trial_temp/test.log, not a separate 'cat' command. TODO: this
53         will fail under windows because of os.sep issues. It might have
54         worked before if 'cat' was doing cygwin path conversion.
56         * buildbot/slave/commands.py (LogFileWatcher.__init__): note the
57         creation of LogFileWatchers
58         (ShellCommand._startCommand): and record the files that were
59         watched in the 'headers' section of the ShellCommand output
61         * buildbot/process/step.py (RemoteShellCommand.__init__): duh, you
62         need to actually pass it to the slave if you want it to work.
63         (ShellCommand): document it a bit
65         * buildbot/test/test_shell.py: new test to validate LogFiles
66         * buildbot/test/runutils.py (SlaveCommandTestBase): updates to
67         test LogFiles
68         * buildbot/test/emitlogs.py: enhance to wait for a line on stdin
69         before printing the last batch of lines, to test that the polling
70         logic is working properly
72         * buildbot/process/step.py (LoggedRemoteCommand): improve LogFile
73         handling, making it possible to track multiple logs for a single
74         RemoteCommand. The previous single logfile is now known as the
75         'stdio' log.
76         (LoggedRemoteCommand.remoteUpdate): accept key='log' updates
77         (RemoteShellCommand.__init__): accept logfiles=
78         (LoggingBuildStep.startCommand): stdio_log is now one of many
79         (ShellCommand): added logfiles= argument, as well as a class-level
80         .logfiles attribute, which will be merged together to figure out
81         which logfiles should be tracked. The latter maybe be useful for
82         subclasses of ShellCommand which know they will aways produce
83         secondary logfiles in the same location.
85         * buildbot/slave/commands.py (ShellCommandPP): add writeStdin()
86         and closeStdin() methods, preparing to make it possible to write
87         to a ShellCommand's stdin at any time, not just at startup. These
88         writes are buffered if the child process hasn't started yet.
89         (LogFileWatcher): new helper class to watch arbitrary logfiles
90         while a ShellCommand runs. This class polls the file every two
91         seconds, and sends back 10k chunks to the buildmaster.
92         (ShellCommand): rename stdin= to initialStdin=, and add
93         keepStdinOpen= and logfiles= to arguments. Set up LogFileWatchers
94         at startup.
95         (ShellCommand.addLogfile): LogFile text is sent in updates with a
96         key of "log" and a value of (logname, data).
97         (SlaveShellCommand): add 'initial_stdin', 'keep_stdin_open', and
98         'logfiles' to the master-visible args dictionary.
99         (SourceBase.doPatch): match s/stdin/initialStdin/ change
100         (CVS.start): same
101         (P4.doVCFull): same
102         * buildbot/test/test_vc.py (Patch.testPatch): same
105         * buildbot/test/emit.py: write to a logfile in the current
106         directory. We use this to figure out what was used as a basedir
107         rather than looking to see which copy of emit.py gets run, so that
108         we can run the commands from inside _trial_temp rather than inside
109         buildbot/test
110         * buildbot/test/subdir/emit.py: same
111         * buildbot/test/runutils.py (FakeSlaveBuilder): take a 'basedir'
112         argument rather than running from buildbot/test/
113         (SlaveCommandTestBase.setUpBuilder): explicitly set up the Builder
114         rather than using an implicit setUp()
115         * buildbot/test/test_slavecommand.py (ShellBase.setUp): same
116         (ShellBase.testShell1, etc): use explicit path to emit.py instead
117         of assuming that we're running in buildbot/test/ (and that '.' is
118         on our $PATH)
120         * buildbot/slave/commands.py (Command.doStart): refactor Command
121         startup/completion a bit: now the SlaveBuilder calls doStart(),
122         which is not meant for overridding by subclasses, and doStart()
123         calls start(), which is. Likewise the SlaveBuilder calls
124         doInterrupt(), and subclasses override interrupt(). This also puts
125         responsibility for maintaining .running in Command rather than in
126         SlaveBuilder.
127         (Command.doInterrupt): same
128         (Command.commandComplete): same, this is called when the deferred
129         returned by start() completes.
130         * buildbot/slave/bot.py (SlaveBuilder.remote_startCommand): same
131         (SlaveBuilder.remote_interruptCommand): same
132         (SlaveBuilder.stopCommand): same
134 2006-06-16  Brian Warner  <warner@lothar.com>
136         * buildbot/test/test_shell.py: new test file to contain everything
137         relating to ShellCommand
138         (SlaveSide.testLogFiles): (todo) test for the upcoming "watch
139         multiple logfiles in realtime" feature, not yet implemented
140         * buildbot/test/emitlogs.py: support file for testLogFiles
141         * docs/buildbot.texinfo (ShellCommand): document the feature
143         * buildbot/test/test_steps.py (BuildStep.setUp): rmtree refactoring
145         * buildbot/test/runutils.py (SlaveCommandTestBase): utility class
146         for tests which exercise SlaveCommands in isolation.
148         * buildbot/test/test_slavecommand.py: Move some utilities like
149         SignalMixin and FakeSlaveBuilder from here ..
150         * buildbot/test/runutils.py: .. to here, so they can be used by
151         other test classes too
152         * buildbot/test/test_vc.py: more SignalMixin refactoring
153         * buildbot/test/test_control.py: same
154         * buildbot/test/test_run.py: and some rmtree refactoring
156 2006-06-15  Brian Warner  <warner@lothar.com>
158         * buildbot/test/test_vc.py (P4.testCheckoutBranch): rename from
159         'testBranch' to match other VC tests and have the tests run in
160         roughly increasing order of dependency
162         * buildbot/test/test_steps.py (LogObserver): new test to verify
163         LogObservers can be created at various times and still get
164         connected up properly
166         * buildbot/test/runutils.py (setupBuildStepStatus): utility method
167         to create BuildStepStatus instances that actually work.
169         * buildbot/process/step.py (LogObserver): add outReceived and
170         errReceived base methods, to be overridden
172         * buildbot/status/builder.py (BuildStatus.addStepWithName): change
173         API to take a name instead of a step, reducing the coupling
174         somewhat. This returns the BuildStepStatus object so it can be
175         passed to the new Step, instead of jamming it directly into the
176         Step.
177         * buildbot/process/step.py (BuildStep.setStepStatus): add a setter
178         method
179         * buildbot/process/base.py (Build.setupBuild): use both methods
180         * buildbot/test/test_web.py (Logfile.setUp): rearrange the setup
181         process a bit to match
183 2006-06-14  Brian Warner  <warner@lothar.com>
185         * docs/buildbot.texinfo (Adding LogObservers): add some limited
186         docs on writing new LogObserver classes
187         (Writing New Status Plugins): brief docs on how Status Plugins fit
188         together
190         * buildbot/process/step_twisted.py (TrialTestCaseCounter):
191         implement a LogObserver that counts how many unit tests have been
192         run so far
193         (Trial.__init__): wire it in
194         * buildbot/test/test_twisted.py (Counter): unit test for it
196         * buildbot/process/step_twisted.py (HLint.commandComplete): update
197         to new cmd.logs['stdio'] scheme
198         (Trial.commandComplete): same
199         (BuildDebs.commandComplete): same
201         * buildbot/process/step.py (LoggedRemoteCommand): use a dict of
202         LogFiles, instead of just a single one. The old single logfile is
203         now called "stdio". LoggedRemoteCommand no longer creates a
204         LogFile for you (the code to do that was broken anyway). If you
205         don't create a "stdio" LogFile, then stdout/stderr will be
206         discarded.
207         (LogObserver): implement "LogObservers", which a BuildStep can add
208         to parse the output of a command in real-time. The primary use is
209         to provide more useful information to the Progress code, allowing
210         better ETA estimates.
211         (LogLineObserver): utility subclass which feeds complete lines to
212         the parser instead of bytes.
213         (BuildStep.progressMetrics): this is safer as a tuple
214         (BuildStep.setProgress): utility method, meant to be called by
215         LogObservers
216         (BuildStep.addLogObserver): new method, to be called at any time
217         during the BuildStep (even before any LogFiles have been created),
218         to attach (or schedule for eventual attachment) a LogObserver to a
219         LogFile.
220         (StdioProgressObserver): new LogObserver which replaces the old
221         "output" progress gatherer
222         (LoggingBuildStep.__init__): same
223         (LoggingBuildStep.startCommand): set up the "stdio" LogFile
224         (LoggingBuildStep._commandComplete): must use logs['stdio']
225         instead of the old single ".log" attribute.
226         * buildbot/status/builder.py (LogFile): remove old logProgressTo
227         functionality, now subsumed into StdioProgressObserver
228         * buildbot/test/test_status.py (Subscription._testSlave_2): the
229         log name changed from "output" to "stdio".
232         * buildbot/interfaces.py (ILogFile): add the Interface used from
233         the BuildStep towards the LogFile
234         (ILogObserver): and the one provided by a LogObserver
235         * buildbot/status/builder.py (LogFile): implement it
237         * buildbot/interfaces.py (LOG_CHANNEL_*): move STDOUT / STDERR /
238         HEADER constants here ..
239         * buildbot/status/builder.py (STDOUT): .. from here
241 2006-06-13  Brian Warner  <warner@lothar.com>
243         * buildbot/test/test_p4poller.py (TestP4Poller.failUnlessIn): fix
244         compatibility with python2.2, which doesn't have the 'substr in
245         str' feature.
246         (TestP4Poller.makeTime): utility function to construct the
247         timestamp using the same strptime() approach as p4poller does. It
248         turns out that time.mktime() behaves slightly differently under
249         python2.2, probably something to do with the DST flag, and that
250         causes the test to fail under python2.2. (changing the mktime()
251         arguments to have dst=0 instead of -1 caused it to fail under
252         python2.3. Go figure.)
253         (TestP4Poller._testCheck3): use our makeTime() instead of mktime()
255 2006-06-12  Brian Warner  <warner@lothar.com>
257         * buildbot/process/step.py (P4): merge in patch SF#1473939, adding
258         proper Perforce (P4) support. Many many thanks to Scott Lamb for
259         contributing such an excellent patch, including docs and unit
260         tests! This makes it *so* much easier to apply. I had to update
261         test_vc.py to handle some recent refactorings, but everything else
262         applied smoothly. The only remaining thing I'd like to fix would
263         be to remove the hard-wired port 1666 used by p4d, and allow it to
264         claim any unused port. This would allow two copies of the test
265         suite to run on the same host at the same time, as well as
266         allowing the test suite to run while a real (production) p4d was
267         running on the same host. Oh, and maybe we should add a warning to
268         step.P4 that gets emitted if the slave is too old to provide the
269         'p4' SlaveCommand. Otherwise it looks great. (closes: SF#1473939).
270         * buildbot/slave/commands.py (P4): same
271         (P4Sync): same, some minor updates
272         * buildbot/changes/p4poller.py: same
273         * docs/buildbot.texinfo: same
274         * buildbot/test/test_p4poller.py: same
275         * buildbot/test/test_vc.py (P4): same
277         * setup.py: add Trove classifiers for PyPI
279 2006-06-08  Brian Warner  <warner@allmydata.com>
281         * buildbot/status/client.py
282         (RemoteBuilder.remote_getCurrentBuilds): oops, I screwed up when
283         changing this from getCurrentBuild() to getCurrentBuilds(). Each
284         build needs to be IRemote'd separately, rather than IRemote'ing
285         the whole list at once. I can't wait until newpb's serialization
286         adapters make this unnecessary.
288 2006-06-06  Brian Warner  <warner@lothar.com>
290         * buildbot/process/step.py (WithProperties): make this inherit
291         from ComparableMixin, so that reloading an unchanged config file
292         doesn't cause us to spuriously reload any Builders which use them.
293         * buildbot/test/test_config.py (ConfigTest.testWithProperties):
294         add a test for it
296 2006-06-03  Brian Warner  <warner@lothar.com>
298         * contrib/windows/{setup.py, buildbot_service.py}: add support for
299         running py2exe on windows, contributed by Mark Hammond. Addresses
300         SF#1401121, but I think we still need to include
301         buildbot/scripts/sample.cfg
302         * setup.py: include buildbot_service.py as a script under windows
303         * buildbot/status/html.py: when sys.frozen (i.e. we're running in
304         a py2exe application), get the icon/css datafiles from a different
305         place than usual.
307         * buildbot/status/mail.py (MailNotifier.buildMessage): don't
308         double-escape the build URL. Thanks to Olivier Bonnet for the
309         patch. Fixes SF#1452801.
311 2006-06-02  Brian Warner  <warner@lothar.com>
313         * contrib/svn_buildbot.py (ChangeSender.getChanges): ignore the
314         first six columns of 'svnlook' output, not just the first column,
315         since property changes appear in the other five. Thanks to Olivier
316         Bonnet for the patch. Fixes SF#1398174.
318 2006-06-01  Brian Warner  <warner@lothar.com>
320         * buildbot/test/test_web.py (Logfile.setUp): set the .reason on
321         the fake build, so that title= has something to be set to
323         * buildbot/status/html.py (BuildBox.getBox): set the 'title='
324         attribute of the "Build #NN" link in the yellow start-the-build
325         box to the build's reason. This means that you get a little
326         tooltip explaining why the build was done when you hover over the
327         yellow box. Thanks to Zandr Milewski for the suggestion.
329         * buildbot/clients/gtkPanes.py (Box.setColor): ignore color=None
330         (Box.setETA): handle ETA=None (by stopping the timer)
331         (Box.update): make the [soon] text less different than the usual
332         text, so the rest of the text doesn't flop around so much. It
333         would be awfully nice to figure out how to center this stuff.
334         (ThreeRowBuilder.stepETAUpdate): more debugging printouts
336         * buildbot/process/step.py (ShellCommand): set flunkOnFailure=True
337         by default, so that any ShellCommand which fails marks the overall
338         build as a failure. I should have done this from the beginning.
339         Add flunkOnFailure=False to the arguments if you want to turn off
340         this behavior.
342 2006-05-30  Brian Warner  <warner@lothar.com>
344         * buildbot/clients/gtkPanes.py: add a third row: now it shows
345         last-build/current-build/current-step. Show what step is currently
346         running. Show ETA for both the overall build and the current step.
347         Update GTK calls to modern non-deprecated forms. There's still a
348         lot of dead code and debug noise to remove.
350         * buildbot/process/step_twisted.py (Trial): set the step name, so it
351         shows up properly in status displays
353 2006-05-28  Brian Warner  <warner@lothar.com>
355         * buildbot/test/test_properties.py (Run.testInterpolate): on the
356         build we use to verify that WithProperties works:
358         ** set flunkOnFailure=True so that build failures get noticed
359         ** set workdir='.' so that the build succeeds, otherwise it is trying
360             to touch 'build/something', and 'build/' doesn't exist because
361             usually that's created by a Source step
362         ** set timeout=10, because Twisted-1.3.0 has a race condition that
363             this test somehow triggers, in which the 'touch' process becomes
364             a zombie and we wait for th etimeout before giving up on it.
366         * buildbot/test/runutils.py (RunMixin.logBuildResults): utility method
367         to log the Build results and step logs to the twisted log.
368         (RunMixin.failUnlessBuildSucceeded): use logBuildResults to record
369         what went wrong if a build was expected to succeed but didn't.
371         * buildbot/process/step_twisted.py (Trial): set the default
372         trialMode to '--reporter=bwverbose', which specifies verbose
373         black-and-white text. Back in twisted-1.3/2.0 days we had to use
374         '-to', but those are completely missing in modern Twisteds.
376         * buildbot/scripts/sample.cfg: make the sample Manhole config use
377         a localhost-only port, to encourage better security
379         * docs/buildbot.texinfo (Change Sources): mention
380         darcs_buildbot.py
382         * .darcs-boring: add a Darcs boringfile
384         * README (REQUIREMENTS): stop claiming compatibility with
385         Twisted-1.3.0
387         * contrib/darcs_buildbot.py: write a darcs-commit-hook change
388         sender
390 2006-05-27  Brian Warner  <warner@lothar.com>
392         * buildbot/__init__.py: bump to 0.7.3+ while between releases
393         * docs/buildbot.texinfo: same
395 2006-05-23  Brian Warner  <warner@lothar.com>
397         * buildbot/__init__.py (version): Releasing buildbot-0.7.3
398         * docs/buildbot.texinfo: set version to match
399         * NEWS: update for 0.7.3
401         * docs/buildbot.texinfo (Change Sources): mention hg_buildbot.py,
402         give a quick mapping from VC system to possible ChangeSources
403         (Build Properties): add 'buildername'
405         * buildbot/process/base.py (Build.setupStatus): oops, set
406         'buildername' and 'buildnumber' properties
407         * buildbot/test/test_properties.py (Interpolate.testBuildNumber):
408         test them
410 2006-05-22  Brian Warner  <warner@lothar.com>
412         * docs/buildbot.texinfo (Build Properties): explain the syntax of
413         property interpolation better
415         * README (INSTALLATION): remove old '-v' argument from recommended
416         trial command line
418         * docs/buildbot.texinfo (ShellCommand): add docs for description=
419         and descriptionDone= arguments. Thanks to Niklaus Giger for the
420         patch. SF#1475494.
422         * buildbot/slave/commands.py (SVN.parseGotRevision._parse): use
423         'svnversion' instead of grepping the output of 'svn info', much
424         simpler and avoids CR/LF problems on windows. Thanks to Olivier
425         Bonnet for the suggestion.
426         (SVN.parseGotRevision): oops, older verisons of 'svnversion'
427         require the WC_PATH argument, so run 'svnversion .' instead.
429         * buildbot/interfaces.py (IChangeSource): methods in Interfaces
430         aren't supposed to have 'self' in their argument list
432 2006-05-21  Brian Warner  <warner@lothar.com>
434         * buildbot/process/step.py (ShellCommand.start): make
435         testInterpolate pass. I was passing the uninterpolated command to
436         the RemoteShellCommand constructor
437         (ShellCommand._interpolateProperties): oops, handle non-list
438         commands (i.e. strings with multiple words separated by spaces in
439         them) properly, instead of forgetting about them.
441         * buildbot/test/test_properties.py (Run.testInterpolate): new test
442         to actually try to use build properties in a real build. This test
443         fails.
444         * buildbot/test/runutils.py (RunMixin.requestBuild): utility methods
445         to start and evaluate builds
447         * buildbot/test/test__versions.py: add a pseudo-test to record
448         what version of Twisted/Python/Buildbot are running. This should
449         show up at the beginning of _trial_tmp/test.log, and exists to help
450         debug other problems.
452         * buildbot/status/html.py (Waterfall): add 'robots_txt=' argument,
453         a filename to be served as 'robots.txt' to discourage web spiders.
454         Adapted from a patch by Tobi Vollebregt, thanks!
455         * buildbot/test/test_web.py (Waterfall._test_waterfall_5): test it
456         (Waterfall.test_waterfall): tweak the way that filenames are put
457         into the config file, to accomodate windows pathnames better.
459         * docs/buildbot.texinfo (HTML Waterfall): document it
461         * buildbot/process/process_twisted.py
462         (QuickTwistedBuildFactory.__init__): recent versions of Twisted
463         changed the build process. The new setup.py no longer takes the
464         'all' argument.
465         (FullTwistedBuildFactory.__init__): same
466         (TwistedReactorsBuildFactory.__init__): same
468         * contrib/hg_buildbot.py: wrote a commit script for mercurial, to
469         be placed in the [hooks] section of the central repository (the
470         one that everybody pushes changes to).
472 2006-05-20  Brian Warner  <warner@lothar.com>
474         * buildbot/slave/commands.py (Darcs.doVCFull): when writing the
475         .darcs-context file, use binary mode. I think this was causing a
476         Darcs failure under windows.
478 2006-05-19  Brian Warner  <warner@lothar.com>
480         * buildbot/scripts/tryclient.py (CVSExtractor.getBaseRevision):
481         use a timezone string of +0000 and gmtime, since this timestamp is
482         sent to a buildmaster and %z is broken.
484         * buildbot/test/test_vc.py (CVSHelper.getdate): use no timezone
485         string and localtime, since this timestamp will only be consumed
486         locally, and %z is broken.
488         * buildbot/slave/commands.py (CVS.parseGotRevision): use +0000 and
489         gmtime, since this timestamp is returned to the buildmaster, and
490         %z is broken.
492 2006-05-18  Brian Warner  <warner@lothar.com>
494         * NEWS: update in preparation for next release
496         * buildbot/test/test_vc.py (VCS_Helper): factor out all the
497         setup-repository and do-we-have-the-vc-tools code into a separate
498         "helper" class, which sticks around in a single module-level
499         object. This seems more likely to continue to work in the future
500         than having it hide in the TestCase and hope that TestCases stick
501         around for a long time.
503         * buildbot/test/test_vc.py (MercurialSupport.vc_create): 'hg
504         addremove' has been deprecated in recent versions of mercurial, so
505         use 'hg add' instead
507 2006-05-07  Brian Warner  <warner@lothar.com>
509         * buildbot/scheduler.py (Try_Jobdir.messageReceived): when
510         operating under windows, move the file before opening it, since
511         you can't rename a file that somebody has open.
513         * buildbot/process/base.py (Build.setupBuild): if something goes
514         wrong while creating a Step, log the name and arguments, since the
515         error message when you get the number of arguments wrong is really
516         opaque.
518 2006-05-06  Brian Warner  <warner@lothar.com>
520         * buildbot/process/step_twisted.py (Trial.setupEnvironment): more
521         bugs in twisted-specific code not covered by my unit tests, this
522         time use 'cmd' argument instead of self.cmd
524         * buildbot/process/process_twisted.py (TwistedBuild.isFileImportant):
525         fix stupid braino: either use startwith or find()==0, not both.
526         (TwistedReactorsBuildFactory.__init__): another dumb typo
528         * buildbot/test/test_slavecommand.py (ShellBase.testInterrupt1): 
529         mark this test as TODO under windows, since process-killing seems
530         dodgy there. We'll come back to this later and try to fix it
531         properly.
533         * buildbot/test/test_vc.py (CVSSupport.getdate): use localtime,
534         and don't include a timezone
535         (CVSSupport.vc_try_checkout): stop trying to strip the timezone.
536         This should avoid the windows-with-verbose-timezone-name problem
537         altogether.
538         (Patch.testPatch): add a test which runs 'patch' with less
539         overhead than the full VCBase.do_patch sequence, to try to isolate
540         a windows test failure. This one uses slave.commands.ShellCommand
541         and 'patch', but none of the VC code.
543         * buildbot/slave/commands.py (getCommand): use which() to find the
544         executables for 'cvs', 'svn', etc. This ought to help under
545         windows.
547         * buildbot/test/test_vc.py (VCBase.do_getpatch): Delete the
548         working directory before starting. If an earlier test failed, the
549         leftover directory would mistakenly flunk a later test.
550         (ArchCommon.registerRepository): fix some tla-vs-baz problems.
551         Make sure that we use the right commandlines if which("tla") picks
552         up "tla.exe" (as it does under windows).
553         (TlaSupport.do_get): factor out this tla-vs-baz difference
554         (TlaSupport.vc_create): more tla-vs-baz differences
556         * buildbot/test/test_slavecommand.py
557         (ShellBase.testShellMissingCommand): stop trying to assert
558         anything about the error message: different shells on different
559         OSes with different languages makes it hard, and it really isn't
560         that interesting of a thing to test anyway.
562         * buildbot/test/test_vc.py (CVSSupport.capable): skip CVS tests if
563         we detect cvs-1.10 (which is the version shipped with OS-X 10.3
564         "Panther"), because it has a bug which flunks a couple tests in
565         weird ways. I've checked that cvs-1.12.9 (as shipped with debian)
566         is ok. OS-X 10.4 "Tiger" ships with cvs-1.11, but I haven't been
567         able to test that yet.
569 2006-04-30  Brian Warner  <warner@lothar.com>
571         * buildbot/test/test_vc.py (VCBase.runCommand): set $LC_ALL="C" to
572         make sure child commands emit messages in english, so our regexps
573         will match. Thanks to Nikaus Giger for identifying the problems.
574         (VCBase._do_vctest_export_1): mode="export" is not responsible
575         for setting the "got_revision" property, since in many cases it is
576         not convenient to determine.
577         (SVNSupport.capable): when running 'svn --version' to check for
578         ra_local, we want error messages in english
579         * buildbot/test/test_slavecommand.py 
580         (ShellBase.testShellMissingCommand): set $LC_ALL="C" to get bash
581         to emit the error message in english
583         * buildbot/slave/commands.py (SourceBase.setup): stash a copy of
584         the environment with $LC_ALL="C" so that Commands which need to
585         parse the output of their child processes can obtain it in
586         english.
587         (SVN.parseGotRevision): call "svn info" afterwards instead of
588         watching the output of the "svn update" or "svn checkout".
589         (Darcs.parseGotRevision): use $LC_ALL="C" when running the command
590         (Arch.parseGotRevision): same
591         (Bazaar.parseGotRevision): same
592         (Mercurial.parseGotRevision): same
594         * buildbot/scripts/tryclient.py (SourceStampExtractor.dovc): set
595         $LC_ALL="C" when running commands under 'buildbot try', too
597         * buildbot/test/__init__.py: remove the global os.environ()
598         setting, instead we do it just for the tests that run commands and
599         need to parse their output.
601         * buildbot/test/test_scheduler.py (Scheduling.testTryJobdir):
602         remove the overly-short .timeout on this test, because non-DNotify
603         platforms must fall back to polling which happens at 10 second
604         intervals, so a 5 second timeout would never succeed.
606 2006-04-24  Brian Warner  <warner@lothar.com>
608         * docs/buildbot.texinfo (Installing the code): update trial
609         invocation, SF#1469116 by Niklaus Giger.
610         (Attributes of Changes): updated branch-name examples to be
611         a bit more realistic, SF#1475240 by Stephen Davis.
613         * contrib/windows/buildbot2.bat: utility wrapper for windows
614         developers, contributed by Nick Trout (after a year of neglect..
615         sorry!). SF#1194231.
617         * buildbot/test/test_vc.py (*.capable): store the actual VC
618         binary's pathname in VCS[vcname], so it can be retrieved later
619         (CVSSupport.vc_try_checkout): incorporate Niklaus Giger's patch to
620         strip out non-numeric timezone information, specifically the funky
621         German string that his system produced that confuses CVS.
622         (DarcsSupport.vc_create): use dovc() instead of vc(), this should
623         allow Darcs tests to work on windows
624         * buildbot/scripts/tryclient.py (SourceStampExtractor): use
625         procutils.which() everywhere, to allow tryclient to work under
626         windows. Also from Niklaus Giger, SF#1463394.
628         * buildbot/twcompat.py (which): move the replacement for a missing
629         twisted.python.procutils.which from test_vc.py to here, so it can
630         be used in other places too (specifically tryclient.py)
632 2006-04-23  Brian Warner  <warner@lothar.com>
634         * buildbot/status/html.py (StatusResourceBuild.body): replace the
635         bare buildbotURL/projectName line with a proper DIV, along with a
636         CSS class of "title", from Stefan Seefeld (SF#1461675).
637         (WaterfallStatusResource.body0): remove the redundant 'table'
638         class from the table
639         (WaterfallStatusResource.body): same. Also add class="LastBuild"
640         to the top-row TR, and class="Activity" to the second-row TR,
641         rather than putting them in the individual TD nodes.
643         * buildbot/test/test_vc.py (VCBase.checkGotRevision): test
644         'got_revision' build property for all VC systems that implement
645         accurate ones: SVN, Darcs, Arch, Bazaar, Mercurial.
647         * buildbot/slave/commands.py (SourceBase._handleGotRevision): try
648         to determine which revision we actually obtained
649         (CVS.parseGotRevision): implement this for CVS, which just means
650         to grab a timestamp. Not ideal, and it depends upon the buildslave
651         having a clock that is reasonably well syncronized with the server,
652         but it's better than nothing.
653         (SVN.parseGotRevision): implement it for SVN, which is accurate
654         (Darcs.parseGotRevision): same
655         (Arch.parseGotRevision): same
656         (Bazaar.parseGotRevision): same
657         (Mercurial.parseGotRevision): same
659         * buildbot/process/step.py (LoggedRemoteCommand.remoteUpdate):
660         keep a record of all non-stdout/stderr/header/rc status updates,
661         for the benefit of RemoteCommands that send other useful things,
662         like got_revision
663         (Source.commandComplete): put any 'got_revision' status values
664         into a build property of the same name
667         * buildbot/process/step_twisted.py (Trial): update to deal with
668         new ShellCommand refactoring
670         * docs/buildbot.texinfo (Build Properties): document new feature
671         that allows BuildSteps to get/set Build-wide properties like which
672         revision was requested and/or checked out.
674         * buildbot/interfaces.py (IBuildStatus.getProperty): new method
675         * buildbot/status/builder.py (BuildStatus.getProperty): implement
676         it. Note that this bumps the persistenceVersion of the saved Build
677         object, so add the necessary upgrade-old-version logic to include
678         an empty properties dict.
680         * buildbot/process/base.py (Build.setProperty): implement it
681         (Build.getProperty): same
682         (Build.startBuild): change build startup to set 'branch',
683         'revision', and 'slavename' properties at the right time
685         * buildbot/process/step.py (BuildStep.__init__): change setup to
686         require 'build' argument in a better way
687         (LoggingBuildStep): split ShellCommand into two pieces, for better
688         subclassing elsewhere. LoggingBuildStep is a BuildStep which runs
689         a single RemoteCommand that sends stdout/stderr status text. It
690         also provides the usual commandComplete / createSummary /
691         evaluateCommand / getText methods to be overridden...
692         (ShellCommand): .. whereas ShellCommand is specifically for
693         running RemoteShellCommands. Other shell-like BuildSteps (like
694         Source) can inherit from LoggingBuildStep instead of ShellCommand
695         (WithProperties): marker class to do build-property interpolation
696         (Source): inherit from LoggingBuildStep instead of ShellCommand
697         (RemoteDummy): same
699         * buildbot/test/test_properties.py: test new functionality
701 2006-04-21  Brian Warner  <warner@lothar.com>
703         * buildbot/test/test_vc.py: rename testBranch to
704         testCheckoutBranch to keep the tests in about the right
705         alphabetical order
707 2006-04-18  Brian Warner  <warner@lothar.com>
709         * docs/buildbot.texinfo (PBListener): improve cross-references
710         between PBListener and 'buildbot statusgui', thanks to John Pye
711         for the suggestion.
713 2006-04-17  Brian Warner  <warner@lothar.com>
715         * buildbot/twcompat.py (maybeWait): handle SkipTest properly when
716         running under Twisted-1.3.0, otherwise skipped tests are reported
717         as errors.
719         * all: use isinstance() instead of 'type(x) is foo', suggested by
720         Neal Norwitz
722         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
723         oops, fix a brain-fade from the other week, when making the
724         addStep changes. I changed all the __init__ upcalls to use the
725         wrong superclass name.
726         (FullTwistedBuildFactory.__init__): same
727         (TwistedDebsBuildFactory.__init__): same
728         (TwistedReactorsBuildFactory.__init__): same
729         (TwistedBuild.isFileImportant): use .startswith for clarity,
730         thanks to Neal Norwitz for the suggestions.
732         * contrib/viewcvspoll.py: script to poll a viewcvs database for
733         changes, then deliver them over PB to a remote buildmaster.
735         * contrib/svnpoller.py: added script by John Pye to poll a remote
736         SVN repository (by running 'svn log') from a cronjob, and run
737         'buildbot sendchange' to deliver the changes to a remote
738         buildmaster.
739         * contrib/svn_watcher.py: added script by Niklaus Giger (a
740         modification of svnpoller.py), same purpose, but this one loops
741         internally (rather than expecting to run from a cronjob) and works
742         under windows.
743         * contrib/README.txt: same
745 2006-04-11  Brian Warner  <warner@lothar.com>
747         * all: fix a number of incorrect names and missing imports, thanks
748         to Anthony Baxter for the patch.
749         * buildbot/status/html.py (WaterfallStatusResource.statusToHTML): 
750         remove unused buggy method.
751         * buildbot/status/builder.py (BuildStatus.saveYourself): rmtree
752         comes from shutil, not "shutils"
753         * buildbot/process/step.py (TreeSize.evaluateCommand): fix bad name
754         (Arch.checkSlaveVersion): same
755         * buildbot/process/step_twisted.py (Trial.commandComplete): same, in
756         some disabled code
757         * buildbot/process/step_twisted2.py: add some missing imports
758         * buildbot/twcompat.py (_deferGenerator): fix cut-and-paste error,
759         this code used to live in twisted.internet.defer
761 2006-04-10  Brian Warner  <warner@lothar.com>
763         * buildbot/process/step.py (Mercurial): add Mercurial support
764         * buildbot/slave/commands.py (Mercurial): same
765         * buildbot/scripts/tryclient.py (MercurialExtractor): same
766         * buildbot/test/test_vc.py (Mercurial): same, checkout over HTTP is
767         not yet tested, but 'try' support *is* covered
768         * docs/buildbot.texinfo (Mercurial): document it
770         * buildbot/process/step.py (LoggedRemoteCommand.remoteUpdate): add
771         some debugging messages (turned off)
772         * buildbot/test/test_vc.py: improve debug messages
774 2006-04-07  Brian Warner  <warner@lothar.com>
776         * buildbot/test/test_vc.py (which): define our own which() in case
777         we can't import twisted.python.procutils, because procutils doesn't
778         exist in Twisted-1.3
780         * docs/buildbot.texinfo (Interlocks): fix some typos, mention use
781         of SlaveLocks for performance tests
783         * docs/examples/twisted_master.cfg: update to match current usage
785         * buildbot/changes/p4poller.py (P4Source): add new arguments:
786         password, p4 binary, pollinterval, maximum history to check.
787         Patch from an anonymous sf.net contributor, SF#1219384.
788         * buildbot/process/step.py (P4Sync.__init__): add username,
789         password, and client arguments.
790         * buildbot/slave/commands.py (P4Sync): same
792 2006-04-05  Brian Warner  <warner@lothar.com>
794         * buildbot/process/factory.py (BuildFactory.addStep): new method
795         to add steps to a BuildFactory. Use it instead of f.steps.append,
796         and you can probably avoid using the s() convenience function.
797         Patch from Neal Norwitz, sf.net #1412605.
798         (other): update all factories to use addStep
799         * buildbot/process/process_twisted.py: update all factories to use
800         addStep.
802 2006-04-03  Brian Warner  <warner@lothar.com>
804         * buildbot/test/test_vc.py: modified find-the-VC-command logic to
805         work under windows too. Adapted from a patch by Niklaus Giger,
806         addresses SF#1463399.
808         * buildbot/test/__init__.py: set $LANG to 'C', to insure that
809         spawned commands emit parseable results in english and not some
810         other language. Patch from Niklaus Giger, SF#1463395.
812         * README (INSTALLATION): discourage users from running unit tests on
813         a "network drive", patch from Niklaus Giger, SF#1463394.
815 2006-03-22  Brian Warner  <warner@lothar.com>
817         * contrib/svn_buildbot.py: rearrange, add an easy-to-change
818         function to turn a repository-relative pathname into a (branch,
819         branch-relative-filename) tuple. Change this function to handle
820         the branch naming policy used by your Subversion repository.
821         Thanks to AllMyData.com for sponsoring this work.
823 2006-03-16  Brian Warner  <warner@lothar.com>
825         * buildbot/scripts/sample.cfg: add python-mode declaration for
826         vim. Thanks to John Pye for the patch.
828         * docs/buildbot.texinfo (Launching the daemons): fix @reboot job
829         command line, mention the importance of running 'crontab' as the
830         buildmaster/buildslave user. Thanks to John Pye for the catch.
832 2006-03-13  Brian Warner  <warner@lothar.com>
834         * buildbot/status/words.py (IRC): add an optional password=
835         argument, which will be sent to Nickserv in an IDENTIFY message at
836         login, to claim the nickname. freenode requires this before the
837         bot can sent (or reply to) private messages. Thanks to Clement
838         Stenac for the patch.
839         * docs/buildbot.texinfo (IRC Bot): document it
841         * buildbot/status/builder.py (LogFile.merge): don't write chunks
842         larger than chunkSize. Fixes SF#1349253.
843         * buildbot/test/test_status.py (Log.testLargeSummary): test it
844         (Log.testConsumer): update to match new internal chunking behavior
846 2006-03-12  Brian Warner  <warner@lothar.com>
848         * buildbot/test/test_vc.py: remove the last use of waitForDeferred
850         * buildbot/test/test_maildir.py (MaildirTest): rename the
851         'timeout' method, as it collides with trial's internals
853         * buildbot/scripts/runner.py: add 'buildbot restart' command
854         (stop): don't sys.exit() out of here, otherwise restart can't work
855         * docs/buildbot.texinfo (Shutdown): document it
857         * buildbot/buildset.py (BuildSet.__init__): clean up docstring
858         * buildbot/status/html.py (Waterfall.__init__): same
859         * buildbot/process/builder.py (Builder.startBuild): same
860         * buildbot/process/base.py (BuildRequest): same
861         * buildbot/sourcestamp.py (SourceStamp): same
862         * buildbot/scheduler.py (Nightly): same
864         * buildbot/__init__.py (version): bump to 0.7.2+ while between
865         releases
866         * docs/buildbot.texinfo: same
868 2006-02-17  Brian Warner  <warner@lothar.com>
870         * buildbot/__init__.py (version): Releasing buildbot-0.7.2
871         * docs/buildbot.texinfo: set version number to match
872         * NEWS: update for 0.7.2
874 2006-02-16  Brian Warner  <warner@lothar.com>
876         * docs/buildbot.texinfo (Build Dependencies): add cindex tag
878 2006-02-09  Brian Warner  <warner@lothar.com>
880         * docs/buildbot.texinfo (How Different VC Systems Specify Sources):
881         add text to explain per-build branch parameters
882         * NEWS: mention --umask
884 2006-02-08  Brian Warner  <warner@lothar.com>
886         * buildbot/scripts/runner.py (Maker.makeSlaveTAC): remove unused
887         method
888         (SlaveOptions.optParameters): add --umask, to make it possible to
889         make buildslave-generated files (including build products) be
890         world-readable
891         (slaveTAC): same
892         * buildbot/slave/bot.py (BuildSlave.startService): same
894 2006-01-23  Brian Warner  <warner@lothar.com>
896         * buildbot/status/builder.py: urllib.quote() all URLs that include
897         Builder names, so that builders can include characters like '/'
898         and ' ' without completely breaking the resulting HTML. Thanks to
899         Kevin Turner for the patch.
900         * buildbot/status/html.py: same
901         * buildbot/test/test_web.py (GetURL.testBuild): match changes
903         * NEWS: update in preparation for upcoming release
905 2006-01-18  Brian Warner  <warner@lothar.com>
907         * docs/examples/twisted_master.cfg: update to match the Twisted
908         buildbot: remove python2.2, switch to exarkun's buildslaves,
909         disable the .deb builder until we figure out how to build twisted
910         .debs from SVN, add some ktrace debugging to the OS-X build
911         process and remove the qt build, remove threadless builders,
912         change freebsd builder to use landonf's buildslave.
914 2006-01-12  Brian Warner  <warner@lothar.com>
916         * buildbot/master.py (Manhole.__init__): let port= be a strports
917         specification string, but handle a regular int for backwards
918         compatibility. This allows "tcp:12345:interface=127.0.0.1" to be
919         used in master.cfg to limit connections to just the local host.
920         (BuildMaster.loadConfig): same for c['slavePortnum']
921         * buildbot/scheduler.py (Try_Userpass.__init__): same
922         * buildbot/status/client.py (PBListener.__init__): same
923         * buildbot/status/html.py (Waterfall.__init__): same, for both
924         http_port and distrib_port. Include backwards-compatibility checks
925         so distrib_port can be a filename string and still mean unix:/foo
926         * docs/buildbot.texinfo (Setting the slaveport): document it
927         (Debug options): same
928         (HTML Waterfall): same
929         (PBListener): same
930         (try): same
931         * buildbot/test/test_config.py (ConfigTest): test it
933         * buildbot/master.py (BuildMaster.loadConfig): wait for the
934         slaveport's disownServiceParent deferred to fire before opening
935         the new one. Fixes an annoying bug in the unit tests.
937 2006-01-03  Brian Warner  <warner@lothar.com>
939         * buildbot/master.py (BuildMaster): remove the .schedulers
940         attribute, replacing it with an allSchedulers() method that looks
941         for all IService children that implement IScheduler. Having only
942         one parent/child relationship means fewer opportunities for bugs.
943         (BuildMaster.allSchedulers): new method
944         (BuildMaster.loadConfig_Schedulers): update to use allSchedulers,
945         also fix ugly bug that caused any config-file reload to
946         half-forget about the earlier Schedulers, causing an exception
947         when a Change arrived and was handed to a half-connected
948         Scheduler. The exception was in scheduler.py line 54ish:
949           self.parent.submitBuildSet(bs)
950           exceptions.AttributeError: 'NoneType' object has no attribute
951           'submitBuildSet'
952         (BuildMaster.addChange): update to use allSchedulers()
954         * buildbot/scheduler.py (BaseScheduler.__implements__): fix this
955         to work properly with twisted-1.3.0, where you must explicitly
956         include the __implements__ from parent classes
957         (BaseScheduler.__repr__): make it easier to distinguish distinct
958         instances
959         (BaseUpstreamScheduler.__implements__): same
961         * buildbot/status/builder.py (Status.getSchedulers): update to
962         use allSchedulers()
963         * buildbot/test/test_run.py (Run.testMaster): same
964         * buildbot/test/test_dependencies.py (Dependencies.findScheduler): same
965         * buildbot/test/test_config.py (ConfigTest.testSchedulers): same,
966         make sure Scheduler instances are left alone when an identical
967         config file is reloaded
968         (ConfigElements.testSchedulers): make sure Schedulers are properly
969         comparable
971         * Makefile (TRIALARGS): my local default Twisted version is now
972         2.1.0, update the trial arguments accordingly
974 2005-12-22  Brian Warner  <warner@lothar.com>
976         * docs/examples/twisted_master.cfg: merge changes from pyr: add
977         new win32 builders
979         * buildbot/scheduler.py (BaseScheduler.addChange): include a dummy
980         addChange in the parent class, although I suspect this should be
981         fixed better in the future.
983 2005-11-26  Brian Warner  <warner@lothar.com>
985         * buildbot/scheduler.py (AnyBranchScheduler.addChange): don't
986         explode when branch==None, thanks to Kevin Turner for the catch
987         * buildbot/test/test_scheduler.py (Scheduling.testAnyBranch): test
988         it
990         * buildbot/__init__.py (version): bump to 0.7.1+ while between
991         releases
992         * docs/buildbot.texinfo: same
994 2005-11-26  Brian Warner  <warner@lothar.com>
996         * buildbot/__init__.py (version): Releasing buildbot-0.7.1
997         * docs/buildbot.texinfo: set version number to match
999 2005-11-26  Brian Warner  <warner@lothar.com>
1001         * NEWS: update for 0.7.1
1003         * buildbot/status/builder.py (BuildStepStatus.unsubscribe): make
1004         sure that unsubscribe works even if we never sent an ETA update.
1005         Also, don't explode on duplicate unsubscribe.
1006         (BuildStepStatus.addLog): make the convenience "return self"-added
1007         watcher automatically unsubscribe when the Step finishes.
1008         (BuildStatus.unsubscribe): same handle-duplicate-unsubscribe
1009         (BuildStatus.stepStarted): same auto-unsubscribe
1010         (BuilderStatus.buildStarted): same auto-unsubscribe
1012         * buildbot/interfaces.py (IStatusReceiver.buildStarted): document
1013         auto-unsubscribe
1014         (IStatusReceiver.stepStarted): same
1015         (IStatusReceiver.logStarted): same
1017         * buildbot/test/test_run.py (Status): move the Status test..
1018         * buildbot/test/test_status.py (Subscription): .. to here
1020 2005-11-25  Brian Warner  <warner@lothar.com>
1022         * NEWS: more updates
1024         * buildbot/locks.py: fix the problem in which loading a master.cfg
1025         file that changes some Builders (but not all of them) can result
1026         in having multiple copies of the same Lock. Now, the real Locks
1027         are kept in a table inside the BotMaster, and the Builders/Steps
1028         use "LockIDs", which are still instances of MasterLock and
1029         SlaveLock. The real Locks are instances of the new RealMasterLock
1030         and RealSlaveLock classes.
1031         * buildbot/master.py (BotMaster.getLockByID): new method to
1032         convert LockIDs into real Locks.
1033         * buildbot/process/base.py (Build.startBuild): convert LockIDs
1034         into real Locks before building
1035         * buildbot/process/step.py (BuildStep.startStep): same
1036         * buildbot/test/test_locks.py (Locks.testLock1a): add a test which
1037         exercises the problem
1040         * docs/buildbot.texinfo (Scheduler Types): give a few hints about
1041         what Schedulers are available
1043         * buildbot/scheduler.py (Nightly): add new Scheduler based upon
1044         work by Dobes Vandermeer and hacked mercilessly by me. This offers
1045         'cron'-style build scheduling at certain times of day, week,
1046         month, or year.
1047         * buildbot/test/test_scheduler.py (Scheduling.testNightly): test it
1049         * buildbot/scheduler.py (Scheduler): change fileIsImportant
1050         handling: treat self.fileIsImportant more as an attribute that
1051         contains a callable than as a method. If the attribute is None,
1052         don't call it and assume all filenames are important. It is still
1053         possible to provide a fileIsImportant method in a subclass,
1054         however.
1055         (AnyBranchScheduler): handle fileIsImportant=None, previously it
1056         was broken
1057         * buildbot/test/test_scheduler.py (Scheduling.testAnyBranch2):
1058         test using AnyBranchScheduler with fileIsImportant=None
1060 2005-11-24  Brian Warner  <warner@lothar.com>
1062         * buildbot/test/test_config.py (StartService): don't claim a fixed
1063         port number, instead set slavePort=0 on the first pass, figure out
1064         what port was allocated, then switch to a config file that uses
1065         the allocated port.
1067         * buildbot/master.py (BuildMaster.loadConfig): close the old
1068         slaveport before opening the new one, because unit tests might
1069         replace slavePort=0 with the same allocated portnumber, and if we
1070         don't wait for the old port to close first, we get a "port already
1071         in use" error. There is a tiny race condition here, but the only
1072         threat is from other programs that bind (statically) to the same
1073         port number we happened to be allocated, and only if those
1074         programs use SO_REUSEADDR, and only if they get control in between
1075         reactor turns.
1077         * Makefile (TRIALARGS): update to handle Twisted > 2.1.0
1079         * buildbot/master.py (BuildMaster.loadConfig_Sources): remove all
1080         deleted ChangeSources before adding any new ones
1081         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): fix
1082         compare_attrs, to make sure that a config-file reload does not
1083         unnecessarily replace an unmodified ChangeSource instance
1084         * buildbot/test/test_config.py (ConfigTest.testSources): update
1086         * buildbot/scheduler.py (AnyBranchScheduler): fix branches=[] to
1087         mean "don't build anything", and add a warning if it gets used
1088         because it isn't actually useful.
1090         * contrib/svn_buildbot.py: update example usage to match the port
1091         number that gets used by the PBChangeSource
1092         * buildbot/scripts/sample.cfg: add example of PBChangeSource
1094 2005-11-22  Brian Warner  <warner@lothar.com>
1096         * NEWS: start collecting items for next release
1098         * buildbot/process/step.py (SVN.computeSourceRevision): assume
1099         revisions are strings
1100         (P4Sync.computeSourceRevision): same
1102         * buildbot/status/html.py (StatusResourceBuild.body): add a link
1103         to the Buildbot's overall status page
1104         (StatusResourceBuilder.body): same
1106 2005-11-15  Brian Warner  <warner@lothar.com>
1108         * buildbot/master.py (BuildMaster.loadConfig): serialize the
1109         config-file loading, specifically to make sure old StatusTargets
1110         are finished shutting down before new ones start up (thus
1111         resolving a bug in which changing the Waterfall object would fail
1112         because both new and old instances were claiming the same
1113         listening port). Also load new Schedulers after all the new
1114         Builders are set up, in case they fire off a new build right away.
1115         * buildbot/test/test_config.py (StartService): test it
1117         * buildbot/status/mail.py (MailNotifier.buildMessage): oops, add
1118         the branch name to the mail body
1120         * buildbot/changes/pb.py (PBChangeSource.compare_attrs): add this.
1121         Without it, a config-file reload fails to update an existing
1122         PBChangeSource.
1123         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): add
1124         username/passwd to compare_attrs, for the same reason
1125         * buildbot/status/html.py (Waterfall): add favicon to
1126         compare_attrs, same reason
1128 2005-11-05  Brian Warner  <warner@lothar.com>
1130         * buildbot/scripts/tryclient.py (createJobfile): stringify the
1131         baserev before stuffing it in the jobfile. This resolves problems
1132         under SVN (and probably Arch) where revisions are expressed as
1133         numbers. I'm inclined to use string-based revisions everywhere in
1134         the future, but this fix should be safe for now. Thanks to Steven
1135         Walter for the patch.
1137         * buildbot/changes/changes.py (ChangeMaster.saveYourself): use
1138         binary mode when opening pickle files, to make windows work
1139         better. Thanks to Dobes Vandermeer for the catch.
1140         * buildbot/status/builder.py (BuildStatus.saveYourself): same
1141         (BuilderStatus.getBuildByNumber): same
1142         (Status.builderAdded): same
1143         * buildbot/master.py (BuildMaster.loadChanges): same
1145         * buildbot/util.py (Swappable): delete unused leftover code
1147         * buildbot/process/step.py (SVN): when building on a non-default
1148         branch, add the word "[branch]" to the VC step's description, so
1149         it is obvious that we're not building the usual stuff. Likewise,
1150         when we are building a specific revision, add the text "rNNN" to
1151         indicate what that revision number is. Thanks to Brad Hards and
1152         Nathaniel Smith for the suggestion.
1153         (Darcs.startVC): same
1154         (Arch.startVC): same
1155         (Bazaar.startVC): same
1157         * buildbot/process/factory.py (GNUAutoconf.__init__): fix a silly
1158         typo, caught by Mark Dillavou, closes SF#1216636.
1160         * buildbot/test/test_status.py (Log.TODO_testDuplicate): add notes
1161         about a test to add some day
1163         * docs/examples/twisted_master.cfg: update: bot1 can now handle
1164         the 'full-2.3' build, and the 'reactors' build is now run under
1165         python-2.4 because the buildslave no longer has gtk/etc bindings
1166         for earlier versions.
1168 2005-11-03  Brian Warner  <warner@lothar.com>
1170         * buildbot/interfaces.py (IBuilderControl.resubmitBuild): new
1171         method, takes an IBuildStatus and rebuilds it. It might make more
1172         sense to add this to IBuildControl instead, but that instance goes
1173         away completely once the build has finished, and resubmitting
1174         builds can take place weeks later.
1175         * buildbot/process/builder.py (BuilderControl.resubmitBuild): same
1176         * buildbot/status/html.py (StatusResourceBuild): also stash an
1177         IBuilderControl so we can use resubmitBuild.
1178         (StatusResourceBuild.body): render "resubmit" button if we can.
1179         Also add hrefs for each BuildStep
1180         (StatusResourceBuild.rebuild): add action for "resubmit" button
1181         (StatusResourceBuilder.getChild): give it an IBuilderControl
1183         * buildbot/status/builder.py (Status.getURLForThing): change the
1184         URL for BuildSteps to have a "step-" prefix, so the magic URLs
1185         that live as targets of buttons like "stop" and "rebuild" can't
1186         collide with them.
1187         * buildbot/status/builder.py (Status.getURLForThing): same
1188         * buildbot/status/html.py (StatusResourceBuild.getChild): same
1189         (StepBox.getBox): same
1190         * buildbot/test/test_web.py (GetURL): same
1191         (Logfile): same
1193         * buildbot/process/step.py (SVN.__init__): put svnurl/baseURL
1194         exclusivity checks after Source.__init__ upcall, so misspelled
1195         arguments will be reported more usefully
1196         (Darcs.__init__): same
1198 2005-10-29  Brian Warner  <warner@lothar.com>
1200         * docs/examples/twisted_master.cfg: don't double-fire the 'quick'
1201         builder. Move the Try scheduler off to a separate port.
1203 2005-10-27  Brian Warner  <warner@lothar.com>
1205         * buildbot/clients/gtkPanes.py
1206         (TwoRowClient.remote_builderRemoved): disappearing Builders used
1207         to cause the app to crash, now they don't.
1209         * buildbot/clients/debug.py: display the buildmaster's location
1210         in the window's title bar
1212 2005-10-26  Brian Warner  <warner@lothar.com>
1214         * buildbot/status/mail.py (MailNotifier): urllib.escape the URLs
1215         in case they have spaces or whatnot. Patch from Dobes Vandermeer.
1216         * buildbot/test/test_status.py (MyStatus.getURLForThing): fix it
1218         * buildbot/status/html.py (td): put a single non-breaking space
1219         inside otherwise empty <td> elements, as a workaround for buggy
1220         browsers which would optimize them away (along with any associated
1221         styles, like the kind that create the waterfall grid borders).
1222         Patch from Frerich Raabe.
1224         * buildbot/process/step_twisted.py (Trial): expose the trialMode=
1225         argv-list as an argument, defaulting to ["-to"], which is
1226         appropriate for the Trial that comes with Twisted-2.1.0 and
1227         earlier. The Trial in current Twisted SVN wants
1228         ["--reporter=bwverbose"] instead. Also expose trialArgs=, which
1229         defaults to an empty list.
1230         * buildbot/process/process_twisted.py (TwistedTrial.trialMode):
1231         match it, now that trialMode= is a list instead of a single string
1233         * buildbot/__init__.py (version): bump to 0.7.0+ while between
1234         releases
1235         * docs/buildbot.texinfo: same
1237 2005-10-24  Brian Warner  <warner@lothar.com>
1239         * buildbot/__init__.py (version): Releasing buildbot-0.7.0
1240         * docs/buildbot.texinfo: set version number to match
1242 2005-10-24  Brian Warner  <warner@lothar.com>
1244         * README: update for 0.7.0
1245         * NEWS: same
1246         * docs/buildbot.texinfo: move the freshcvs stuff out of the README
1248         * buildbot/clients/debug.glade: add 'branch' box to fake-commit
1249         * buildbot/clients/debug.py (DebugWidget.do_commit): same. Don't
1250         send the branch= argument unless the user really provided one, to
1251         retain compatibility with older buildmasters that don't accept
1252         that argument.
1253         * buildbot/master.py (DebugPerspective.perspective_fakeChange):
1254         same
1256         * docs/buildbot.texinfo: update lots of stuff
1258         * buildbot/scripts/runner.py (sendchange): add a --branch argument
1259         to the 'buildbot sendchange' command
1260         * buildbot/clients/sendchange.py (Sender.send): same
1261         * buildbot/changes/pb.py (ChangePerspective): same
1262         * buildbot/test/test_changes.py (Sender.testSender): test it
1264         * buildbot/process/step.py (SVN.__init__): change 'base_url' and
1265         'default_branch' argument names to 'baseURL' and 'defaultBranch',
1266         for consistency with other BuildStep arguments that use camelCase.
1267         Well, at least more of them use camelCase (like flunkOnWarnings)
1268         than don't.. I wish I'd picked one style and stuck with it
1269         earlier. Annoying, but it's best done before the release, since
1270         these arguments didn't exist at all in 0.6.6 .
1271         (Darcs): same
1272         * buildbot/test/test_vc.py (SVN.testCheckout): same
1273         (Darcs.testPatch): same
1274         * docs/buildbot.texinfo (SVN): document the change
1275         (Darcs): same, add some build-on-branch docs
1276         * docs/examples/twisted_master.cfg: match change
1278         * buildbot/process/step.py (BuildStep): rename
1279         slaveVersionNewEnough to slaveVersionIsOlderThan, because that's
1280         how it is normally used.
1281         * buildbot/test/test_steps.py (Version.checkCompare): same
1283         * buildbot/process/step.py (CVS.startVC): refuse to build
1284         update/copy -style builds on a non-default branch with an old
1285         buildslave (<=0.6.6) that doesn't know how to do it properly. The
1286         concern is that it will do a VC 'update' in an existing tree when
1287         it is supposed to be switching branches (and therefore clobbering
1288         the tree to do a full checkout), thus building the wrong source.
1289         This used to be a warning, but I think the confusion it is likely
1290         to cause warrants making it an error.
1291         (SVN.startVC): same, also make mode=export on old slaves an error
1292         (Darcs.startVC): same
1293         (Git.startVC): improve error message for non-Git-enabled slaves
1294         (Arch.checkSlaveVersion): same. continue to emit a warning when a
1295         specific revision is built on a slave that doesn't pay attention
1296         to args['revision'], because for slowly-changing trees it will
1297         probably do the right thing, and because we have no way to tell
1298         whether we're asking it to build the most recent version or not.
1299         * buildbot/interfaces.py (BuildSlaveTooOldError): new exception
1301         * buildbot/scripts/runner.py (SlaveOptions.postOptions): assert
1302         that 'master' is in host:portnum format, to catch errors sooner
1304 2005-10-23  Brian Warner  <warner@lothar.com>
1306         * buildbot/process/step_twisted.py (ProcessDocs.createSummary):
1307         when creating the list of warning messages, include the line
1308         immediately after each WARNING: line, since that's usually where
1309         the file and line number wind up.
1311         * docs/examples/twisted_master.cfg: OS-X slave now does QT, add a
1312         TryScheduler
1314         * NEWS: update
1316 2005-10-22  Brian Warner  <warner@lothar.com>
1318         * buildbot/status/html.py (HtmlResource): incorporate valid-HTML
1319         patch from Brad Hards
1320         * buildbot/status/classic.css: same
1321         * buildbot/test/test_web.py (Waterfall): match changes
1323         * buildbot/test/test_steps.py (BuildStep.setUp): set
1324         nextBuildNumber so the test passes
1325         * buildbot/test/test_status.py (MyBuilder): same
1327         * buildbot/status/html.py (StatusResourceBuild.body): revision
1328         might be numeric, so stringify it before html-escapifying it
1329         (CurrentBox.getBox): add a "waiting" state, and show a countdown
1330         timer for the upcoming build
1331         * buildbot/status/classic.css: add background-color attributes for
1332         offline/waiting/building classes
1334         * buildbot/status/builder.py (BuildStatus): derive from
1335         styles.Versioned, fix upgrade of .sourceStamp attribute. Also set
1336         the default (i.e. unknown) .slavename to "???" instead of None,
1337         since even unknown slavenames need to be printed eventually.
1338         (BuilderStatus): also derive from styles.Versioned . More
1339         importantly, determine .nextBuildNumber at creation/unpickling
1340         time by scanning the directory of saved BuildStatus instances and
1341         choosing one larger than the highest-numbered one found. This
1342         should fix the problem where random errors during upgrades cause
1343         the buildbot to forget about earlier builds. .nextBuildNumber is
1344         no longer stored in the pickle.
1345         (Status.builderAdded): if we can't unpickle the BuilderStatus,
1346         at least log the error. Also call Builder.determineNextBuildNumber
1347         once the basedir is set.
1349         * buildbot/master.py (BuildMaster.loadChanges): do
1350         styles.doUpgrade afterwards, in case I decide to make Changes
1351         derived from styles.Versioned some day and forget to make this
1352         change later.
1355         * buildbot/test/test_runner.py (Options.testForceOptions): skip
1356         when running under older pythons (<2.3) in which the shlex module
1357         doesn't have a 'split' function.
1359         * buildbot/process/step.py (ShellCommand.start): make
1360         errorMessages= be a list of strings to stuff in the log before the
1361         command actually starts. This makes it easier to flag multiple
1362         warning messages, e.g. when the Source steps have to deal with an
1363         old buildslave.
1364         (CVS.startVC): handle slaves that don't handle multiple branches
1365         by switching into 'clobber' mode
1366         (SVN.startVC): same. Also reject branches without base_url
1367         (Darcs.startVC): same. Also reject revision= in older slaves
1368         (Arch.checkSlaveVersion): same (just the multiple-branches stuff)
1369         (Bazaar.startVC): same, and test for baz separately than for arch
1371         * buildbot/slave/commands.py (cvs_ver): document new features
1373         * buildbot/process/step.py (BuildStep.slaveVersion): document it
1374         (BuildStep.slaveVersionNewEnough): more useful utility method
1375         * buildbot/test/test_steps.py (Version): start testing it
1377         * buildbot/status/words.py (IrcStatusBot.command_FORCE): note that
1378         the 'force' command requires python2.3, for the shlex.split method
1380         * docs/examples/twisted_master.cfg: remove old freshcvs stuff,
1381         since we don't use it anymore. The Twisted buildbot uses a
1382         PBChangeSource now.
1384 2005-10-21  Brian Warner  <warner@lothar.com>
1386         * buildbot/process/process_twisted.py: rework all BuildFactory
1387         classes to take a 'source' step as an argument, instead of
1388         building up the SVN instance in the factory.
1389         * docs/examples/twisted_master.cfg: enable build-on-branch by
1390         providing a base_url and default_branch
1392         * buildbot/status/words.py (IrcStatusBot.command_FORCE): add
1393         control over --branch and --revision, not that they are always
1394         legal to provide
1395         * buildbot/status/html.py (StatusResourceBuilder.force): same
1396         (StatusResourceBuild.body): display SourceStamp components
1398         * buildbot/scripts/runner.py (ForceOptions): option parser for the
1399         IRC 'force' command, so it can be shared with an eventual
1400         command-line-tool 'buildbot force' mode.
1401         * buildbot/test/test_runner.py (Options.testForceOptions): test it
1403 2005-10-20  Brian Warner  <warner@lothar.com>
1405         * buildbot/status/mail.py (MailNotifier.buildMessage): reformat
1407         * docs/examples/twisted_master.cfg: update to use Schedulers
1409         * buildbot/scripts/sample.cfg: update with Schedulers
1411         * buildbot/interfaces.py (IBuilderControl.requestBuildSoon): new
1412         method specifically for use by HTML "force build" button and the
1413         IRC "force" command. Raises an immediate error if there are no
1414         slaves available.
1415         (IBuilderControl.requestBuild): make this just submit a build, not
1416         try to check for existing slaves or set up any when-finished
1417         Deferreds or anything.
1418         * buildbot/process/builder.py (BuilderControl): same
1419         * buildbot/status/html.py (StatusResourceBuilder.force): same
1420         * buildbot/status/words.py (IrcStatusBot.command_FORCE): same
1421         * buildbot/test/test_slaves.py: same
1422         * buildbot/test/test_web.py: same
1424 2005-10-19  Brian Warner  <warner@lothar.com>
1426         * docs/examples/twisted_master.cfg: re-sync with reality: bring
1427         back python2.2 tests, turn off OS-X threadedselect-reactor tests
1429 2005-10-18  Brian Warner  <warner@lothar.com>
1431         * buildbot/status/html.py: provide 'status' argument to most
1432         StatusResourceFOO objects
1433         (StatusResourceBuild.body): href-ify the Builder name, add "Steps
1434         and Logfiles" section to make the Build page into a more-or-less
1435         comprehensive source of status information about the build
1437         * buildbot/status/mail.py (MailNotifier): include the Build's URL
1438         * buildbot/status/words.py (IrcStatusBot.buildFinished): same
1440 2005-10-17  Brian Warner  <warner@lothar.com>
1442         * buildbot/process/process_twisted.py (TwistedTrial): update Trial
1443         arguments to accomodate Twisted >=2.1.0 . I will have to figure
1444         out what to do about other projects: the correct options for
1445         recent Twisteds will not work for older ones.
1447 2005-10-15  Brian Warner  <warner@lothar.com>
1449         * buildbot/status/builder.py (Status.getURLForThing): add method
1450         to provide a URL for arbitrary IStatusFoo objects. The idea is to
1451         use this in email/IRC status clients to make them more useful, by
1452         providing the end user with hints on where to learn more about the
1453         object being reported on.
1454         * buildbot/test/test_web.py (GetURL): tests for it
1456 2005-10-14  Brian Warner  <warner@lothar.com>
1458         * buildbot/test/test_config.py (ConfigTest._testSources_1): oops,
1459         fix bug resulting from deferredResult changes
1461 2005-10-13  Brian Warner  <warner@lothar.com>
1463         * buildbot/test/test_changes.py: remove use of deferredResult
1464         * buildbot/test/test_config.py: same
1465         * buildbot/test/test_control.py: same
1466         * buildbot/test/test_status.py: same
1467         * buildbot/test/test_vc.py: this is the only remaining use, since
1468         it gets used at module level. This needs to be replaced by some
1469         sort of class-level run-once routine.
1471         * buildbot/status/words.py (IrcStatusBot.command_WATCH): fix typo
1473         * lots: implement multiple slaves per Builder, which means multiple
1474         current builds per Builder. Some highlights:
1475         * buildbot/interfaces.py (IBuilderStatus.getState): return a tuple
1476         of (state,currentBuilds) instead of (state,currentBuild)
1477         (IBuilderStatus.getCurrentBuilds): replace getCurrentBuild()
1478         (IBuildStatus.getSlavename): new method, so you can tell which
1479         slave got used. This only gets set when the build completes.
1480         (IBuildRequestStatus.getBuilds): new method
1482         * buildbot/process/builder.py (SlaveBuilder): add a .state
1483         attribute to track things like ATTACHING and IDLE and BUILDING,
1484         instead of..
1485         (Builder): .. the .slaves attribute here, which has been turned
1486         into a simple list of available slaves. Added a separate
1487         attaching_slaves list to track ones that are not yet ready for
1488         builds.
1489         (Builder.fireTestEvent): put off the test-event callback for a
1490         reactor turn, to make tests a bit more consistent.
1491         (Ping): cleaned up the slaveping a bit, now it disconnects if the
1492         ping fails due to an exception. This needs work, I'm worried that
1493         a code error could lead to a constantly re-connecting slave.
1494         Especially since I'm trying to move to a distinct remote_ping
1495         method, separate from the remote_print that we currently use.
1496         (BuilderControl.requestBuild): return a convenience Deferred that
1497         provides an IBuildStatus when the build finishes.
1498         (BuilderControl.ping): ping all connected slaves, only return True
1499         if they all respond.
1501         * buildbot/slave/bot.py (BuildSlave.stopService): stop trying to
1502         reconnect when we shut down.
1504         * buildbot/status/builder.py: implement new methods, convert
1505         one-build-at-a-time methods to handle multiple builds
1506         * buildbot/status/*.py: do the same in all default status targets
1507         * buildbot/status/html.py: report the build's slavename in the
1508         per-Build page, report all buildslaves on the per-Builder page
1510         * buildbot/test/test_run.py: update/create tests
1511         * buildbot/test/test_slaves.py: same
1512         * buildbot/test/test_scheduler.py: remove stale test
1514         * docs/buildbot.texinfo: document the new builder-specification
1515         'slavenames' parameter
1517 2005-10-12  Brian Warner  <warner@lothar.com>
1519         * buildbot/buildset.py (BuildSet): fix bug where BuildSet did not
1520         report failure correctly, causing Dependent builds to run when
1521         they shouldn't have.
1522         * buildbot/status/builder.py (BuildSetStatus): same
1523         * buildbot/test/test_buildreq.py (Set.testBuildSet): verify it
1524         (Set.testSuccess): test the both-pass case too
1525         * buildbot/test/test_dependencies.py (Dependencies.testRun_Fail):
1526         fix this test: it was ending too early, masking the failure before
1527         (Logger): specialized StatusReceiver to make sure the dependent
1528         builds aren't even started, much less completed.
1530 2005-10-07  Brian Warner  <warner@lothar.com>
1532         * buildbot/slave/bot.py (SlaveBuilder.activity): survive
1533         bot.SlaveBuilder being disowned in the middle of a build
1535         * buildbot/status/base.py (StatusReceiverMultiService): oops, make
1536         this inherit from StatusReceiver. Also upcall in __init__. This
1537         fixes the embarrasing crash when the new buildSetSubmitted method
1538         is invoked and Waterfall/etc don't implement their own.
1539         * buildbot/test/test_run.py: add a TODO note about a test to catch
1540         just this sort of thing.
1542         * buildbot/process/builder.py (Builder.attached): remove the
1543         already-attached warning, this situation is normal. Add some
1544         comments explaining it.
1546 2005-10-02  Brian Warner  <warner@lothar.com>
1548         * buildbot/changes/maildir.py (Maildir.start): Tolerate
1549         OverflowError when setting up dnotify, because some 64-bit systems
1550         have problems with signed-vs-unsigned constants and trip up on the
1551         DN_MULTISHOT flag. Patch from Brad Hards.
1553 2005-09-06  Fred Drake  <fdrake@users.sourceforge.net>
1555         * buildbot/process/step.py (BuildStep, ShellCommand): Add
1556         progressMetrics, description, descriptionDone to the 'parms' list,
1557         and make use the 'parms' list from the implementation class
1558         instead of only BuildStep to initialize the parameters.  This
1559         allows buildbot.process.factory.s() to initialize all the parms,
1560         not just those defined in directly by BuildStep.
1562 2005-09-03  Brian Warner  <warner@lothar.com>
1564         * NEWS: start adding items for the next release
1566         * docs/examples/twisted_master.cfg: (sync with reality) turn off
1567         python2.2 tests, change 'Quick' builder to only use python2.3
1569 2005-09-02  Fred Drake  <fdrake@users.sourceforge.net>
1571         * buildbot/status/html.py (StatusResourceBuilder.body): only show
1572         the "Ping Builder" button if the build control is available; the
1573         user sees an exception otherwise
1575         * docs/buildbot.texinfo (PBChangeSource): fix a typo
1577 2005-09-01  Brian Warner  <warner@lothar.com>
1579         * buildbot/interfaces.py (IBuilderStatus.getState): update
1580         signature, point out that 'build' can be None
1581         (IBuildStatus.getETA): point out ETA can be none
1583         * buildbot/status/html.py (CurrentBox.getBox): tolerate build/ETA
1584         being None
1585         * buildbot/status/words.py (IrcStatusBot.emit_status): same
1587 2005-08-31  Brian Warner  <warner@lothar.com>
1589         * buildbot/status/base.py (StatusReceiver.builderChangedState):
1590         update to match correct signature: removed 'eta' argument
1591         * buildbot/status/mail.py (MailNotifier.builderChangedState): same
1593 2005-08-30  Brian Warner  <warner@lothar.com>
1595         * buildbot/status/builder.py (LogFile): remove the assertion that
1596         blows up when you try to overwrite an existing logfile, instead
1597         just emit a warning. This case gets hit when the buildmaster is
1598         killed and doesn't get a chance to write out the serialized
1599         BuilderStatus object, so the .nextBuildNumber attribute gets out
1600         of date.
1602         * buildbot/scripts/runner.py (sendchange): add --revision_file to
1603         the 'buildbot sendchange' arguments, for the Darcs context file
1604         * docs/buildbot.texinfo (sendchange): document it
1606         * buildbot/status/html.py: add pending/upcoming builds to CurrentBox
1607         * buildbot/interfaces.py (IScheduler.getPendingBuildTimes): new method
1608         (IStatus.getSchedulers): new method
1609         * buildbot/status/builder.py (BuilderStatus): track pendingBuilds
1610         (Status.getSchedulers): implement
1611         * buildbot/process/builder.py (Builder): maintain
1612         BuilderStatus.pendingBuilds
1613         * buildbot/scheduler.py (Scheduler.getPendingBuildTimes): new method
1614         (TryBase.addChange): Try schedulers should ignore Changes
1616         * buildbot/scripts/tryclient.py (getTopdir): implement getTopdir
1617         for 'try' on CVS/SVN
1618         * buildbot/test/test_runner.py (Try.testGetTopdir): test case
1620         * buildbot/scripts/tryclient.py (Try): make jobdir-style 'try'
1621         report status properly.
1622         (Try.createJob): implement unique buildset IDs
1624         * buildbot/status/client.py (StatusClientPerspective): add a
1625         perspective_getBuildSets method for the benefit of jobdir-style
1626         'try'.
1627         * docs/buildbot.texinfo (try): more docs
1628         * buildbot/test/test_scheduler.py (Scheduling.testGetBuildSets):
1629         new test case
1631 2005-08-18  Brian Warner  <warner@lothar.com>
1633         * buildbot/scripts/tryclient.py (Try): make 'try' status reporting
1634         actually work. It's functional but still kind of clunky. Also, it
1635         only works with the pb-style.. needs to be made to work with the
1636         jobdir-style too.
1638         * buildbot/status/client.py (RemoteBuildSet): new class
1639         (RemoteBuildRequest): same
1640         (RemoteBuild.remote_waitUntilFinished): return the RemoteBuild
1641         object, not the internal BuildStatus object.
1642         (RemoteBuild.remote_subscribe): new method to subscribe to builds
1643         outside of the usual buildStarted() return value.
1644         (BuildSubscriber): support class for RemoteBuild.remote_subscribe
1646         * buildbot/scheduler.py (Try_Jobdir): convey buildsetID properly
1647         (Try_Userpass_Perspective.perspective_try): return a remotely
1648         usable BuildSetStatus object
1650         * buildbot/interfaces.py (IBuildStatus): remove obsolete
1651         isStarted()/waitUntilStarted()
1653 2005-08-16  Brian Warner  <warner@lothar.com>
1655         * buildbot/status/builder.py: implement IBuildSetStatus and
1656         IBuildRequestStatus, wire them into place.
1657         * buildbot/buildset.py: same. Add ID, move wait-until-finished
1658         methods into the BuildSetStatus object.
1659         * buildbot/interfaces.py: same
1660         (IStatus.getBuildSets): new method to get pending BuildSets
1661         (IStatusReceiver.buildsetSubmitted): new method which hears about
1662         new BuildSets
1663         * buildbot/master.py (BuildMaster.submitBuildSet): same
1664         * buildbot/process/base.py (BuildRequest): same, replace
1665         waitUntilStarted with subscribe/unsubscribe
1666         * buildbot/process/builder.py (BuilderControl.forceBuild): use
1667         subscribe instead of waitUntilStarted
1668         * buildbot/status/base.py (StatusReceiver.buildsetSubmitted): stub
1669         for new method
1670         * buildbot/status/client.py (StatusClientPerspective.builderRemoved): 
1671         same
1672         * buildbot/test/test_buildreq.py: update for new code
1673         * buildbot/test/test_control.py (Force.testRequest): same
1676         * buildbot/slave/commands.py (Darcs.doVCFull): fix get-revision
1677         for Darcs to not use the tempfile module, so it works under
1678         python-2.2 too. We really didn't need the full cleverness of that
1679         module, since the slave has exclusive control of its own builddir.
1681 2005-08-15  Brian Warner  <warner@lothar.com>
1683         * buildbot/scripts/tryclient.py (CVSExtractor): implement 'try'
1684         for CVS trees. It doesn't work for non-trunk branches,
1685         unfortunately.
1686         * buildbot/test/test_vc.py (CVS.testTry): test it, but skip the
1687         branch test
1689         * Makefile: make it easier to test against python2.2
1691         * buildbot/test/test_vc.py (VCBase.tearDown): provide for
1692         tearDown2, so things like Arch can unregister archives as they're
1693         shutting down. The previous subclass-override-tearDown technique
1694         resulted in a nested maybeWait() and test failures under
1695         Twisted-1.3.0
1697         * buildbot/scripts/tryclient.py (getSourceStamp): extract branches
1698         where we can (Arch), add a branch= argument to set the branch used
1699         when we can't
1700         (BazExtractor): extract the branch too
1701         (TlaExtractor): same
1702         * buildbot/scripts/runner.py (TryOptions): add --branch
1703         * docs/buildbot.texinfo (try): document --branch/try_branch
1705         * buildbot/slave/commands.py (Darcs): implement get-revision for
1706         Darcs, so that 'try' will work. This requires the tempfile module
1707         from python-2.3 .
1709         * buildbot/test/test_vc.py: rewrite tests, getting better coverage
1710         of revisions, branches, and 'try' in the process.
1712 2005-08-11  Brian Warner  <warner@lothar.com>
1714         * buildbot/master.py (DebugPerspective.perspective_pokeIRC): fix
1715         this, it got broken at some point in the last few releases
1716         * buildbot/status/words.py (IrcBuildRequest): reply was broken
1717         (IrcStatusBot.emit_status): handle new IBuilderStatus.getState,
1718         specifically the removal of ETA information from the tuple
1720         * buildbot/locks.py: use %d for id() instead of %x, avoid a silly
1721         warning message
1723         * docs/buildbot.texinfo (try): document both --builder and
1724         'try_builders' in .buildbot/options
1725         * buildbot/scripts/runner.py (TryOptions): add --builder,
1726         accumulate the values into opts['builders']
1727         * buildbot/scripts/tryclient.py (Try.__init__): set builders
1728         * buildbot/test/test_runner.py (Try): add some quick tests to make
1729         sure 'buildbot try --options' and .buildbot/options get parsed
1730         * buildbot/test/test_scheduler.py (Scheduling.testTryUserpass):
1731         use --builder control
1733         * docs/buildbot.texinfo (try): add --port argument to PB style
1735         * buildbot/scripts/tryclient.py (SourceStampExtractor): return an
1736         actual SourceStamp. Still need to extract a branch name, somehow.
1737         (Try): finish implementing the try client side, still need a UI
1738         for specifying which builders to use
1739         (Try.getopt): factor our options/config-file reading
1740         * buildbot/test/test_scheduler.py (Scheduling.testTryUserpass):
1741         test it
1742         * buildbot/test/test_vc.py: match SourceStampExtractor change
1744         * buildbot/scripts/runner.py (Options.opt_verbose): --verbose
1745         causes the twisted log to be sent to stderr
1747         * buildbot/scheduler.py (Try_Userpass): implement the PB style
1749 2005-08-10  Brian Warner  <warner@lothar.com>
1751         * buildbot/scripts/runner.py: Add 'buildbot try' command, jobdir
1752         style is 90% done, still missing status reporting or waiting for
1753         the buildsets to finish, and it is completely untested.
1755         * buildbot/trybuild.py: delete file, move contents to ..
1756         * buildbot/scripts/tryclient.py (getSourceStamp): .. here
1757         * buildbot/test/test_vc.py: match the move
1759         * buildbot/scheduler.py (Try_Jobdir): implement the jobdir style
1760         of the TryScheduler, no buildsetID or status-tracking support yet
1761         * buildbot/test/test_scheduler.py (Scheduling.testTryJobdir): test it
1763         * buildbot/changes/maildir.py (Maildir.setBasedir): make it
1764         possible to set the basedir after __init__ time, so it is easier
1765         to use as a Service-child of the BuildMaster instance
1767         * buildbot/changes/maildirtwisted.py (MaildirService): make a form
1768         that delivers messages to its Service parent instead of requiring
1769         a subclass to be useful. This turns out to be much easier to build
1770         unit tests around.
1772         * buildbot/scripts/tryclient.py (createJob): utility code to
1773         create jobfiles, will eventually be used by 'buildbot try'
1775 2005-08-08  Brian Warner  <warner@lothar.com>
1777         * docs/buildbot.texinfo (try): add docs on the
1778         as-yet-unimplemented Try scheduler
1780         * buildbot/test/test_buildreq.py: move Scheduling tests out to ..
1781         * buildbot/test/test_scheduler.py: .. here
1782         (Scheduling.testTryJobdir): add placeholder test for 'try'
1784         * buildbot/test/test_status.py (Log.testMerge3): update to match new
1785         addEntry merging (>=chunkSize) behavior
1786         (Log.testConsumer): update to handle new callLater(0) behavior
1788         * buildbot/test/test_web.py: rearrange tests a bit, add test for
1789         both the MAX_LENGTH bugfix and the resumeProducing hang.
1791         * buildbot/status/builder.py (LogFileProducer.resumeProducing):
1792         put off the actual resumeProducing for a moment with
1793         reactor.callLater(0). This works around a twisted-1.3.0 bug which
1794         causes large logfiles to hang midway through.
1796         * buildbot/process/step.py (BuildStep.addCompleteLog): break the
1797         logfile up into chunks, both to avoid NetstringReceiver.MAX_LENGTH
1798         and to improve memory usage when streaming the file out to a web
1799         browser.
1800         * buildbot/status/builder.py (LogFile.addEntry): change > to >= to
1801         make this work cleanly
1803 2005-08-03  Brian Warner  <warner@lothar.com>
1805         * buildbot/trybuild.py: new file for 'try' utilities
1806         (getSourceStamp): run in a tree, find out the baserev+patch
1807         * buildbot/test/test_vc.py (VCBase.do_getpatch): test it,
1808         implemented for SVN and Darcs, still working on Arch. I don't know
1809         how to make CVS work yet.
1811         * docs/buildbot.texinfo: document the 'buildbot' command-line
1812         tool, including the not-yet-implemented 'try' feature, and the
1813         in-flux .buildbot/ options directory.
1815 2005-07-20  Brian Warner  <warner@lothar.com>
1817         * buildbot/locks.py: added temporary id() numbers to Lock
1818         descriptions, to track down a not-really-sharing-the-Lock bug
1820         * buildbot/test/runutils.py: must import errno, cut-and-paste bug
1822         * buildbot/test/test_slavecommand.py (ShellBase.failUnlessIn):
1823         needed for python2.2 compatibility
1824         * buildbot/test/test_vc.py: python2.2 compatibility: generators
1825         are from the __future__
1827 2005-07-19  Brian Warner  <warner@lothar.com>
1829         * buildbot/master.py (BuildMaster.loadConfig): give a better error
1830         message when schedulers use unknown builders
1832         * buildbot/process/builder.py (Builder.compareToSetup): make sure
1833         SlaveLock('name') and MasterLock('name') are distinct
1835         * buildbot/master.py (BuildMaster.loadConfig): oops, sanity-check
1836         c['schedulers'] in such a way that we can actually accept
1837         Dependent instances
1838         * buildbot/test/test_config.py: check it
1840         * buildbot/scheduler.py (Dependent.listBuilderNames): oops, add
1841         utility method to *all* the Schedulers
1842         (Periodic.listBuilderNames): same
1844         * docs/buildbot.texinfo (Interlocks): update chapter to match
1845         reality
1847         * buildbot/master.py (BuildMaster.loadConfig): Add sanity checks
1848         to make sure that c['sources'], c['schedulers'], and c['status']
1849         are all lists of the appropriate objects, and that the Schedulers
1850         all point to real Builders
1851         * buildbot/interfaces.py (IScheduler, IUpstreamScheduler): add
1852         'listBuilderNames' utility method to support this
1853         * buildbot/scheduler.py: implement the utility method
1854         * buildbot/test/test_config.py (ConfigTest.testSchedulers): test it
1856         * docs/buildbot.texinfo: add some @cindex entries
1858         * buildbot/test/test_vc.py (Arch.createRepository): set the tla ID
1859         if it wasn't already set: most tla commands will fail unless one
1860         has been set.
1861         (Arch.createRepository): and disable bazaar's revision cache, since
1862         they cause test failures (the multiple repositories we create all
1863         interfere with each other through the cache)
1865         * buildbot/test/test_web.py (WebTest): remove use of deferredResult,
1866         bring it properly up to date with twisted-2.0 test guidelines
1868         * buildbot/master.py (BuildMaster): remove references to old
1869         'interlock' module, this caused a bunch of post-merge test
1870         failures
1871         * buildbot/test/test_config.py: same
1872         * buildbot/process/base.py (Build): same
1874         * buildbot/test/test_slaves.py: stubs for new test case
1876         * buildbot/scheduler.py: add test-case-name tag
1877         * buildbot/test/test_buildreq.py: same
1879         * buildbot/slave/bot.py (SlaveBuilder.__init__): remove some
1880         unnecessary init code
1881         (Bot.remote_setBuilderList): match it
1883         * docs/buildbot.texinfo (@settitle): don't claim version 1.0
1885         * buildbot/changes/mail.py (parseSyncmail): update comment
1887         * buildbot/test/test_slavecommand.py: disable Shell tests on
1888         platforms that don't suport IReactorProcess
1890         * buildbot/status/builder.py (LogFile): remove the 't' mode from
1891         all places where we open logfiles. It causes OS-X to open the file
1892         in some weird mode that that prevents us from mixing reads and
1893         writes to the same filehandle, which we depend upon to implement
1894         _generateChunks properly. This change doesn't appear to break
1895         win32, on which "b" and "t" are treated differently but a missing
1896         flag seems to be interpreted as "t".
1898 2005-07-18  Brian Warner  <warner@lothar.com>
1900         * buildbot/slave/commands.py (ShellCommand): overhaul
1901         error-handling code, to try and make timeout/interrupt work
1902         properly, and make win32 happier
1903         * buildbot/test/test_slavecommand.py: clean up, stop using
1904         reactor.iterate, add tests for timeout and interrupt
1905         * buildbot/test/sleep.py: utility for a new timeout test
1907         * buildbot/twcompat.py: copy over twisted 1.3/2.0 compatibility
1908         code from the local-usebranches branch
1910 2005-07-17  Brian Warner  <warner@lothar.com>
1912         * buildbot/process/process_twisted.py
1913         (TwistedReactorsBuildFactory): change the treeStableTimer to 5
1914         minutes, to match the other twisted BuildFactories, and don't
1915         excuse failures in c/qt/win32 reactors any more.
1917         * docs/examples/twisted_master.cfg: turn off the 'threadless' and
1918         'freebsd' builders, since the buildslaves have been unavailable
1919         for quite a while
1921 2005-07-13  Brian Warner  <warner@lothar.com>
1923         * buildbot/test/test_vc.py (VCBase.do_branch): test the new
1924         build-on-branch feature
1926         * buildbot/process/step.py (Darcs.__init__): add base_url and
1927         default_branch arguments, just like SVN
1928         (Arch.__init__): note that the version= argument is really the
1929         default branch name
1931         * buildbot/slave/commands.py (SourceBase): keep track of the
1932         repository+branch that was used for the last checkout in
1933         SRCDIR/.buildbot-sourcedata . If the contents of this file do not
1934         match, we clobber the directory and perform a fresh checkout
1935         rather than trying to do an in-place update. This should protect
1936         us against trying to get to branch B by doing an update in a tree
1937         obtained from branch A.
1938         (CVS.setup): add CVS-specific sourcedata: root, module, and branch
1939         (SVN.setup): same, just the svnurl
1940         (Darcs.setup): same, just the repourl
1941         (Arch.setup): same, arch coordinates (url), version, and
1942         buildconfig. Also pull the buildconfig from the args dictionary,
1943         which we weren't doing before, so the build-config was effectively
1944         disabled.
1945         (Arch.sourcedirIsUpdateable): don't try to update when we're
1946         moving to a specific revision: arch can't go backwards, so it is
1947         safer to just clobber the tree and checkout a new one at the
1948         desired revision.
1949         (Bazaar.setup): same sourcedata as Arch
1951         * buildbot/test/test_dependencies.py (Dependencies.testRun_Fail):
1952         use maybeWait, to work with twisted-1.3.0 and twcompat
1953         (Dependencies.testRun_Pass): same
1955         * buildbot/test/test_vc.py: rearrange, cleanup
1957         * buildbot/twcompat.py: add defer.waitForDeferred and
1958         utils.getProcessOutputAndValue, so test_vc.py (which uses them)
1959         can work under twisted-1.3.0 .
1961         * buildbot/test/test_vc.py: rewrite. The sample repositories are
1962         now created at setUp time. This increases the runtime of the test
1963         suite considerably (from 91 seconds to 151), but it removes the
1964         need for an offline tarball, which should solve a problem I've
1965         seen where the test host has a different version of svn than the
1966         tarball build host. The new code also validates that mode=update
1967         really picks up recent commits. This approach will also make it
1968         easier to test out branches, because the code which creates the VC
1969         branches is next to the code which uses them. It will also make it
1970         possible to test some change-notification hooks, by actually
1971         performing a VC commit and watching to see the ChangeSource get
1972         notified.
1974 2005-07-12  Brian Warner  <warner@lothar.com>
1976         * docs/buildbot.texinfo (SVN): add branches example
1977         * docs/Makefile (buildbot.ps): add target for postscript manual
1979         * buildbot/test/test_dependencies.py: s/test_interlocks/test_locks/ 
1980         * buildbot/test/test_locks.py: same
1982         * buildbot/process/step.py (Darcs): comment about default branches
1984         * buildbot/master.py (BuildMaster.loadConfig): don't look for
1985         c['interlocks'] in the config file, complain if it is present.
1986         Scan all locks in c['builders'] to make sure the Locks they use
1987         are uniquely named.
1988         * buildbot/test/test_config.py: remove old c['interlocks'] test,
1989         add some tests to check for non-uniquely-named Locks
1990         * buildbot/test/test_vc.py (Patch.doPatch): fix factory.steps,
1991         since the unique-Lock validation code requires it now
1993         * buildbot/locks.py: fix test-case-name
1995         * buildbot/interlock.py: remove old file
1997 2005-07-11  Brian Warner  <warner@lothar.com>
1999         * buildbot/test/test_interlock.py: rename to..
2000         * buildbot/test/test_locks.py: .. something shorter
2002         * buildbot/slave/bot.py (BuildSlave.stopService): newer Twisted
2003         versions (after 2.0.1) changed internet.TCPClient to shut down the
2004         connection in stopService. Change the code to handle this
2005         gracefully.
2007         * buildbot/process/base.py (Build): handle whole-Build locks
2008         * buildbot/process/builder.py (Builder.compareToSetup): same
2009         * buildbot/test/test_interlock.py: make tests work
2011         * buildbot/process/step.py (BuildStep.startStep): complain if a
2012         Step tries to claim a lock that's owned by its own Build
2013         (BuildStep.releaseLocks): typo
2015         * buildbot/locks.py (MasterLock): use ComparableMixin so config
2016         file reloads don't replace unchanged Builders
2017         (SlaveLock): same
2018         * buildbot/test/test_config.py (ConfigTest.testInterlocks):
2019         rewrite to cover new Locks instead of old c['interlocks']
2020         * buildbot/test/runutils.py (RunMixin.connectSlaves): remember
2021         slave2 too
2024         * buildbot/test/test_dependencies.py (Dependencies.setUp): always
2025         start the master and connect the buildslave
2027         * buildbot/process/step.py (FailingDummy.done): finish with a
2028         FAILURE status rather than raising an exception
2030         * buildbot/process/base.py (BuildRequest.mergeReasons): don't try to
2031         stringify a BuildRequest.reason that is None
2033         * buildbot/scheduler.py (BaseUpstreamScheduler.buildSetFinished):
2034         minor fix
2035         * buildbot/status/builder.py (BuildSetStatus): implement enough to
2036         allow scheduler.Dependent to work
2037         * buildbot/buildset.py (BuildSet): set .reason and .results
2039         * buildbot/test/test_interlock.py (Locks.setUp): connect both
2040         slaves, to make the test stop hanging. It still fails, of course,
2041         because I haven't even started to implement Locks.
2043         * buildbot/test/runutils.py (RunMixin.connectSlaves): new utility
2045         * docs/buildbot.texinfo (Build-Dependencies): redesign the feature
2046         * buildbot/interfaces.py (IUpstreamScheduler): new Interface
2047         * buildbot/scheduler.py (BaseScheduler): factor out common stuff
2048         (Dependent): new class for downstream build dependencies
2049         * buildbot/test/test_dependencies.py: tests (still failing)
2051         * buildbot/buildset.py (BuildSet.waitUntilSuccess): minor notes
2053 2005-07-07  Brian Warner  <warner@lothar.com>
2055         * buildbot/test/runutils.py (RunMixin): factored this class out..
2056         * buildbot/test/test_run.py: .. from here
2057         * buildbot/test/test_interlock.py: removed old c['interlock'] tests,
2058         added new buildbot.locks tests (which all hang right now)
2059         * buildbot/locks.py (SlaveLock, MasterLock): implement Locks
2060         * buildbot/process/step.py: claim/release per-BuildStep locks
2062         * docs/Makefile: add 'buildbot.html' target
2064         * buildbot/process/step.py (CVS.__init__): allow branch=None to be
2065         interpreted as "HEAD", so that all VC steps can accept branch=None
2066         and have it mean the "default branch".
2068         * docs/buildbot.texinfo: add Schedulers, Dependencies, and Locks
2070 2005-07-07  Brian Warner  <warner@lothar.com>
2072         * docs/examples/twisted_master.cfg: update to match current usage
2074         * docs/buildbot.texinfo (System Architecture): comment out the
2075         image, it doesn't exist yet and just screws up the HTML manual.
2077 2005-07-05  Brian Warner  <warner@lothar.com>
2079         * debian/.cvsignore: oops, missed one. Removing leftover file.
2081 2005-06-17  Brian Warner  <warner@lothar.com>
2083         * buildbot/test/test_vc.py (VCSupport.__init__): svn --version
2084         changed its output in 1.2.0, don't mistakenly think that the
2085         subversion we find isn't capable of supporting our tests.
2087         * debian/*: remove the debian/ directory and its contents, to make
2088         life easier for the proper Debian maintainer
2089         * MANIFEST.in: same
2090         * Makefile (release): same
2092 2005-06-07  Brian Warner  <warner@lothar.com>
2094         * everything: create a distinct SourceStamp class to replace the
2095         ungainly 4-tuple, let it handle merging instead of BuildRequest.
2096         Changed the signature of Source.startVC to include the revision
2097         information (instead of passing it through self.args). Implement
2098         branches for SVN (now only Darcs/Git is missing support). Add more
2099         Scheduler tests.
2101 2005-06-06  Brian Warner  <warner@lothar.com>
2103         * everything: rearrange build scheduling. Create a new Scheduler
2104         object (configured in c['schedulers'], which submit BuildSets to a
2105         set of Builders. Builders can now use multiple slaves. Builds can
2106         be run on alternate branches, either requested manually or driven
2107         by changes. This changed some of the Status classes. Interlocks
2108         are out of service until they've been properly split into Locks
2109         and Dependencies. treeStableTimer, isFileImportant, and
2110         periodicBuild have all been moved from the Builder to the
2111         Scheduler.
2112         (BuilderStatus.currentBigState): removed the 'waiting' and
2113         'interlocked' states, removed the 'ETA' argument.
2115 2005-05-24  Brian Warner  <warner@lothar.com>
2117         * buildbot/pbutil.py (ReconnectingPBClientFactory): Twisted-1.3
2118         erroneously abandons the connection (in clientConnectionFailed)
2119         for non-UserErrors, which means that if we lose the connection due
2120         to a network problem or a timeout, we'll never try to reconnect.
2121         Fix this by not upcalling to the buggy parent method. Note:
2122         twisted-2.0 fixes this, but the function only has 3 lines so it
2123         makes more sense to copy it than to try and detect the buggyness
2124         of the parent class. Fixes SF#1207588.
2126         * buildbot/changes/changes.py (Change.branch): doh! Add a
2127         class-level attribute to accomodate old Change instances that were
2128         pickled before 0.6.5 (where .branch was added for new Changes).
2129         This fixes the exception that occurs when you try to look at an
2130         old Change (through asHTML).
2132         * buildbot/__init__.py (version): bump to 0.6.6+ while between
2133         releases
2135 2005-05-23  Brian Warner  <warner@lothar.com>
2137         * buildbot/__init__.py (version): release 0.6.6
2139 2005-05-23  Brian Warner  <warner@lothar.com>
2141         * NEWS: update for 0.6.6 release
2142         * debian/changelog: same
2144         * buildbot/scripts/runner.py (start): put the basedir in sys.path
2145         before starting: this was done by twistd back when we spawned it,
2146         now that we're importing the pieces and running them in the
2147         current process, we have to do it ourselves. This allows
2148         master.cfg to import files from the same directory without
2149         explicitly manipulating PYTHONPATH. Thanks to Thomas Vander
2150         Stichele for the catch.
2151         (Options.opt_version): Add a --version command (actually, just make
2152         the existing --version command emit Buildbot's version too)
2154         * buildbot/status/builder.py (HTMLLogFile.upgrade): oops! second
2155         fix to make this behave like other LogFiles, this time to handle
2156         existing LogFiles on disk. (add the missing .upgrade method)
2157         * buildbot/test/test_status.py (Log.testHTMLUpgrade): test it
2159 2005-05-21  Brian Warner  <warner@lothar.com>
2161         * buildbot/test/test_runner.py (Create.testMaster): match the
2162         rawstring change in runner.py:masterTAC
2164         * buildbot/test/test_config.py (ConfigTest.testIRC): skip unless
2165         TwistedWords is installed
2166         * buildbot/test/test_status.py: same, with TwistedMail
2168         * buildbot/master.py: remove old IRC/Waterfall imports (used by
2169         some old, deprecated, and removed config keys). This should enable
2170         you to use the base buildbot functionality with Twisted-2.0.0 when
2171         you don't also have TwistedWeb and TwistedWords installed
2173 2005-05-20  Brian Warner  <warner@lothar.com>
2175         * buildbot/scripts/runner.py (run): call sendchange(), not
2176         do_sendchange(): thus 'buildbot sendchange' was broken in 0.6.5
2177         (run): call stop("HUP"), not "-HUP", 'buildbot stop' was broken.
2178         (stop): don't wait for process to die when sending SIGHUP
2179         (masterTAC): use a rawstring for basedir=, otherwise '\' in the
2180         directory name gets interpreted, which you don't want
2181         (slaveTAC): same
2183         * buildbot/__init__.py (version): bump to 0.6.5+ while between
2184         releases
2186 2005-05-18  Brian Warner  <warner@lothar.com>
2188         * buildbot/__init__.py (version): Releasing buildbot-0.6.5
2190 2005-05-18  Brian Warner  <warner@lothar.com>
2192         * README: update for 0.6.5
2193         * debian/changelog: same
2195         * buildbot/changes/changes.py: rename tag= to branch=, since
2196         that's how we're using it, and my design for the upcoming "build a
2197         specific branch" feature wants it. also, tag= was too CVS-centric
2198         * buildbot/changes/mail.py (parseSyncmail): same
2199         * buildbot/process/base.py (Build.isBranchImportant): same
2200         * buildbot/test/test_mailparse.py (Test3.testMsgS4): same
2201         * docs/buildbot.texinfo (Attributes of Changes): same
2203         * NEWS: update tag=, update for upcoming release
2205 2005-05-17  Brian Warner  <warner@lothar.com>
2207         * buildbot/scripts/runner.py (stop): actually poll once per
2208         second, instead of re-killing the poor daemon once per second.
2209         Sleep briefly (0.1s) before the first poll, since there's a good
2210         chance we can avoid waiting the full second if the daemon shuts
2211         down quickly. Also remove the sys.exit() at the end.
2212         (start): remove the unneighborly sys.exit()
2214         * Makefile: improve permission-setting to not kick Arch so badly
2216         * buildbot/scripts/runner.py (SlaveOptions.optParameters): set a
2217         default --keepalive=600, since it doesn't hurt very much, and it's
2218         a hassle to discover that you need it.
2219         * buildbot/test/test_runner.py (Create.testSlave): test it
2221         * buildbot/status/words.py (IrcStatusBot.buildFinished): Teach the
2222         IRC bot about EXCEPTION
2224         * buildbot/status/client.py (PBListener): upcall more correctly
2226         * buildbot/process/base.py (Build.allStepsDone): if a step caused
2227         an exception mark the overall build with EXCEPTION, not SUCCESS
2229         * buildbot/scripts/runner.py (makefile_sample): remove the leading
2230         newline
2231         * buildbot/status/mail.py (MailNotifier): oops, forgot to upcall
2232         * Makefile: update some release-related stuff
2234         * buildbot/slave/commands.py (ShellCommand.kill): if somehow this
2235         gets called when there isn't actually an active process, just end
2236         the Command instead of blowing up. I don't know how it gets into
2237         this state, but the twisted win32 buildslave will sometimes hang,
2238         and when it shakes its head and comes back, it thinks it's still
2239         running a Command. The next build causes this command to be
2240         interrupted, but the lack of self.process.pid breaks the interrupt
2241         attempt.
2243         * NEWS: document changes since the last release
2245         * buildbot/scripts/runner.py (start): change 'buildbot start' to
2246         look for Makefile.buildbot instead of a bare Makefile . The
2247         'buildbot start' does not install this file, so you have to
2248         manually copy it if you want to customize startup behavior.
2249         (createMaster): change 'buildbot master' command to create
2250         Makefile.sample instead of Makefile, to create master.cfg.sample
2251         instead of master.cfg (requiring you to copy it before the
2252         buildmaster can be started). Both sample files are kept up to
2253         date, i.e. they are overwritten if they have been changed. The
2254         'buildbot.tac' file is *not* overwritten, but if the new contents
2255         don't match the old, a 'buildbot.tac.new' file is created and the
2256         user is warned. This seems to be a much more sane way to handle
2257         startup files. Also, don't sys.exit(0) when done, so we can run
2258         unit tests against it.
2259         (createSlave): same. Don't overwrite the sample info/ files.
2260         * buildbot/scripts/sample.mk: remove. the contents were pulled
2261         into runner.py, since they need to match the behavior of start()
2262         * setup.py: same
2263         * MANIFEST.in: same
2265         * docs/buildbot.texinfo (Launching the daemons): document it
2266         * buildbot/test/test_runner.py (Create): test it
2268         * buildbot/test/test_vc.py (SetupMixin.failUnlessIn): Add a
2269         version that can handle string-in-string tests, because otherwise
2270         python-2.2 fails the tests. It'd be tremendous if Trial's test
2271         took two strings under 2.2 too.
2273         * everything: fixed all deprecation warnings when running against
2274         Twisted-2.0 . (at least all the ones in buildbot code, there are a
2275         few that come from Twisted itself). This involved putting most of
2276         the Twisted-version specific code in the new buildbot.twcompat
2277         module, and creating some abstract base classes in
2278         buildbot.changes.base and buildbot.status.base (which might be
2279         useful anyway). __implements__ is a nuisance and requires an ugly
2280         'if' clause everywhere.
2282         * buildbot/test/test_status.py (Mail.testMail): add a 0.1 second
2283         delay before finishing the test: it seems that smtp.sendmail
2284         doesn't hang up on the server, so we must wait a moment so it can
2285         hang up on us. This removes the trial warning about an unclean
2286         reactor.
2288 2005-05-16  Brian Warner  <warner@lothar.com>
2290         * buildbot/process/step.py (Source): add 'retry' argument. It is a
2291         tuple of (delay, repeats).
2292         * buildbot/test/test_vc.py (Retry): test it
2293         * docs/buildbot.texinfo (Source Checkout): document it
2294         * buildbot/slave/commands.py (SourceBase): add 'retry' parameter.
2295         (SourceBase.maybeDoVCRetry): If 'retry' is set, failures in
2296         doVCFull() are handled by re-trying the checkout (after a delay)
2297         some number of times.
2298         (ShellCommand._startCommand): make header lines easier to read
2300         * buildbot/test/test_web.py (WebTest.tearDown): factor out master
2301         shutdown
2302         (WebTest.test_logfile): make sure master gets shut down, silences
2303         some "unclean reactor" test errors
2305         * buildbot/test/test_changes.py (Sender.tearDown): spin the
2306         reactor once after shutdown, something in certain versions of
2307         Twisted trigger a test failure. 1.3.0 is ok, 2.0.0 fails, 2.0.1pre
2308         fails, svn-trunk is ok.
2310         * buildbot/test/test_slavecommand.py (Shell.testShellZ): add a
2311         second win32 error message
2313         * buildbot/test/test_run.py (Status.testSlave): be smarter about
2314         validating the ETA, so the tests don't fail on slow systems
2316 2005-05-15  Brian Warner  <warner@lothar.com>
2318         * buildbot/status/builder.py (HTMLLogFile): make this behave like
2319         the new LogFile class, so upgrading works properly
2320         (LogFileProducer.resumeProducing): survive resumeProducing after
2321         we've exhausted the chunkGenerator
2323         * buildbot/test/test_web.py (WebTest.test_logfile): validate HTML
2324         logs too
2325         * buildbot/test/test_status.py (Log.testAdd): validate hasContents
2326         (Log.testUpgrade): same
2328         * docs/buildbot.texinfo (Maintenance): describe how to delete old
2329         Builds and logs with a cron job.
2331         * buildbot/status/builder.py (LogFile): revamp LogFiles. Got rid
2332         of the old non-offline LogFile, added code to upgrade these to
2333         new-style contents-live-on-disk instances at load time (in a way
2334         that doesn't invalidate the old Build pickles, so upgrading to
2335         0.6.5 is not a one-way operation). Got rid of everything related
2336         to 'stub' builds.
2337         (LogFile.__init__): create LogFiles with the parent step status,
2338         the log's name, and a builder-relative filename where it can keep
2339         the contents on disk.
2340         (LogFile.hasContents): new method, clients are advised to call it
2341         before getText or getChunks and friends. If it returns False, the
2342         log's contents have been deleted and getText() will raise an
2343         error.
2344         (LogFile.getChunks): made it a generator
2345         (LogFile.subscribeConsumer): new method, takes a Twisted-style
2346         Consumer (except one that takes chunks instead of strings). This
2347         enables streaming of very large logfiles without storing the whole
2348         thing in memory.
2349         (BuildStatus.generateLogfileName): create names like
2350         12-log-compile-output, with a _0 suffix if required to be unique
2351         (BuildStatus.upgradeLogfiles): transform any old-style (from 0.6.4
2352         or earlier) logfiles into new-style ones
2353         (BuilderStatus): remove everything related to 'stub' builds. There
2354         is now only one build cache, and we don't strip logs from old
2355         builds anymore.
2356         (BuilderStatus.getBuildByNumber): check self.currentBuild too,
2357         since we no longer fight to keep it in the cache
2359         * buildbot/status/html.py (TextLog.render_GET): use a
2360         ChunkConsumer to stream the log entries efficiently.
2361         (ChunkConsumer): wrapper which consumes chunks and writes
2362         formatted HTML.
2364         * buildbot/test/test_twisted.py (Parse.testParse): use a
2365         LogFile-like object instead of a real one
2367         * buildbot/test/test_status.py (MyLog): handle new LogFile code
2368         (Log.testMerge3): validate more merge behavior
2369         (Log.testChunks): validate LogFile.getChunks
2370         (Log.testUpgrade): validate old-style LogFile upgrading
2371         (Log.testSubscribe): validate LogFile.subscribe
2372         (Log.testConsumer): validate LogFile.subscribeConsumer
2374         * buildbot/interfaces.py (IStatusLogStub): remove
2375         (IStatusLog.subscribeConsumer): new method
2376         (IStatusLog.hasContents): new method
2377         (IStatusLogConsumer): describes things passed to subscribeConsumer
2379         * buildbot/status/html.py (StepBox.getBox): Don't offer an href to
2380         the log contents if it does not have any contents.
2381         (StatusResourceBuildStep.body): same
2382         (StatusResourceBuildStep.getChild): give a 404 for empty logs
2384 2005-05-14  Brian Warner  <warner@lothar.com>
2386         * buildbot/test/test_web.py (WebTest.test_logfile): add 5-second
2387         timeouts to try and make the windows metabuildslave not hang
2389 2005-05-13  Mike Taylor  <bear@code-bear.com>
2391         * buildbot/slave/commands.py (rmdirRecursive): added a check
2392         to ensure the path passed into rmdirRecursive actually exists.
2393         On win32 a non-existant path would generate an exception.
2395 2005-05-13  Brian Warner  <warner@lothar.com>
2397         * buildbot/slave/commands.py (rmdirRecursive): replacement for
2398         shutil.rmtree which behaves correctly on windows in the face of
2399         files that you have to chmod before deleting. Thanks to Bear at
2400         the OSAF for the routine.
2401         (SourceBase.doClobber): use rmdirRecursive
2403 2005-05-12  Brian Warner  <warner@lothar.com>
2405         * buildbot/status/builder.py (OfflineLogFile.getChunks): have this
2406         method generate chunks instead of returning a big list. This
2407         allows the same method to be used for both old LogFile and new
2408         OfflineLogFile.
2409         (OfflineLogFile.getText): use the generator
2410         (OfflineLogFile.subscribe): same
2411         * buildbot/status/html.py (TextLog.resumeProducing): same
2412         * buildbot/interfaces.py (IStatusLog.getChunks): document it
2414         * buildbot/test/test_web.py (WebTest.test_logfile): Add a test to
2415         point out that OfflineLogFile does not currently work with
2416         html.Waterfall . Fixing this is high-priority.
2418         * buildbot/scripts/runner.py (start): add --logfile=twistd.log, since
2419         apparently windows defaults to using stdout
2421         * buildbot/test/test_slavecommand.py (Shell.testShellZ): log a
2422         better message on failure so I can figure out the win32 problem
2424         * buildbot/slave/commands.py (ShellCommand._startCommand): update
2425         log messages to include more useful copies of the command being
2426         run, the argv array, and the child command's environment.
2427         (Git.doVCFull): update cg-close usage, patch from Brandon Philips.
2429 2005-05-11  Brian Warner  <warner@lothar.com>
2431         * setup.py: oops, install debug.glade so 'buildbot debugclient'
2432         will actually work
2433         * Makefile: update the deb-snapshot version
2435         * docs/buildbot.texinfo: move all .xhtml docs into a new
2436         .texinfo-format document, adding a lot of material in the process.
2437         This is starting to look like a real user's manual. Removed all
2438         the Lore-related files: *.xhtml, *.css, template.tpl .
2439         * docs/Makefile: simple makefile to run 'makeinfo'
2440         * buildbot/scripts/sample.cfg: rearrange slightly
2441         * MANIFEST.in: include .info and .textinfo, don't include *.xhtml
2443 2005-05-10  Brian Warner  <warner@lothar.com>
2445         * buildbot/scripts/runner.py (start): Twisted-1.3.0 used a
2446         different name for the internal twistw module, handle it.
2448         * MANIFEST.in: we deleted plugins.tml, so stop shipping it
2449         * setup.py: .. and stop trying to install it
2451         * buildbot/process/step.py (Git): added support for 'cogito' (aka
2452         'git'), the new linux kernel VC system (http://kernel.org/git/).
2453         Thanks to Brandon Philips for the patch.
2454         * buildbot/slave/commands.py (Git): same
2456 2005-05-06  Brian Warner  <warner@lothar.com>
2458         * buildbot/status/builder.py (OfflineLogFile): replace the default
2459         LogFile with a form that appends its new contents to a disk file
2460         as they arrive. The complete log data is never kept in RAM. This
2461         is the first step towards handling very large (100MB+) logfiles
2462         without choking quite so badly. (The other half is
2463         producer/consumer on the HTML pages).
2464         (BuildStepStatus.addLog): use OfflineLogFile by default
2465         (BuildStatus.getLogfileName): helper code to give the
2466         OfflineLogFile a filename to work with
2468         * buildbot/test/test_status.py (Results.testAddResults): update
2469         tests to handle new asserts
2470         * buildbot/test/test_vc.py (Patch.doPatch): same
2471         * buildbot/test/test_steps.py (BuildStep.setUp): same
2473 2005-05-05  Brian Warner  <warner@lothar.com>
2475         * buildbot/scripts/runner.py (start): if there is no Makefile,
2476         launch the app by importing twistd's internals and calling run(),
2477         rather than spawning a new twistd process. This stands a much
2478         better chance of working under windows.
2479         (stop): kill the process with os.kill instead of spawning
2480         /bin/kill, again to reduce the number of external programs which
2481         windows might not have in the PATH. Also wait up to 5 seconds for
2482         the process to go away, allowing things like 'buildbot stop;
2483         buildbot start' to be reliable in the face of slow shutdowns.
2485         * buildbot/master.py (Dispatcher.__getstate__): remove old
2486         .tap-related methods
2487         (BuildMaster.__getstate__): same
2488         (makeService): same
2489         * buildbot/slave/bot.py (makeService): same
2490         (Options.longdesc): same
2491         * buildbot/scripts/runner.py: copy over some old mktap option text
2493         * buildbot/scripts/runner.py (masterTAC): stop using mktap.
2494         'buildbot master' now creates a buildbot.tac file, so there is no
2495         longer a create-instance/save/reload sequence. mktap is dead, long
2496         live twistd -y.
2497         * buildbot/scripts/sample.mk: use twistd -y, not -f
2498         * buildbot/test/test_config.py: remove mktap-based test
2499         * buildbot/bb_tap.py, buildbot/plugins.tml: delete old files
2500         * README: don't reference mktap
2502         * docs/source.xhtml: document some of the attributes that Changes
2503         might have
2505         * docs/steps.xhtml (Bazaar): document the Bazaar checkout step
2507         * general: merge in Change(tag=) patch from Thomas Vander Stichele.
2508         [org.apestaart@thomas--buildbot/buildbot--cvstag--0-dev--patch-2]
2509         * buildbot/changes/changes.py (Change)
2510         * buildbot/changes/mail.py (parseSyncmail)
2511         * buildbot/test/test_mailparse.py (Test3.getNoPrefix)
2512         (Test3.testMsgS5)
2513         * buildbot/process/base.py (Build.isTagImportant)
2514         (Build.addChange)
2517 2005-05-04  Brian Warner  <warner@lothar.com>
2519         * buildbot/clients/sendchange.py (Sender.send): tear down the PB
2520         connection after sending the change, so that unit tests don't
2521         complain about sockets being left around
2523         * buildbot/status/html.py (WaterfallStatusResource.body): fix
2524         exception in phase=0 rendering
2525         * buildbot/test/test_web.py (WebTest.test_waterfall): test it
2527         * buildbot/changes/dnotify.py (DNotify.__init__): remove debug msg
2529         * buildbot/master.py (BuildMaster.loadConfig): finally remove
2530         deprecated config keys: webPortnum, webPathname, irc, manholePort,
2531         and configuring builders with tuples.
2532         * buildbot/test/test_config.py: stop testing compatibility with
2533         deprecated config keys
2534         * buildbot/test/test_run.py: same
2536 2005-05-03  Brian Warner  <warner@lothar.com>
2538         * contrib/arch_buildbot.py: survive if there are no logfiles
2539         (username): just use a string, os.getlogin isn't reliable
2541         * buildbot/scripts/runner.py (sendchange): oops, fix the command
2542         so 'buildbot sendchange' actually works. The earlier test only
2543         covered the internal (non-reactor-running) form.
2545         * contrib/arch_buildbot.py: utility that can run as an Arch hook
2546         script to notify the buildmaster about changes
2548         * buildbot/scripts/runner.py (sendchange): new command to send a
2549         change to a buildbot.changes.pb.PBChangeSource receiver.
2550         * buildbot/test/test_changes.py (Sender): test it
2552         * buildbot/master.py (BuildMaster.startService): mark .readConfig
2553         after any reading of the config file, not just when we do it in
2554         startService. This makes some tests a bit cleaner.
2556         * buildbot/changes/pb.py: add some log messages
2558         * buildbot/process/base.py (Build.startBuild): fix a bug that
2559         caused an exception when the build terminated in the very first
2560         step.
2561         (Build.stepDone): let steps return a status of EXCEPTION. This
2562         terminates the build right away, and sets the build's overall
2563         status to EXCEPTION too.
2564         * buildbot/process/step.py (BuildStep.failed): return a status of
2565         EXCEPTION when that is what has happened.
2567         * buildbot/process/step.py (Arch.computeSourceRevision): finally
2568         implement this, allowing Arch-based projects to get precise
2569         checkouts instead of always using the latest code
2570         (Bazaar): create variant of Arch to let folks use baz instead of
2571         tla. Requires a new buildslave too.
2572         * buildbot/slave/commands.py (Arch): add 'revision' argument
2573         (Bazaar): create variant of Arch that uses baz instead of tla.
2574         Remove the code that extracts the archive name from the
2575         register-archive output, since baz doesn't provide it, and require
2576         the user provide both the archive name and its location.
2577         * buildbot/test/test_vc.py (VC.testBazaar): added tests
2579 2005-05-02  Brian Warner  <warner@lothar.com>
2581         * buildbot/scripts/sample.cfg: improve docs for c['buildbotURL'],
2582         thanks to Nick Trout.
2584         * buildbot/scripts/runner.py (Maker.makefile): chmod before edit,
2585         deals better with source Makefile coming from a read-only CVS
2586         checkout. Thanks to Nick Trout for the catch.
2588         * buildbot/__init__.py (version): bump to 0.6.4+ while between
2589         releases
2591 2005-04-28  Brian Warner  <warner@lothar.com>
2593         * buildbot/__init__.py (version): Releasing buildbot-0.6.4
2595         * debian/changelog: update for 0.6.4
2597 2005-04-28  Brian Warner  <warner@lothar.com>
2599         * README.w32: add a checklist of steps for getting buildbot
2600         running on windows.
2601         * MANIFEST.in: include it in the tarball
2603         * NEWS: update
2605         * buildbot/master.py (BuildMaster.upgradeToVersion3): deal with
2606         broken .tap files from 0.6.3 by getting rid of .services,
2607         .namedServices, and .change_svc at load time.
2609 2005-04-27  Brian Warner  <warner@lothar.com>
2611         * NEWS: update in preparation for new release
2613         * buildbot/test/test_config.py (Save.testSave): don't pull in
2614         twisted.scripts.twistd, we don't need it and it isn't for windows
2615         anyway.
2617         * buildbot/changes/changes.py (ChangeMaster.saveYourself):
2618         accomodate win32 which can't do atomic-rename
2620 2005-04-27  Brian Warner  <warner@lothar.com>
2622         * buildbot/test/test_run.py (Disconnect.testBuild2): crank up some
2623         timeouts to help the slow metabuildbot not flunk them so much
2624         (Disconnect.testBuild3): same
2625         (Disconnect.testBuild4): same
2626         (Disconnect.testInterrupt): same
2628         * buildbot/master.py (BuildMaster.loadChanges): fix change_svc
2629         setup, it was completely broken for new buildmasters (those which
2630         did not have a 'change.pck' already saved. Thanks to Paul Warren
2631         for catching this (embarrassing!) bug.
2632         (Dispatcher.__getstate__): don't save our registered avatar
2633         factories, since they'll be re-populated when the config file is
2634         re-read.
2635         (BuildMaster.__init__): add a dummy ChangeMaster, used only by
2636         tests (since the real mktap-generated BuildMaster doesn't save
2637         this attribute).
2638         (BuildMaster.__getstate__): don't save any service children,
2639         they'll all be re-populated when the config file is re-read.
2640         * buildbot/test/test_config.py (Save.testSave): test for this
2642 2005-04-26  Brian Warner  <warner@lothar.com>
2644         * buildbot/buildbot.png: use a new, smaller (16x16) icon image,
2645         rendered with Blender.. looks a bit nicer.
2646         * buildbot/docs/images/icon.blend: add the Blender file for it
2648         * buildbot/slave/commands.py (ShellCommand._startCommand): prepend
2649         'cmd.exe' (or rather os.environ['COMSPEC']) to the argv list when
2650         running under windows. This appears to be the best way to allow
2651         BuildSteps to do something normal like 'trial -v buildbot.test' or
2652         'make foo' and still expect it to work. The idea is to make the
2653         BuildSteps look as much like what a developer would type when
2654         compiling or testing the tree by hand. This approach probably has
2655         problems when there are spaces in the arguments, so if you've got
2656         windows buildslaves, you'll need to pay close attention to your
2657         commands.
2659         * buildbot/status/html.py (WaterfallStatusResource.body): add the
2660         timezone to the timestamp column.
2661         * buildbot/test/test_web.py (WebTest.test_waterfall): test it
2663         * buildbot/scripts/runner.py (loadOptions): do something sane for
2664         windows, I think. We use %APPDATA%/buildbot instead of
2665         ~/.buildbot, but we still search everywhere from the current
2666         directory up to the root for a .buildbot/ subdir. The "is it under
2667         $HOME" security test was replaced with "is it owned by the current
2668         user", which is only performed under posix.
2669         * buildbot/test/test_runner.py (Options.testFindOptions): update
2670         tests to match. The "is it owned by the current user" check is
2671         untested. The test has been re-enabled for windows.
2673         * buildbot/test/test_slavecommand.py (Shell.checkOutput): replace
2674         any "\n" in the expected output with the platform-specific line
2675         separator. Make this separator "\r\n" on PTYs under unix, they
2676         seem to do that and I don't know why
2678         * buildbot/test/test_runner.py (Options.optionsFile): disable on
2679         windows for now, I don't know what ~/.buildbot/ should mean there.
2681         * buildbot/test/test_run.py (BuilderNames.testGetBuilderNames):
2682         win32 compatibility, don't use "/tmp"
2683         (Basedir.testChangeBuilddir): remove more unixisms
2685 2005-04-26  Brian Warner  <warner@lothar.com>
2687         * buildbot/test/test_control.py (Force.rmtree): python2.2
2688         compatibility, apparently its shutil.rmtree ignore_errors=
2689         argument is ignored.
2690         * buildbot/test/test_run.py (Run.rmtree): same
2691         (RunMixin.setUp): same
2693         * buildbot/test/test_runner.py (make): python2.2 has os.sep but
2694         not os.path.sep
2696         * buildbot/test/test_twisted.py (Parse.failUnlessIn): 2.2 has no
2697         'substring in string' operator, must use string.find(substr)!=-1
2698         * buildbot/test/test_vc.py (Patch.failUnlessIn): same
2699         * buildbot/test/test_web.py (WebTest.failUnlessIn): same
2701         * buildbot/scripts/runner.py (loadOptions): add code to search for
2702         ~/.buildbot/, a directory with things like 'options', containing
2703         defaults for various 'buildbot' subcommands. .buildbot/ can be in
2704         the current directory, your $HOME directory, or anywhere
2705         inbetween, as long as you're somewhere inside your home directory.
2706         (debugclient): look in ~/.buildbot/options for master and passwd
2707         (statuslog): look in ~/.buildbot/options for 'masterstatus'
2708         * buildbot/test/test_runner.py (Options.testFindOptions): test it
2710         * buildbot/status/client.py (makeRemote): new approach to making
2711         IRemote(None) be None, which works under Twisted-2.0
2712         * buildbot/test/test_status.py (Client.testAdaptation): test it
2714         * buildbot/status/builder.py (Status.builderAdded): when loading a
2715         pickled BuilderStatus in from disk, set its name after loading.
2716         The config file might have changed its name (but not its
2717         directory) while it wasn't looking.
2718         
2719         * buildbot/process/builder.py (Builder.attached): always return a
2720         Deferred, even if the builder was already attached
2721         * buildbot/test/test_run.py (Basedir.testChangeBuilddir): test it
2723 2005-04-25  Brian Warner  <warner@lothar.com>
2725         * buildbot/status/words.py (IrcStatusBot.buildFinished): fix a
2726         category-related exception when announcing a build has finished
2728         * buildbot/status/html.py (StatusResourceChanges.body): oops, don't
2729         reference no-longer-existent changemaster.sources
2730         * buildbot/test/test_web.py (WebTest.test_waterfall): test for it
2732         * buildbot/__init__.py (version): bump to 0.6.3+ while between
2733         releases
2735 2005-04-25  Brian Warner  <warner@lothar.com>
2737         * buildbot/__init__.py (version): Releasing buildbot-0.6.3
2739         * debian/changelog: update for 0.6.3
2741 2005-04-25  Brian Warner  <warner@lothar.com>
2743         * MANIFEST.in: make sure debug.glade is in the tarball
2745         * README (REQUIREMENTS): list necessary Twisted-2.0 packages
2747         * NEWS: update for the imminent 0.6.3 release
2749         * buildbot/status/html.py (HtmlResource.content): make the
2750         stylesheet <link> always point at "buildbot.css".
2751         (StatusResource.getChild): map "buildbot.css" to a static.File
2752         containing whatever css= argument was provided to Waterfall()
2753         (Waterfall): provide the "classic" css as the default.
2754         * docs/waterfall.classic.css: move default CSS from here ..
2755         * buildbot/status/classic.css: .. to here
2757         * MANIFEST.in: make sure classic.css is included in the tarball
2758         * setup.py: and that it is installed too, under buildbot/status/
2760         * buildbot/master.py (BuildMaster): oops, set .change_svc=None at
2761         the module level, because buildbot.tap files from 0.6.2 don't have
2762         it in their attribute dictionary.
2764         * buildbot/slave/bot.py (Bot.startService): make sure the basedir
2765         really exists at startup, might save some confusion somewhere.
2767 2005-04-24  Thomas Vander Stichele  <thomas at apestaart dot org>
2769         * docs/waterfall.classic.css:
2770           add a stylesheet that's almost the same as the "classic"
2771           buildbot style
2773         * buildbot/status/builder.py:
2774           add EXCEPTION as a result - this is a problem for the bot
2775           maintainer, not a build problem for the changers
2776         * buildbot/process/step.py:
2777           use EXCEPTION instead of FAILURE for exceptions
2778         * buildbot/status/html.py:
2779           add build_get_class to get a class out of a build/buildstep
2780           finish naming the classes
2781           split out sourceNames to changeNames and builderNames so we
2782           can style them separately
2783         * docs/config.xhtml:
2784           finish documenting classes as they are right now
2786         * buildbot/status/html.py:
2787           name the classes as we agreed on IRC
2788         * docs/config.xhtml:
2789           and document them
2791         * buildbot/status/html.py:
2792           same for cssclass->class_
2794         * buildbot/status/html.py:
2795           as decided on IRC, use class_ for the "class" attribute to not
2796           conflict with the class keyword, and clean up the messy **{} stuff.
2798         * buildbot/status/mail.py:
2799           put back "builders" argument, and fix docstring, because the
2800           code *ignores* builders listed in this argument
2802         * buildbot/process/builder.py:
2803           remove FIXME notes - category is now indeed a cvar of BuilderStatus
2805         * docs/config.xhtml:
2806           describe the category argument for builders
2808         * buildbot/status/builder.py:
2809           Fix a silly bug due to merging
2811         * buildbot/process/builder.py:
2812           remove category from the process Builder ...
2813         * buildbot/status/builder.py:
2814           ... and add it to BuilderStatus instead.
2815           Set category on unpickled builder statuses, they might not have it.
2816         * buildbot/master.py:
2817           include category when doing builderAdded
2818         * buildbot/status/mail.py:
2819           return None instead of self for builders we are not interested in.
2820         * buildbot/test/test_run.py:
2821           fix a bug due to only doing deferredResult on "dummy" waiting
2822         * buildbot/test/test_status.py:
2823           add checks for the Mail IStatusReceiver returning None or self
2825         * buildbot/status/html.py:
2826           fix testsuite by prefixing page title with BuildBot
2828         * buildbot/status/builder.py:
2829           have .category in builder status ...
2830         * buildbot/process/builder.py:
2831           ... and set it from Builder
2832         * buildbot/status/html.py:
2833           make .css a class variable 
2834         * buildbot/test/test_status.py:
2835           write more tests to cover our categories stuff ...
2836         * buildbot/status/mail.py:
2837           ... and fix the bug that this uncovered
2839         * buildbot/changes/mail.py:
2840         * buildbot/changes/pb.py:
2841         * buildbot/master.py:
2842         * buildbot/process/base.py:
2843         * buildbot/process/factory.py:
2844         * buildbot/process/interlock.py:
2845         * buildbot/process/step.py:
2846         * buildbot/process/step_twisted.py:
2847         * buildbot/slave/commands.py:
2848         * buildbot/status/builder.py:
2849         * buildbot/status/client.py:
2850         * buildbot/status/html.py:
2851         * buildbot/status/mail.py:
2852         * buildbot/status/progress.py:
2853         * buildbot/test/test_changes.py:
2854         * buildbot/test/test_config.py:
2855         * buildbot/test/test_control.py:
2856         * buildbot/test/test_interlock.py:
2857         * buildbot/test/test_maildir.py:
2858         * buildbot/test/test_mailparse.py:
2859         * buildbot/test/test_run.py:
2860         * buildbot/test/test_slavecommand.py:
2861         * buildbot/test/test_status.py:
2862         * buildbot/test/test_steps.py:
2863         * buildbot/test/test_twisted.py:
2864         * buildbot/test/test_util.py:
2865         * buildbot/test/test_vc.py:
2866         * buildbot/test/test_web.py:
2867         * buildbot/util.py:
2868           add test-case-name at the top of a whole set of files
2870         * buildbot/status/builder.py:
2871           keep order of addition when getting builder names
2872         * buildbot/status/words.py:
2873         * buildbot/test/test_run.py:
2874           add test for getBuilderNames
2876         * buildbot/process/base.py:
2877         * buildbot/process/step.py:
2878         * buildbot/status/builder.py:
2879         * buildbot/status/html.py:
2880           make buildbot css-able
2881           replace the color code for purple with purple, don't understand
2882           why it wasn't purple to start with
2884         * buildbot/status/words.py:
2885           ok, so it doesn't look like BuilderStatus.remote is still valid.
2886           Use what waterfall uses instead.
2888         * buildbot/interfaces.py:
2889         * buildbot/status/builder.py:
2890         * buildbot/status/html.py:
2891         * buildbot/status/mail.py:
2892         * buildbot/status/words.py:
2893         * buildbot/test/test_run.py:
2894           use categories everywhere and make it be a list.  More sensible
2895           for the future.  Also make words actually respect this in
2896           buildFinished.
2898         * buildbot/interfaces.py:
2899           add category argument to getBuilderNames
2900         * buildbot/process/builder.py:
2901         * buildbot/status/builder.py:
2902         * buildbot/status/html.py:
2903         * buildbot/status/mail.py:
2904         * buildbot/status/words.py:
2905         * buildbot/test/test_run.py:
2906           move from specifying builders by name to specifying the category
2908         * buildbot/status/html.py:
2909         * buildbot/status/words.py:
2910           add "builders=" to __init__ of status clients so they can
2911           limit themselves to the given list of builders to report on
2913         * buildbot/status/html.py: set the title to the product name
2915 2005-04-23  Thomas Vander Stichele  <thomas at apestaart dot org>
2917         * buildbot/interfaces.py:
2918         * buildbot/status/builder.py:
2919           more documentation.  Hm, not sure if ChangeLog entries make sense
2920           here...
2922 2005-04-23  Brian Warner  <warner@lothar.com>
2924         * buildbot/test/test_vc.py (SetupMixin.do_vc): increase timeouts
2926         * buildbot/test/test_slavecommand.py (Shell): increase timeouts
2928         * buildbot/scripts/runner.py: make 'statuslog' and 'statusgui' be
2929         the sub-commands that log buildmaster status to stdout and to a
2930         GUI window, respectively.
2932         * buildbot/clients/gtkPanes.py: overhaul. basic two-row
2933         functionality is working again, but all the step-status and ETA
2934         stuff is missing. Commented out a lot of code pending more
2935         overhaul work.
2937         * buildbot/status/client.py: make sure that IRemote(None) is None
2939         * buildbot/changes/changes.py: import defer, oops
2940         (ChangeMaster): remove the .sources list, rely upon the fact that
2941         MultiServices can be treated as sequences of their children. This
2942         cleans up the add/remove ChangeSource routines a lot, as we keep
2943         exactly one list of the current sources instead of three.
2945         * buildbot/master.py (BuildMaster.__init__): remove .sources, set
2946         up an empty ChangeMaster at init time.
2947         (BuildMaster.loadChanges): if there are changes to be had from
2948         disk, replace self.change_svc with the new ones. If not, keep
2949         using the empty ChangeMaster set up in __init__.
2950         (BuildMaster.loadConfig_Sources): use list(self.change_svc)
2951         instead of a separate list, makes the code a bit cleaner.
2952         * buildbot/test/test_config.py (ConfigTest.testSimple): match it
2953         (ConfigTest.testSources): same, also wait for loadConfig to finish.
2954         Extend the test to make sure we can get rid of the sources when
2955         we're done.
2957 2005-04-22  Brian Warner  <warner@lothar.com>
2959         * buildbot/scripts/runner.py (Maker.mkinfo): create the info/admin
2960         and info/host files when making the slave directory
2962         * buildbot/test/test_run.py (RunMixin.shutdownSlave): remove the
2963         whendone= argument, just return the Deferred and let the caller do
2964         what they want with it.
2965         (Disconnect.testBuild1): wait for shutdownSlave
2966         (Basedir.testChangeBuilddir): new test to make sure changes to the
2967         builddir actually get propagated to the slave
2969         * buildbot/slave/bot.py (SlaveBuilder.setBuilddir): use an
2970         explicit method, rather than passing the builddir in __init__ .
2971         Make sure to update self.basedir too, this was broken before.
2972         (Bot.remote_setBuilderList): use b.setBuilddir for both new
2973         builders and for ones that have just had their builddir changed.
2974         (BotFactory): add a class-level .perspective attribute, so
2975         BuildSlave.waitUntilDisconnected won't get upset when the
2976         connection hasn't yet been established
2977         (BuildSlave.__init__): keep track of the bot.Bot instance, so
2978         tests can reach through it to inspect the SlaveBuilders
2980         * buildbot/process/base.py (Build.buildException): explain the
2981         log.err with a log.msg
2982         * buildbot/process/builder.py (Builder.startBuild): same
2983         (Builder._startBuildFailed): improve error message
2985         * buildbot/pbutil.py (RBCP.failedToGetPerspective): if the failure
2986         occurred because we lost the brand-new connection, retry instead
2987         of giving up. If not, it's probably an authorization failure, and
2988         it makes sense to stop trying. Make sure we log.msg the reason
2989         that we're log.err'ing the failure, otherwise test failures are
2990         really hard to figure out.
2992         * buildbot/master.py: change loadConfig() to return a Deferred
2993         that doesn't fire until the change has been fully implemented.
2994         This means any connected slaves have been updated with the new
2995         builddir. This change makes it easier to test the code which
2996         actually implements this builddir-updating.
2997         (BotPerspective.addBuilder): return Deferred
2998         (BotPerspective.removeBuilder): same
2999         (BotPerspective.attached): same
3000         (BotPerspective._attached): same. finish with remote_print before
3001         starting the getSlaveInfo, instead of doing them in parallel
3002         (BotPerspective.list_done): same
3003         (BotMaster.removeSlave): same. Fix the typo that meant we weren't
3004         actually calling slave.disconnect()
3005         (BotMaster.addBuilder): same
3006         (BotMaster.removeBuilder): same
3007         (BuildMaster.loadConfig): same
3008         (BuildMaster.loadConfig_Slaves): same
3009         (BuildMaster.loadConfig_Sources): same
3010         (BuildMaster.loadConfig_Builders): same
3011         (BuildMaster.loadConfig_status): same
3013         * buildbot/changes/changes.py (ChangeMaster.removeSource): return
3014         a Deferred that fires when the source is finally removed
3016         * buildbot/slave/commands.py (SourceBase.doClobber): when removing
3017         the previous tree on win32, where we have to do it synchronously,
3018         make sure we return a Deferred anyway.
3019         (SourceBase.doCopy): same
3021         * buildbot/scripts/runner.py (statusgui): use the text client for
3022         now, while I rewrite the Gtk one
3023         * buildbot/clients/base.py: strip out old code, leaving just the
3024         basic print-message-on-event functionality. I also remove the
3025         ReconnectingPBClientFactory, but it does at least quit when it
3026         loses the connection instead of going silent
3028 2005-04-21  Brian Warner  <warner@lothar.com>
3030         * Makefile: minor tweaks
3032         * NEWS: point out deprecation warnings, new features for
3033         /usr/bin/buildbot
3035         * buildbot/master.py (BuildMaster.loadConfig): emit
3036         DeprecationWarnings for Builders defined with tuples. Rearrange
3037         code to facility removal of deprecated configuration keys in the
3038         next release.
3040         * buildbot/scripts/runner.py (createMaster,createSlave): rewrite
3041         'buildbot' command to put a little Makefile in the target that
3042         helps you re-create the buildbot.tap file, start or stop the
3043         master/slave, and reconfigure (i.e. SIGHUP) the master. Also chmod
3044         all the files 0600, since they contain passwords.
3045         (start): if there is a Makefile, and /usr/bin/make exists, use
3046         'make start' in preference to a raw twistd command. This lets
3047         slave admins put things like PYTHONPATH variables in their
3048         Makefiles and have them still work when the slave is started with
3049         'buildbot start ~/slave/foo'. The test is a bit clunky, it would
3050         be nice to first try the 'make' command and only fall back to
3051         twistd if it fails. TODO: the Makefile's "start" command does not
3052         add the --reactor=win32 argument when running under windows.
3053         (Options.debugclient, Options.statusgui): add sub-commands to launch
3054         the debug client (formerly in contrib/debugclient.py) and the
3055         Gtk status application (currently broken)
3056         * buildbot/clients/debug.py: move from contrib/debugclient.py
3057         * buildbot/clients/debug.glade: same
3059         * buildbot/test/test_trial.py: remove it. This requires some
3060         functionality out of Twisted that isn't there yet, and until then
3061         having it around just confuses things.
3063         * buildbot/test/test_slavecommand.py (Shell): test both with and
3064         without PTYs, and make sure that command output is properly
3065         interleaved in the with-PTY case. I think the without-PTY test
3066         should pass on windows, where we never use PTYs anyway.
3068 2005-04-20  Brian Warner  <warner@lothar.com>
3070         * README (REQUIREMENTS): mention Twisted-2.0.0 compatibility
3072         * MANIFEST.in: add epyrun, gen-reference, buildbot.png
3074         * NEWS: start creating entries for the next release
3076         * buildbot/slave/commands.py (ShellCommand.__init__): use os.pathsep
3078         * buildbot/test/test_web.py (WebTest.test_webPortnum): add timeout
3079         (WebTest.test_webPathname): same
3080         (WebTest.test_webPathname_port): same
3081         (WebTest.test_waterfall): use the default favicon rather than
3082         rooting around the filesystem for it. Open the expected-icon file
3083         in binary mode, to make win32 tests happier (thanks to Nick Trout
3084         for the catch)
3085         * buildbot/status/html.py (buildbot_icon): win32 portability
3087         * buildbot/test/test_slavecommand.py (SlaveCommandTestCase.testShellZ):
3088         win32-compatibility fixes from Nick Trout, the "file not found" message
3089         is different under windows
3090         (FakeSlaveBuilder.__init__): clean up setup a bit
3091         * buildbot/test/test_vc.py (VCSupport.__init__): win32: use os.pathsep
3093 2005-04-19  Brian Warner  <warner@lothar.com>
3095         * buildbot/test/test_vc.py (SetupMixin.setUpClass): fix the
3096         skip-if-repositories-are-unavailable test to not kill the trial
3097         that comes with Twisted-1.3.0
3099         * setup.py: install buildbot.png icon file when installing code
3101         * buildbot/slave/commands.py (ShellCommand._startCommand): log the
3102         environment used by the command, at least on the child side.
3104         * buildbot/status/html.py (TextLog.pauseProducing): add a note,
3105         this method needs to be added and implemented because it gets
3106         called under heavy load. I don't quite understand the
3107         producer/consumer API enough to write it.
3108         (StatusResource.getChild): add a resource for /favicon.ico
3109         (Waterfall.__init__): add favicon= argument
3110         * buildbot/test/test_web.py (WebTest.test_waterfall): test it
3111         (WebTest.test_webPortnum): stop using deprecated 'webPortnum'
3112         (WebTest.test_webPathname): same
3113         (WebTest.test_webPathname_port): same
3114         * docs/config.xhtml: mention favicon=
3115         * buildbot/buildbot.png: add a default icon, dorky as it is
3117 2005-04-18  Thomas Vander Stichele  <thomas at apestaart dot org>
3119         * buildbot/master.py:
3120         * buildbot/process/base.py:
3121         * buildbot/process/builder.py:
3122         * buildbot/process/interlock.py:
3123         * buildbot/status/builder.py:
3124         * buildbot/status/html.py:
3125         * buildbot/status/mail.py:
3126         * buildbot/status/words.py:
3127           new documentation while digging through the code
3129 2005-04-17  Brian Warner  <warner@lothar.com>
3131         * general: try to fix file modes on all .py files: a+r, a-x,
3132         but let buildbot/clients/*.py be +x since they're tools
3134         * docs/epyrun (addMod): when an import fails, say why
3136         * Makefile: Add a 'docs' target, hack on the PYTHONPATH stuff
3138 2005-04-17  Thomas Vander Stichele  <thomas at apestaart dot org>
3140         * buildbot/process/base.py:
3141         * buildbot/process/builder.py:
3142         * buildbot/status/builder.py:
3143           new documentation while digging through the code
3145 2005-04-17  Thomas Vander Stichele  <thomas at apestaart dot org>
3147         * buildbot/changes/changes.py:
3148         * buildbot/changes/p4poller.py:
3149         * buildbot/interfaces.py:
3150         * buildbot/process/base.py:
3151         * buildbot/process/builder.py:
3152         * buildbot/process/step.py:
3153         * buildbot/process/step_twisted.py:
3154         * buildbot/slave/bot.py:
3155         * buildbot/slave/commands.py:
3156         * buildbot/status/builder.py:
3157           fix all docstrings to make epydoc happy.  In the process of fixing
3158           some, I also moved pieces of docs, and removed some deprecated
3159           documentation
3161 2005-04-17  Thomas Vander Stichele  <thomas at apestaart dot org>
3163         * buildbot/process/builder.py:
3164         * buildbot/process/interlock.py:
3165         * buildbot/process/process_twisted.py:
3166         * buildbot/process/step.py:
3167           BuildProcess -> Build, as it looks like that's what happened
3168         * buildbot/process/base.py:
3169         * buildbot/process/factory.py:
3170           update epydoc stuff
3172 2005-04-17  Brian Warner  <warner@lothar.com>
3174         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
3175         update compile command to accomodate the Twisted split.. now
3176         instead of './setup.py build_ext -i', you do './setup.py all
3177         build_ext -i', to run build_ext over all sub-projects.
3178         (FullTwistedBuildFactory): same
3179         (TwistedReactorsBuildFactory): same
3181         * buildbot/status/html.py (TextLog.finished): null out self.req
3182         when we're done, otherwise the reference cycle of TextLog to .req
3183         to .notifications to a Deferred to TextLog.stop keeps them from
3184         being collected, and consumes a huge (610MB on pyramid at last
3185         check) amount of memory.
3187 2005-04-11  Brian Warner  <warner@lothar.com>
3189         * buildbot/test/test_vc.py (VCSupport.__init__): use abspath() to
3190         normalize the VC-repository location.. makes SVN happier with
3191         certain test environments.
3193         * buildbot/process/step.py (RemoteShellCommand.__init__): let each
3194         RemoteShellCommand gets its own .env dictionary, so that code in
3195         start() doesn't mutate the original. I think this should fix the
3196         step_twisted.Trial problem where multiple identical components
3197         kept getting added to PYTHONPATH= over and over again.
3199         * general: merge org.apestaart@thomas/buildbot--doc--0--patch-3,
3200         adding epydoc-format docstrings to many classes. Thanks to Thomas
3201         Vander Stichele for the patches.
3202         * docs/epyrun, docs/gen-reference: add epydoc-generating tools
3203         * buildbot/status/mail.py, buildbot/process/step_twisted.py: same
3204         * buildbot/slave/bot.py, commands.py, registry.py: same
3206 2005-04-05  Brian Warner  <warner@lothar.com>
3208         * buildbot/slave/commands.py (SourceBase.doCopy): use cp -p to
3209         preserve timestamps, helps incremental builds of large trees.
3210         Patch from Rene Rivera.
3212         * buildbot/slave/bot.py (SlaveBuilder.commandComplete): oops, log
3213         'failure' and not the non-existent 'why'. Thanks to Rene Rivera
3214         for the catch.
3216 2005-04-03  Brian Warner  <warner@lothar.com>
3218         * buildbot/master.py (BuildMaster.loadConfig): only call exec()
3219         with one dict, apparently exec has some scoping bugs when used
3220         with both global/local dicts. Thanks to Nathaniel Smith for the
3221         catch.
3223 2005-04-02  Brian Warner  <warner@lothar.com>
3225         * buildbot/process/step_twisted.py (countFailedTests): the new
3226         trial in Twisted-2.0 emits a slightly different status line than
3227         old trial ("PASSED.." instead of "OK.."). Handle it so we don't
3228         mistakenly think the test count is unparseable.
3229         (Trial.start): note that for some reason each build causes another
3230         copy of self.testpath to be prepended to PYTHONPATH. This needs to
3231         be fixed but I'm not sure quite where the problem is.
3233 2005-04-01  Brian Warner  <warner@lothar.com>
3235         * buildbot/test/test_run.py (Run.testMaster): change some uses of
3236         deferredResult to avoid hangs/warnings under twisted-2.0
3237         (RunMixin.tearDown): same
3238         (RunMixin.shutdownSlave): same
3239         (Disconnect.testIdle1): same
3240         (Disconnect.testBuild2): same: wait one second after the build
3241         finishes for test to really be done.. this should be cleaned up to
3242         avoid wasting that second. Builder.detach uses a callLater(0),
3243         either that should be done in-line (something else needed that
3244         behavior), or it should return a Deferred that fires when the
3245         builder is really offline.
3246         (Disconnect.testBuild3): same
3247         (Disconnect.testDisappear): same
3249         * buildbot/test/test_web.py: rearrange server-setup and teardown
3250         code to remove unclean-reactor warnings from twisted-2.0
3252         * buildbot/test/test_vc.py: rearrange probe-for-VC-program routine
3253         so the tests don't hang under twisted-2.0
3255 2005-03-31  Brian Warner  <warner@lothar.com>
3257         * buildbot/slave/bot.py (Bot.remote_setBuilderList): fix typo that
3258         caused a warning each time the master changed our set of builders
3260         * buildbot/status/builder.py (BuildStatus.saveYourself): under
3261         w32, don't unlink the file unless it already exists. Thanks to
3262         Baptiste Lepilleur for the catch.
3263         (BuilderStatus.saveYourself): same
3265 2005-02-01  Brian Warner  <warner@lothar.com>
3267         * buildbot/status/html.py (TextLog.getChild): use a /text child
3268         URL, such as http://foo.com/svn-hello/builds/1/test/0/text instead
3269         of http://foo.com/svn-hello/builds/1/test/0 , to retrieve the
3270         logfile as text/plain (no markup, no headers). This replaces the
3271         previous scheme (which used an ?text=1 argument), and gets us back
3272         to a relative link (which works better when the buildbot lives
3273         behind another web server, such as Apache configured as a reverse
3274         proxy). Thanks to Gerald Combs for spotting the problem.
3276         * buildbot/__init__.py (version): bump to 0.6.2+ while between
3277         releases
3279 2004-12-13  Brian Warner  <warner@lothar.com>
3281         * buildbot/__init__.py (version): Releasing buildbot-0.6.2
3283         * debian/changelog: update for 0.6.2
3284         * NEWS: finalize for 0.6.2
3286 2004-12-11  Brian Warner  <warner@lothar.com>
3288         * NEWS: bring it up to date
3290         * buildbot/slave/bot.py (BotFactory): revamp keepalive/lost-master
3291         detection code. Require some sign of life from the buildmaster
3292         every BotFactory.keepaliveInterval seconds. Provoke this
3293         indication at BotFactory.keepaliveTimeout seconds before the
3294         deadline by sending a keepalive request. We don't actually care if
3295         that request is answered in a timely fashion, what we care about
3296         is that .activity() is called before the deadline. .activity() is
3297         triggered by any PB message from the master (including an ack to
3298         one of the slave's status-update messages). With this new scheme,
3299         large status messages over slow pipes are OK, as long as any given
3300         message can be sent (and thus acked) within .keepaliveTimeout
3301         seconds (which defaults to 30).
3302         (SlaveBuilder.remote_startCommand): record activity
3303         (SlaveBuilder.ackUpdate): same
3304         (SlaveBuilder.ackComplete): same
3305         (BotFactory.gotPerspective): same
3306         * buildbot/test/test_run.py (Disconnect.testSlaveTimeout): test it
3308 2004-12-09  Brian Warner  <warner@lothar.com>
3310         * buildbot/status/html.py (StatusResourceBuilder.getChild): remove
3311         debug message
3313         * buildbot/process/step_twisted.py (Trial._commandComplete):
3314         update self.cmd when we start the 'cat test.log' transfer. Without
3315         this, we cannot interrupt the correct RemoteCommand when we lose
3316         the connection.
3318         * buildbot/process/step.py (RemoteCommand.interrupt): don't bother
3319         trying to tell the slave to stop the command if we're already
3320         inactive, or if we no longer have a .remote
3322         * buildbot/process/builder.py (Builder._detached): don't let an
3323         exception in currentBuild.stopBuild() prevent the builder from
3324         being marked offline
3326 2004-12-07  Brian Warner  <warner@lothar.com>
3328         * buildbot/status/words.py (IrcStatusBot.getBuilder): catch the
3329         KeyError that happens when you ask for a non-existent Builder, and
3330         translate it into a UsageError.
3332         * buildbot/test/test_run.py (Disconnect.testBuild4): validate that
3333         losing the slave in the middle of a remote step is handled too
3335         * buildbot/process/step.py (ShellCommand.interrupt): 'reason' can
3336         be a Failure, so be sure to stringify it before using it as the
3337         contents of the 'interrupt' logfile
3338         (RemoteCommand.interrupt): use stringified 'why' in
3339         remote_interruptCommand too, just in case
3341 2004-12-06  Brian Warner  <warner@lothar.com>
3343         * buildbot/slave/commands.py (Arch.doVCUpdate): use 'tla replay'
3344         instead of 'tla update', which is more efficient in case we've
3345         missed a couple of patches since the last update.
3347         * debian/changelog: update for previous (0.6.1) release. Obviously
3348         this needs to be handled better.
3350 2004-12-05  Brian Warner  <warner@lothar.com>
3352         * NEWS: update for stuff since last release
3354         * buildbot/master.py (DebugPerspective.attached): return 'self', to
3355         match the maybeDeferred change in Dispatcher.requestAvatar
3356         * buildbot/changes/pb.py (ChangePerspective.attached): same
3357         * buildbot/status/client.py (StatusClientPerspective.attached): same
3358         * buildbot/process/builder.py (Builder._attached3): same
3359         * buildbot/pbutil.py (NewCredPerspective.attached): same
3361         * buildbot/status/html.py (WaterfallStatusResource.phase2): Add
3362         the date to the top-most box, if it is not the same as today's
3363         date.
3365         * docs/slave.xhtml: provide a buildslave setup checklist
3367         * docs/source.xhtml (Arch): correct terminology
3369 2004-12-04  Brian Warner  <warner@lothar.com>
3371         * buildbot/test/test_slavecommand.py: use sys.executable instead
3372         of hard-coding 'python' for child commands, might help portability
3374         * docs/examples/twisted_master.cfg: update to current usage
3376         * buildbot/status/words.py (IrcStatusBot.command_STOP): add a
3377         'stop build' command to the IRC bot
3379         * buildbot/master.py (Dispatcher.requestAvatar): remove debug
3380         message that broke PBChangeSource
3382         * buildbot/slave/bot.py: clean up shutdown/lose-master code
3383         (SlaveBuilder): make some attributes class-level, remove the old
3384         "update queue" which existed to support resuming a build after the
3385         master connection was lost. Try to reimplement that feature later.
3386         (SlaveBuilder.stopCommand): clear self.command when the
3387         SlaveCommand finishes, so that we don't try to kill a leftover one
3388         at shutdown time.
3389         (SlaveBuilder.commandComplete): same, merge with commandFailed and
3390         .finishCommand
3392         * buildbot/slave/commands.py (SourceBase): set self.command for
3393         all VC commands, so they can be interrupted.
3395 2004-12-03  Brian Warner  <warner@lothar.com>
3397         * buildbot/master.py: clean up slave-handling code, to handle
3398         slave-disconnect and multiple-connect better
3399         (BotPerspective): make these long-lasting, exactly one per bot
3400         listed in the config file.
3401         (BotPerspective.attached): if a slave connects while an existing
3402         one appears to still be connected, disconnect the old one first.
3403         (BotPerspective.disconnect): new method to forcibly disconnect a
3404         buildslave. Use some hacks to empty the transmit buffer quickly to
3405         avoid the long (20-min?) TCP timeout that could occur if the old
3406         slave has dropped off the net.
3407         (BotMaster): Keep persistent BotPerspectives in .slaves, let them
3408         own their own SlaveStatus objects. Remove .attached/.detached, add
3409         .addSlave/.removeSlave, treat slaves like Builders (config file
3410         parsing sends deltas to the BotMaster). Inform the slave
3411         instances, i.e. the BotPerspective, about addBuilder and
3412         removeBuilder.
3413         (BotMaster.getPerspective): turns into a single dict lookup
3414         (Dispatcher.requestAvatar): allow .attached to return a Deferred,
3415         which gives BotPerspective.attached a chance to disconnect the old
3416         slave first.
3417         (BuildMaster.loadConfig): add code (disabled) to validate that all
3418         builders use known slaves (listed in c['bots']). The check won't
3419         work with tuple-specified builders, which are deprecated but not
3420         yet invalid, so the check is disabled for now.
3421         (BuildMaster.loadConfig_Slaves): move slave-config into a separate
3422         routine, do the add/changed/removed dance with them like we do
3423         with builders.
3424         (BuildMaster.loadConfig_Sources): move source-config into a
3425         separate routine too
3427         * buildbot/status/builder.py (Status.getSlave): get the
3428         SlaveStatus object from the BotPerspective, not the BotMaster.
3430         * buildbot/test/test_run.py: bunch of new tests for losing the
3431         buildslave at various points in the build, handling a slave that
3432         connects multiple times, and making sure we can interrupt a
3433         running build
3435         * buildbot/slave/bot.py (BuildSlave): make it possible to use
3436         something other than 'Bot' for the Bot object, to make certain
3437         test cases easier to write.
3438         (BuildSlave.waitUntilDisconnected): utility method for testing
3440 2004-11-30  Brian Warner  <warner@lothar.com>
3442         * buildbot/test/test_run.py (RunMixin): refactor, remove debug msg
3444         * buildbot/interfaces.py (IBuilderControl.ping): add timeout=
3445         argument, return a Deferred that always fires with True or False.
3446         I don't use an errback to indicate 'ping failed' so that callers
3447         are free to ignore the deferred without causing spurious errors in
3448         the logs.
3449         * buildbot/process/builder.py (BuilderControl.ping): implement it
3451         * buildbot/test/test_run.py (Status.testDisappear): test ping
3452         (Status.disappearSlave): fix it
3454 2004-11-30  Brian Warner  <warner@lothar.com>
3456         * buildbot/interfaces.py (IBuildControl): add .stopBuild
3457         (IBuilderControl): add .getBuild(num), only works for the current
3458         build, of course, although it might be interesting to offer
3459         something for builds in the .waiting or .interlocked state.
3461         * buildbot/process/base.py (Build): have .stopBuild just do the
3462         interrupt, then let the build die by itself.
3463         (BuildControl): add .stopBuild, and add a point-event named
3464         'interrupt' just after the build so status viewers can tell that
3465         someone killed it.
3466         (BuilderControl): add .getBuild
3468         * buildbot/process/step.py (Dummy): use haltOnFailure so it really
3469         stops when you kill it, good for testing
3470         (ShellCommand.interrupt): add a logfile named 'interrupt' which
3471         contains the 'reason' text.
3473         * buildbot/status/html.py: Add Stop Build button, if the build can
3474         still be stopped. Send a Redirect (to the top page) one second
3475         later, hopefully long enough for the interrupt to have an effect.
3476         Move make_row() up to top-level to share it between Stop Build and
3477         Force Build.
3479         * buildbot/slave/commands.py: only kill the child process once
3481         * buildbot/test/test_run.py: add testInterrupt
3483 2004-11-29  Brian Warner  <warner@lothar.com>
3485         * buildbot/process/base.py: Refactor command interruption. The
3486         Build is now responsible for noticing that the slave has gone
3487         away: Build.lostRemote() interrupts the current step and makes
3488         sure that no further ones will be started.
3489         
3490         * buildbot/process/builder.py: When the initial remote_startBuild
3491         message fails, log it: this usually indicates that the slave has
3492         gone away, but we don't really start paying attention until they
3493         fail to respond to the first step's command.
3495         * buildbot/process/step.py (RemoteCommand): Does *not* watch for
3496         slave disconnect. Now sports a new interrupt() method. Error
3497         handling was simplified a lot by chaining deferreds, so
3498         remoteFailed/remoteComplete were merged into a single
3499         remoteComplete method (which can now get a Failure object).
3500         Likewise failed/finished were merged into just _finished.
3501         (BuildStep): Add interrupt(why) method, and if why is a
3502         ConnectionLost Failure then the step is failed with some useful
3503         error text.
3505         * buildbot/slave/bot.py: stop the current command when the remote
3506         Step reference is lost, and when the slave is shut down.
3507         (Bot): make it a MultiService, so it can have children. Use
3508         stopService to tell when the slave is shutting down.
3509         (SlaveBuilder): make it a Service, and a child of the Bot. Add
3510         remote_interruptCommand (which asks the current SlaveCommand to
3511         stop but allows it to keep emitting status messages), and
3512         stopCommand (which tells it to shut up and die).
3514         * buildbot/slave/commands.py: make commands interruptible
3515         (ShellCommand.kill): factor out os.kill logic
3516         (Command): factor out setup()
3517         (Command.sendStatus): don't send status if .running is false, this
3518         happens when the command has been halted.
3519         (Command.interrupt): new method, used to tell the command to die
3520         (SlaveShellCommand): implement .interrupt
3521         (DummyCommand): implement .interrupt
3522         (SourceBase, etc): factor out setup(), don't continue substeps if
3523         .interrupted is set
3525         * buildbot/status/builder.py: fix all waitUntilFinished() methods
3526         so they can be called after finishing
3528         * buildbot/test/test_run.py: new tests for disconnect behavior,
3529         refactor slave-shutdown routines, add different kinds of
3530         slave-shutdown
3532 2004-11-27  Brian Warner  <warner@lothar.com>
3534         * buildbot/status/words.py (IrcStatusBot.convertTime): utility
3535         method to express ETA time like "2m45s" instead of "165 seconds"
3537 2004-11-24  Brian Warner  <warner@lothar.com>
3539         * buildbot/test/test_vc.py (VC.testArch): unregister the test
3540         archive after the test completes, to avoid cluttering the user's
3541         'tla archives' listing with a bogus entry. Arch doesn't happen to
3542         provide any way to override the use of ~/.arch-params/, so there
3543         isn't a convenient way to avoid touching the setup of the user who
3544         runs the test.
3545         (VC_HTTP.testArchHTTP): same
3547 2004-11-23  Brian Warner  <warner@lothar.com>
3549         * buildbot/status/html.py (TextLog): split render() up into
3550         render_HEAD and render_GET. Use a Producer when sending log
3551         chunks, to reduce memory requirements and avoid sending huge
3552         non-Banana-able strings over web.distrib connections. Requires
3553         peeking under the covers of IStatusLog.
3554         (TextLog.resumeProducing): fix the "as text" link, handle client
3555         disconnects that occur while we're still sending old chunks.
3557         * buildbot/status/builder.py (HTMLLogFile.waitUntilFinished): oops,
3558         use defer.succeed, not the non-existent defer.success
3559         (LogFile.waitUntilFinished): same
3560         (LogFile.subscribe): don't add watchers to a finished logfile
3562         * buildbot/__init__.py (version): bump to 0.6.1+ while between
3563         releases
3565 2004-11-23  Brian Warner  <warner@lothar.com>
3567         * buildbot/__init__.py (version): Releasing buildbot-0.6.1
3569 2004-11-23  Brian Warner  <warner@lothar.com>
3571         * NEWS: update for the 0.6.1 release
3572         * MANIFEST.in: add new files
3574         * README (INSTALLATION): explain how to enable the extra VC tests
3576         * buildbot/status/builder.py (LogFile): add .runEntries at the class
3577         level to, so old pickled builds can be displayed ok
3579 2004-11-22  Brian Warner  <warner@lothar.com>
3581         * NEWS: summarize updates since last release
3583         * README (SLAVE): fix usage of 'buildbot slave' command. Thanks to
3584         Yoz Grahame. Closes SF#1050138.
3586         * docs/changes.xhtml (FreshCVSSourceNewcred): fix typo. Closes
3587         SF#1042563.
3589         * buildbot/process/step_twisted.py (Trial): update docs a bit
3591         * docs/factories.xhtml: fix Trial factory docs to match reality.
3592         Closes: SF#1049758.
3594         * buildbot/process/factory.py (Trial.__init__): add args for
3595         randomly= and recurse=, making them available to instantiators
3596         instead of only to subclassers. Closes: SF#1049759.
3598 2004-11-15  Brian Warner  <warner@lothar.com>
3600         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
3601         try to teach the Quick factory to use multiple versions of python
3603 2004-11-12  Brian Warner  <warner@lothar.com>
3605         * buildbot/status/builder.py (BuilderStatus.saveYourself): use a
3606         safer w32-compatible approach, and only use it on windows
3607         (BuildStatus.saveYourself): same
3609 2004-11-11  Brian Warner  <warner@lothar.com>
3611         * buildbot/status/builder.py (LogFile.addEntry): smarter way to do
3612         it: one string merge per chunk. There are now separate .entries
3613         and .runEntries lists: when enumerating over all chunks, make sure
3614         to look at both.
3615         * buildbot/test/test_status.py (Log): more tests
3617         * buildbot/status/builder.py (LogFile.addEntry): Merge string
3618         chunks together, up to 10kb per chunk. This ought to cut down on
3619         the CPU-burning overhead of large log files. Thanks to Alexander
3620         Staubo for spotting the problem.
3621         * buildbot/test/test_status.py (Log): tests for same
3623 2004-11-10  Brian Warner  <warner@lothar.com>
3625         * buildbot/status/mail.py (MailNotifier.buildMessage): add a Date
3626         header to outbound mail
3627         * buildbot/test/test_status.py (Mail.testBuild1): test for same
3629 2004-11-08  Brian Warner  <warner@lothar.com>
3631         * buildbot/status/builder.py (BuilderStatus.saveYourself): w32
3632         can't do os.rename() onto an existing file, so catch the exception
3633         and unlink the target file first. This introduces a slight window
3634         where the existing file could be lost, but the main failure case
3635         (disk full) should still be handled safely.
3636         (BuildStatus.saveYourself): same
3638         * buildbot/changes/pb.py (ChangePerspective): use a configurable
3639         separator character instead of os.sep, because the filenames being
3640         split here are coming from the VC system, which can have a
3641         different pathname convention than the local host. This should
3642         help a buildmaster running on windows that uses a CVS repository
3643         which runs under unix.
3644         * buildbot/changes/mail.py (MaildirSource): same, for all parsers
3646         * buildbot/process/step_twisted.py (Trial.createSummary): survive
3647         when there are no test failures to be parsed
3649         * buildbot/scripts/runner.py (createMaster): use shutil.copy()
3650         instead of the unix-specific os.system("cp"), thanks to Elliot
3651         Murphy for this and the other buildbot-vs-windows catches.
3652         * buildbot/test/test_maildir.py (MaildirTest.deliverMail): same
3654         * contrib/windows/buildbot.bat: prefix a '@', apparently to not
3655         echo the command as it is run
3657         * setup.py: install sample.mk too, not just sample.cfg
3658         (scripts): install contrib/windows/buildbot.bat on windows
3660 2004-11-07  Brian Warner  <warner@lothar.com>
3662         * buildbot/process/builder.py (Builder._detached): clear the
3663         self.currentBuild reference, otherwise the next build will be
3664         skipped because we think the Builder is already in use.
3666         * docs/examples/twisted_master.cfg: update to match current usage
3667         on the Twisted buildbot
3669 2004-10-29  Brian Warner  <warner@lothar.com>
3671         * buildbot/status/mail.py (MailNotifier): fix typo in docs
3673 2004-10-28  Brian Warner  <warner@lothar.com>
3675         * buildbot/slave/commands.py (SourceBase): refactor subclasses to
3676         have separate doVCUpdate/doVCFull methods. Catch an update failure
3677         and respond by clobbering the source directory and re-trying. This
3678         will handle local changes (like replacing a file with a directory)
3679         that will cause CVS and SVN updates to fail.
3680         * buildbot/test/test_vc.py (SetupMixin.do_vc): test the same
3682         * buildbot/process/step.py (LoggedRemoteCommand.__repr__): avoid a
3683         python-2.4 warning
3685 2004-10-19  Brian Warner  <warner@lothar.com>
3687         * buildbot/process/step_twisted.py (Trial.createSummary): bugfixes
3689         * buildbot/status/html.py (StatusResourceTestResults): display any
3690         TestResults that the Build might have
3691         (StatusResourceTestResult): and the logs for each TestResult
3692         (StatusResourceBuild): add link from the per-build page
3694 2004-10-15  Brian Warner  <warner@lothar.com>
3696         * buildbot/process/step_twisted.py (Trial.createSummary): parse
3697         the 'problems' portion of stdout, add TestResults to our build
3698         * buildbot/test/test_twisted.py (Parse.testParse): test it
3700         * buildbot/interfaces.py (IBuildStatus.getTestResults): new method
3701         to retrieve a dict of accumulated test results
3702         (ITestResult): define what a single test result can do
3703         * buildbot/status/builder.py (TestResult): implement ITestResult
3704         (BuildStatus.getTestResults): retrieve dict of TestResults
3705         (BuildStatus.addTestResult): add TestResults
3706         * buildbot/test/test_status.py (Results.testAddResults): test it
3708 2004-10-14  Brian Warner  <warner@lothar.com>
3710         * buildbot/test/test_maildir.py (MaildirTest): use shutil.rmtree
3711         instead of os.system("rm -rf") for win32 portability
3713         * buildbot/test/test_slavecommand.py (SlaveCommandTestCase): use
3714         SignalMixin instead of starting/stopping the reactor, which is
3715         likely to cause problems with other tests
3717         * buildbot/slave/commands.py (SourceBase.doCopy): remove leftover
3718         self.copyComplete() call. Yoz Grahame makes the catch.
3720         * contrib/windows/buildbot.bat: helper script to deal with path
3721         issues. Thanks to Yoz Grahame.
3723         * buildbot/master.py (BuildMaster.startService): don't register a
3724         SIGHUP handler if the signal module has no SIGHUP attribute.
3725         Apparently win32 does this.
3727         * buildbot/scripts/runner.py (start): add --reactor=win32 on win32
3729         * buildbot/test/test_web.py (WebTest.test_webPathname): skip the
3730         test if the reactor can't offer UNIX sockets
3732         * buildbot/status/html.py (StatusResourceBuild.body): fix syntax
3733         error introduced in the last commit. We really need that
3734         metabuildbot :).
3736 2004-10-12  Brian Warner  <warner@lothar.com>
3738         * buildbot/changes/mail.py (MaildirSource.describe): fix exception
3739         when describing a maildir source. Thanks to Stephen Davis.
3741         * buildbot/status/words.py (IrcStatusBot.command_WATCH): round off
3742         ETA seconds
3744         * buildbot/scripts/runner.py (createMaster): install Makefile too
3745         (start): add --no_save to 'start' command
3746         * buildbot/scripts/sample.mk: simple convenience Makefile with 
3747         start/stop/reload targets
3749         * buildbot/__init__.py (version): bump to 0.6.0+ while between
3750         releases
3752 2004-09-30  Brian Warner  <warner@lothar.com>
3754         * setup.py: Releasing buildbot-0.6.0
3756 2004-09-30  Brian Warner  <warner@lothar.com>
3758         * MANIFEST.in: add debian/*, sample.cfg, more docs files. Remove
3759         test_trial.py from the source tarball until support is complete.
3761         * NEWS: update for 0.6.0 release
3762         * buildbot/__init__.py (version): same
3763         * README: same
3765         * buildbot/status/words.py (IrcStatusBot.command_SOURCE): add
3766         'source' command to tell users where to get the Buildbot source
3768         * docs/examples/*.cfg: update to modern standards
3770         * NEWS: update for release
3772         * buildbot/scripts/runner.py (createMaster): remove the
3773         -shutdown.tap stuff now that it isn't necessary
3774         (createSlave): same
3775         (start): launch buildbot.tap, not buildbot-shutdown.tap
3778         * buildbot/status/mail.py (Domain): shorten class name
3779         (MailNotifier): if lookup= is a string, pass it to Domain()
3780         * buildbot/test/test_status.py (Mail.testBuild1): new class name
3781         (Mail.testBuild2): test the string-to-Domain shortcut
3782         (Mail.testMail): fix test
3785         * buildbot/scripts/sample.cfg: improve the build-the-buildbot
3786         example config file
3788         * buildbot/status/builder.py (BuildStatus.__setstate__): re-set
3789         more attributes on load
3790         (BuilderStatus.stubBuildCacheSize): bump to 30, this was too low
3791         to accomodate the whole waterfall page at once, and the thrashing
3792         results in a lot of unnecessary loads
3793         (BuildStatus.saveYourself): use binary pickles, not fluffy text
3794         (BuilderStatus.saveYourself): same
3795         (BuilderStatus.eventGenerator): stop generating on the first missing
3796         build. We assume that saved builds are deleted oldest-first.
3797         (BuildStepStatus.__getstate__): .progress might not exist
3799         * buildbot/changes/changes.py (ChangeMaster): make it
3800         serializable, in $masterdir/changes.pck
3801         (ChangeMaster.stopService): save on shutdown
3802         * buildbot/master.py (BuildMaster.loadChanges): load at startup
3803         * buildbot/test/test_config.py: load Changes before config file
3806         * buildbot/slave/commands.py (ShellCommand.doTimeout): put the
3807         "Oh my god, you killed the command" header on a separate line
3809         * buildbot/status/builder.py (BuilderStatus.getStubBuildByNumber):
3810         skip over corrupted build pickles
3811         (BuilderStatus.getFullBuildByNumber): same
3812         (BuilderStatus.eventGenerator): skip over unavailable builds
3813         (BuildStatus.saveYourself): save builds to a .tmp file first, then
3814         do an atomic rename. This prevents a corrupted pickle when some
3815         internal serialization error occurs.
3816         (BuilderStatus.saveYourself): same
3818         * buildbot/slave/commands.py (SlaveShellCommand): oops, restore
3819         the timeout for shell commands, it got lost somehow
3821         * buildbot/status/builder.py (BuilderStatus.eventGenerator): if we
3822         run out of build steps, return the rest of the builder events
3824         * buildbot/interfaces.py (IBuilderControl.ping): add method
3826         * buildbot/process/builder.py (BuilderControl.ping): move
3827         slave-ping to BuilderControl, and fix the failure case in the
3828         process (Event.finish() is the verb, Event.finished is the noun).
3830         * buildbot/status/html.py (StatusResourceBuilder.ping): ping
3831         through the BuilderControl instead of the BuilderStatus
3832         (EventBox): add adapter for builder.Event, allowing builder events to
3833         be displayed in the waterfall display
3835         * buildbot/master.py (BotMaster.stopService): add a 'master
3836         shutdown' event to the builder's log
3837         (BuildMaster.startService): and a 'master started' on startup
3839         * buildbot/status/builder.py (BuilderStatus.eventGenerator): merge
3840         builder events into the BuildStep event stream
3841         (Status.builderAdded): add a 'builder created' event
3844         * buildbot/status/words.py (IrcStatusBot.command_WATCH): new
3845         command to announce the completion of a running build
3846         (IrcStatusBot.command_FORCE): announce when the build finishes
3848         * buildbot/status/builder.py (BuilderStatus.addFullBuildToCache):
3849         don't evict unfinished builds from the cache: they must stay in
3850         the full-cache until their logfiles have stopped changing. Make
3851         sure the eviction loop terminates if an unfinished build was hit.
3852         (HTMLLogFile.getTextWithHeaders): return HTML as if it were text.
3853         This lets exceptions be dumped in an email status message. Really
3854         we need LogFiles which contain both text and HTML, instead of two
3855         separate classes.
3856         (BuildStatus.__getstate__): handle self.finished=False
3857         (Status.builderAdded): if the pickle is corrupted, abandon the
3858         history and create a new BuilderStatus object.
3860         * buildbot/process/base.py (Build.stopBuild): tolerate lack of a
3861         self.progress attribute, helped one test which doesn't fully set
3862         up the Build object.
3864         * buildbot/interfaces.py (IStatusLogStub): split out some of the
3865         IStatusLog methods into an Interface that is implemented by "stub"
3866         logs, for which all the actual text chunks are on disk (in the
3867         pickled Build instance). To show the log contents, you must first
3868         adapt the stub log to a full IStatusLog object.
3870         * buildbot/status/builder.py (LogFileStub): create separate stub
3871         log objects, which can be upgraded to a real one if necessary.
3872         (LogFile): make them persistable, and let them stubify themselves
3873         (HTMLLogFile): same
3874         (BuildStepStatus): same
3875         (BuildStatus): same
3876         (BuildStatus.saveYourself): save the whole build out to disk
3877         (BuilderStatus): make it persistable
3878         (BuilderStatus.saveYourself): save the builder to disk
3879         (BuilderStatus.addFullBuildToCache): implement two caches which
3880         hold Build objects: a small one which holds full Builds, and a
3881         larger one which holds "stubbed" Builds (ones with their LogFiles
3882         turned into LogFileStubs). This reduces memory usage by the
3883         buildmaster by not keeping more than a few (default is 2) whole
3884         build logs in RAM all the time.
3885         (BuilderStatus.getBuild): rewrite to pull from disk (through the
3886         cache)
3887         (BuilderStatus.eventGenerator): rewrite since .builds went away
3888         (BuilderStatus.buildStarted): remove the .builds array. Add the
3889         build to the "full" cache when it starts.
3890         (BuilderStatus._buildFinished): save the build to disk when it
3891         finishes
3892         (Status): give it a basedir (same as the BuildMaster's basedir)
3893         where the builder pickles can be saved
3894         (Status.builderAdded): create the BuilderStatus ourselves, by
3895         loading a pickle from disk (or creating a new instance if there
3896         was none on disk). Return the BuilderStatus so the master can glue
3897         it into the new Builder object.
3899         * buildbot/master.py (BotMaster.stopService): on shutdown, tell
3900         all BuilderStatuses to save themselves out to disk. This is in
3901         lieu of saving anything important in the main Application pickle
3902          (the -shutdown.tap file).
3903         (BuildMaster.__init__): give Status() a basedir for its files
3904         (BuildMaster.loadConfig_Builders): do status.builderAdded first,
3905         to get the BuilderStatus, then give it to the Builder (instead of
3906         doing it the other way around). It's ok if the status announces
3907         the new Builder before it's really ready, as the outside world can
3908         only see the BuilderStatus object anyway (and it is ready before
3909         builderAdded returns). Use the builder's "builddir" (which
3910         normally specifies where the slave will run the builder) as the
3911         master's basedir (for saving serialized builds).
3913         * buildbot/status/html.py (StatusResourceBuildStep.getChild):
3914         coerce the logfile to IStatusLog before trying to get the text
3915         chunks out of it. This will pull the full (non-stubified) Build in
3916         from disk if necessary.
3917         (TextLog): fix the adapter registration
3919         * buildbot/test/test_control.py (Force.setUp): create the basedir
3920         * buildbot/test/test_web.py: same
3921         * buildbot/test/test_vc.py (SetupMixin.setUp): same
3922         * buildbot/test/test_status.py (Mail.makeBuild): match new setup
3923         * buildbot/test/test_run.py (Run.testMaster): same
3924         (Status.setUp): same
3926 2004-09-29  Fred L. Drake, Jr.  <fdrake@acm.org>
3928         * buildbot/status/html.py (Waterfall.__init__): store actual
3929         allowForce flag passed in rather than using True for everyone;
3930         make sure setting it to False doesn't cause a NameError
3931         (Waterfall.setup).
3932         (StatusResourceBuilder.__init__) add the builder name to the page
3933         title.
3934         (StatusResourceBuilder.body) move HTML generation for a name/value
3935         row into a helper method (StatusResourceBuilder.make_row); only
3936         generate the "Force Build" form if allowForce was True and the
3937         slave is connected.  Use class attributes in the generated HTML to
3938         spread a little CSS-joy.
3940 2004-09-28  Brian Warner  <warner@lothar.com>
3942         * buildbot/process/step_twisted.py (Trial.createSummary): fix
3943         warning-scanner to not ignore things like
3944         'ComponentsDeprecationWarning' and 'exceptions.RuntimeWarning'
3946         * buildbot/status/html.py (StatusResource.control): add some
3947         class-level values for .control in an attempt to make upgrading
3948         smoother
3950         * buildbot/util.py (ComparableMixin): survive missing attributes,
3951         such as when a class is modified and we're comparing old instances
3952         against new ones
3954         * buildbot/status/words.py (IrcStatusBot.privmsg): clean up
3955         failure handling, remove a redundant try/except block. Don't
3956         return the full traceback to the IRC channel.
3957         (IrcStatusBot.command_FORCE): catch new exceptions, return useful
3958         error messages. Get ETA properly.
3960         * buildbot/status/html.py (StatusResourceBuild.body): html.escape
3961         the reason, since (at least) IRC message will have <> in them.
3962         (StatusResourceBuilder.__init__): take an IBuilderControl
3963         (StatusResourceBuilder.force): use the IBuilderControl we get in
3964         the constructor instead of trying to make our own. Catch the
3965         new exceptions and ignore them for now (until we make an
3966         intermediate web page where we could show the error message)
3967         (StatusResource): create with an IControl, use it to give an
3968         IBuilderControl to all children
3969         (Waterfall): take an allowForce= option, pass an IControl object
3970         to StatusResource if it is True
3972         * buildbot/test/test_web.py (ConfiguredMaster): handle IControl
3974         * buildbot/master.py (BotPerspective.perspective_forceBuild):
3975         catch new exceptions and return string forms
3977         * buildbot/interfaces.py: add NoSlaveError, BuilderInUseError
3978         * buildbot/process/builder.py (Builder.forceBuild): raise them
3979         * buildbot/test/test_control.py (Force.testNoSlave): new test
3980         (Force.testBuilderInUse): same
3983         * buildbot/status/words.py (IrcStatusBot): enable build-forcing
3985         * buildbot/test/test_run.py: use IControl
3986         * buildbot/test/test_vc.py: same
3988         * buildbot/status/html.py (StatusResourceBuilder.force): rewrite
3989         to use IControl. Still offline.
3990         * buildbot/status/words.py (IrcStatusBot.command_FORCE): same
3992         * buildbot/process/builder.py (Builder.doPeriodicBuild): set
3993         who=None so periodic builds don't send out status mail
3994         (Builder.forceBuild): include reason in the log message
3995         (BuilderControl.forceBuild): rename 'name' to 'who'
3997         * buildbot/master.py (BotPerspective.perspective_forceBuild): add
3998         'who' parameter, but make it None by default so builds forced by
3999         slave admins don't cause status mail to be sent to anybody
4000         (BotMaster.forceBuild): same. this method is deprecated.
4001         (DebugPerspective.perspective_forceBuild): same, use IControl.
4002         (DebugPerspective.perspective_fakeChange): use IControl..
4003         (Dispatcher.requestAvatar): .. so don't set .changemaster
4005         * buildbot/interfaces.py (IBuilderControl.forceBuild): rename 'who'
4006         parameter to avoid confusion with the name of the builder
4009         * buildbot/status/mail.py: refine comment about needing 2.3
4011         * buildbot/status/html.py: move all imports to the top
4013         * buildbot/test/test_control.py: test new interfaces
4014         * buildbot/test/test_run.py (Status): handle new interfaces
4015         * buildbot/test/test_vc.py (SetupMixin.doBuild): same
4017         * buildbot/process/base.py (BuildControl): implement IBuildControl
4018         and its lonely getStatus() method
4020         * buildbot/process/builder.py (BuilderControl): implement
4021         IBuilderControl, obtained by adapting the Builder instance
4022         (Builder.startBuild): return a BuilderControl instead of a
4023         Deferred. The caller can use bc.getStatus().waitUntilFinished() to
4024         accomplish the same thing.
4026         * buildbot/master.py: move all import statements to the top
4027         (Control): implement IControl, obtained by adapting the
4028         BuildMaster instance.
4030         * buildbot/interfaces.py: add IControl, IBuilderControl, and
4031         IBuildControl. These are used to force builds. Eventually they
4032         will provide ways to reconfigure the Builders, pause or abandon a
4033         Build, and perhaps control the BuildMaster itself.
4035 2004-09-26  Brian Warner  <warner@lothar.com>
4037         * buildbot/util.py (ComparableMixin): survive twisted>1.3.0 which
4038         ends up comparing us against something without a .__class__
4040 2004-09-24  Brian Warner  <warner@lothar.com>
4042         * buildbot/scripts/runner.py: rearrange option parsing a lot, to get
4043         usage text right.
4045         * Makefile: add 'deb-snapshot' target, to create a timestamped
4046         .deb package
4048         * debian/rules (binary-indep): skip CVS/ files in dh_installexamples
4050 2004-09-23  Brian Warner  <warner@lothar.com>
4052         * buildbot/__init__.py (version): move version string here
4053         * setup.py: get version string from buildbot.version
4054         * buildbot/status/html.py (WaterfallStatusResource.body): add
4055         buildbot version to the page footer
4056         * buildbot/status/words.py (IrcStatusBot.command_VERSION): provide
4057         version when asked
4059         * buildbot/master.py (BotMaster.getPerspective): detect duplicate
4060         slaves, let the second know where the first one is coming from
4061         (BuildMaster.__init__): turn on .unsafeTracebacks so the slave can
4062         see our exceptions. It would be nice if there were a way to just
4063         send them the exception type and value, not the full traceback.
4066         * buildbot/status/mail.py (MailNotifier): add a new argument
4067         sendToInterestedUsers=, which can be set to False to disable the
4068         usual send-to-blamelist behavior.
4069         (top): handle python-2.2 which has no email.MIMEMultipart
4070         (MailNotifier.buildMessage): don't send logs without MIMEMultipart
4071         (MailNotifier.disownServiceParent): unsubscribe on removal
4073         * buildbot/test/test_status.py (Mail.testBuild2): test it
4076         * buildbot/status/progress.py (Expectations.wavg): tolerate
4077         current=None, which happens when steps start failing badly
4078         * buildbot/test/test_status.py (Progress.testWavg): test for it
4080         * buildbot/process/step.py (SVN.startVC): when the (old) slave
4081         doesn't understand args['revision'], emit a warning instead of
4082         bailing completely. Updating to -rHEAD is probably close enough.
4084         * buildbot/process/step_twisted.py (Trial.start): fix sanity-check
4086         * buildbot/test/test_status.py: at least import bb.status.client
4087         even if we don't have any test coverage for it yet
4089         * contrib/svn_buildbot.py: don't require python2.3
4090         (main): wait, do require it (for sets.py), but explain how to
4091         make it work under python2.2
4093 2004-09-23  Brian Warner  <warner@lothar.com>
4095         * contrib/svn_buildbot.py: include the revision number in the Change
4097         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): use when=,
4098         using util.now() because FreshCVS is a realtime service
4100         * buildbot/status/event.py: delete dead code
4101         * buildbot/process/step.py: don't import dead Event class
4102         * buildbot/process/step_twisted.py: same
4103         * buildbot/status/builder.py: same
4104         * buildbot/status/client.py: same
4106         * buildbot/test/test_process.py: kill buggy out-of-date disabled test
4108         * buildbot/changes/changes.py (Change): set .when from an __init__
4109         argument (which defaults to now()), rather than having
4110         ChangeMaster.addChange set it later.
4111         (ChangeMaster.addChange): same
4113         * buildbot/changes/mail.py (parseFreshCVSMail): pass in when=
4114         (parseSyncmail): same. Just use util.now() for now.
4115         (parseBonsaiMail): parse the timestamp field for when=
4117         * buildbot/test/test_vc.py (SourceStamp.addChange): page in when=
4118         instead of setting .when after the fact
4120 2004-09-22  slyphon
4122         * buildbot/slave/trial.py: new SlaveCommand to machine-parse test
4123         results when the target project uses retrial. Still under
4124         development.
4125         * buildbot/test/test_trial.py: same
4127 2004-09-21  Brian Warner  <warner@lothar.com>
4129         * buildbot/status/mail.py (MailNotifier.__init__): include
4130         success/warnings/failure in the Subject line
4131         (MailNotifier.buildMessage): add the buildbot's URL to the body,
4132         use step.logname for the addLogs=True attachment filenames
4133         * buildbot/test/test_status.py (Mail): test Subject lines
4134         (Mail.testLogs): test attachment filenames
4136         * buildbot/master.py (DebugPerspective.perspective_fakeChange):
4137         accept a 'who' argument from the debug tool
4138         * contrib/debugclient.py (DebugWidget.do_commit): send 'who'
4139         * contrib/debug.glade: add text box to set 'who'
4141         * buildbot/interfaces.py (IBuildStatus.getBuilder): replace
4142         .getBuilderName with .getBuilder().getName(), more flexible
4143         (IStatusLog.getName): logs have short names, but you can prefix
4144         them with log.getStep().getName() to make them more useful
4145         * buildbot/status/builder.py: same
4146         * buildbot/status/client.py: same
4147         * buildbot/status/html.py: same
4148         * buildbot/test/test_run.py (Status.testSlave): same
4149         * buildbot/process/step.py: tweak logfile names
4151         * buildbot/status/mail.py (MailNotifier): add lookup, change
4152         argument to extraRecipients. The notifier is now aimed at sending
4153         mail to the people involved in a particular build, with additional
4154         constant recipients as a secondary function.
4156         * buildbot/test/test_status.py: add coverage for IEmailLookup,
4157         including slow-lookup and failing-lookup. Make sure the blamelist
4158         members are included.
4160         * buildbot/interfaces.py: new interfaces IEmailSender+IEmailLookup
4161         (IBuildStatus.getResponsibleUsers): rename from getBlamelist
4162         (IBuildStatus.getInterestedUsers): new method
4163         * buildbot/status/builder.py (BuildStatus.getResponsibleUsers): same
4164         * buildbot/status/client.py (remote_getResponsibleUsers): same
4165         * buildbot/status/html.py (StatusResourceBuild.body): same
4166         * buildbot/test/test_run.py (Status.testSlave): same
4168 2004-09-20  Brian Warner  <warner@lothar.com>
4170         * docs/users.xhtml: update concepts
4172         * Makefile: add a convenience makefile, for things like 'make
4173         test'. It is not included in the source tarball.
4175 2004-09-16  Brian Warner  <warner@lothar.com>
4177         * NEWS: mention /usr/bin/buildbot, debian/*
4179         * debian/*: add preliminary debian packaging. Many thanks to
4180         Kirill Lapshin (and Kevin Turner) for the hard work. I've mangled
4181         it considerably since it left their hands, I am responsible for
4182         all breakage that's resulted.
4184         * bin/buildbot: create a top-level 'buildbot' command, to be
4185         installed in /usr/bin/buildbot . For now it's just a simple
4186         frontend to mktap/twistd/kill, but eventually it will be the entry
4187         point to the 'try' command and also a status client. It is also
4188         intended to support the upcoming debian-packaging init.d scripts.
4189         * buildbot/scripts/runner.py: the real work is done here
4190         * buildbot/scripts/__init__.py: need this too
4191         * buildbot/scripts/sample.cfg: this is installed in new
4192         buildmaster directories
4193         * setup.py: install new stuff
4195 2004-09-15  Brian Warner  <warner@lothar.com>
4197         * buildbot/test/test_vc.py: skip SVN tests if svn can't handle the
4198         'file:' schema (the version shipped with OS-X was built without the
4199         ra_local plugin).
4200         (SetupMixin.tearDown): stop the goofy twisted.web timer which
4201         updates the log-timestamp, to make sure it isn't still running after
4202         the test finishes
4204         * docs/config.xhtml: Add projectName, projectURL, buildbotURL
4205         values to the config file.
4206         * docs/examples/hello.cfg: add examples
4207         * buildbot/interfaces.py (IStatus.getBuildbotURL): define accessors
4208         * buildbot/status/builder.py (Status.getProjectURL): implement them
4209         * buildbot/master.py (BuildMaster.loadConfig): set them from config
4210         * buildbot/test/test_config.py (ConfigTest.testSimple): test them
4211         * buildbot/status/html.py (WaterfallStatusResource): display them
4214         * buildbot/test/test_vc.py (FakeBuilder.name): add attribute so
4215         certain error cases don't suffer a secondary exception.
4216         (top): Skip tests if the corresponding VC tool is not installed.
4218         * buildbot/process/factory.py (Trial): introduce separate
4219         'buildpython' and 'trialpython' lists, since trialpython=[] is
4220         what you want to invoke /usr/bin/python, whereas ./setup.py is
4221         less likely to be executable. Add env= parameter to pass options
4222         to test cases (which is how I usually write tests, I don't know if
4223         anyone else does it this way).
4225         * buildbot/process/step_twisted.py (Trial): handle python=None.
4226         Require 'testpath' be a string, not a list. Fix tests= typo.
4227         (Trial.start): sanity-check any PYTHONPATH value for stringness.
4229         * buildbot/process/step.py (RemoteCommand._remoteFailed): goofy
4230         way to deal with the possibility of removing the disconnect notify
4231         twice.
4232         (CVS): add a 'login' parameter to give a password to 'cvs login',
4233         commonly used with pserver methods (where pw="" or pw="guest")
4235         * buildbot/slave/commands.py (SourceBase): move common args
4236         extraction and setup() to __init__, so everything is ready by the
4237         time setup() is called
4238         (CVS.start): call 'cvs login' if a password was supplied
4239         (ShellCommand): special-case PYTHONPATH: prepend the master's
4240         value to any existing slave-local value.
4242         * buildbot/process/builder.py (Builder.updateBigStatus): if we
4243         don't have a remote, mark the builder as Offline. This whole
4244         function should probably go away and be replaced by individual
4245         deltas.
4246         (Builder.buildFinished): return the results to the build-finished
4247         deferred callback, helps with testing
4249 2004-09-14  Brian Warner  <warner@lothar.com>
4251         * buildbot/test/test_vc.py: put all the repositories needed to run
4252         the complete tests into a single small (1.3MB) tarball, so I can
4253         make that tarball available on the buildbot web site. Test HTTP
4254         access (for Arch and Darcs) by spawning a temporary web server
4255         while the test runs.
4257         * docs/users.xhtml: new document, describe Buildbot's limited
4258         understanding of different human users
4260         * buildbot/test/test_vc.py: rearrange test cases a bit
4262         * buildbot/process/step_twisted.py (Trial): handle testpath=
4263         * buildbot/process/factory.py (Trial): update to use step.Trial
4265         * buildbot/slave/commands.py (ShellCommandPP): fix fatal typo
4267         * buildbot/status/builder.py (BuildStatus.getText): add text2 to
4268         the overall build text (which gives you 'failed 2 tests' rather
4269         than just 'failed')
4270         (BuildStepStatus.text2): default to [], not None
4272         * buildbot/process/step_twisted.py (Trial.commandComplete): text2
4273         must be a list
4275 2004-09-12  Brian Warner  <warner@lothar.com>
4277         * buildbot/master.py (BotPerspective._commandsUnavailable): don't
4278         log the whole exception if it's just an AttributeError (old slave)
4280         * buildbot/process/step.py (ShellCommand.__init__): stash .workdir
4281         so (e.g.) sub-commands can be run in the right directory.
4282         (ShellCommand.start): accept an optional errorMessage= argument
4283         to make life easier for SVN.start
4284         (SVN.startVC): put the "can't do mode=export" warning in the LogFile
4285         headers
4286         (ShellCommand.start): move ['dir'] compatibility hack..
4287         (RemoteShellCommand.start): .. to here so everyone can use it
4289         * buildbot/process/step_twisted.py (Trial): use .workdir
4291         * buildbot/process/step_twisted.py (BuildDebs.getText): fix the
4292         text displayed when debuild fails completely
4293         (Trial): snarf _trial_temp/test.log from the slave and display it
4295 2004-09-11  Brian Warner  <warner@lothar.com>
4297         * buildbot/process/step_twisted.py (ProcessDocs.getText): typo
4299         * buildbot/process/process_twisted.py (TwistedTrial.tests): oops,
4300         set to 'twisted', so --recurse can find twisted/web/test/*, etc
4302         * buildbot/process/step.py (ShellCommand): call .createSummary
4303         before .evaluateCommand instead of the other way around. This
4304         makes it slightly easier to count warnings and then use that to
4305         set results=WARNINGS
4306         * buildbot/process/step_twisted.py: cosmetic, swap the methods
4308         * buildbot/process/base.py (Build.buildFinished): update status
4309         before doing progress. It's embarrassing for the build to be stuck
4310         in the "building" state when an exceptions occurs elsewhere..
4312         * buildbot/status/progress.py (Expectations.expectedBuildTime):
4313         python2.2 doesn't have 'sum'
4315         * buildbot/status/builder.py (Status.getBuilderNames): return a copy,
4316         to prevent clients from accidentally sorting it
4318         * buildbot/master.py (Manhole): add username/password
4319         (BuildMaster.loadConfig): use c['manhole']=Manhole() rather than
4320         c['manholePort'], deprecate old usage
4321         * docs/config.xhtml: document c['manhole']
4322         * docs/examples/hello.cfg: show example of using a Manhole
4325         * buildbot/test/test_steps.py (FakeBuilder.getSlaveCommandVersion):
4326         pretend the slave is up to date
4328         * buildbot/status/builder.py (BuildStepStatus.stepFinished): 'log',
4329         the module, overlaps with 'log', the local variable
4331         * buildbot/status/html.py: oops, 2.2 needs __future__ for generators
4333         * buildbot/process/builder.py (Builder.getSlaveCommandVersion):
4334         new method to let Steps find out the version of their
4335         corresponding SlaveCommand.
4336         * buildbot/process/step.py (BuildStep.slaveVersion): utility method
4337         (ShellCommand.start): add 'dir' argument for <=0.5.0 slaves
4338         (CVS.startVC): backwards compatibility for <=0.5.0 slaves
4339         (SVN.startVC): same
4340         (Darcs.startVC): detect old slaves (missing the 'darcs' command)
4341         (Arch.startVC): same
4342         (P4Sync.startVC): same
4344         * buildbot/process/step.py (LoggedRemoteCommand.start): return the
4345         Deferred so we can catch errors in remote_startCommand
4346         (RemoteShellCommand.start): same
4348         * docs/examples/twisted_master.cfg: update sample config file
4350         * buildbot/slave/commands.py (ShellCommandPP): write to stdin
4351         after connectionMade() is called, not before. Close stdin at that
4352         point too.
4354         * buildbot/process/process_twisted.py: update to use Trial, clean
4355         up argument passing (move to argv arrays instead of string
4356         commands)
4358         * buildbot/process/step_twisted.py (Trial): new step to replace
4359         RunUnitTests, usable by any trial-using project (not just
4360         Twisted). Arguments have changed, see the docstring for details.
4362         * buildbot/process/base.py (Build.startBuild): this now returns a
4363         Deferred. Exceptions that occur during setupBuild are now
4364         caught better and lead to fewer build_status weirdnesses, like
4365         finishing a build that was never started.
4366         (Build.buildFinished): fire the Deferred instead of calling
4367         builder.buildFinished directly. The callback argument is this
4368         Build, everything else can be extracted from it, including the
4369         new build.results attribute.
4370         * buildbot/process/builder.py (Builder.startBuild): same
4371         (Builder.buildFinished): same, extract results from build
4373         * buildbot/process/step.py (ShellCommands): remove dead code
4375 2004-09-08  Brian Warner  <warner@lothar.com>
4377         * buildbot/test/test_vc.py (VC.doPatch): verify that a new build
4378         doesn't try to use the leftover patched workdir
4379         (SourceStamp): test source-stamp computation for CVS and SVN
4381         * buildbot/slave/commands.py (SourceBase.doPatch): mark the
4382         patched workdir ('touch .buildbot-patched') so we don't try to
4383         update it later
4384         (SourceBase.start): add ['revision'] for all Source steps
4385         (CVS): change args: use ['branch'] for -r, remove ['files']
4386         (CVS.buildVC): fix revision/branch stuff
4387         (SVN): add revision stuff
4389         * buildbot/process/step.py (BuildStep.__init__): reject unknown
4390         kwargs (except 'workdir') to avoid silent spelling errors
4391         (ShellCommand.__init__): same
4392         (Source): new base class for CVS/SVN/etc. Factor out everything
4393         common, add revision computation (perform the checkout with a -D
4394         DATE or -r REVISION that gets exactly the sources described by the
4395         last Change), overridable with step.alwaysUseLatest. Add patch
4396         handling (build.getSourceStamp can trigger the use of a base
4397         revision and a patch).
4398         (CVS, SVN, Darcs, Arch, P4Sync): refactor, remove leftover arguments
4399         * docs/steps.xhtml: update docs
4400         * docs/source.xhtml: mention .checkoutDelay
4401         * docs/examples/hello.cfg: show use of checkoutDelay, alwaysUseLatest
4403         * buildbot/process/base.py (Build.setSourceStamp): add a
4404         .sourceStamp attribute to each Build. If set, this indicates that
4405         the build should be done with something other than the most
4406         recent source tree. This will be used to implement "try" builds.
4407         (Build.allChanges): new support method
4408         (Build.lastChangeTime): remove, functionality moved to Source steps
4409         (Build.setupBuild): copy the Step args before adding ['workdir'],
4410         to avoid modifying the BuildFactory (and thus triggering spurious
4411         config changes)
4414         * buildbot/status/html.py: rename s/commits/changes/
4415         (StatusResourceChanges): same
4416         (CommitBox.getBox): same, update URL
4417         (WaterfallStatusResource): same
4418         (StatusResource.getChild): same
4420         * contrib/debugclient.py (DebugWidget.do_commit): send .revision
4421         * contrib/debug.glade: add optional 'revision' to the fakeChange
4423         * buildbot/changes/changes.py (html_tmpl): display .revision
4424         (ChangeMaster.addChange): note .revision in log
4425         * buildbot/changes/pb.py (ChangePerspective.perspective_addChange):
4426         accept a ['revision'] attribute
4428         * buildbot/process/factory.py (BuildFactory): use ComparableMixin
4430         * buildbot/master.py (BotMaster.getPerspective): update the
4431         .connected flag in SlaveStatus when it connects
4432         (BotMaster.detach): and when it disconnects
4433         (DebugPerspective.perspective_fakeChange): take a 'revision' attr
4434         (BuildMaster.loadConfig_Builders): walk old list correctly
4436         * buildbot/test/test_config.py: fix prefix= usage
4438 2004-09-06  Brian Warner  <warner@lothar.com>
4440         * NEWS: mention P4
4442         * buildbot/changes/p4poller.py (P4Source): New ChangeSource to
4443         poll a P4 depot looking for recent changes. Thanks to Dave
4444         Peticolas for the contribution. Probably needs some testing after
4445         I mangled it.
4447         * buildbot/process/step.py (P4Sync): simple P4 source-updater,
4448         requires manual client setup for each buildslave. Rather
4449         experimental. Thanks again to Dave Peticolas.
4450         * buildbot/slave/commands.py (P4Sync): slave-side source-updater
4452         * buildbot/changes/changes.py (Change): add a .revision attribute,
4453         which will eventually be used to generate source-stamp values.
4455         * buildbot/process/step.py (RemoteCommand.start): use
4456         notifyOnDisconnect to notice when we lose the slave, then treat it
4457         like an exception. This allows LogFiles to be closed and the build
4458         to be wrapped up normally. Be sure to remove the disconnect
4459         notification when the step completes so we don't accumulate a
4460         bazillion such notifications which will fire weeks later (when the
4461         slave finally disconnects normally). Fixes SF#915807, thanks to
4462         spiv (Andrew Bennetts) for the report.
4463         (LoggedRemoteCommand): move __init__ code to RemoteCommand, since it
4464         really isn't Logged- specific
4465         (LoggedRemoteCommand.remoteFailed): Add an extra newline to the
4466         header, since it's almost always going to be appended to an
4467         incomplete line
4468         * buildbot/test/test_steps.py (BuildStep.testShellCommand1):
4469         update test to handle use of notifyOnDisconnect
4471         * buildbot/status/builder.py (BuilderStatus.currentlyOffline):
4472         don't clear .ETA and .currentBuild when going offline, let the
4473         current build clean up after itself
4475         * buildbot/process/builder.py (Builder.detached): wait a moment
4476         before doing things like stopping the current build, because the
4477         current step will probably notice the disconnect and cleanup the
4478         build by itself
4479         * buildbot/test/test_run.py (Status.tearDown): update test to
4480         handle asynchronous build-detachment
4482         * buildbot/process/base.py (Build.stopBuild): minor shuffles
4484         * buildbot/status/html.py (WaterfallStatusResource.buildGrid):
4485         hush a debug message
4487 2004-09-05  Brian Warner  <warner@lothar.com>
4489         * buildbot/changes/maildir.py (Maildir.start): catch an IOError
4490         when the dnotify fcntl() fails and fall back to polling. Linux 2.2
4491         kernels do this: the fcntl module has the F_NOTIFY constant, but
4492         the kernel itself doesn't support the operation. Thanks to Olly
4493         Betts for spotting the problem.
4495         * buildbot/process/step.py (Darcs): new source-checkout command
4496         (Arch): new source-checkout command
4497         (todo_P4): fix constructor syntax, still just a placeholder
4498         * buildbot/test/test_vc.py (VC.testDarcs): test it
4499         (VC.testDarcsHTTP): same, via localhost HTTP
4500         (VC.testArch): same
4501         (VC.testArchHTTP): same
4502         * NEWS: mention new features
4504         * buildbot/slave/commands.py (ShellCommand): add .keepStdout,
4505         which tells the step to stash stdout text locally (in .stdout).
4506         Slave-side Commands can use this to make decisions based upon the
4507         output of the the ShellCommand (not just the exit code).
4508         (Darcs): New source-checkout command
4509         (Arch): New source-checkout command, uses .keepStdout in one place
4510         where it needs to discover the archive's default name.
4512         * docs/steps.xhtml: Document options taken by Darcs and Arch.
4513         * docs/source.xhtml: add brief descriptions of Darcs and Arch
4514         * docs/examples/hello.cfg: add examples of Darcs and Arch checkout
4516         * buildbot/process/step.py (ShellCommand.describe): add an
4517         alternate .descriptionDone attribute which provides descriptive
4518         text when the step is complete. .description can be ["compiling"],
4519         for use while the step is running, then .descriptionDone can be
4520         ["compile"], used alone when the step succeeds or with "failed" when
4521         it does not. Updated other steps to use the new text.
4522         * buildbot/process/step_twisted.py: same
4523         * buildbot/test/test_run.py: update tests to match
4525 2004-08-30  Brian Warner  <warner@lothar.com>
4527         * buildbot/process/step.py (ShellCommand.createSummary): fix docs
4528         (CVS.__init__): send 'patch' argument to slave
4529         (CVS.start): don't create the LoggedRemoteCommand until start(),
4530         so we can catch a .patch added after __init__
4531         (SVN.__init__): add 'patch' to SVN too
4532         (SVN.start): same
4534         * buildbot/slave/commands.py (ShellCommand): add a 'stdin'
4535         argument, to let commands push data into the process' stdin pipe.
4536         Move usePTY to a per-instance attribute, and clear it if 'stdin'
4537         is in use, since closing a PTY doesn't really affect the process
4538         in the right way (in particular, I couldn't run /usr/bin/patch
4539         under a pty).
4540         (SourceBase.doPatch): handle 'patch' argument
4542         * buildbot/test/test_vc.py (VC.doPatch): test 'patch' argument for
4543         both CVS and SVN
4545         * buildbot/slave/commands.py (cvs_ver): fix version-parsing goo
4546         * buildbot/slave/bot.py (Bot.remote_getCommands): send command
4547         versions to master
4548         * buildbot/master.py (BotPerspective.got_commands): get command
4549         versions from slave, give to each builder
4550         * buildbot/process/builder.py (Builder.attached): stash slave
4551         command versions in .remoteCommands
4553         * docs/steps.xhtml: bring docs in-line with reality
4555         * buildbot/process/step.py (CVS.__init__): more brutal
4556         compatibility code removal
4557         (SVN.__init__): same
4559         * buildbot/slave/commands.py (SlaveShellCommand): update docs
4560         (SlaveShellCommand.start): require ['workdir'] argument, remove
4561         the ['dir'] fallback (compatibility will come later)
4562         (SourceBase): update docs
4563         (SourceBase.start): remove ['directory'] fallback
4564         (CVS): update docs
4565         (SVN): update docs
4566         * buildbot/test/test_config.py (ConfigTest.testBuilders): update test
4567         * buildbot/test/test_steps.py (BuildStep.testShellCommand1): same
4568         * buildbot/test/test_slavecommand.py (SlaveCommandTestCase): same
4570         * buildbot/process/step.py (RemoteShellCommand.__init__): add
4571         want_stdout/want_stderr. remove old 'dir' keyword (to simplify the
4572         code.. I will figure out 0.5.0-compatibility hooks later)
4574 2004-08-30  Brian Warner  <warner@lothar.com>
4576         * buildbot/process/process_twisted.py: rewrite in terms of new
4577         BuildFactory base class. It got significantly shorter. Yay
4578         negative code days.
4580         * buildbot/process/step_twisted.py (HLint.start): fix to make it
4581         work with the new "self.build isn't nailed down until we call
4582         step.start()" scheme: specifically, __init__ is called before the
4583         build has decided on which Changes are going in, so we don't scan
4584         build.allFiles() for .xhtml files until start()
4585         (HLint.commandComplete): use getText(), not getStdout()
4586         (RunUnitTests.start): same: don't use .build until start()
4587         (RunUnitTests.describe): oops, don't report (None) when using
4588         the default reactor
4589         (RunUnitTests.commandComplete): use getText()
4590         (RunUnitTests.createSummary): same
4591         (BuildDebs.commandComplete): same
4593         * buildbot/process/step.py (RemoteShellCommand.__init__): don't
4594         set args['command'] until start(), since our BuildStep is allowed
4595         to change their mind up until that point
4596         (TreeSize.commandComplete): use getText(), not getStdout()
4598         * docs/examples/twisted_master.cfg: update to current standards
4600         * docs/factories.xhtml: update
4601         * buildbot/process/factory.py: implement all the common factories
4602         described in the docs. The Trial factory doesn't work yet, and
4603         I've probably broken all the process_twisted.py factories in the
4604         process. There are compatibility classes left in for things like
4605         the old BasicBuildFactory, but subclasses of them are unlikely to
4606         work.
4607         * docs/examples/glib_master.cfg: use new BuildFactories
4608         * docs/examples/hello.cfg: same
4610         * buildbot/test/test_config.py (ConfigTest.testBuilders): remove
4611         explicit 'workdir' args
4613         * buildbot/process/base.py (BuildFactory): move factories to ..
4614         * buildbot/process/factory.py (BuildFactory): .. here
4615         * buildbot/process/process_twisted.py: handle move
4616         * buildbot/test/test_config.py: same
4617         * buildbot/test/test_run.py: same
4618         * buildbot/test/test_steps.py: same
4619         * buildbot/test/test_vc.py: same
4620         * docs/factories.xhtml: same
4622         * NEWS: mention config changes that require updating master.cfg
4624         * buildbot/process/base.py (Build.setupBuild): add a 'workdir'
4625         argument to all steps that weren't given one already, pointing at
4626         the "build/" directory.
4628         * docs/examples/hello.cfg: remove explicit 'workdir' args
4630         * docs/factories.xhtml: document standard BuildFactory clases,
4631         including a bunch which are have not yet been written
4633 2004-08-29  Brian Warner  <warner@lothar.com>
4635         * buildbot/interfaces.py (IBuildStepStatus.getResults): move
4636         result constants (SUCCESS, WARNINGS, FAILURE, SKIPPED) to
4637         buildbot.status.builder so they aren't quite so internal
4638         * buildbot/process/base.py, buildbot/process/builder.py: same
4639         * buildbot/process/maxq.py, buildbot/process/step.py: same
4640         * buildbot/process/step_twisted.py, buildbot/status/builder.py: same
4641         * buildbot/status/mail.py, buildbot/test/test_run.py: same
4642         * buildbot/test/test_status.py, buildbot/test/test_vc.py: same
4644         * buildbot/status/html.py (StatusResourceBuildStep): oops, update
4645         to handle new getLogs()-returns-list behavior
4646         (StatusResourceBuildStep.getChild): same
4647         (StepBox.getBox): same
4648         (WaterfallStatusResource.phase0): same
4650         * docs/source.xhtml: document how Buildbot uses version-control
4651         systems (output side: how we get source trees)
4652         * docs/changes.xhtml: rename from sources.xhtml, documents VC
4653         systems (input side: how we learn about Changes)
4655         * buildbot/master.py (Manhole): use ComparableMixin
4656         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): same
4657         * buildbot/changes/mail.py (MaildirSource): same
4658         * buildbot/status/client.py (PBListener): same
4659         * buildbot/status/html.py (Waterfall): same
4660         * buildbot/status/words.py (IRC): same
4662         * NEWS: start describing new features
4664         * buildbot/status/mail.py (MailNotifier): finish implementation.
4665         The message body is still a bit sparse.
4666         * buildbot/test/test_status.py (Mail): test it
4668         * buildbot/util.py (ComparableMixin): class to provide the __cmp__
4669         and __hash__ methods I wind up adding everywhere. Specifically
4670         intended to support the buildbot config-file update scheme where
4671         we compare, say, the old list of IStatusTargets against the new
4672         one and don't touch something which shows up on both lists.
4673         * buildbot/test/test_util.py (Compare): test case for it
4675         * buildbot/interfaces.py (IBuildStatus): change .getLogs() to
4676         return a list instead of a dict
4677         (IBuildStepStatus.getLogs): same. The idea is that steps create
4678         logs with vaguely unique names (although their uniqueness is not
4679         guaranteed). Thus a compilation step should create its sole
4680         logfile with the name 'compile', and contribute it to the
4681         BuildStatus. If a step has two logfiles, try to create them with
4682         different names (like 'test.log' and 'test.summary'), and only
4683         contribute the important ones to the overall BuildStatus.
4684         * buildbot/status/builder.py (Event.getLogs): same
4685         (BuildStepStatus): fix default .text and .results
4686         (BuildStepStatus.addLog): switch to list-like .getLogs()
4687         (BuildStepStatus.stepFinished): same
4688         (BuildStatus.text): fix default .text
4689         (BuildStatus.getLogs): temporary hack to return all logs (from all
4690         child BuildStepStatus objects). Needs to be fixed to only report
4691         the significant ones (as contributed by the steps themselves)
4692         * buildbot/test/test_run.py: handle list-like .getLogs()
4693         * buildbot/test/test_steps.py (BuildStep.testShellCommand1): same
4695 2004-08-28  Brian Warner  <warner@lothar.com>
4697         * buildbot/process/builder.py (Builder.attached): serialize the
4698         attachment process, so the attach-watcher isn't called until the
4699         slave is really available. Add detached watchers too, which makes
4700         testing easier.
4702         * buildbot/test/test_vc.py: test VC modes (clobber/update/etc)
4704         * buildbot/test/test_swap.py: remove dead code
4706         * buildbot/slave/commands.py (ShellCommandPP): add debug messages
4707         (ShellCommand.start): treat errors in _startCommand/spawnProcess
4708         sort of as if the command being run exited with a -1. There may
4709         still be some holes in this scheme.
4710         (CVSCommand): add 'revision' tag to the VC commands, make sure the
4711         -r option appears before the module list
4712         * buildbot/process/step.py (CVS): add 'revision' argument
4714         * buildbot/slave/bot.py (SlaveBuilder._ackFailed): catch failures
4715         when sending updates or stepComplete messages to the master, since
4716         we don't currently care whether they arrive or not. When we revamp
4717         the master/slave protocol to really resume interrupted builds,
4718         this will need revisiting.
4719         (lostRemote): remove spurious print
4721         * buildbot/master.py (BotPerspective.attached): serialize the
4722         new-builder interrogation process, to make testing easier
4723         (BotMaster.waitUntilBuilderDetached): convenience function
4725         * buildbot/status/builder.py (BuilderStatus): prune old builds
4726         (BuildStatus.pruneSteps): .. and steps
4727         (BuildStepStatus.pruneLogs): .. and logs
4728         (BuilderStatus.getBuild): handle missing builds
4729         * buildbot/status/html.py (StatusResourceBuild.body): display build
4730         status in the per-build page
4731         (BuildBox.getBox): color finished builds in the per-build box
4733 2004-08-27  Brian Warner  <warner@lothar.com>
4735         * buildbot/status/mail.py (MailNotifier): new notification class,
4736         not yet finished
4738         * buildbot/slave/commands.py (SourceBase): refactor SVN and CVS into
4739         variants of a common base class which handles all the mode= logic
4741         * buildbot/interfaces.py (IBuildStatus.getPreviousBuild): add
4742         convenience method
4743         * buildbot/status/builder.py (BuildStatus.getPreviousBuild): same
4745 2004-08-26  Brian Warner  <warner@lothar.com>
4747         * buildbot/test/test_slavecommand.py: accomodate new slavecommand
4748         interfaces
4750         * buildbot/test/test_run.py: update to new Logfile interface, new
4751         buildbot.slave modules
4752         * buildbot/test/test_steps.py: same, remove Swappable, add timeouts
4754         * MANIFEST.in: new sample config file
4755         * docs/examples/hello.cfg: same
4757         * buildbot/process/step_twisted.py: remove dead import
4759         * buildbot/process/step.py (RemoteCommand.run): catch errors
4760         during .start
4761         (RemoteCommand.remote_update): ignore updates that arrive after
4762         we've shut down
4763         (RemoteCommand.remote_complete): ignore duplicate complete msgs
4764         (RemoteCommand._remoteComplete): cleanup failure handling, reduce
4765         the responsibilities of the subclass's methods
4766         (BuildStep.failed): catch errors during failure processing
4767         (BuildStep.addHTMLLog): provide all-HTML logfiles (from Failures)
4768         (CVS): move to a mode= argument (described in docstring), rather
4769         than the ungainly clobber=/export=/copydir= combination.
4770         (SVN): add mode= functionality to SVN too
4771         (todo_Darcs, todo_Arch, todo_P4): placeholders for future work
4773         * buildbot/process/base.py (Build.startNextStep): catch errors
4774         during s.startStep()
4776         * buildbot/clients/base.py: update to new PB client interface.
4777         gtkPanes is still broken
4779         * buildbot/bot.py, buildbot/slavecommand.py: move to..
4780         * buildbot/slave/bot.py, buildbot/slave/commands.py: .. new directory
4781         * setup.py: add buildbot.slave module
4782         * buildbot/bb_tap.py: handle move
4783         * buildbot/slave/registry.py: place to register commands, w/versions
4784         * buildbot/slave/bot.py: major simplifications
4785         (SlaveBuilder.remote_startCommand): use registry for slave commands,
4786         instead of a fixed table. Eventually this will make the slave more
4787         extensible. Use 'start' method on the command, not .startCommand.
4788         Fix unsafeTracebacks handling (I think).
4789         * buildbot/slave/commands.py: major cleanup. ShellCommand is now a
4790         helper class with a .start method that returns a Deferred.
4791         SlaveShellCommand is the form reached by the buildmaster. Commands
4792         which use multiple ShellCommands can just chain them as Deferreds,
4793         with some helper methods in Command (_abandonOnFailure and
4794         _checkAbandoned) to bail on rc!=0.
4795         (CVSCommand): prefer new mode= argument
4796         (SVNFetch): add mode= argument
4798         * buildbot/master.py (DebugPerspective.perspective_forceBuild):
4799         put a useful reason string on the build
4801         * buildbot/status/builder.py (LogFile): do LogFile right: move the
4802         core functionality into an IStatusLog object
4803         (BuildStatus.sendETAUpdate): don't send empty build-eta messages
4804         * buildbot/status/html.py (TextLog): HTML-rendering goes here
4805         (StatusResourceBuild.body): use proper accessor methods
4806         * buildbot/status/client.py (RemoteLog): PB-access goes here
4807         (StatusClientPerspective.perspective_subscribe): add "full" mode,
4808         which delivers log contents too
4809         (PBListener.__cmp__): make PBListeners comparable, thus removeable
4810         * buildbot/status/event.py: remove old Logfile completely
4812         * buildbot/interfaces.py (IStatusLog.subscribe): make the
4813         subscription interface for IStatusLog subscriptions just like all
4814         other the status subscriptions
4815         (IStatusReceiver.logChunk): method called on subscribers
4817 2004-08-24  Brian Warner  <warner@lothar.com>
4819         * buildbot/process/builder.py (Builder._pong): oops, ping response
4820         includes a result (the implicit None returned by remote_print).
4821         Accept it so the _pong method handles the response correctly.
4823 2004-08-06  Brian Warner  <warner@lothar.com>
4825         * buildbot/test/test_config.py: update IRC, PBListener tests
4827         * buildbot/status/client.py (StatusClientPerspective): total
4828         rewrite to match new IStatus interfaces. New subscription scheme.
4829         There are still a few optimizations to make (sending down extra
4830         information with event messages so the client doesn't have to do a
4831         round trip). The logfile-retrieval code is probably still broken.
4832         Moved the PB service into its own port, you can no longer share a
4833         TCP socket between a PBListener and, say, the slaveport (this
4834         should be fixed eventually).
4835         * buildbot/clients/base.py (Client): revamp to match. still needs
4836         a lot of work, but basic event reporting works fine. gtkPanes is
4837         completely broken.
4839         * buildbot/status/words.py (IRC): move to c['status']. Each IRC
4840         instance talks to a single irc server. Threw out all the old
4841         multi-server handling code. Still need to add back in
4842         builder-control (i.e. "force build")
4844         * buildbot/status/html.py (StatusResourceBuildStep.body): add some
4845         more random text to the as-yet-unreachable per-step page
4847         * buildbot/status/builder.py (BuildStepStatus.sendETAUpdate):
4848         rename to stepETAUpdate
4849         (BuildStatus.subscribe): add build-wide ETA updates
4850         (BuilderStatus.getState): remove more cruft
4851         (BuilderStatus.getCurrentBuild): remove more cruft
4852         (BuilderStatus.buildStarted): really handle tuple-subscription
4853         * buildbot/test/test_run.py (Status.testSlave): handle the
4854         stepETAUpdate rename
4856         * buildbot/master.py (BuildMaster): don't add a default
4857         StatusClientService. Don't add a default IrcStatusFactory. Both
4858         are now added through c['status'] in the config file. c['irc'] is
4859         accepted for backwards compatibility, the only quirk is you cannot
4860         use c['irc'] to specify IRC servers on ports other than 6667.
4862         * buildbot/interfaces.py (IBuildStatus.getCurrentStep): add method
4863         (IStatusReceiver.buildStarted): allow update-interval on subscribe
4864         (IStatusReceiver.buildETAUpdate): send build-wide ETA updates
4865         (IStatusReceiver.stepETAUpdate): rename since it's step-specific
4868         * buildbot/master.py (BuildMaster.startService): SIGHUP now causes
4869         the buildmaster to re-read its config file
4872         * buildbot/test/test_web.py (test_webPortnum): need a new hack to
4873         find out the port our server is running on
4874         (WebTest.test_webPathname_port): same
4876         * buildbot/test/test_config.py (testWebPortnum): test it
4877         (testWebPathname): ditto
4879         * docs/config.xhtml: document new c['status'] configuration option
4881         * buildbot/status/html.py (Waterfall): new top-level class which
4882         can be added to c['status']. This creates the Site as well as the
4883         necessary TCPServer/UNIXServer. It goes through the BuildMaster,
4884         reachable as .parent, for everything.
4886         * buildbot/master.py (Manhole): make it a normal service Child
4887         (BuildMaster.loadConfig_status): c['status'] replaces webPortnum and
4888         webPathname. It will eventually replace c['irc'] and the implicit
4889         PB listener as well. c['webPortnum'] and c['webPathname'] are left
4890         in as (deprecated) backward compatibility hooks for now.
4893         * buildbot/process/builder.py (Builder.buildFinished): don't
4894         inform out builder_status about a finished build, as it finds out
4895         through its child BuildStatus object
4897         * buildbot/status/html.py: extensive revamp. Use adapters to make
4898         Boxes out of BuildStepStatus and friends. Acknowledge that Steps
4899         have both starting and finishing times and adjust the waterfall
4900         display accordingly, using spacers if necessary. Use SlaveStatus
4901         to get buildslave info.
4902         (StatusResourceBuildStep): new just-one-step resource, used to get
4903         logfiles. No actual href to it yet.
4905         * buildbot/status/event.py (Logfile.doSwap): disable Swappable for
4906         the time being, until I get the file-naming scheme right
4908         * buildbot/status/builder.py (Event): clean started/finished names
4909         (BuildStatus.isFinished): .finished is not None is the right test
4910         (BuildStatus.buildStarted): track started/finished times ourselves
4911         (BuilderStatus.getSlave): provide access to SlaveStatus object
4912         (BuilderStatus.getLastFinishedBuild): all builds are now in
4913         .builds, even the currently-running one. Accomodate this change.
4914         (BuilderStatus.eventGenerator): new per-builder event generator.
4915         Returns BuildStepStatus and BuildStatus objects, since they can
4916         both be adapted as necessary.
4917         (BuilderStatus.addEvent): clean up started/finished attributes
4918         (BuilderStatus.startBuild,finishBuild): remove dead code
4919         (SlaveStatus): new object to provide ISlaveStatus
4921         * buildbot/process/step.py (ShellCommand.getColor): actually
4922         return the color instead of setting it ourselves
4923         (CVS.__init__): pull .timeout and .workdir options out of
4924         **kwargs, since BuildStep will ignore them. Without this neither
4925         will be sent to the slave correctly.
4926         (SVN.__init__): same
4928         * buildbot/process/builder.py (Builder): move flags to class-level
4929         attributes
4930         (Builder.attached): remove .remoteInfo, let the BotPerspective and
4931         SlaveStatus handle that
4933         * buildbot/process/base.py (Build.firstEvent): remove dead code
4934         (Build.stopBuild): bugfix
4936         * buildbot/changes/pb.py (PBChangeSource.describe): add method
4938         * buildbot/changes/changes.py (Change): add IStatusEvent methods
4939         (ChangeMaster.eventGenerator): yield Changes, since there are now
4940         Adapters to turn them into HTML boxes
4942         * buildbot/master.py (BotMaster): track SlaveStatus from BotMaster
4943         (BotPerspective.attached): feed a SlaveStatus object
4944         (BuildMaster.loadConfig): add a manhole port (debug over telnet)
4945         (BuildMaster.loadConfig_Builders): give BuilderStatus a parent
4947         * buildbot/interfaces.py: API additions
4948         (ISlaveStatus): place to get slave status
4950 2004-08-04  Brian Warner  <warner@lothar.com>
4952         * buildbot/slavecommand.py (DummyCommand.finished): send rc=0 when
4953         the delay finishes, so the step is marked as SUCCESS
4955         * buildbot/test/test_run.py (Status.testSlave): cover more of
4956         IBuildStatus and IBuildStepStatus
4958         * buildbot/status/progress.py (StepProgress): move some flags to
4959         class-level attributes
4960         (StepProgress.remaining): if there are no other progress metrics
4961         to go by, fall back to elapsed time
4962         (StepProgress.setExpectations): take a dict of metrics instead of
4963         a list
4964         (BuildProgress.setExpectationsFrom): pull expectations from the
4965         Expectations, instead of having it push them to the BuildProgress
4966         (Expectations): move some flags to class-level attributes
4967         (Expectations.__init__): copy per-step times from the
4968         BuildProgress too
4969         (Expectations.expectedBuildTime): new method for per-build ETA
4971         * buildbot/status/event.py (Logfile): move some flags to
4972         class-level attributes
4973         (Logfile.logProgressTo): better method name, let step set the
4974         progress axis name (instead of always being "output")
4976         * buildbot/status/builder.py (BuildStepStatus.getTimes): track the
4977         times directly, rather than depending upon the (possibly missing)
4978         .progress object. Use 'None' to indicate "not started/finished
4979         yet"
4980         (BuildStepStatus.getExpectations): oops, return the full list of
4981         expectations
4982         (BuilderStatus._buildFinished): append finished builds to .builds
4984         * buildbot/process/step.py (BuildStep): add separate .useProgress
4985         flag, since empty .progressMetrics[] still implies that time is a
4986         useful predictor
4987         (CVS): set up the cmd in __init__, instead of waiting for start()
4989         * buildbot/process/base.py (Build.startBuild): disable the 'when'
4990         calculation, this will eventually turn into a proper sourceStamp
4991         (Build.setupBuild): tell the Progress to load from the Expectations,
4992         instead of having the Expectations stuff things into the Progress
4993         (Build.buildException): add a build-level errback to make sure the
4994         build's Deferred fires even in case of exceptions
4996         * buildbot/master.py (BotMaster.forceBuild): convey the reason into
4997         the forced build
4998         * buildbot/process/builder.py (Builder.forceBuild): convey the
4999         reason instead of creating a fake Change
5001         * docs/examples/twisted_master.cfg: update to match reality
5003         * buildbot/test/test_config.py, buildbot/test/test_process.py:
5004         * buildbot/test/test_run.py, buildbot/test/test_steps.py:
5005         fix or remove broken/breaking tests
5007         * buildbot/status/event.py (Logfile.__len__): remove evil method
5009         * buildbot/status/builder.py (BuildStepStatus.stepStarted): tolerate
5010         missing .build, for test convenience
5012         * buildbot/process/step_twisted.py: import fixes
5014         * buildbot/process/step.py (BuildStep.failed): exception is FAILURE
5016         * buildbot/master.py (BuildMaster.loadConfig_Builders): leftover
5017         .statusbag reference
5019         * buildbot/bot.py (BuildSlave.stopService): tear down the TCP
5020         connection at shutdown, and stop it from reconnecting
5022         * buildbot/test/test_run.py (Run.testSlave): use a RemoteDummy to
5023         chase down remote-execution bugs
5025         * buildbot/process/step.py: more fixes, remove
5026         BuildStep.setStatus()
5027         * buildbot/status/builder.py: move setStatus() functionality into
5028         BuildStatus.addStep
5029         * buildbot/status/event.py: minor fixes
5031 2004-08-03  Brian Warner  <warner@lothar.com>
5033         * buildbot/process/base.py, buildbot/process/builder.py
5034         * buildbot/process/step.py, buildbot/status/builder.py
5035         * buildbot/status/event.py, buildbot/test/test_run.py:
5036         fix status delivery, get a basic test case working
5037         * buildbot/master.py: finish implementing basic status delivery,
5038         temporarily disable HTML/IRC/PB status sources
5040         * buildbot/bot.py (Bot.remote_setBuilderList): remove debug noise
5042         * buildbot/status/progress.py (BuildProgress): remove dead code
5044         * buildbot/interfaces.py
5045         * buildbot/process/base.py, buildbot/process/builder.py
5046         * buildbot/process/step.py, buildbot/process/step_twisted.py
5047         * buildbot/status/builder.py: Complete overhaul of the all
5048         status-delivery code, unifying all types of status clients (HTML,
5049         IRC, PB). See interfaces.IBuildStatus for an idea of what it will
5050         look like. This commit is a checkpointing of the work-in-progress:
5051         the input side is mostly done (Builders/Builds sending status
5052         to the BuilderStatus/BuildStatus objects), but the output side has
5053         not yet been started (HTML resources querying BuilderStatus
5054         objects). Things are probably very broken right now and may remain
5055         so for several weeks, I apologize for the disruption.
5057         * buildbot/status/event.py: add a setHTML method to use pre-rendered
5058         HTML as the log's contents. Currently used for exception tracebacks.
5059         * buildbot/status/progress.py: minor spelling changes
5061 2004-08-02  Brian Warner  <warner@lothar.com>
5063         * docs/config.xhtml: XHTML fixes, makes raw .xhtml files viewable
5064         in mozilla. Also added stylesheets copied from Twisted's docs.
5065         Remember that these files are meant to be run through Lore first.
5066         Thanks to Philipp Frauenfelder for the fixes.
5067         * docs/factories.xhtml, docs/sources.xhtml, docs/steps.xhtml: same
5068         * docs/stylesheet-unprocessed.css, docs/stylesheet.css: same
5069         * docs/template.tpl: added a Lore template
5071 2004-07-29  Brian Warner  <warner@lothar.com>
5073         * buildbot/interfaces.py: revamp status delivery. This is the
5074         preview: these are the Interfaces that will be provided by new
5075         Builder code, and to which the current HTML/IRC/PB status
5076         displayers will be adapted.
5078         * buildbot/slavecommand.py (ShellCommand.start): look for .usePTY
5079         on the SlaveBuilder, not the Bot.
5080         * buildbot/bot.py (Bot.remote_setBuilderList): copy Bot.usePTY to
5081         SlaveBuilder.usePTY
5082         * buildbot/test/test_slavecommand.py (FakeSlaveBuilder.usePTY):
5083         set .usePTY on the FakeSlaveBuilder
5085 2004-07-25  Brian Warner  <warner@lothar.com>
5087         * buildbot/changes/freshcvs.py: add some debug log messages
5088         (FreshCVSConnectionFactory.gotPerspective): pre-emptively fix the
5089         disabled 'setFilter' syntax
5090         (FreshCVSSourceNewcred.__init__): warn about prefix= values that
5091         don't end with a slash
5093         * buildbot/process/base.py (Builder._pong_failed): add TODO note
5095         * setup.py: bump to 0.5.0+ while between releases
5097 2004-07-23  Brian Warner  <warner@lothar.com>
5099         * setup.py (version): Releasing buildbot-0.5.0
5101 2004-07-23  Brian Warner  <warner@lothar.com>
5103         * README: update for 0.5.0 release
5105         * NEWS: update for 0.5.0 release
5107 2004-07-22  Brian Warner  <warner@lothar.com>
5109         * buildbot/slavecommand.py (ShellCommand): make usePTY a
5110         mktap-time configuration flag (--usepty=1, --usepty=0)
5111         * buildbot/bot.py: same
5113         * buildbot/master.py (BotPerspective.got_dirs): don't complain about
5114         an 'info' directory being unwanted
5116         * buildbot/changes/freshcvs.py (FreshCVSSource): flip the
5117         newcred/oldcred switch. Newcred (for CVSToys-1.0.10 and later) is now
5118         the default. To communicate with an oldcred daemond (CVSToys-1.0.9
5119         and earlier), use a FreshCVSSourceOldcred instead.
5120         (test): simple test routine: connect to server, print changes
5122         * buildbot/changes/changes.py (Change.getTime): make it possible
5123         to print un-timestamped changes
5125         * buildbot/master.py (makeApp): delete ancient dead code
5126         (BuildMaster.loadTheConfigFile): make "master.cfg" name configurable
5127         * buildbot/test/test_config.py (testFindConfigFile): test it
5129         * docs/examples/twisted_master.cfg (b22w32): use iocp reactor
5130         instead of win32 one
5133         * buildbot/master.py (BuildMaster.loadConfig_Builders): config file
5134         now takes a dictionary instead of a tuple. See docs/config.xhtml for
5135         details.
5137         * buildbot/process/base.py (Builder.__init__): change constructor
5138         to accept a dictionary of config data, rather than discrete
5139         name/slave/builddir/factory arguments
5141         * docs/examples/twisted_master.cfg: update to new syntax
5142         * docs/examples/glib_master.cfg: same
5143         * buildbot/test/test_config.py (ConfigTest.testBuilders): some
5144         rough tests of the new syntax
5146         
5147         * buildbot/master.py (BuildMaster.loadConfig): allow webPathname
5148         to be an int, which means "run a web.distrib sub-server on a TCP
5149         port". This lets you publish the buildbot status page to a remote
5150         twisted.web server (using distrib.ResourceSubscription). Also
5151         rename the local attributes used to hold these web things so
5152         they're more in touch with reality.
5153         * buildbot/test/test_web.py: test webPortnum and webPathname
5154         * docs/config.xhtml: document this new use of webPathname
5156         * docs/config.xhtml: new document, slightly ahead of reality
5157         
5158         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred.notify): fix
5159         'prefix' handling: treat it as a simple string to check with
5160         .startswith, instead of treating it as a directory. This allows
5161         sub-directories to be used. If you use prefix=, you should give it
5162         a string that starts just below the CVSROOT and ends with a slash.
5163         This prefix will be stripped from all filenames, and filenames
5164         which do not start with it will be ignored.
5166 2004-07-20  Cory Dodt  <corydodt@twistedmatrix.com>
5168         * contrib/svn_buildbot.py: Add --include (synonym for --filter)
5169         and --exclude (inverse of --include).  SVN post-commit hooks
5170         now have total control over which changes get sent to buildbot and which
5171         do not.
5173 2004-07-10  Brian Warner  <warner@lothar.com>
5175         * buildbot/test/test_twisted.py (Case1.testCountFailedTests): fix
5176         test case to match new API
5178         * buildbot/status/event.py (Logfile.getEntries): fix silly bug
5179         which crashed HTML display when self.entries=[] (needed to
5180         distinguish between [], which means "no entries yet", and None,
5181         which means "the entries have been swapped out to disk, go fetch
5182         them").
5184 2004-07-04  Brian Warner  <warner@lothar.com>
5186         * buildbot/process/step_twisted.py (countFailedTests): Count
5187         skips, expectedFailures, and unexpectedSuccesses. Start scanning
5188         10kb from the end because any import errors are wedged there and
5189         they would make us think the test log was unparseable.
5190         (RunUnitTests.finishStatus): add skip/todo counts to the event box
5192 2004-06-26  Brian Warner  <warner@lothar.com>
5194         * buildbot/process/step_twisted.py (RemovePYCs): turn the
5195         delete-*.pyc command into an actual BuildStep, so we can label it
5196         nicely
5197         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
5198         (FullTwistedBuildFactory): same
5200 2004-06-25  Cory Dodt  <corydodt@twistedmatrix.com>
5202         * contrib/fakechange.py: Add an errback when sending the fake 
5203         change, so we know it didn't work.
5205 2004-06-25  Christopher Armstrong  <radix@twistedmatrix.com>
5207         * buildbot/process/step_twisted.py: Delete *.pyc files before
5208         calling trial, so it doesn't catch any old .pyc files whose .py
5209         files have been moved or deleted.
5211         * buildbot/process/step_twisted.py (RunUnitTests): 1) Add a new
5212         parameter, 'recurse', that passes -R to trial. 2) have 'runAll'
5213         imply 'recurse'. 3) Make the default 'allTests' be ["twisted"]
5214         instead of ["twisted.test"], so that the end result is "trial -R
5215         twisted".
5217         * contrib/svn_buildbot.py: Add a --filter parameter that accepts a
5218         regular expression to match filenames that should be ignored when
5219         changed. Also add a --revision parameter that specifies the
5220         revision to examine, which is useful for debugging.
5222 2004-06-25  Brian Warner  <warner@lothar.com>
5224         * buildbot/process/step_twisted.py (trialTextSummarizer): create a
5225         summary of warnings (like DeprecationWarnings), next to the
5226         "summary" file
5228 2004-05-13  Brian Warner  <warner@lothar.com>
5230         * docs/examples/twisted_master.cfg: enable the win32 builder, as
5231         we now have a w32 build slave courtesy of Mike Taylor.
5233         * buildbot/process/base.py (Build.checkInterlocks): OMG this was
5234         so broken. Fixed a race condition that tripped up interlocked
5235         builds and caused the status to be stuck at "Interlocked" forever.
5236         The twisted buildbot's one interlocked build just so happened to
5237         never hit this case until recently (the feeding builds both pass
5238         before the interlocked build is attempted.. usually it has to wait
5239         a while).
5240         (Builder._pong_failed): fix method signature
5242         * setup.py: bump to 0.4.3+ while between releases
5244 2004-04-30  Brian Warner  <warner@lothar.com>
5246         * setup.py (version): Releasing buildbot-0.4.3
5248 2004-04-30  Brian Warner  <warner@lothar.com>
5250         * MANIFEST.in: add the doc fragments in  docs/*.xhtml
5252         * README: update for 0.4.3 release
5254         * NEWS: update for 0.4.3 release
5256         * buildbot/master.py (BuildMaster.__getstate__): make sure
5257         Versioned.__getstate__ is invoked, for upgrade from 0.4.2
5259         * buildbot/process/step_twisted.py (RunUnitTests.trial): add
5260         .trial as a class attribute, for upgrade from 0.4.2
5262         * buildbot/changes/changes.py (Change.links): add .links for
5263         upgrade from 0.4.2
5265         * buildbot/status/event.py (Logfile.__getstate__): get rid of both
5266         .textWatchers and .htmlWatchers at save time, since they are both
5267         volatile, should allow smooth 0.4.2 upgrade
5269         * buildbot/process/step.py (CVS.finishStatus): catch failed
5270         CVS/SVN commands so we can make the status box red
5272 2004-04-29  Brian Warner  <warner@lothar.com>
5274         * buildbot/changes/freshcvs.py
5275         (FreshCVSConnectionFactory.gotPerspective): add (commented-out)
5276         code to do setFilter(), which tells the freshcvs daemon to not
5277         send us stuff that we're not interested in. I will uncomment it
5278         when a new version of CVSToys is available in which setFilter()
5279         actually works, and I get a chance to test it better.
5281         * docs/examples/twisted_master.cfg: start using a PBChangeSource
5283         * buildbot/master.py (Dispatcher): use a registration scheme
5284         instead of hardwired service names
5285         (BuildMaster): keep track of the Dispatcher to support
5286         registration
5288         * buildbot/changes/changes.py (ChangeMaster): create a distinct
5289         PBChangeSource class instead of having it be an undocumented
5290         internal feature of the ChangeMaster. Split out the code into a
5291         new file.
5292         * buildbot/changes/pb.py (PBChangeSource): same
5293         * buildbot/test/test_changes.py: a few tests for PBChangeSource
5295         * docs/{factories|sources|steps}.xhtml: document some pieces
5297         * docs/examples/twisted_master.cfg: use SVN instead of CVS, stop
5298         using FCMaildirSource
5299         (f23osx): update OS-X builder to use python2.3, since the slave
5300         was updated to Panther (10.3.3)
5302 2004-03-21  Brian Warner  <warner@lothar.com>
5304         * buildbot/process/process_twisted.py: factor out doCheckout, change
5305         to use SVN instead of CVS
5307         * buildbot/process/base.py (BasicBuildFactory): refactor to make
5308         an SVN subclass easier
5309         (BasicSVN): subclass which uses Subversion instead of CVS
5311 2004-03-15  Christopher Armstrong  <radix@twistedmatrix.com>
5313         * buildbot/slavecommand.py (ShellCommand.start): use COMSPEC instead
5314         of /bin/sh on win32
5315         (CVSCommand.cvsComplete): don't assume chdir worked on win32
5317 2004-02-25  Brian Warner  <warner@lothar.com>
5319         * buildbot/slavecommand.py (ShellCommand): ['commands'] argument
5320         is now either a list (which is passed to spawnProcess directly) or
5321         a string (which gets passed to /bin/sh -c). This removes the useSH
5322         flag and the ArgslistCommand class. Also send status header at the
5323         start and end of each command, instead of having the master-side
5324         code do that.
5325         (CVSCommand): fix the doUpdate command, it failed to do the 'cp
5326         -r'. Update to use list-based arguments.
5327         (SVNFetch): use list-based arguments, use ['dir'] argument to
5328         simplify code.
5329         * buildbot/test/test_steps.py (Commands): match changes
5331         * buildbot/process/step.py (InternalShellCommand.words): handle
5332         command lists
5333         (SVN): inherit from CVS, cleanup
5335         * buildbot/status/event.py (Logfile.content): render in HTML, with
5336         stderr in red and headers (like the name of the command we're
5337         about to run) in blue. Add link to a second URL (url + "?text=1")
5338         to get just stdout/stderr in text/plain without markup. There is
5339         still a problem with .entries=None causing a crash, it seems to occur
5340         when the logfile is read before it is finished.
5342         * buildbot/bot.py (BotFactory.doKeepalive): add a 30-second
5343         timeout to the keepalives, and use it to explicitly do a
5344         loseConnection instead of waiting for TCP to notice the loss. This
5345         ought to clear up the silent-lossage problem.
5346         (unsafeTracebacks): pass exception tracebacks back to the master,
5347         makes it much easier to debug problems
5349 2004-02-23  Brian Warner  <warner@lothar.com>
5351         * buildbot/slavecommand.py (ShellCommand): add useSH flag to pass
5352         the whole command to /bin/sh instead of execve [Johan Dahlin]
5353         (CVSCommand): drop '-r BRANCH' if BRANCH==None instead of usiing
5354         '-r HEAD' [Johan Dahlin]
5355         (CVSCommand.start2): fix cvsdir calculation [Johan Dahlin]
5357         * buildbot/changes/changes.py (Change): add links= argument, add
5358         asHTML method [Johan Dahlin]. Modified to make a bit more
5359         XHTMLish. Still not sure how to best use links= .
5361         * buildbot/status/html.py (StatusResourceCommits.getChild): use 
5362         Change.asHTML to display the change, not asText
5364         * buildbot/status/html.py (StatusResourceBuilder): web button to
5365         ping slave
5367         * buildbot/test/test_run.py: test to actually start a buildmaster
5368         and poke at it
5370         * MANIFEST.in: bring back accidentally-dropped test helper files
5372         * buildbot/test/test_config.py (ConfigTest.testSources): skip tests
5373         that require cvstoys if it is not installed
5375         * buildbot/process/step_twisted.py (RunUnitTests): allow other
5376         values of "bin/trial" [Dave Peticolas]
5377         (RunUnitTests.finishStatus): say "no tests run" instead of "0
5378         tests passed" when we didn't happen to run any tests
5380         * buildbot/process/step.py (Compile): use haltOnFailure instead of
5381         flunkOnFailure [Johan Dahlin]
5383         * buildbot/process/base.py (ConfigurableBuild.setSteps): allow
5384         multiple instances of the same Step class by suffixing "_2", etc,
5385         to the name until it is unique. This name needs to be unique
5386         because it is used as a key in the dictionary that tracks build
5387         progress.
5388         * buildbot/test/test_steps.py (Steps.testMultipleStepInstances):
5389         add test for it
5391         * buildbot/process/base.py (Builder.ping): add "ping slave" command
5393 2004-01-14  Brian Warner  <warner@lothar.com>
5395         * buildbot/status/words.py (IrcStatusBot): when we leave or get
5396         kicked from a channel, log it
5398         * buildbot/master.py (Dispatcher): add "poke IRC" command to say
5399         something over whatever IRC channels the buildmaster is currently
5400         connected to. Added to try and track down a problem in which the
5401         master thinks it is still connected but the IRCd doesn't see it. I
5402         used a styles.Versioned this time, so hopefully users won't have
5403         to rebuild their .tap files this time.
5404         * contrib/debug.glade: add a "Poke IRC" button
5405         * contrib/debugclient.py: same
5407         * setup.py: bump to 0.4.2+ while between releases
5409 2004-01-08  Brian Warner  <warner@lothar.com>
5411         * setup.py (version): Releasing buildbot-0.4.2
5413 2004-01-08  Brian Warner  <warner@lothar.com>
5415         * NEWS: update for 0.4.2 release
5417         * README: document how to run the tests, now that they all pass
5419         * buildbot/changes/maildir.py (Maildir.poll): minor comment
5421         * buildbot/process/step.py (CVS): add a global_options= argument,
5422         which lets you set CVS global options for the command like "-r"
5423         for read-only checkout, or "-R" to avoid writing in the
5424         repository.
5425         * buildbot/slavecommand.py (CVSCommand): same
5427         * buildbot/status/event.py (Logfile): add a .doSwap switch to make
5428         testing easier (it is turned off when testing, to avoid the
5429         leftover timer)
5431         * buildbot/process/step.py (InternalBuildStep): shuffle code a bit
5432         to make it easier to test: break generateStepID() out to a
5433         separate function, only update statusbag if it exists.
5434         (ShellCommands): create useful text for dict-based commands too.
5436         * test/*, buildbot/test/*: move unit tests under the buildbot/
5437         directory
5438         * setup.py (packages): install buildbot.test too
5440         * buildbot/test/test_slavecommand.py: fix it, tests pass now
5441         * buildbot/test/test_steps.py: fix it, tests pass now
5443 2004-01-06  Brian Warner  <warner@lothar.com>
5445         * buildbot/changes/mail.py (parseFreshCVSMail): looks like new
5446         freshcvs mail uses a slightly different syntax for new
5447         directories. Update parser to handle either.
5448         * test/test_mailparse.py (Test1.testMsg9): test for same
5450 2003-12-21  Brian Warner  <warner@lothar.com>
5452         * buildbot/process/process_twisted.py (TwistedDebsBuildFactory): set
5453         'warnOnWarnings' so that lintian errors mark the build orange
5455 2003-12-17  Brian Warner  <warner@lothar.com>
5457         * buildbot/changes/mail.py (parseBonsaiMail): parser for commit
5458         messages emitted by Bonsai, contributed by Stephen Davis.
5460         * test/*: moved all tests to use trial instead of unittest. Some
5461         still fail (test_steps, test_slavecommand, and test_process).
5463         * setup.py (version): bump to 0.4.1+ while between releases
5465 2003-12-09  Brian Warner  <warner@lothar.com>
5467         * setup.py (version): Releasing buildbot-0.4.1
5469 2003-12-09  Brian Warner  <warner@lothar.com>
5471         * NEWS: update for 0.4.1 release
5473         * docs/examples/twisted_master.cfg: add netbsd builder, shuffle
5474         freebsd builder code a little bit
5476         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred.__cmp__):
5477         don't try to compare attributes of different classes
5478         * buildbot/changes/mail.py (MaildirSource.__cmp__): same
5479         (MaildirSource.messageReceived): fix Change delivery
5481         * buildbot/master.py (BuildMaster.loadConfig): insert 'basedir'
5482         into the config file's namespace before loading it, like the
5483         documentation claims it does
5484         * docs/examples/twisted_master.cfg: remove explicit 'basedir'
5485         (useFreshCVS): switch to using a maildir until Twisted's freshcvs
5486         daemon comes back online
5488 2003-12-08  Brian Warner  <warner@lothar.com>
5490         * docs/examples/twisted_master.cfg: provide an explicit 'basedir'
5491         so the example will work with online=0 as well
5493         * buildbot/changes/mail.py (FCMaildirSource, SyncmailMaildirSource):
5494         fix the __implements__ line
5496         * buildbot/changes/maildirtwisted.py (MaildirTwisted): make this
5497         class a twisted.application.service.Service, use startService to
5498         get it moving.
5500         * buildbot/changes/dnotify.py (DNotify): use os.open to get the
5501         directory fd instead of simple open(). I'm sure this used to work,
5502         but the current version of python refuses to open directories with
5503         open().
5505 2003-12-05  Brian Warner  <warner@lothar.com>
5507         * setup.py (version): bump to 0.4.0+ while between releases
5509 2003-12-05  Brian Warner  <warner@lothar.com>
5511         * setup.py (version): Releasing buildbot-0.4.0
5513 2003-12-05  Brian Warner  <warner@lothar.com>
5515         * docs/examples/glib_master.cfg: replace old sample scripts with
5516         new-style config files
5517         * MANIFEST.in: include .cfg files in distribution tarball
5519         * buildbot/changes/freshcvs.py (FreshCVSListener.remote_goodbye):
5520         implement a dummy method to avoid the exception that occurs when
5521         freshcvs sends this to us.
5523         * buildbot/pbutil.py (ReconnectingPBClientFactory.stopFactory):
5524         removed the method, as it broke reconnection. Apparently
5525         stopFactory is called each time the connection attempt fails. Must
5526         rethink this.
5527         (ReconnectingPBClientFactory.__getstate__): squash the _callID
5528         attribute before serialization, since without stopFactory the
5529         reconnect timer may still be active and they aren't serializable.
5531         * test/test_mailparse.py (ParseTest): test with 'self' argument
5533         * buildbot/changes/mail.py (parseFreshCVSMail): add (silly) 'self'
5534         argument, as these "functions" are invoked like methods from class
5535         attributes and therefore always get an instance as the first
5536         argument.
5538         * buildbot/changes/maildir.py (Maildir.start): fix error in error
5539         message: thanks to Stephen Davis for the catch
5541 2003-12-04  Brian Warner  <warner@lothar.com>
5543         * buildbot/pbutil.py: complete rewrite using PBClientFactory and
5544         twisted's standard ReconnectingClientFactory. Handles both oldcred
5545         and newcred connections. Also has a bug-workaround for
5546         ReconnectingClientFactory serializing its connector when it
5547         shouldn't.
5549         * buildbot/bot.py (BotFactory): rewrite connection layer with new
5550         pbutil. Replace makeApp stuff with proper newcred/mktap
5551         makeService(). Don't serialize Ephemerals on shutdown.
5553         * buildbot/changes/changes.py (ChangeMaster): make it a
5554         MultiService and add the sources as children, to get startService
5555         and stopService for free. This also gets rid of the .running flag.
5557         * buildbot/changes/freshcvs.py (FreshCVSSource): rewrite to use
5558         new pbutil, turn into a TCPClient at the same time (to get
5559         startService for free). Two variants exist: FreshCVSSourceOldcred
5560         and FreshCVSSourceNewcred (CVSToys doesn't actualy support newcred
5561         yet, but when it does, we'll be ready).
5562         (FreshCVSSource.notify): handle paths which are empty after the
5563         prefix is stripped. This only happens when the top-level (prefix)
5564         directory is added, at the very beginning of a Repository's life.
5566         * buildbot/clients/base.py: use new pbutil, clean up startup code.
5567         Now the only reconnecting code is in the factory where it belongs.
5568         (Builder.unsubscribe): unregister the disconnect callback when we
5569         delete the builder on command from the master (i.e. when the
5570         buildmaster is reconfigured and that builder goes away). This
5571         fixes a multiple-delete exception when the status client is shut
5572         down afterwards.
5573         * buildbot/clients/gtkPanes.py (GtkClient): cleanup, match the
5574         base Client. 
5576         * buildbot/status/words.py (IrcStatusBot): add some more sillyness
5577         (IrcStatusBot.getBuilderStatus): fix minor exception in error message
5579 2003-10-20  Christopher Armstrong  <radix@twistedmatrix.com>
5581         * contrib/run_maxq.py: Accept a testdir as an argument rather than
5582         a list of globs (ugh). The testdir will be searched for files
5583         named *.tests and run the tests in the order specified in each of
5584         those files. This allows for "dependancies" between tests to be
5585         codified.
5587         * buildbot/process/maxq.py (MaxQ.__init__): Accept a testdir
5588         argument to pass to run_maxq.py, instead of a glob.
5590 2003-10-17  Brian Warner  <warner@lothar.com>
5592         * buildbot/process/step_twisted.py (HLint.start): ignore .xhtml
5593         files that live in the sandbox
5595 2003-10-15  Brian Warner  <warner@lothar.com>
5597         * buildbot/process/step_twisted.py (ProcessDocs.finished): fix
5598         spelling error in "docs" count-warnings output
5599         (HLint.start): stupid thinko meant .xhtml files were ignored
5601         * docs/examples/twisted_master.cfg (reactors): disable cReactor
5602         tests now that cReactor is banished to the sandbox
5604 2003-10-10  Brian Warner  <warner@lothar.com>
5606         * buildbot/process/step_twisted.py (ProcessDocs, HLint): new Twisted
5607         scheme: now .xhtml are sources and .html are generated
5609 2003-10-08  Brian Warner  <warner@lothar.com>
5611         * buildbot/process/step_twisted.py (RunUnitTests.__init__): oops,
5612         we were ignoring the 'randomly' parameter.
5614 2003-10-01  Brian Warner  <warner@lothar.com>
5616         * buildbot/slavecommand.py (ShellCommand.start): set usePTY=1 on
5617         posix, to kill sub-children of aborted slavecommands.
5619         * buildbot/status/builder.py: rename Builder to BuilderStatus.
5620         Clean up initialization: lastBuildStatus remains None until the
5621         first build has been completed.
5623         * buildbot/status/html.py (WaterfallStatusResource.body): handle
5624         None as a lastBuildStatus
5625         * buildbot/clients/gtkPanes.py: same
5627         * buildbot/status/client.py (StatusClientService): keep
5628         BuilderStatus objects in self.statusbags . These objects now live
5629         here in the StatusClientService and are referenced by the Builder
5630         object, rather than the other way around.
5631         * buildbot/status/words.py (IrcStatusBot.getBuilderStatus): same
5632         * buildbot/process/base.py (Builder): same
5633         * test/test_config.py (ConfigTest.testBuilders): same
5635         * buildbot/master.py (BuildMaster.loadConfig_Builders): when modifying
5636         an existing builder, leave the statusbag alone. This will preserve the
5637         event history.
5639         * buildbot/pbutil.py (ReconnectingPB.connect): add initial newcred
5640         hook. This will probably go away in favor of a class in upcoming
5641         Twisted versions.
5643         * buildbot/changes/freshcvs.py (FreshCVSSource.start): Remove old
5644         serviceName from newcred FreshCVSNotifiee setup
5646 2003-09-29  Brian Warner  <warner@lothar.com>
5648         * buildbot/process/process_twisted.py: switch to new reactor
5649         abbreviations
5650         * docs/examples/twisted_master.cfg: same
5652         * README (REQUIREMENTS): mention twisted-1.0.8a3 requirement
5654         * buildbot/status/words.py (IrcStatusBot.getBuilder): use the
5655         botmaster reference instead of the oldapp service lookup
5657         * buildbot/master.py (BuildMaster.__init__): give the
5658         StatusClientService a reference to the botmaster to make it easier to
5659         force builds
5661 2003-09-24  Christopher Armstrong  <radix@twistedmatrix.com>
5663         * buildbot/status/html.py (Box.td): escape hreffy things so you
5664         can have spaces in things like builder names
5665         (StatusResourceBuilder.body)
5666         (WaterfallStatusResource.body)
5667         (WaterfallStatusResource.body0): same
5669 2003-09-25  Brian Warner  <warner@lothar.com>
5671         * buildbot/master.py (BuildMaster.loadConfig_Builders): don't
5672         rearrange the builder list when adding or removing builders: keep
5673         them in the order the user requested.
5674         * test/test_config.py (ConfigTest.testBuilders): verify it
5676         * contrib/debug.glade: give the debug window a name
5678         * buildbot/process/base.py (Builder.buildTimerFired): builders can
5679         now wait on multiple interlocks. Fix code relating to that.
5680         (Builder.checkInterlocks): same
5681         * buildbot/status/builder.py (Builder.currentlyInterlocked): same
5683         * buildbot/master.py (BuildMaster.loadConfig): move from
5684         deprecated pb.BrokerFactory to new pb.PBServerFactory
5685         * test/test_config.py (ConfigTest.testWebPathname): same
5687         * docs/examples/twisted_master.cfg: fix interlock declaration
5689         * buildbot/master.py (BotMaster.addInterlock): move code to attach
5690         Interlocks to their Builders into interlock.py .
5691         (BuildMaster.loadConfig_Interlocks): fix interlock handling
5693         * test/test_config.py (ConfigTest.testInterlocks): validate
5694         interlock handling
5696         * buildbot/process/base.py (Builder.__init__): better comments
5697         * buildbot/process/interlock.py (Interlock.__repr__): same
5698         (Interlock.deactivate): add .active flag, move the code that
5699         attaches/detaches builders into the Interlock
5701 2003-09-24  Christopher Armstrong  <radix@twistedmatrix.com>
5703         * buildbot/process/maxq.py (MaxQ): support for running a set of MaxQ
5704         tests using the new run_maxq.py script, and reporting failures by
5705         parsing its output.
5707         * contrib/run_maxq.py: Hacky little script for running a set of maxq
5708         tests, reporting their success or failure in a buildbot-friendly 
5709         manner.
5711 2003-09-24  Brian Warner  <warner@lothar.com>
5713         * docs/examples/twisted_master.cfg: example of a new-style config
5714         file. This lives in the buildmaster base directory as
5715         "master.cfg".
5717         * contrib/debugclient.py (DebugWidget.do_rebuild): add 'reload'
5718         button to make the master re-read its config file
5720         * buildbot/master.py (BuildMaster.loadConfig): new code to load
5721         buildmaster configuration from a file. This file can be re-read
5722         later, and the buildmaster will update itself to match the new
5723         desired configuration. Also use new Twisted Application class.
5724         * test/Makefile, test/test_config.py: unit tests for same
5726         * buildbot/changes/freshcvs.py (FreshCVSSource.__cmp__): make
5727         FreshCVSSources comparable, to support reload.
5728         * buildbot/changes/mail.py (MaildirSource.__cmp__): same
5730         * buildbot/process/base.py (Builder): make them comparable, make
5731         Interlocks easier to attach, to support reload. Handle
5732         re-attachment of remote slaves.
5733         * buildbot/process/interlock.py (Interlock): same
5735         * buildbot/bot.py, bb_tap.py, changes/changes.py: move to
5736         Twisted's new Application class. Requires Twisted >= 1.0.8 .
5737         buildmaster taps are now constructed with mktap.
5738         * buildbot/status/client.py (StatusClientService): same
5740         * buildbot/status/words.py: move to new Services, add support to
5741         connect to multiple networks, add reload support, allow nickname
5742         to be configured on a per-network basis
5744 2003-09-20  Brian Warner  <warner@lothar.com>
5746         * docs/examples/twisted_master.py (twisted_app): use python2.3 for
5747         the freebsd builder, now that the machine has been upgraded and no
5748         longer has python2.2
5750         * setup.py (version): bump to 0.3.5+ while between releases
5752 2003-09-19  Brian Warner  <warner@lothar.com>
5754         * setup.py (version): Releasing buildbot-0.3.5
5756 2003-09-19  Brian Warner  <warner@lothar.com>
5758         * NEWS: add post-0.3.4 notes
5760         * README (REQUIREMENTS): note twisted-1.0.7 requirement
5762         * MANIFEST.in: add contrib/*
5764         * docs/examples/twisted_master.py (twisted_app): all build slaves must
5765         use a remote root now: cvs.twistedmatrix.com
5767         * buildbot/changes/freshcvs.py (FreshCVSNotifiee.connect): update
5768         to newcred
5769         (FreshCVSNotifieeOldcred): but retain a class that uses oldcred for
5770         compatibility with old servers
5771         (FreshCVSSource.start): and provide a way to use it
5772         (FreshCVSNotifiee.disconnect): handle unconnected notifiee
5774         * docs/examples/twisted_master.py (twisted_app): update to new
5775         makeApp interface.
5776         (twisted_app): listen on new ~buildbot socket
5777         (twisted_app): Twisted CVS has moved to cvs.twistedmatrix.com
5779         * buildbot/process/process_twisted.py: Use 'copydir' on CVS steps
5780         to reduce cvs bandwidth (update instead of full checkout)
5782 2003-09-11  Brian Warner  <warner@lothar.com>
5784         * contrib/fakechange.py: demo how to connect to the changemaster
5785         port. You can use this technique to submit changes to the
5786         buildmaster from source control systems that offer a hook to run a
5787         script when changes are committed.
5789         * contrib/debugclient.py: tool to connect to the debug port. You
5790         can use it to force builds, submit fake changes, and wiggle the
5791         builder state
5793         * buildbot/master.py: the Big NewCred Reorganization. Use a single
5794         'Dispatcher' realm to handle all the different kinds of
5795         connections and Perspectives: buildslaves, the changemaster port,
5796         the debug port, and the status client port. NewCredPerspectives
5797         now have .attached/.detached methods called with the remote 'mind'
5798         reference, much like old perspectives did. All the pb.Services
5799         turned into ordinary app.ApplicationServices .
5800         (DebugService): went away, DebugPerspectives are now created
5801         directly by the Dispatcher.
5802         (makeApp): changed interface a little bit
5804         * buildbot/changes/changes.py: newcred
5805         * buildbot/status/client.py: newcred
5807         * buildbot/clients/base.py: newcred client side changes
5808         * buildbot/bot.py: ditto
5810         * docs/examples/glib_master.py: handle new makeApp() interface
5811         * docs/examples/twisted_master.py: ditto
5813         * buildbot/pbutil.py (NewCredPerspective): add a helper class to
5814         base newcred Perspectives on. This should go away once Twisted
5815         itself provides something sensible.
5818 2003-09-11  Christopher Armstrong  <radix@twistedmatrix.com>
5820         * contrib/svn_buildbot.py: A program that you can call from your
5821         SVNREPO/hooks/post-commit file that will notify a BuildBot master
5822         when a change in an SVN repository has happened. See the top of
5823         the file for some minimal usage info.
5825 2003-09-10  Christopher Armstrong  <radix@twistedmatrix.com>
5827         * buildbot/slavecommand.py (ArglistCommand): Add new
5828         ArglistCommand that takes an argument list rather than a string as
5829         a parameter. Using a st.split() for argv is very bad.
5831         * buildbot/slavecommand.py (SVNFetch): Now has the ability to
5832         update to a particular revision rather than always checking out
5833         (still not very smart about it, there may be cases where the
5834         checkout becomes inconsistent).
5836 2003-09-10  Christopher Armstrong  <radix@twistedmatrix.com>
5838         * buildbot/{bot.py,slavecommand.py,process/step.py}: Rudimentary
5839         SVN fetch support. It can checkout (not update!) a specified
5840         revision from a specified repository to a specified directory.
5842         * buildbot/status/progress.py (Expectations.update): Fix an
5843         obvious bug (apparently created by the change described in the
5844         previous ChangeLog message) by moving a check to *after* the
5845         variable it checks is defined.
5848 2003-09-08  Brian Warner  <warner@lothar.com>
5850         * buildbot/status/progress.py (Expectations.update): hack to catch
5851         an exception TTimo sees: sometimes the update() method seems to
5852         get called before the step has actually finished, so the .stopTime
5853         is not set, so no totalTime() is available and we average None
5854         with the previous value. Catch this and just don't update the
5855         metrics, and emit a log message.
5857 2003-08-24  Brian Warner  <warner@lothar.com>
5859         * buildbot/process/base.py (BasicBuildFactory): accept 'cvsCopy'
5860         parameter to set copydir='original' in CVS commands.
5862         * buildbot/process/step.py (CVS): accept 'copydir' parameter.
5864         * buildbot/slavecommand.py (CVSCommand): add 'copydir' parameter,
5865         which tells the command to maintain a separate original-source CVS
5866         workspace. For each build, this workspace will be updated, then
5867         the tree copied into a new workdir. This reduces CVS bandwidth
5868         (from a full checkout to a mere update) while doubling the local
5869         disk usage (to keep two copies of the tree).
5871 2003-08-21  Brian Warner  <warner@lothar.com>
5873         * buildbot/status/event.py (Logfile.addEntry): if the master web
5874         server dies while we're serving a page, request.write raises
5875         pb.DeadReferenceError . Catch this and treat it like a
5876         notifyFinish event by dropping the request.
5878 2003-08-18  Brian Warner  <warner@lothar.com>
5880         * buildbot/status/words.py (IrcStatusBot.command_FORCE): complain
5881         (instead of blowing up) if a force-build command is given without
5882         a reason field
5884         * buildbot/changes/changes.py (ChangeMaster.getChangeNumbered):
5885         don't blow up if there aren't yet any Changes in the list
5887 2003-08-02  Brian Warner  <warner@lothar.com>
5889         * buildbot/bot.py (updateApplication): don't set the .tap name,
5890         since we shouldn't assume we own the whole .tap file
5892         * buildbot/bb_tap.py (updateApplication): clean up code, detect
5893         'mktap buildbot' (without a subcommand) better
5895 2003-07-29  Brian Warner  <warner@lothar.com>
5897         * buildbot/status/words.py
5898         (IrcStatusFactory.clientConnectionLost): when we lose the
5899         connection to the IRC server, schedule a reconnection attempt.
5901         * buildbot/slavecommand.py (CVSCommand.doClobber): on non-posix,
5902         use shutil.rmtree instead of forking off an "rm -rf" command.
5903         rmtree may take a while and will block until it finishes, so we
5904         use "rm -rf" if available.
5906         * docs/examples/twisted_master.py: turn off kqreactor, it hangs
5907         freebsd buildslave badly
5909         * setup.py (version): bump to 0.3.4+ while between releases
5911 2003-07-28  Brian Warner  <warner@lothar.com>
5913         * setup.py (version): Releasing buildbot-0.3.4
5915 2003-07-28  Brian Warner  <warner@lothar.com>
5917         * NEWS: update in preparation for release
5919         * buildbot/slavecommand.py (ShellCommand.doTimeout): use
5920         process.signalProcess instead of os.kill, to improve w32
5921         portability
5923         * docs/examples/twisted_master.py (twisted_app): turn off
5924         win32eventreactor: the tests hang the buildslave badly
5926         * buildbot/process/base.py (Build.buildFinished): update ETA even on
5927         failed builds, since usually the failures are consistent
5929         * buildbot/process/process_twisted.py (TwistedReactorsBuildFactory):
5930         add compileOpts/compileOpts2 to reactors build
5932         * docs/examples/twisted_master.py (twisted_app): add "-c mingw32"
5933         (twisted_app): use both default and win32eventreactor on w32 build.
5934         Use both default and kqreactor on freebsd build.
5936         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
5937         add compileOpts2, which is put after the build_ext argument. w32
5938         needs "-c mingw32" here.
5940         * buildbot/status/html.py (StatusResourceBuilder.getChild): don't
5941         touch .acqpath, it goes away in recent Twisted releases
5943         * docs/examples/twisted_master.py (twisted_app): use "python" for
5944         the w32 buildslave, not "python2.2"
5946         * buildbot/bot.py (Bot.remote_getSlaveInfo): only look in info/ if
5947         the directory exists.. should hush an exception under w32
5949         * buildbot/slavecommand.py (ShellCommandPP.processEnded): use
5950         ProcessTerminated -provided values for signal and exitCode rather
5951         than parsing the unix status code directly. This should remove one
5952         more roadblock for a w32-hosted buildslave.
5954         * test/test_mailparse.py: add test cases for Syncmail parser
5956         * Buildbot/changes/freshcvsmail.py: remove leftover code, leave a
5957         temporary compatibility import. Note! Start importing
5958         FCMaildirSource from changes.mail instead of changes.freshcvsmail
5960         * buildbot/changes/mail.py (parseSyncmail): finish Syncmail parser
5962 2003-07-27  Brian Warner  <warner@lothar.com>
5964         * NEWS: started adding new features
5966         * buildbot/changes/mail.py: start work on Syncmail parser, move
5967         mail sources into their own file
5969         * buildbot/changes/freshcvs.py (FreshCVSNotifiee): mark the class
5970         as implementing IChangeSource
5971         * buildbot/changes/freshcvsmail.py (FCMaildirSource): ditto
5973         * buildbot/interfaces.py: define the IChangeSource interface
5975 2003-07-26  Brian Warner  <warner@lothar.com>
5977         * buildbot/master.py (makeApp): docstring (thanks to Kevin Turner)
5979 2003-06-25  Brian Warner  <warner@lothar.com>
5981         * buildbot/status/words.py (IrcStatusBot.emit_last): round off
5982         seconds display
5984 2003-06-17  Brian Warner  <warner@lothar.com>
5986         * buildbot/status/words.py: clean up method usage to avoid error
5987         in silly IRC command
5988         (IrcStatusBot.emit_status): round off seconds display
5990         * buildbot/process/base.py (Build): delete the timer when saving
5991         to the .tap file, and restore it (if it should still be running)
5992         upon restore. This should fix the "next build in -34 seconds"
5993         messages that result when the master is restarted while builds are
5994         sitting in the .waiting slot. If the time for the build has
5995         already passed, start it very soon (in 1 second).
5997         * buildbot/status/words.py: more silly commands
5999         * README (REQUIREMENTS): add URLs to all required software
6001         * buildbot/status/words.py ('last'): mention results of, and time
6002         since last build
6004 2003-05-28  Brian Warner  <warner@lothar.com>
6006         * buildbot/status/words.py: add 'last' command
6007         (IrcStatusBot.emit_status): add current-small text to 'status' output
6009         * docs/examples/twisted_master.py (twisted_app): turn on IRC bot
6010         (twisted_app): remove spaces from OS-X builder name
6012         * buildbot/master.py (makeApp): add knob to turn on IRC bot
6013         * buildbot/status/words.py: IRC bot should actually be useful now
6015 2003-05-23  Brian Warner  <warner@lothar.com>
6017         * buildbot/bot.py (Bot.remote_getSlaveInfo): add routines to get
6018         "slave information" from $(slavedir)/info/* . These files are
6019         maintained by the slave administrator, and describe the
6020         machine/environment that is hosting the slave. Information from
6021         them is put into the "Builder" HTML page. Still need to establish
6022         a set of well-known filenames and meanings for this data: at the
6023         moment, *all* info/* files are sent to the master, but only
6024         'admin' and 'host' are used on that end.
6025         * buildbot/status/html.py (StatusResourceBuilder.body): ditto
6026         * buildbot/process/base.py (Builder.setRemoteInfo):  ditto
6027         * buildbot/master.py (BotPerspective.got_info):  ditto
6029 2003-05-22  Brian Warner  <warner@lothar.com>
6031         * setup.py (version): bump version to 0.3.3+ while between releases
6033 2003-05-21  Brian Warner  <warner@lothar.com>
6035         * setup.py: Releasing buildbot-0.3.3
6037 2003-05-21  Brian Warner  <warner@lothar.com>
6039         * NEWS: 0.3.3 news items
6041         * README: describe --keepalive and life behind a NAT box
6043         * buildbot/bot.py (Bot.connected): implement application-level
6044         keepalives to deal with NAT timeouts, turn them on with
6045         --keepalive option or when SO_KEEPALIVE doesn't work.
6047         * buildbot/master.py (BotPerspective): accept keepalives silently
6049         * buildbot/process/base.py (Build.buildException): CopiedFailures
6050         don't carry as much information as local ones, so don't try to
6051         create a big HTMLized version of them.
6053         * buildbot/process/step.py (InternalShellCommand.stepFailed): close
6054         log file when step fails due to an exception, such as when the slave
6055         becomes unreachable
6057         * buildbot/process/step_twisted.py (RunUnitTests): use trial's new
6058         --testmodule argument instead of grepping for test-case-name tags
6059         ourselves. Remove FindUnitTests code.
6060         * buildbot/slavecommand.py, buildbot/bot.py: remove old code
6062         * MANIFEST.in: Add docs/examples, files under test/ . Oops!
6064 2003-05-16  Brian Warner  <warner@lothar.com>
6066         * buildbot/process/base.py (BasicBuildFactory): add 'configureEnv'
6067         argument to allow things like CFLAGS=-O0 to be passed without relying
6068         upon /bin/sh processing on the slave.
6070         * buildbot/process/step.py (InternalShellCommand.start): send
6071         'env' dict to slave
6072         * buildbot/slavecommand.py (ShellCommand.start): create argv with
6073         'split' instead of letting /bin/sh do it. This should also remove
6074         the need for /bin/sh on the buildslave, making it more likely to
6075         work with win32.
6077         * buildbot/status/html.py: html-escape text in blamelist.
6078         Add "force build" button to the Builder page.
6080         * buildbot/process/step_twisted.py (countFailedTests): look at
6081         last 1000 characters for status line, as import errors can put it
6082         before the -200 point.
6084 2003-05-15  Brian Warner  <warner@lothar.com>
6086         * docs/examples/twisted_master.py: use clobber=0 for remote builds
6088         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
6089         make 'clobber' a parameter, so it is possible to have builds which
6090         do full tests but do a cvs update instead of hammering the CVS
6091         server with a full checkout each build
6093         * buildbot/process/step.py (InternalShellCommand): bump default
6094         timeout to 20 minutes
6096         * buildbot/bot.py (Bot.debug_forceBuild): utility method to ask
6097         the master to trigger a build. Run it via manhole.
6099         * buildbot/master.py (BotPerspective.perspective_forceBuild):
6100         allow slaves to trigger any build that they host, to make life
6101         easier for slave admins who are testing out new build processes
6103         * buildbot/process/process_twisted.py (TwistedReactorsBuildFactory):
6104         don't flunk cReactor or qtreactor on failure, since they fail alot
6105         these days. Do warnOnFailure instead.
6107         * buildbot/process/base.py: change Builder.buildable from a list
6108         into a single slot. When we don't have a slave, new builds (once
6109         they make it past the timeout) are now merged into an existing
6110         buildable one instead of being queued. With this change, a slave
6111         which has been away for a while doesn't get pounded with all the
6112         builds it missed, but instead just does a single build.
6114 2003-05-07  Brian Warner  <warner@lothar.com>
6116         * setup.py (version): bump version to 0.3.2+ while between releases
6118 2003-05-07  Brian Warner  <warner@lothar.com>
6120         * setup.py: Releasing buildbot-0.3.2
6122 2003-05-07  Brian Warner  <warner@lothar.com>
6124         * setup.py: fix major packaging error: include subdirectories!
6125         
6126         * NEWS: add changes since last release
6128         * README (REQUIREMENTS): update twisted/python dependencies
6130         * buildbot/status/builder.py (Builder.startBuild): change
6131         BuildProcess API: now they should call startBuild/finishBuild
6132         instead of pushing firstEvent / setLastBuildStatus. Moving towards
6133         keeping a list of builds in the statusbag, to support other kinds of
6134         status delivery.
6135         (Builder.addClient): send current-activity-small to new clients
6136         * buildbot/process/base.py (Build.startBuild, .buildFinished): use
6137         new API
6139         * buildbot/status/client.py: drop RemoteReferences at shutdown
6141         * buildbot/status/event.py (Event.stoppedObserving): oops, add it
6143         * buildbot/status/progress.py (BuildProgress.remote_subscribe):
6144         more debug messages for remote status client
6146         * buildbot/process/step.py (InternalBuildStep.stepComplete)
6147         (.stepFailed): only fire the Deferred once, even if both
6148         stepComplete and stepFailed are called. I think this can happen if
6149         an exception occurs at a weird time.
6151         * buildbot/status/words.py: work-in-progress: IRC status delivery
6153 2003-05-05  Brian Warner  <warner@lothar.com>
6155         * docs/examples/twisted_master.py (twisted_app): hush internal
6156         python2.3 distutils deprecation warnings
6157         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
6158         add compileOpts= argument which inserts extra args before the
6159         "setup.py build_ext" command. This can be used to give -Wignore
6160         warnings, to hush some internal python-2.3 deprecation messages.
6162         * buildbot/process/step_twisted.py (RunUnitTests): parameterize
6163         the ['twisted.test'] default test case to make it easier to change
6164         in subclasses
6166         * buildbot/clients/base.py: switch to pb.Cacheable-style Events
6167         * buildbot/clients/gtkPanes.py: ditto
6169         * buildbot/process/step_twisted.py (RunUnitTests): use randomly=
6170         arg to collapse RunUnitTestsRandomly into RunUnitTests
6171         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
6172         use RunUnitTests(randomly=1) instead of RunUnitTestsRandomly
6174         * buildbot/status/html.py (StatusResource): shuffle Resources
6175         around to fix a bug: both 'http://foo:8080' and 'http://foo:8080/'
6176         would serve the waterfall display, but the internal links were
6177         only valid on the trailing-slash version. The correct behavior is
6178         for the non-slashed one to serve a Redirect to the slashed one.
6179         This only shows up when the buildbot page is hanging off another
6180         server, like a Twisted-Web distributed server.
6182         * buildbot/status/event.py (Event, RemoteEvent): make Events
6183         pb.Cacheable, with RemoteEvent as the cached version. This removes
6184         a lot of explicit send-an-update code.
6185         * buildbot/status/builder.py (Builder): remove send-update code
6186         * buildbot/status/client.py (ClientBuilder): remove send-update
6187         code, and log errors that occur during callRemote (mostly to catch
6188         InsecureJelly exceptions)
6190         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
6191         run Lore with the same python used in the rest of the build
6193         * buildbot/process/step_twisted2.py (RunUnitTestsJelly): moved
6195         * buildbot/process/step_twisted.py (HLint): accept 'python'
6196         argument. Catch rc!=0 and mark the step as failed. This marks the
6197         build orange ("has warnings").
6198         (RunUnitTestsJelly): move out to step_twisted2.py
6200         * buildbot/util.py (ignoreStaleRefs): add utility function
6202         * buildbot/master.py (DebugPerspective.perspective_setCurrentState):
6203         don't fake ETA object, it's too hard to get right
6205 2003-05-02  Brian Warner  <warner@lothar.com>
6207         * docs/examples/twisted_master.py (twisted_app): add FreeBSD builder
6209 2003-05-01  Brian Warner  <warner@lothar.com>
6211         * buildbot/status/html.py (StatusResource.body): oops, I was
6212         missing a <tr>, causing the waterfall page to be misrendered in
6213         everything except Galeon.
6215 2003-04-29  Brian Warner  <warner@lothar.com>
6217         * docs/examples/twisted_master.py: make debuild use python-2.2
6218         explicitly, now that Twisted stopped supporting 2.1
6220         * buildbot/process/step_twisted.py (BuildDebs.finishStatus): oops,
6221         handle tuple results too. I keep forgetting this, which suggests
6222         it needs to be rethought.
6224         * setup.py (setup): bump version to 0.3.1+ while between releases
6225         
6226 2003-04-29  Brian Warner  <warner@lothar.com>
6228         * setup.py: Releasing buildbot-0.3.1
6230 2003-04-29  Brian Warner  <warner@lothar.com>
6232         * README (SUPPORT): add plea to send questions to the mailing list
6234         * NEWS, MANIFEST.in: add description of recent changes
6236         * docs/examples/twisted_master.py: add the code used to create the
6237         Twisted buildmaster, with passwords and such removed out to a
6238         separate file.
6240         * buildbot/changes/changes.py, freshcvs.py, freshcvsmail.py: split
6241         out cvstoys-using bits from generic changes.py, to allow non-cvstoys
6242         buildmasters to not require CVSToys be installed.
6243         * README, docs/examples/glib_master: update to match the change
6245         * buildbot/clients/base.py, buildbot/bot.py,
6246         buildbot/changes/changes.py, buildbot/pbutil.py: copy
6247         ReconnectingPB from CVSToys distribution to remove CVSToys
6248         dependency for build slaves and status clients. Buildmasters which
6249         use FreshCVSSources still require cvstoys be installed, of course.
6251 2003-04-25  Brian Warner  <warner@lothar.com>
6253         * buildbot/process/process_twisted.py (FullTwistedBuildFactory): add
6254         runTestsRandomly arg to turn on trial -z
6256         * buildbot/process/step_twisted.py (TwistedJellyTestResults):
6257         experimental code to use trial's machine-parseable output to get
6258         more detailed test results. Still has some major issues.
6259         (RunUnitTestsRandomly): subclass to add "-z 0" option, runs tests
6260         in random sequence
6262         * buildbot/status/builder.py (Builder.setCurrentBuild):
6263         anticipating moving build history into statusbag, not used yet
6265         * buildbot/status/tests.py: code to centralize test results,
6266         doesn't work quite yet
6268         * buildbot/status/event.py (Event): use hasattr("setName") instead
6269         of isinstance for now.. need better long-term solution
6271         * buildbot/status/html.py: Remove old imports
6273 2003-04-24  Brian Warner  <warner@lothar.com>
6275         * buildbot/process/process_twisted.py (TwistedBuild.isFileImportant):
6276         ignore changes under doc/fun/ and sandbox/
6278         * buildbot/process/step_twisted.py: update pushEvent and friends.
6280         * buildbot/status/html.py (Box.td): replace event.buildername with
6281         event.parent.getSwappableName(). Needs more thought.
6283         * buildbot/status/builder.py (Builder): Replace pushEvent and
6284         getLastEvent with {set|update|addFileTo|finish}CurrentActivity.
6285         Tell events they are being pruned with event.delete().
6287         * buildbot/process/base.py (Build): Remove Builder status-handling
6288         methods. s/pushEvent/setCurrentActivity/.
6290         * buildbot/process/step.py (BuildStep): clean up status delivery.
6291         Gouse builder.statusbag methods instead of intermediate builder
6292         methods. s/updateLastEvent/updateCurrentActivity/.
6293         s/finalizeLastEvent/finishCurrentActivity/. Use
6294         addFileToCurrentActivity for summaryFunction.
6296         * buildbot/status/event.py (Logfile): put data in a Swappable when
6297         .finish is called.
6298         (Event): add more setter methods. Remove .buildername, use .parent
6299         and getSwappableName instead (needs more thought).
6301         * buildbot/util.py (Swappable):
6302         * test/test_swap.py: don't bother setting filename at __init__
6303         time, do it later. Change setFilename args to take parent first,
6304         since it provides the most significant part of the filename.
6306 2003-04-23  Brian Warner  <warner@lothar.com>
6308         * buildbot/status/event.py (Logfile.addEntry): append to previous
6309         entry, if possible
6311         * buildbot/process/step.py (BuildStep.finalizeLastEvent):
6312         anticipating Swappable
6313         (InternalShellCommand.remoteUpdate): split out various log-adding
6314         methods so subclasses can snarf stdout separately
6316         * buildbot/process/base.py (Builder.finalizeLastEvent): more code
6317         in anticipation of Swappable build logs
6318         (Builder.testsFinished): anticipating TestResults, still disabled
6320         * buildbot/status/builder.py (Builder.pruneEvents): only keep the
6321         last 100 events
6323         * buildbot/status/event.py (Logfile): add (disabled) support for
6324         Swappable, not ready for use yet
6326         * buildbot/util.py (Swappable): object which is swapped out to
6327         disk after some period of no use.
6328         * test/test_swap.py: test buildbot.utils.Swappable
6330 2003-04-14  Brian Warner  <warner@lothar.com>
6332         * buildbot/process/base.py (Builder.doPeriodicBuild): add simple
6333         periodic-build timer. Set the .periodicBuildTime on a builder
6334         instance to some number of seconds to activate it.
6336         * buildbot/master.py (BotMaster.forceBuild): change forceBuild API
6338         * buildbot/process/step.py (ShellCommand.finishStatus): use log.msg in
6339         a way that survives result tuples
6341 2003-04-12  Brian Warner  <warner@lothar.com>
6343         * buildbot/process/step.py (ShellCommand.finishStatusSummary):
6344         return a dict instead of a tuple: allow summarizers to provide
6345         multiple summaries if they want
6346         * buildbot/process/step_twisted.py (trialTextSummarizer): return dict
6347         (debuildSummarizer): summarize lintian warnings/errors
6349 2003-04-10  Brian Warner  <warner@lothar.com>
6351         * README (REQUIREMENTS): slave requires twisted-1.0.4a2
6353 2003-04-09  Brian Warner  <warner@lothar.com>
6355         * buildbot/process/step_twisted.py (trialTextSummarizer): Don't create
6356         empty summaries: happens when the tests fail so hard they don't emit
6357         a parseable summary line.
6359         * buildbot/process/step.py (ShellCommand.finishStatusSummary):
6360         Allow summaryFunction to return None to indicate no summary should
6361         be added.
6363         * buildbot/status/event.py (Logfile.removeHtmlWatcher): avoid
6364         writing to stale HTTP requests: notice when they disconnect and
6365         remove the request from the list. Also add CacheToFile from
6366         moshez, will be used later.
6368 2003-04-08  Brian Warner  <warner@lothar.com>
6370         * buildbot/process/step_twisted.py (ProcessDocs.finished): warnings
6371         should be an int, not a list of strings
6373         * buildbot/changes/changes.py (FreshCVSSource.stop): don't disconnect
6374         if we weren't actually connected
6376         * buildbot/process/step_twisted.py (trialTextSummarizer): function
6377         to show the tail end of the trial text output
6379         * buildbot/process/step.py (ShellCommand.finishStatusSummary): add
6380         hook to summarize the results of a ShellCommand
6382 2003-04-07  Brian Warner  <warner@lothar.com>
6384         * buildbot/process/step_twisted.py (RunUnitTests): consolidate all
6385         twisted test suite code into a single class.
6386         * buildbot/process/process_twisted.py: same
6388 2003-04-04  Brian Warner  <warner@lothar.com>
6390         * setup.py, MANIFEST.in: hack to make sure plugins.tml gets installed
6392         * README (SLAVE): document use of mktap to create slave .tap file
6393         (REQUIREMENTS): describe dependencies
6395         * buildbot/bb_tap.py, buildbot/plugins.tml:
6396         * buildbot/bot.py (updateApplication): Add mktap support for creating
6397         buildslave .tap files
6399 2003-03-28  Brian Warner  <warner@lothar.com>
6401         * buildbot/process/step.py (InternalShellCommand.finished): handle
6402         new tuple result values (fix embarrasing bug that appeared during
6403         PyCon demo)
6405 2003-03-27  Brian Warner  <warner@lothar.com>
6407         * docs/examples/glib_master.py, README: add sample buildmaster.tap
6408         -making program
6410 2003-03-25  Brian Warner  <warner@lothar.com>
6412         * buildbot/process/step.py (CVS, ShellCommand): add reason for failure
6413         to overall build status
6414         * buildbot/clients/base.py (Builder): improve event printing
6415         * buildbot/process/base.py (BasicBuildFactory): use specific steps
6416         instead of generic ShellCommand
6417         (Build): Add .stopBuild, use it when slave is detached
6419         * buildbot/process/step.py (Configure,Test): give the steps their
6420         own names and status strings
6422         * buildbot/status/html.py (StatusResource): add "show" argument,
6423         lets you limit the set of Builders being displayed.
6425 2003-03-20  Brian Warner  <warner@lothar.com>
6427         * buildbot/process/basic.py: removed
6429 2003-03-19  Brian Warner  <warner@lothar.com>
6431         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
6432         turn off process-docs by default
6434         * buildbot/process/base.py (Builder.getBuildNumbered): Don't blow up
6435         when displaying build information without anything in allBuilds[]
6437         * buildbot/bot.py (makeApp): really take password from sys.argv
6439 2003-03-18  Brian Warner  <warner@lothar.com>
6441         * buildbot/bot.py (buildApp): take password from sys.argv
6443         * README: replace with more useful text
6445         * setup.py: add a real one
6446         * MANIFEST.in, .cvsignore: more distutils packaging stuff
6447         
6448         * docs/PyCon-2003/: added sources for PyCon paper.
6450         * buildbot/process/base.py, step.py: revamp. BuildProcess is gone,
6451         now Build objects control the process and Builder only handles
6452         slave stuff and distribution of changes/status. A new BuildFactory
6453         class creates Build objects on demand.
6455         Created ConfigurableBuild which takes a list of steps to run. This
6456         makes it a lot easier to set up a new kind of build and moves us
6457         closer to being able to configure a build from a web page.
6459         * buildbot/process/step_twisted.py, process_twisted.py: move to
6460         new model. A lot of code went away.
6461         
6462         * buildbot/status/progress.py (BuildProgress.newProgress): Don't
6463         send lots of empty progress messages to the client.
6465         * buildbot/master.py (makeApp): enforce builder-name uniqueness
6467 2003-02-20  Brian Warner  <warner@lothar.com>
6469         * buildbot/process/step_twisted.py (BuildDebs): count lintian hits
6471         * buildbot/slavecommand.py (ShellCommand): back to usePTY=0. The
6472         Twisted bug that prevented non-pty processes from working just got
6473         fixed, and the bug that leaks ptys is still being investigated.
6475         * buildbot/process/step.py (CVS): send timeout arg to slave
6477         * buildbot/clients/gtkPanes.py: add connection-status row, handle
6478         builders coming and going
6479         * buildbot/clients/base.py: clean up protocol, move to ReconnectingPB
6480         from CVSToys, handle lost-buildmaster
6482         * buildbot/status/client.py (StatusClientService.removeBuilder):
6483         Clean up status client protocol: send builders (with references)
6484         as they are created, rather than sending a list and requiring the
6485         client to figure out which ones are new.
6486         * buildbot/master.py (BotMaster.forceBuild): Log debugclient
6487         attempts to force a build on an unknown builder
6489 2003-02-19  Brian Warner  <warner@lothar.com>
6491         * buildbot/slavecommand.py (CVSCommand): add timeout to sub-commands
6492         * buildbot/slavecommand.py (ShellCommand.start): stop using PTYs until
6493         Twisted stops leaking them.
6494         * buildbot/clients/gtkPanes.py (CompactBuilder): forget ETA when the
6495         builder goes to an idle state.
6497         * buildbot/slavecommand.py (ShellCommand.start): bring back PTYs until
6498         I figure out why CVS commands hang without them, and/or I fix the
6499         hung-command timeout
6501 2003-02-16  Brian Warner  <warner@lothar.com>
6503         * buildbot/process/step_twisted.py: bin/hlint went away, replace
6504         with 'bin/lore --output lint'. Use 'bin/trial -o' to remove
6505         ansi-color markup. Remove GenerateLore step. Count hlint warnings in
6506         GenerateDocs now that they are prefixed with WARNING:.
6508         * buildbot/status/html.py (StatusResource.body): Fix Builder link,
6509         use manual href target instead of request.childLink
6511         * buildbot/clients/gtkPanes.py: Fix progress countdown: update the
6512         display every second, but update the ETA every 5 seconds (or
6513         whenever) as remote_progress messages arrive.
6516 2003-02-12  Brian Warner  <warner@lothar.com>
6518         * *: import current sources from home CVS repository
6519         
6521 # Local Variables:
6522 # add-log-time-format: add-log-iso8601-time-string
6523 # End: