whoops, forgot to pull before modifying the ChangeLog.. merge conflict
[buildbot.git] / ChangeLog
blob70f78730269fd3de65aa09e353c5bd54673a7606
1 2006-09-25  Brian Warner  <warner@lothar.com>
3         * buildbot/steps/source.py (Monotone): initial Monotone support,
4         contributed by Nathaniel Smith. Still needs docs and tests, but
5         this code has been in use on the Monotone buildbot for a long
6         time now.
7         * buildbot/slave/commands.py (Monotone): slave-side support
8         * buildbot/changes/monotone.py (MonotoneSource): polling change
9         source
11         * buildbot/changes/bonsaipoller.py (BonsaiPoller): Ben also
12         contributed a Change Source that polls a Bonsai server (a
13         kind of web-based viewcvs CGI script).
15         * buildbot/status/tinderbox.py (TinderboxMailNotifier): Ben
16         Hearsum contributed a status plugin which sends email in the same
17         format that Tinderbox does: this allows a number of tinderbox
18         tools to be driven by Buildbot instead. Thanks Ben!
20 2006-09-24  Brian Warner  <warner@lothar.com>
22         * buildbot/changes/mail.py (parseBonsaiMail): fix the parser.
23         Thanks to Robert Helmer for the patch.
25         * buildbot/process/base.py (Build.setupSlaveBuilder): tell our
26         BuildStatus about the buildslave name at the *beginning* of the
27         build, rather than at the end. Thanks to Alexander Lorenz for the
28         patch.
29         * buildbot/status/html.py (StatusResourceBuild.body): always
30         include the slavename in the build page, not just when the build
31         has finished.
32         * buildbot/status/mail.py (MailNotifier.buildMessage): include the
33         slavename in the email message
35 2006-09-21  Brian Warner  <warner@lothar.com>
37         * buildbot/scripts/sample.cfg: update to use new BuildStep classes
38         from buildbot.steps
39         * docs/examples/glib_master.cfg: same
40         * docs/examples/hello.cfg: same
41         * docs/examples/twisted_master.cfg: same, update to current usage
43 2006-09-19  Brian Warner  <warner@lothar.com>
45         * buildbot/steps/python.py (PyFlakes): refactor, add summary logs
46         (PyFlakes.createSummary): make it compatible with python-2.2
48         * buildbot/test/test_steps.py (Python.testPyFlakes): add a test
49         for at least the output-parsing parts of PyFlakes
51 2006-09-18  Brian Warner  <warner@lothar.com>
53         * buildbot/steps/python.py: oops, fix import of StringIO
55 2006-09-17  Brian Warner  <warner@lothar.com>
57         * buildbot/test/test_vc.py (VCBase._do_vctest_update_retry_1): it
58         turns out that SVN-1.4.0 doesn't fail to update once you've
59         replaced a file with a directory, unlike older versions of SVN and
60         pretty much every other VC tool we support. Since what we really
61         care about is that the update succeeds anyway, stop checking that
62         the tree got clobbered and just assert that the build succeeded.
63         (VCBase.printLogs): add a utility function for debugging
65         * buildbot/process/step.py: oops, added extra imports by mistake
67         * buildbot/changes/p4poller.py (P4Source._process_describe): do an
68         rstrip() on the first line coming out of the 'p4 describe'
69         process, to remove the stray ^M that Wade Brainerd reports seeing
70         in the 'when' field. Fixes SF#1555985.
72         * buildbot/master.py (BuildMaster.loadConfig): improve the error
73         message logged when c['schedulers'] is not right
74         * buildbot/scheduler.py (Scheduler.__init__): improve error
75         message when a Scheduler() is created with the wrong arguments
76         * buildbot/test/test_config.py (ConfigTest.testSchedulerErrors):
77         verify that these error messages are emitted
79         * buildbot/process/buildstep.py: rename step.py to buildstep.py .
80         The idea is that all the base classes (like BuildStep and
81         RemoteCommand and LogObserver) live in b.p.buildstep, and b.p.step
82         will be a leftover backwards-compatibility file that only contains
83         aliases for the steps that were moved out to buildbot.steps.*
84         * lots: change imports to match
85         * buildbot/process/step.py: add a DeprecationWarning if it ever
86         gets imported
88 2006-09-12  Brian Warner  <warner@lothar.com>
90         * buildbot/scheduler.py (Scheduler.__init__): make sure that
91         builderNames= is actually a sequence, since if you happen to give
92         it a single builder-specification dictionary instead, it won't get
93         caught by the existing assert. Thanks to Brett Neely for the
94         catch.
96         * buildbot/steps/python.py (BuildEPYDoc, PyFlakes): add new steps. No
97         tests yet, alas.
98         * docs/buildbot.texinfo (Python BuildSteps): document them
99         (sendchange): include a link to PBChangeSource, since you need one
101         * buildbot/steps/shell.py: clean up test-case-name line, remove some
102         unnecessary imports
103         * buildbot/steps/dummy.py: same
105 2006-09-08  Brian Warner  <warner@lothar.com>
107         * buildbot/steps/transfer.py (FileUpload,FileDownload): new
108         BuildStep which lets you transfer files from the master to the
109         slave or vice versa. Thanks to Albert Hofkamp for the original
110         patch. Fixes SF#1504631.
111         * buildbot/slave/commands.py (SlaveFileUploadCommand): slave-side
112         support for it
113         (SlaveFileDownloadCommand): same
114         * docs/buildbot.texinfo (Transferring Files): document it
115         * buildbot/test/test_transfer.py: test it
116         * buildbot/test/runutils.py (StepTester): new utility class for
117         testing BuildSteps and RemoteCommands without Builds or Bots or PB
118         * buildbot/test/test_steps.py (CheckStepTester): validate that the
119         utility class works
121         * buildbot/interfaces.py (IStatusLog.readlines): make it easier to
122         walk through StatusLogs one line at a time, mostly for the benefit
123         of ShellCommand.createSummary methods. You can either walk through
124         STDOUT or STDERR, but the default is STDOUT.
126         * buildbot/status/builder.py (LogFile.readlines): implement it.
127         Note that this is not yet memory-efficient, it just pulls the
128         whole file into RAM and then splits it up with a StringIO.
129         Eventually this should be a generator that only pulls chunks from
130         disk as necessary.
131         * buildbot/test/test_status.py (Log.testReadlines): test it
133         * docs/buildbot.texinfo: update to match changes
134         * buildbot/process/factory.py: stop using old definitions
135         * buildbot/process/process_twisted.py: same
136         * buildbot/test/test_*.py: same
138         * buildbot/process/step_twisted.py: move definition to..
139         * buildbot/steps/python_twisted.py: .. here, unfortunately python's
140         relative-import mechanisms prevent this from being named 'twisted'
141         or 'python/twisted' as I would have preferred.
143         * buildbot/process/maxq.py: move definition to..
144         * buildbot/steps/maxq.py: .. here, leave a compatibility import
146         * buildbot/process/step.py: split the user-visible BuildSteps into
147         separate files, all under buildbot/steps/
148         * buildbot/steps/source.py: this holds VC-checkout steps like SVN
149         * buildbot/steps/shell.py: this holds ShellCommand and friends
150         * buildbot/steps/dummy.py: this holds the testing steps like Dummy
152 2006-09-05  Brian Warner  <warner@lothar.com>
154         * lots: run pyflakes, removed a lot of unused imports, changed the
155         form of some conditional imports to remove false pyflakes
156         warnings. There are still a number of warnings left, mostly from
157         imports that are done for their side-effects.
158         * buildbot/test/test_vc.py: import twisted.python.failure, since it
159         was missing
161 2006-08-26  Brian Warner  <warner@lothar.com>
163         * buildbot/test/test_locks.py (Unit.testLater): make the tests
164         compatible with twisted-1.3.0, for some reason I just can't seem
165         to let go of the past.
167 2006-08-25  Brian Warner  <warner@lothar.com>
169         * buildbot/status/mail.py (MailNotifier.__init__): fix typo in docs
171         * buildbot/process/step.py (LoggingBuildStep.startCommand): set up
172         all logfiles= in startCommand(), rather than in start() . This
173         makes it easier to have the 'stdio' log come before any secondary
174         logfiles, which I feel makes the waterfall display more
175         understandable.
176         (LoggingBuildStep.setupLogfiles): move the addLog/cmd.useLog code
177         from ShellCommand up into LoggingBuildStep
178         (LoggingBuildStep.__init__): move the handling of logfiles= from
179         ShellCommand up to LoggingBuildStep, because startCommand is
180         provided by LoggingBuildStep, whereas start() was specific to
181         subclasses like ShellCommand and Source. This removes code
182         duplication in those subclasses.
183         (ShellCommand.__init__): same
184         (ShellCommand.checkForOldSlaveAndLogfiles): split out the check
185         for a slave that's too old to understand logfiles= into a separate
186         method, so it can live in ShellCommand. The rest of
187         setupLogfiles() can live in LoggingBuildStep.
189 2006-08-24  Brian Warner  <warner@lothar.com>
191         * buildbot/locks.py (BaseLock): you can now configure Locks to
192         allow multiple simultaneous owners. They still default to
193         maxCount=1. Fixes SF#1434997. Thanks to James Knight (foom) for
194         the patch.
195         * docs/buildbot.texinfo (Interlocks): document the new options
196         * buildbot/test/test_locks.py: add a bunch of new unit tests
197         * buildbot/process/base.py (Build.acquireLocks): locks now offer
198         waitUntilMaybeAvailable, not waitUntilAvailable
199         * buildbot/process/step.py (BuildStep.acquireLocks): same
200         * buildbot/master.py (BotMaster.getLockByID): real locks now use
201         the whole lockid in their constructor, not just the name. Also,
202         keep track of which real locks we've handed out by the full
203         lockid, not just class+name, otherwise changing just the maxCount=
204         in the master.cfg file would not actually cause a behavioral
205         change
207 2006-08-23  Brian Warner  <warner@lothar.com>
209         * buildbot/__init__.py (version): bump to 0.7.4+ while between
210         releases
211         * docs/buildbot.texinfo: same
213 2006-08-23  Brian Warner  <warner@lothar.com>
215         * buildbot/__init__.py (version): Releasing buildbot-0.7.4
216         * docs/buildbot.texinfo: set version to match
217         * NEWS: update for 0.7.4
218         * buildbot/slave/commands.py (command_version): mention that this
219         version (2.1) was released with buildbot-0.7.4
221 2006-08-22  Brian Warner  <warner@lothar.com>
223         * README: update
225         * CREDITS: new file, list of people who have helped. Thanks!
226         * MANIFEST.in: ship it
228         * MANIFEST.in: stop shipping the old PyCon-2003 paper.. with the
229         new diagrams, the user's manual is more informative than it was.
230         Start shipping the .html user's manual (and generated .png
231         images).
232         * Makefile: update 'release' target to match
234         * buildbot/test/test_web.py (GetURL.testBrokenStuff): delete this
235         test.. I think the web-parts effort will render it pointless well
236         before it ever actually starts to work.
238 2006-08-20  Brian Warner  <warner@lothar.com>
240         * buildbot/changes/pb.py (PBChangeSource): fix and simplify
241         meaning of the prefix= argument. It is now just a string which is
242         stripped from the beginning of the filename. If prefix= is set but
243         not found on any given filename, that filename is ignored. If all
244         filenames in a Change are ignored, the Change is dropped. This is
245         much simpler than the previous sep= nonsense, and I should have
246         implemented it this way from the beginning. Effectively resolves
247         SF#1217699 and SF#1381867. Thanks to Gary Granger and Marius
248         Gedminas for the catch and suggested fixes.
249         (ChangePerspective.perspective_addChange): implement the actual
250         prefix comparison
251         * buildbot/test/test_changes.py (TestChangePerspective): test it
252         * docs/buildbot.texinfo (PBChangeSource): document it, explain
253         how to properly use prefix=
254         * docs/examples/twisted_master.cfg (source): update prefix= by
255         adding the trailing slash
258         * docs/examples/twisted_master.cfg: update to actual practice
260         * buildbot/test/test_web.py (WaterfallSteps.test_urls): oops,
261         update test case to match new link text.. the HREF has both a
262         class= setting and an enclosing [] pair that I didn't match in the
263         test.
265         * docs/buildbot.texinfo (ShellCommand.command=): explain why a
266         list of strings is preferred over a single string with embedded
267         spaces
268         (ShellCommand.description=): explain that either single strings or
269         a list of strings is acceptable, and why you might prefer one over
270         the other. Add an example. Fixes SF#1524659, thanks to Paul
271         Winkler for the catch.
272         (Build Steps): update to use f.addStep() rather than using s()
273         and the constructor list
275         * buildbot/process/step.py (ShellCommand): accept either a single
276         string or a list of strings in both description= and
277         descriptionDone=
278         * buildbot/test/test_steps.py (Steps.test_description): test it
279         * buildbot/test/runutils.py (makeBuildStep): support for that test
281         * contrib/CSS/*.css: add some contributed CSS stylesheets, to make
282         the Waterfall display a bit less ugly. Thanks to John O'Duinn for
283         collecting the files and creating the patch.
285         * docs/buildbot.texinfo (BuildStep URLs): document new feature:
286         per-step URLs that will be displayed on the waterfall display,
287         for things like the HTML output of code-coverage tools, when
288         the results are hosted elsewhere.
289         * buildbot/interfaces.py (IBuildStepStatus.getURLs): document the
290         way to retrieve these URLs
291         * buildbot/status/builder.py (BuildStepStatus.getURLs): implement
292         the method to retrieve these URLs. Also provide backwards
293         compatibility for saved BuildStepStatus instances that didn't have
294         the .urls attribute
295         * buildbot/process/step.py (BuildStep.addURL): method to set these
296         URLs from within a BuildStep
297         * buildbot/status/html.py (StepBox.getBox): emit links to the URLs
298         (StepBox.getBox): give these external links a distinct CSS class
299         named "BuildStep external" so a .css file can display them
300         differently
302         * buildbot/test/test_web.py (WaterfallSteps): test that we really
303         do emit those links
304         * buildbot/test/test_steps.py (Steps): test that we can all the
305         URLs. Also add a bunch of other tests on methods that can be
306         called from within BuildSteps
307         * buildbot/test/runutils.py (makeBuildStep): add utility function
309 2006-08-13  Brian Warner  <warner@lothar.com>
311         * docs/buildbot.texinfo (BuildStep LogFiles): document them
313 2006-08-10  Brian Warner  <warner@lothar.com>
315         * docs/buildbot.texinfo (Index of master.cfg keys): add another
316         index, this one of things like c['sources'] and c['schedulers']
317         (indices): it looks like my clever idea of putting the @fooindex
318         commands in between the @node and the @subsection (to make the
319         HREF anchor jump to slightly above the section title, which works
320         much better in html) confused texinfo horribly, so I'm moving the
321         index tags back to be just after the @subsection marker. I also
322         added extra lines between the @node/@section paragraph and the
323         index tags, since I think maybe texinfo wants to see these be
324         separate paragraphs.
326         * docs/Makefile (images): make sure images get built when
327         rendering the manual
328         * docs/images/Makefile: same
330         * buildbot/scripts/runner.py: rename 'buildbot master' to
331         'buildbot create-master', and 'buildbot slave' to 'buildbot
332         create-slave'
333         * docs/buildbot.texinfo: same
334         * README: same
336         * docs/buildbot.texinfo: reimplement the "useful classes" index
337         with actual texinfo indices. The .info rendering is a bit
338         weird-looking but it works well, and the HTML rendering is quite
339         nice. This also puts the index targets in the regular flow of the
340         text, which is easier to maintain.
342 2006-08-06  Brian Warner  <warner@lothar.com>
344         * buildbot/slave/commands.py (ShellCommand.__init__): patch from
345         Kevin Turner to prefer the environ= argument be a list rather than
346         a string. If it is a list, it will be joined with a platform-local
347         os.pathsep delimiter, and then prepended to any existing
348         $PYTHONPATH value. This works better in cross-platform (i.e.
349         windows buildslaves) environments when you need to push multiple
350         directories onto the front of the path.
351         (SlaveShellCommand): documented the new magic
352         * docs/buildbot.texinfo (ShellCommand): documented the new magic
353         in a user-visible form
355         * buildbot/test/test_vc.py (BaseHelper.dovc): patch from Kevin
356         Turner to prefer lists over strings when creating/running VC
357         commands during unit tests. This is clearly necessary to survive
358         vcexe containing spaces, like "C:\Program Files\darcs.exe". I
359         renamed the wq() function to qw() though, since that's how it's
360         spelled in perl. Eventually I'd prefer all commands to be
361         specified with lists.
363         * buildbot/slave/commands.py (LogFileWatcher): handle logfiles
364         which are deleted (or not yet created) correctly. Also add
365         failsafe code to not explode if the file-watching poller doesn't
366         get started. Thanks to JP Calderone for the catch and the poller
367         patch.
368         * buildbot/test/test_shell.py (SlaveSide._testLogFiles): add test
369         for that case
370         * buildbot/test/emitlogs.py: same
372         * NEWS: summarize recent changes
374         * docs/buildbot.texinfo (Debug options): suggest an .ssh/options
375         clause to avoid the "host key mismatch" warning
377         * buildbot/process/step_twisted.py (Trial.start): if the
378         buildslave is too old to understand logfiles=, fall back to
379         running 'cat _trial_temp/test.log' like before.
380         (Trial.commandComplete): same. this takes advantage of the
381         LoggingBuildStep refactoring to stall commandComplete long enough
382         to run a second RemoteShellCommand.
384         * buildbot/process/step.py (LoggingBuildStep.startCommand):
385         refactor command-completion handling, to allow methods like
386         commandComplete/createSummary/evaluateCommand to return Deferreds.
387         (LoggingBuildStep._commandComplete): delete the refactored method
388         (ShellCommand.setupLogfiles): if the buildslave is too old to
389         understand logfiles=, put a warning message both into twistd.log
390         and into the otherwise empty user-visible LogFiles.
392         * buildbot/process/step.py (LoggedRemoteCommand.useLog): allow
393         callers to provide the slave-side logfile name, rather than
394         forcing it to come from the local name of the LogFile.
395         (BuildStep.getSlaveName): new method
397         * buildbot/process/base.py (Build.getSlaveName): new method, so
398         steps can find out which buildslave they're running on
400         * buildbot/test/test_steps.py (Version.checkCompare): oops, update
401         to match the s/cvs_ver/command_version/ change
403 2006-08-05  Brian Warner  <warner@lothar.com>
405         * buildbot/slave/commands.py (command_version): replace the CVS
406         auto-updated cvs_ver keyword with a manually-updated variable,
407         since CVS is no longer the master repository. Add a description of
408         the remote API change starting in this version (2.1), specifically
409         the fact that SlaveShellCommand now accepts 'initial_stdin',
410         'keep_stdin_open', and 'logfiles'.
412 2006-07-31  Brian Warner  <warner@lothar.com>
414         * docs/buildbot.texinfo (System Architecture): Finally add lots of
415         diagrams to describe how the whole system fits together. The
416         images themselves are kept in SVG files, with ascii-art versions
417         in corresponding .txt files. Texinfo knows how to interpolate the
418         text version into .info files, reference the .png versions from
419         .html files, and include .eps versions in the .ps format.
420         * docs/images/Makefile: tools to create .png and .eps
421         * docs/images/*.svg: created pictures with Inkscape.
422         * .darcs-boring: ignore the generated .eps and .png files
424 2006-07-24  Brian Warner  <warner@lothar.com>
426         * buildbot/master.py (BuildMaster.loadConfig): check for duplicate
427         Scheduler names, since they cause setServiceParent to explode
428         later.
429         * buildbot/test/test_config.py (ConfigTest._testSchedulers_7): test it
431 2006-07-20  Brian Warner  <warner@lothar.com>
433         * buildbot/scripts/sample.cfg: simplify the sample BuildFactory,
434         which runs the buildbot unit tests
436         * docs/buildbot.texinfo (Index of Useful Classes): add a table of
437         classes that are useful in master.cfg
439 2006-07-15  Brian Warner  <warner@lothar.com>
441         * Makefile (some-apidocs): new target to build only some epydocs
443         * setup.py: minor comment.. does the classifiers= argument prevent
444         the setup.py script from working on python2.2/2.3?
446         * buildbot/scripts/sample.cfg: update manhole example, arrange into
447         major sections
449         * buildbot/twcompat.py: fix minor typo in comments
451         * buildbot/manhole.py: move all Manhole-related code out to this
452         module. Implement SSH-based manholes (with TwistedConch), and move
453         to conch's nifty line-editing syntax-coloring REPL shell instead
454         of the boring non-editing monochromatic (and deprecated) old
455         'telnet' protocol.
456         * buildbot/master.py: remove all Manhole-related code
457         (BuildMaster.loadConfig._add): make sure the old manhole is
458         removed before we add the new one
459         * docs/buildbot.texinfo (Debug options): document new Manhole options
461         * buildbot/twcompat.py (_which): fix some epydoc issues
462         * buildbot/status/html.py (Waterfall.__init__): same
464 2006-06-29  Brian Warner  <warner@lothar.com>
466         * buildbot/interfaces.py: get Interface from b.twcompat to hush
467         deprecation warnings under newer Twisteds (by using
468         zope.interface.Interface instead of old twisted.python.components
469         stuff)
470         * buildbot/slave/interfaces.py: same
472 2006-06-28  Brian Warner  <warner@lothar.com>
474         * buildbot/slave/commands.py (SVN): add --non-interactive to all
475         svn commands, so it will fail immediately instead of hanging while
476         it waits for a username/password to be typed in.
478         * buildbot/slave/bot.py (SlaveBuilder.commandComplete): add minor
479         log message if the step was shut down
481         * buildbot/scripts/runner.py (SlaveOptions.longdesc): remove
482         obsolete reference to mktap.
484 2006-06-20  Brian Warner  <warner@lothar.com>
486         * buildbot/test/test_steps.py (BuildStep.testShellCommand1): update
487         test to include new 'logfiles' argument sent from master to slave
489 2006-06-19  Brian Warner  <warner@lothar.com>
491         * buildbot/process/step_twisted.py (Trial): track Progress from
492         _trial_temp/test.log too
494         * buildbot/process/step.py (OutputProgressObserver): generalize
495         the earlier StdioProgressObserver into an OutputProgressObserver
496         that can track LogFiles other than stdio.
497         (LoggingBuildStep.__init__): same
499         * buildbot/process/step_twisted.py (Trial): use logfiles= to track
500         _trial_temp/test.log, not a separate 'cat' command. TODO: this
501         will fail under windows because of os.sep issues. It might have
502         worked before if 'cat' was doing cygwin path conversion.
504         * buildbot/slave/commands.py (LogFileWatcher.__init__): note the
505         creation of LogFileWatchers
506         (ShellCommand._startCommand): and record the files that were
507         watched in the 'headers' section of the ShellCommand output
509         * buildbot/process/step.py (RemoteShellCommand.__init__): duh, you
510         need to actually pass it to the slave if you want it to work.
511         (ShellCommand): document it a bit
513         * buildbot/test/test_shell.py: new test to validate LogFiles
514         * buildbot/test/runutils.py (SlaveCommandTestBase): updates to
515         test LogFiles
516         * buildbot/test/emitlogs.py: enhance to wait for a line on stdin
517         before printing the last batch of lines, to test that the polling
518         logic is working properly
520         * buildbot/process/step.py (LoggedRemoteCommand): improve LogFile
521         handling, making it possible to track multiple logs for a single
522         RemoteCommand. The previous single logfile is now known as the
523         'stdio' log.
524         (LoggedRemoteCommand.remoteUpdate): accept key='log' updates
525         (RemoteShellCommand.__init__): accept logfiles=
526         (LoggingBuildStep.startCommand): stdio_log is now one of many
527         (ShellCommand): added logfiles= argument, as well as a class-level
528         .logfiles attribute, which will be merged together to figure out
529         which logfiles should be tracked. The latter maybe be useful for
530         subclasses of ShellCommand which know they will aways produce
531         secondary logfiles in the same location.
533         * buildbot/slave/commands.py (ShellCommandPP): add writeStdin()
534         and closeStdin() methods, preparing to make it possible to write
535         to a ShellCommand's stdin at any time, not just at startup. These
536         writes are buffered if the child process hasn't started yet.
537         (LogFileWatcher): new helper class to watch arbitrary logfiles
538         while a ShellCommand runs. This class polls the file every two
539         seconds, and sends back 10k chunks to the buildmaster.
540         (ShellCommand): rename stdin= to initialStdin=, and add
541         keepStdinOpen= and logfiles= to arguments. Set up LogFileWatchers
542         at startup.
543         (ShellCommand.addLogfile): LogFile text is sent in updates with a
544         key of "log" and a value of (logname, data).
545         (SlaveShellCommand): add 'initial_stdin', 'keep_stdin_open', and
546         'logfiles' to the master-visible args dictionary.
547         (SourceBase.doPatch): match s/stdin/initialStdin/ change
548         (CVS.start): same
549         (P4.doVCFull): same
550         * buildbot/test/test_vc.py (Patch.testPatch): same
553         * buildbot/test/emit.py: write to a logfile in the current
554         directory. We use this to figure out what was used as a basedir
555         rather than looking to see which copy of emit.py gets run, so that
556         we can run the commands from inside _trial_temp rather than inside
557         buildbot/test
558         * buildbot/test/subdir/emit.py: same
559         * buildbot/test/runutils.py (FakeSlaveBuilder): take a 'basedir'
560         argument rather than running from buildbot/test/
561         (SlaveCommandTestBase.setUpBuilder): explicitly set up the Builder
562         rather than using an implicit setUp()
563         * buildbot/test/test_slavecommand.py (ShellBase.setUp): same
564         (ShellBase.testShell1, etc): use explicit path to emit.py instead
565         of assuming that we're running in buildbot/test/ (and that '.' is
566         on our $PATH)
568         * buildbot/slave/commands.py (Command.doStart): refactor Command
569         startup/completion a bit: now the SlaveBuilder calls doStart(),
570         which is not meant for overridding by subclasses, and doStart()
571         calls start(), which is. Likewise the SlaveBuilder calls
572         doInterrupt(), and subclasses override interrupt(). This also puts
573         responsibility for maintaining .running in Command rather than in
574         SlaveBuilder.
575         (Command.doInterrupt): same
576         (Command.commandComplete): same, this is called when the deferred
577         returned by start() completes.
578         * buildbot/slave/bot.py (SlaveBuilder.remote_startCommand): same
579         (SlaveBuilder.remote_interruptCommand): same
580         (SlaveBuilder.stopCommand): same
582 2006-06-16  Brian Warner  <warner@lothar.com>
584         * buildbot/test/test_shell.py: new test file to contain everything
585         relating to ShellCommand
586         (SlaveSide.testLogFiles): (todo) test for the upcoming "watch
587         multiple logfiles in realtime" feature, not yet implemented
588         * buildbot/test/emitlogs.py: support file for testLogFiles
589         * docs/buildbot.texinfo (ShellCommand): document the feature
591         * buildbot/test/test_steps.py (BuildStep.setUp): rmtree refactoring
593         * buildbot/test/runutils.py (SlaveCommandTestBase): utility class
594         for tests which exercise SlaveCommands in isolation.
596         * buildbot/test/test_slavecommand.py: Move some utilities like
597         SignalMixin and FakeSlaveBuilder from here ..
598         * buildbot/test/runutils.py: .. to here, so they can be used by
599         other test classes too
600         * buildbot/test/test_vc.py: more SignalMixin refactoring
601         * buildbot/test/test_control.py: same
602         * buildbot/test/test_run.py: and some rmtree refactoring
604 2006-06-15  Brian Warner  <warner@lothar.com>
606         * buildbot/test/test_vc.py (P4.testCheckoutBranch): rename from
607         'testBranch' to match other VC tests and have the tests run in
608         roughly increasing order of dependency
610         * buildbot/test/test_steps.py (LogObserver): new test to verify
611         LogObservers can be created at various times and still get
612         connected up properly
614         * buildbot/test/runutils.py (setupBuildStepStatus): utility method
615         to create BuildStepStatus instances that actually work.
617         * buildbot/process/step.py (LogObserver): add outReceived and
618         errReceived base methods, to be overridden
620         * buildbot/status/builder.py (BuildStatus.addStepWithName): change
621         API to take a name instead of a step, reducing the coupling
622         somewhat. This returns the BuildStepStatus object so it can be
623         passed to the new Step, instead of jamming it directly into the
624         Step.
625         * buildbot/process/step.py (BuildStep.setStepStatus): add a setter
626         method
627         * buildbot/process/base.py (Build.setupBuild): use both methods
628         * buildbot/test/test_web.py (Logfile.setUp): rearrange the setup
629         process a bit to match
631 2006-06-14  Brian Warner  <warner@lothar.com>
633         * docs/buildbot.texinfo (Adding LogObservers): add some limited
634         docs on writing new LogObserver classes
635         (Writing New Status Plugins): brief docs on how Status Plugins fit
636         together
638         * buildbot/process/step_twisted.py (TrialTestCaseCounter):
639         implement a LogObserver that counts how many unit tests have been
640         run so far
641         (Trial.__init__): wire it in
642         * buildbot/test/test_twisted.py (Counter): unit test for it
644         * buildbot/process/step_twisted.py (HLint.commandComplete): update
645         to new cmd.logs['stdio'] scheme
646         (Trial.commandComplete): same
647         (BuildDebs.commandComplete): same
649         * buildbot/process/step.py (LoggedRemoteCommand): use a dict of
650         LogFiles, instead of just a single one. The old single logfile is
651         now called "stdio". LoggedRemoteCommand no longer creates a
652         LogFile for you (the code to do that was broken anyway). If you
653         don't create a "stdio" LogFile, then stdout/stderr will be
654         discarded.
655         (LogObserver): implement "LogObservers", which a BuildStep can add
656         to parse the output of a command in real-time. The primary use is
657         to provide more useful information to the Progress code, allowing
658         better ETA estimates.
659         (LogLineObserver): utility subclass which feeds complete lines to
660         the parser instead of bytes.
661         (BuildStep.progressMetrics): this is safer as a tuple
662         (BuildStep.setProgress): utility method, meant to be called by
663         LogObservers
664         (BuildStep.addLogObserver): new method, to be called at any time
665         during the BuildStep (even before any LogFiles have been created),
666         to attach (or schedule for eventual attachment) a LogObserver to a
667         LogFile.
668         (StdioProgressObserver): new LogObserver which replaces the old
669         "output" progress gatherer
670         (LoggingBuildStep.__init__): same
671         (LoggingBuildStep.startCommand): set up the "stdio" LogFile
672         (LoggingBuildStep._commandComplete): must use logs['stdio']
673         instead of the old single ".log" attribute.
674         * buildbot/status/builder.py (LogFile): remove old logProgressTo
675         functionality, now subsumed into StdioProgressObserver
676         * buildbot/test/test_status.py (Subscription._testSlave_2): the
677         log name changed from "output" to "stdio".
680         * buildbot/interfaces.py (ILogFile): add the Interface used from
681         the BuildStep towards the LogFile
682         (ILogObserver): and the one provided by a LogObserver
683         * buildbot/status/builder.py (LogFile): implement it
685         * buildbot/interfaces.py (LOG_CHANNEL_*): move STDOUT / STDERR /
686         HEADER constants here ..
687         * buildbot/status/builder.py (STDOUT): .. from here
689 2006-06-13  Brian Warner  <warner@lothar.com>
691         * buildbot/test/test_p4poller.py (TestP4Poller.failUnlessIn): fix
692         compatibility with python2.2, which doesn't have the 'substr in
693         str' feature.
694         (TestP4Poller.makeTime): utility function to construct the
695         timestamp using the same strptime() approach as p4poller does. It
696         turns out that time.mktime() behaves slightly differently under
697         python2.2, probably something to do with the DST flag, and that
698         causes the test to fail under python2.2. (changing the mktime()
699         arguments to have dst=0 instead of -1 caused it to fail under
700         python2.3. Go figure.)
701         (TestP4Poller._testCheck3): use our makeTime() instead of mktime()
703 2006-06-12  Brian Warner  <warner@lothar.com>
705         * buildbot/process/step.py (P4): merge in patch SF#1473939, adding
706         proper Perforce (P4) support. Many many thanks to Scott Lamb for
707         contributing such an excellent patch, including docs and unit
708         tests! This makes it *so* much easier to apply. I had to update
709         test_vc.py to handle some recent refactorings, but everything else
710         applied smoothly. The only remaining thing I'd like to fix would
711         be to remove the hard-wired port 1666 used by p4d, and allow it to
712         claim any unused port. This would allow two copies of the test
713         suite to run on the same host at the same time, as well as
714         allowing the test suite to run while a real (production) p4d was
715         running on the same host. Oh, and maybe we should add a warning to
716         step.P4 that gets emitted if the slave is too old to provide the
717         'p4' SlaveCommand. Otherwise it looks great. (closes: SF#1473939).
718         * buildbot/slave/commands.py (P4): same
719         (P4Sync): same, some minor updates
720         * buildbot/changes/p4poller.py: same
721         * docs/buildbot.texinfo: same
722         * buildbot/test/test_p4poller.py: same
723         * buildbot/test/test_vc.py (P4): same
725         * setup.py: add Trove classifiers for PyPI
727 2006-06-08  Brian Warner  <warner@allmydata.com>
729         * buildbot/status/client.py
730         (RemoteBuilder.remote_getCurrentBuilds): oops, I screwed up when
731         changing this from getCurrentBuild() to getCurrentBuilds(). Each
732         build needs to be IRemote'd separately, rather than IRemote'ing
733         the whole list at once. I can't wait until newpb's serialization
734         adapters make this unnecessary.
736 2006-06-06  Brian Warner  <warner@lothar.com>
738         * buildbot/process/step.py (WithProperties): make this inherit
739         from ComparableMixin, so that reloading an unchanged config file
740         doesn't cause us to spuriously reload any Builders which use them.
741         * buildbot/test/test_config.py (ConfigTest.testWithProperties):
742         add a test for it
744 2006-06-03  Brian Warner  <warner@lothar.com>
746         * contrib/windows/{setup.py, buildbot_service.py}: add support for
747         running py2exe on windows, contributed by Mark Hammond. Addresses
748         SF#1401121, but I think we still need to include
749         buildbot/scripts/sample.cfg
750         * setup.py: include buildbot_service.py as a script under windows
751         * buildbot/status/html.py: when sys.frozen (i.e. we're running in
752         a py2exe application), get the icon/css datafiles from a different
753         place than usual.
755         * buildbot/status/mail.py (MailNotifier.buildMessage): don't
756         double-escape the build URL. Thanks to Olivier Bonnet for the
757         patch. Fixes SF#1452801.
759 2006-06-02  Brian Warner  <warner@lothar.com>
761         * contrib/svn_buildbot.py (ChangeSender.getChanges): ignore the
762         first six columns of 'svnlook' output, not just the first column,
763         since property changes appear in the other five. Thanks to Olivier
764         Bonnet for the patch. Fixes SF#1398174.
766 2006-06-01  Brian Warner  <warner@lothar.com>
768         * buildbot/test/test_web.py (Logfile.setUp): set the .reason on
769         the fake build, so that title= has something to be set to
771         * buildbot/status/html.py (BuildBox.getBox): set the 'title='
772         attribute of the "Build #NN" link in the yellow start-the-build
773         box to the build's reason. This means that you get a little
774         tooltip explaining why the build was done when you hover over the
775         yellow box. Thanks to Zandr Milewski for the suggestion.
777         * buildbot/clients/gtkPanes.py (Box.setColor): ignore color=None
778         (Box.setETA): handle ETA=None (by stopping the timer)
779         (Box.update): make the [soon] text less different than the usual
780         text, so the rest of the text doesn't flop around so much. It
781         would be awfully nice to figure out how to center this stuff.
782         (ThreeRowBuilder.stepETAUpdate): more debugging printouts
784         * buildbot/process/step.py (ShellCommand): set flunkOnFailure=True
785         by default, so that any ShellCommand which fails marks the overall
786         build as a failure. I should have done this from the beginning.
787         Add flunkOnFailure=False to the arguments if you want to turn off
788         this behavior.
790 2006-05-30  Brian Warner  <warner@lothar.com>
792         * buildbot/clients/gtkPanes.py: add a third row: now it shows
793         last-build/current-build/current-step. Show what step is currently
794         running. Show ETA for both the overall build and the current step.
795         Update GTK calls to modern non-deprecated forms. There's still a
796         lot of dead code and debug noise to remove.
798         * buildbot/process/step_twisted.py (Trial): set the step name, so it
799         shows up properly in status displays
801 2006-05-28  Brian Warner  <warner@lothar.com>
803         * buildbot/test/test_properties.py (Run.testInterpolate): on the
804         build we use to verify that WithProperties works:
806         ** set flunkOnFailure=True so that build failures get noticed
807         ** set workdir='.' so that the build succeeds, otherwise it is trying
808             to touch 'build/something', and 'build/' doesn't exist because
809             usually that's created by a Source step
810         ** set timeout=10, because Twisted-1.3.0 has a race condition that
811             this test somehow triggers, in which the 'touch' process becomes
812             a zombie and we wait for th etimeout before giving up on it.
814         * buildbot/test/runutils.py (RunMixin.logBuildResults): utility method
815         to log the Build results and step logs to the twisted log.
816         (RunMixin.failUnlessBuildSucceeded): use logBuildResults to record
817         what went wrong if a build was expected to succeed but didn't.
819         * buildbot/process/step_twisted.py (Trial): set the default
820         trialMode to '--reporter=bwverbose', which specifies verbose
821         black-and-white text. Back in twisted-1.3/2.0 days we had to use
822         '-to', but those are completely missing in modern Twisteds.
824         * buildbot/scripts/sample.cfg: make the sample Manhole config use
825         a localhost-only port, to encourage better security
827         * docs/buildbot.texinfo (Change Sources): mention
828         darcs_buildbot.py
830         * .darcs-boring: add a Darcs boringfile
832         * README (REQUIREMENTS): stop claiming compatibility with
833         Twisted-1.3.0
835         * contrib/darcs_buildbot.py: write a darcs-commit-hook change
836         sender
838 2006-05-27  Brian Warner  <warner@lothar.com>
840         * buildbot/__init__.py: bump to 0.7.3+ while between releases
841         * docs/buildbot.texinfo: same
843 2006-05-23  Brian Warner  <warner@lothar.com>
845         * buildbot/__init__.py (version): Releasing buildbot-0.7.3
846         * docs/buildbot.texinfo: set version to match
847         * NEWS: update for 0.7.3
849         * docs/buildbot.texinfo (Change Sources): mention hg_buildbot.py,
850         give a quick mapping from VC system to possible ChangeSources
851         (Build Properties): add 'buildername'
853         * buildbot/process/base.py (Build.setupStatus): oops, set
854         'buildername' and 'buildnumber' properties
855         * buildbot/test/test_properties.py (Interpolate.testBuildNumber):
856         test them
858 2006-05-22  Brian Warner  <warner@lothar.com>
860         * docs/buildbot.texinfo (Build Properties): explain the syntax of
861         property interpolation better
863         * README (INSTALLATION): remove old '-v' argument from recommended
864         trial command line
866         * docs/buildbot.texinfo (ShellCommand): add docs for description=
867         and descriptionDone= arguments. Thanks to Niklaus Giger for the
868         patch. SF#1475494.
870         * buildbot/slave/commands.py (SVN.parseGotRevision._parse): use
871         'svnversion' instead of grepping the output of 'svn info', much
872         simpler and avoids CR/LF problems on windows. Thanks to Olivier
873         Bonnet for the suggestion.
874         (SVN.parseGotRevision): oops, older verisons of 'svnversion'
875         require the WC_PATH argument, so run 'svnversion .' instead.
877         * buildbot/interfaces.py (IChangeSource): methods in Interfaces
878         aren't supposed to have 'self' in their argument list
880 2006-05-21  Brian Warner  <warner@lothar.com>
882         * buildbot/process/step.py (ShellCommand.start): make
883         testInterpolate pass. I was passing the uninterpolated command to
884         the RemoteShellCommand constructor
885         (ShellCommand._interpolateProperties): oops, handle non-list
886         commands (i.e. strings with multiple words separated by spaces in
887         them) properly, instead of forgetting about them.
889         * buildbot/test/test_properties.py (Run.testInterpolate): new test
890         to actually try to use build properties in a real build. This test
891         fails.
892         * buildbot/test/runutils.py (RunMixin.requestBuild): utility methods
893         to start and evaluate builds
895         * buildbot/test/test__versions.py: add a pseudo-test to record
896         what version of Twisted/Python/Buildbot are running. This should
897         show up at the beginning of _trial_tmp/test.log, and exists to help
898         debug other problems.
900         * buildbot/status/html.py (Waterfall): add 'robots_txt=' argument,
901         a filename to be served as 'robots.txt' to discourage web spiders.
902         Adapted from a patch by Tobi Vollebregt, thanks!
903         * buildbot/test/test_web.py (Waterfall._test_waterfall_5): test it
904         (Waterfall.test_waterfall): tweak the way that filenames are put
905         into the config file, to accomodate windows pathnames better.
907         * docs/buildbot.texinfo (HTML Waterfall): document it
909         * buildbot/process/process_twisted.py
910         (QuickTwistedBuildFactory.__init__): recent versions of Twisted
911         changed the build process. The new setup.py no longer takes the
912         'all' argument.
913         (FullTwistedBuildFactory.__init__): same
914         (TwistedReactorsBuildFactory.__init__): same
916         * contrib/hg_buildbot.py: wrote a commit script for mercurial, to
917         be placed in the [hooks] section of the central repository (the
918         one that everybody pushes changes to).
920 2006-05-20  Brian Warner  <warner@lothar.com>
922         * buildbot/slave/commands.py (Darcs.doVCFull): when writing the
923         .darcs-context file, use binary mode. I think this was causing a
924         Darcs failure under windows.
926 2006-05-19  Brian Warner  <warner@lothar.com>
928         * buildbot/scripts/tryclient.py (CVSExtractor.getBaseRevision):
929         use a timezone string of +0000 and gmtime, since this timestamp is
930         sent to a buildmaster and %z is broken.
932         * buildbot/test/test_vc.py (CVSHelper.getdate): use no timezone
933         string and localtime, since this timestamp will only be consumed
934         locally, and %z is broken.
936         * buildbot/slave/commands.py (CVS.parseGotRevision): use +0000 and
937         gmtime, since this timestamp is returned to the buildmaster, and
938         %z is broken.
940 2006-05-18  Brian Warner  <warner@lothar.com>
942         * NEWS: update in preparation for next release
944         * buildbot/test/test_vc.py (VCS_Helper): factor out all the
945         setup-repository and do-we-have-the-vc-tools code into a separate
946         "helper" class, which sticks around in a single module-level
947         object. This seems more likely to continue to work in the future
948         than having it hide in the TestCase and hope that TestCases stick
949         around for a long time.
951         * buildbot/test/test_vc.py (MercurialSupport.vc_create): 'hg
952         addremove' has been deprecated in recent versions of mercurial, so
953         use 'hg add' instead
955 2006-05-07  Brian Warner  <warner@lothar.com>
957         * buildbot/scheduler.py (Try_Jobdir.messageReceived): when
958         operating under windows, move the file before opening it, since
959         you can't rename a file that somebody has open.
961         * buildbot/process/base.py (Build.setupBuild): if something goes
962         wrong while creating a Step, log the name and arguments, since the
963         error message when you get the number of arguments wrong is really
964         opaque.
966 2006-05-06  Brian Warner  <warner@lothar.com>
968         * buildbot/process/step_twisted.py (Trial.setupEnvironment): more
969         bugs in twisted-specific code not covered by my unit tests, this
970         time use 'cmd' argument instead of self.cmd
972         * buildbot/process/process_twisted.py (TwistedBuild.isFileImportant):
973         fix stupid braino: either use startwith or find()==0, not both.
974         (TwistedReactorsBuildFactory.__init__): another dumb typo
976         * buildbot/test/test_slavecommand.py (ShellBase.testInterrupt1): 
977         mark this test as TODO under windows, since process-killing seems
978         dodgy there. We'll come back to this later and try to fix it
979         properly.
981         * buildbot/test/test_vc.py (CVSSupport.getdate): use localtime,
982         and don't include a timezone
983         (CVSSupport.vc_try_checkout): stop trying to strip the timezone.
984         This should avoid the windows-with-verbose-timezone-name problem
985         altogether.
986         (Patch.testPatch): add a test which runs 'patch' with less
987         overhead than the full VCBase.do_patch sequence, to try to isolate
988         a windows test failure. This one uses slave.commands.ShellCommand
989         and 'patch', but none of the VC code.
991         * buildbot/slave/commands.py (getCommand): use which() to find the
992         executables for 'cvs', 'svn', etc. This ought to help under
993         windows.
995         * buildbot/test/test_vc.py (VCBase.do_getpatch): Delete the
996         working directory before starting. If an earlier test failed, the
997         leftover directory would mistakenly flunk a later test.
998         (ArchCommon.registerRepository): fix some tla-vs-baz problems.
999         Make sure that we use the right commandlines if which("tla") picks
1000         up "tla.exe" (as it does under windows).
1001         (TlaSupport.do_get): factor out this tla-vs-baz difference
1002         (TlaSupport.vc_create): more tla-vs-baz differences
1004         * buildbot/test/test_slavecommand.py
1005         (ShellBase.testShellMissingCommand): stop trying to assert
1006         anything about the error message: different shells on different
1007         OSes with different languages makes it hard, and it really isn't
1008         that interesting of a thing to test anyway.
1010         * buildbot/test/test_vc.py (CVSSupport.capable): skip CVS tests if
1011         we detect cvs-1.10 (which is the version shipped with OS-X 10.3
1012         "Panther"), because it has a bug which flunks a couple tests in
1013         weird ways. I've checked that cvs-1.12.9 (as shipped with debian)
1014         is ok. OS-X 10.4 "Tiger" ships with cvs-1.11, but I haven't been
1015         able to test that yet.
1017 2006-04-30  Brian Warner  <warner@lothar.com>
1019         * buildbot/test/test_vc.py (VCBase.runCommand): set $LC_ALL="C" to
1020         make sure child commands emit messages in english, so our regexps
1021         will match. Thanks to Nikaus Giger for identifying the problems.
1022         (VCBase._do_vctest_export_1): mode="export" is not responsible
1023         for setting the "got_revision" property, since in many cases it is
1024         not convenient to determine.
1025         (SVNSupport.capable): when running 'svn --version' to check for
1026         ra_local, we want error messages in english
1027         * buildbot/test/test_slavecommand.py 
1028         (ShellBase.testShellMissingCommand): set $LC_ALL="C" to get bash
1029         to emit the error message in english
1031         * buildbot/slave/commands.py (SourceBase.setup): stash a copy of
1032         the environment with $LC_ALL="C" so that Commands which need to
1033         parse the output of their child processes can obtain it in
1034         english.
1035         (SVN.parseGotRevision): call "svn info" afterwards instead of
1036         watching the output of the "svn update" or "svn checkout".
1037         (Darcs.parseGotRevision): use $LC_ALL="C" when running the command
1038         (Arch.parseGotRevision): same
1039         (Bazaar.parseGotRevision): same
1040         (Mercurial.parseGotRevision): same
1042         * buildbot/scripts/tryclient.py (SourceStampExtractor.dovc): set
1043         $LC_ALL="C" when running commands under 'buildbot try', too
1045         * buildbot/test/__init__.py: remove the global os.environ()
1046         setting, instead we do it just for the tests that run commands and
1047         need to parse their output.
1049         * buildbot/test/test_scheduler.py (Scheduling.testTryJobdir):
1050         remove the overly-short .timeout on this test, because non-DNotify
1051         platforms must fall back to polling which happens at 10 second
1052         intervals, so a 5 second timeout would never succeed.
1054 2006-04-24  Brian Warner  <warner@lothar.com>
1056         * docs/buildbot.texinfo (Installing the code): update trial
1057         invocation, SF#1469116 by Niklaus Giger.
1058         (Attributes of Changes): updated branch-name examples to be
1059         a bit more realistic, SF#1475240 by Stephen Davis.
1061         * contrib/windows/buildbot2.bat: utility wrapper for windows
1062         developers, contributed by Nick Trout (after a year of neglect..
1063         sorry!). SF#1194231.
1065         * buildbot/test/test_vc.py (*.capable): store the actual VC
1066         binary's pathname in VCS[vcname], so it can be retrieved later
1067         (CVSSupport.vc_try_checkout): incorporate Niklaus Giger's patch to
1068         strip out non-numeric timezone information, specifically the funky
1069         German string that his system produced that confuses CVS.
1070         (DarcsSupport.vc_create): use dovc() instead of vc(), this should
1071         allow Darcs tests to work on windows
1072         * buildbot/scripts/tryclient.py (SourceStampExtractor): use
1073         procutils.which() everywhere, to allow tryclient to work under
1074         windows. Also from Niklaus Giger, SF#1463394.
1076         * buildbot/twcompat.py (which): move the replacement for a missing
1077         twisted.python.procutils.which from test_vc.py to here, so it can
1078         be used in other places too (specifically tryclient.py)
1080 2006-04-23  Brian Warner  <warner@lothar.com>
1082         * buildbot/status/html.py (StatusResourceBuild.body): replace the
1083         bare buildbotURL/projectName line with a proper DIV, along with a
1084         CSS class of "title", from Stefan Seefeld (SF#1461675).
1085         (WaterfallStatusResource.body0): remove the redundant 'table'
1086         class from the table
1087         (WaterfallStatusResource.body): same. Also add class="LastBuild"
1088         to the top-row TR, and class="Activity" to the second-row TR,
1089         rather than putting them in the individual TD nodes.
1091         * buildbot/test/test_vc.py (VCBase.checkGotRevision): test
1092         'got_revision' build property for all VC systems that implement
1093         accurate ones: SVN, Darcs, Arch, Bazaar, Mercurial.
1095         * buildbot/slave/commands.py (SourceBase._handleGotRevision): try
1096         to determine which revision we actually obtained
1097         (CVS.parseGotRevision): implement this for CVS, which just means
1098         to grab a timestamp. Not ideal, and it depends upon the buildslave
1099         having a clock that is reasonably well syncronized with the server,
1100         but it's better than nothing.
1101         (SVN.parseGotRevision): implement it for SVN, which is accurate
1102         (Darcs.parseGotRevision): same
1103         (Arch.parseGotRevision): same
1104         (Bazaar.parseGotRevision): same
1105         (Mercurial.parseGotRevision): same
1107         * buildbot/process/step.py (LoggedRemoteCommand.remoteUpdate):
1108         keep a record of all non-stdout/stderr/header/rc status updates,
1109         for the benefit of RemoteCommands that send other useful things,
1110         like got_revision
1111         (Source.commandComplete): put any 'got_revision' status values
1112         into a build property of the same name
1115         * buildbot/process/step_twisted.py (Trial): update to deal with
1116         new ShellCommand refactoring
1118         * docs/buildbot.texinfo (Build Properties): document new feature
1119         that allows BuildSteps to get/set Build-wide properties like which
1120         revision was requested and/or checked out.
1122         * buildbot/interfaces.py (IBuildStatus.getProperty): new method
1123         * buildbot/status/builder.py (BuildStatus.getProperty): implement
1124         it. Note that this bumps the persistenceVersion of the saved Build
1125         object, so add the necessary upgrade-old-version logic to include
1126         an empty properties dict.
1128         * buildbot/process/base.py (Build.setProperty): implement it
1129         (Build.getProperty): same
1130         (Build.startBuild): change build startup to set 'branch',
1131         'revision', and 'slavename' properties at the right time
1133         * buildbot/process/step.py (BuildStep.__init__): change setup to
1134         require 'build' argument in a better way
1135         (LoggingBuildStep): split ShellCommand into two pieces, for better
1136         subclassing elsewhere. LoggingBuildStep is a BuildStep which runs
1137         a single RemoteCommand that sends stdout/stderr status text. It
1138         also provides the usual commandComplete / createSummary /
1139         evaluateCommand / getText methods to be overridden...
1140         (ShellCommand): .. whereas ShellCommand is specifically for
1141         running RemoteShellCommands. Other shell-like BuildSteps (like
1142         Source) can inherit from LoggingBuildStep instead of ShellCommand
1143         (WithProperties): marker class to do build-property interpolation
1144         (Source): inherit from LoggingBuildStep instead of ShellCommand
1145         (RemoteDummy): same
1147         * buildbot/test/test_properties.py: test new functionality
1149 2006-04-21  Brian Warner  <warner@lothar.com>
1151         * buildbot/test/test_vc.py: rename testBranch to
1152         testCheckoutBranch to keep the tests in about the right
1153         alphabetical order
1155 2006-04-18  Brian Warner  <warner@lothar.com>
1157         * docs/buildbot.texinfo (PBListener): improve cross-references
1158         between PBListener and 'buildbot statusgui', thanks to John Pye
1159         for the suggestion.
1161 2006-04-17  Brian Warner  <warner@lothar.com>
1163         * buildbot/twcompat.py (maybeWait): handle SkipTest properly when
1164         running under Twisted-1.3.0, otherwise skipped tests are reported
1165         as errors.
1167         * all: use isinstance() instead of 'type(x) is foo', suggested by
1168         Neal Norwitz
1170         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
1171         oops, fix a brain-fade from the other week, when making the
1172         addStep changes. I changed all the __init__ upcalls to use the
1173         wrong superclass name.
1174         (FullTwistedBuildFactory.__init__): same
1175         (TwistedDebsBuildFactory.__init__): same
1176         (TwistedReactorsBuildFactory.__init__): same
1177         (TwistedBuild.isFileImportant): use .startswith for clarity,
1178         thanks to Neal Norwitz for the suggestions.
1180         * contrib/viewcvspoll.py: script to poll a viewcvs database for
1181         changes, then deliver them over PB to a remote buildmaster.
1183         * contrib/svnpoller.py: added script by John Pye to poll a remote
1184         SVN repository (by running 'svn log') from a cronjob, and run
1185         'buildbot sendchange' to deliver the changes to a remote
1186         buildmaster.
1187         * contrib/svn_watcher.py: added script by Niklaus Giger (a
1188         modification of svnpoller.py), same purpose, but this one loops
1189         internally (rather than expecting to run from a cronjob) and works
1190         under windows.
1191         * contrib/README.txt: same
1193 2006-04-11  Brian Warner  <warner@lothar.com>
1195         * all: fix a number of incorrect names and missing imports, thanks
1196         to Anthony Baxter for the patch.
1197         * buildbot/status/html.py (WaterfallStatusResource.statusToHTML): 
1198         remove unused buggy method.
1199         * buildbot/status/builder.py (BuildStatus.saveYourself): rmtree
1200         comes from shutil, not "shutils"
1201         * buildbot/process/step.py (TreeSize.evaluateCommand): fix bad name
1202         (Arch.checkSlaveVersion): same
1203         * buildbot/process/step_twisted.py (Trial.commandComplete): same, in
1204         some disabled code
1205         * buildbot/process/step_twisted2.py: add some missing imports
1206         * buildbot/twcompat.py (_deferGenerator): fix cut-and-paste error,
1207         this code used to live in twisted.internet.defer
1209 2006-04-10  Brian Warner  <warner@lothar.com>
1211         * buildbot/process/step.py (Mercurial): add Mercurial support
1212         * buildbot/slave/commands.py (Mercurial): same
1213         * buildbot/scripts/tryclient.py (MercurialExtractor): same
1214         * buildbot/test/test_vc.py (Mercurial): same, checkout over HTTP is
1215         not yet tested, but 'try' support *is* covered
1216         * docs/buildbot.texinfo (Mercurial): document it
1218         * buildbot/process/step.py (LoggedRemoteCommand.remoteUpdate): add
1219         some debugging messages (turned off)
1220         * buildbot/test/test_vc.py: improve debug messages
1222 2006-04-07  Brian Warner  <warner@lothar.com>
1224         * buildbot/test/test_vc.py (which): define our own which() in case
1225         we can't import twisted.python.procutils, because procutils doesn't
1226         exist in Twisted-1.3
1228         * docs/buildbot.texinfo (Interlocks): fix some typos, mention use
1229         of SlaveLocks for performance tests
1231         * docs/examples/twisted_master.cfg: update to match current usage
1233         * buildbot/changes/p4poller.py (P4Source): add new arguments:
1234         password, p4 binary, pollinterval, maximum history to check.
1235         Patch from an anonymous sf.net contributor, SF#1219384.
1236         * buildbot/process/step.py (P4Sync.__init__): add username,
1237         password, and client arguments.
1238         * buildbot/slave/commands.py (P4Sync): same
1240 2006-04-05  Brian Warner  <warner@lothar.com>
1242         * buildbot/process/factory.py (BuildFactory.addStep): new method
1243         to add steps to a BuildFactory. Use it instead of f.steps.append,
1244         and you can probably avoid using the s() convenience function.
1245         Patch from Neal Norwitz, sf.net #1412605.
1246         (other): update all factories to use addStep
1247         * buildbot/process/process_twisted.py: update all factories to use
1248         addStep.
1250 2006-04-03  Brian Warner  <warner@lothar.com>
1252         * buildbot/test/test_vc.py: modified find-the-VC-command logic to
1253         work under windows too. Adapted from a patch by Niklaus Giger,
1254         addresses SF#1463399.
1256         * buildbot/test/__init__.py: set $LANG to 'C', to insure that
1257         spawned commands emit parseable results in english and not some
1258         other language. Patch from Niklaus Giger, SF#1463395.
1260         * README (INSTALLATION): discourage users from running unit tests on
1261         a "network drive", patch from Niklaus Giger, SF#1463394.
1263 2006-03-22  Brian Warner  <warner@lothar.com>
1265         * contrib/svn_buildbot.py: rearrange, add an easy-to-change
1266         function to turn a repository-relative pathname into a (branch,
1267         branch-relative-filename) tuple. Change this function to handle
1268         the branch naming policy used by your Subversion repository.
1269         Thanks to AllMyData.com for sponsoring this work.
1271 2006-03-16  Brian Warner  <warner@lothar.com>
1273         * buildbot/scripts/sample.cfg: add python-mode declaration for
1274         vim. Thanks to John Pye for the patch.
1276         * docs/buildbot.texinfo (Launching the daemons): fix @reboot job
1277         command line, mention the importance of running 'crontab' as the
1278         buildmaster/buildslave user. Thanks to John Pye for the catch.
1280 2006-03-13  Brian Warner  <warner@lothar.com>
1282         * buildbot/status/words.py (IRC): add an optional password=
1283         argument, which will be sent to Nickserv in an IDENTIFY message at
1284         login, to claim the nickname. freenode requires this before the
1285         bot can sent (or reply to) private messages. Thanks to Clement
1286         Stenac for the patch.
1287         * docs/buildbot.texinfo (IRC Bot): document it
1289         * buildbot/status/builder.py (LogFile.merge): don't write chunks
1290         larger than chunkSize. Fixes SF#1349253.
1291         * buildbot/test/test_status.py (Log.testLargeSummary): test it
1292         (Log.testConsumer): update to match new internal chunking behavior
1294 2006-03-12  Brian Warner  <warner@lothar.com>
1296         * buildbot/test/test_vc.py: remove the last use of waitForDeferred
1298         * buildbot/test/test_maildir.py (MaildirTest): rename the
1299         'timeout' method, as it collides with trial's internals
1301         * buildbot/scripts/runner.py: add 'buildbot restart' command
1302         (stop): don't sys.exit() out of here, otherwise restart can't work
1303         * docs/buildbot.texinfo (Shutdown): document it
1305         * buildbot/buildset.py (BuildSet.__init__): clean up docstring
1306         * buildbot/status/html.py (Waterfall.__init__): same
1307         * buildbot/process/builder.py (Builder.startBuild): same
1308         * buildbot/process/base.py (BuildRequest): same
1309         * buildbot/sourcestamp.py (SourceStamp): same
1310         * buildbot/scheduler.py (Nightly): same
1312         * buildbot/__init__.py (version): bump to 0.7.2+ while between
1313         releases
1314         * docs/buildbot.texinfo: same
1316 2006-02-17  Brian Warner  <warner@lothar.com>
1318         * buildbot/__init__.py (version): Releasing buildbot-0.7.2
1319         * docs/buildbot.texinfo: set version number to match
1320         * NEWS: update for 0.7.2
1322 2006-02-16  Brian Warner  <warner@lothar.com>
1324         * docs/buildbot.texinfo (Build Dependencies): add cindex tag
1326 2006-02-09  Brian Warner  <warner@lothar.com>
1328         * docs/buildbot.texinfo (How Different VC Systems Specify Sources):
1329         add text to explain per-build branch parameters
1330         * NEWS: mention --umask
1332 2006-02-08  Brian Warner  <warner@lothar.com>
1334         * buildbot/scripts/runner.py (Maker.makeSlaveTAC): remove unused
1335         method
1336         (SlaveOptions.optParameters): add --umask, to make it possible to
1337         make buildslave-generated files (including build products) be
1338         world-readable
1339         (slaveTAC): same
1340         * buildbot/slave/bot.py (BuildSlave.startService): same
1342 2006-01-23  Brian Warner  <warner@lothar.com>
1344         * buildbot/status/builder.py: urllib.quote() all URLs that include
1345         Builder names, so that builders can include characters like '/'
1346         and ' ' without completely breaking the resulting HTML. Thanks to
1347         Kevin Turner for the patch.
1348         * buildbot/status/html.py: same
1349         * buildbot/test/test_web.py (GetURL.testBuild): match changes
1351         * NEWS: update in preparation for upcoming release
1353 2006-01-18  Brian Warner  <warner@lothar.com>
1355         * docs/examples/twisted_master.cfg: update to match the Twisted
1356         buildbot: remove python2.2, switch to exarkun's buildslaves,
1357         disable the .deb builder until we figure out how to build twisted
1358         .debs from SVN, add some ktrace debugging to the OS-X build
1359         process and remove the qt build, remove threadless builders,
1360         change freebsd builder to use landonf's buildslave.
1362 2006-01-12  Brian Warner  <warner@lothar.com>
1364         * buildbot/master.py (Manhole.__init__): let port= be a strports
1365         specification string, but handle a regular int for backwards
1366         compatibility. This allows "tcp:12345:interface=127.0.0.1" to be
1367         used in master.cfg to limit connections to just the local host.
1368         (BuildMaster.loadConfig): same for c['slavePortnum']
1369         * buildbot/scheduler.py (Try_Userpass.__init__): same
1370         * buildbot/status/client.py (PBListener.__init__): same
1371         * buildbot/status/html.py (Waterfall.__init__): same, for both
1372         http_port and distrib_port. Include backwards-compatibility checks
1373         so distrib_port can be a filename string and still mean unix:/foo
1374         * docs/buildbot.texinfo (Setting the slaveport): document it
1375         (Debug options): same
1376         (HTML Waterfall): same
1377         (PBListener): same
1378         (try): same
1379         * buildbot/test/test_config.py (ConfigTest): test it
1381         * buildbot/master.py (BuildMaster.loadConfig): wait for the
1382         slaveport's disownServiceParent deferred to fire before opening
1383         the new one. Fixes an annoying bug in the unit tests.
1385 2006-01-03  Brian Warner  <warner@lothar.com>
1387         * buildbot/master.py (BuildMaster): remove the .schedulers
1388         attribute, replacing it with an allSchedulers() method that looks
1389         for all IService children that implement IScheduler. Having only
1390         one parent/child relationship means fewer opportunities for bugs.
1391         (BuildMaster.allSchedulers): new method
1392         (BuildMaster.loadConfig_Schedulers): update to use allSchedulers,
1393         also fix ugly bug that caused any config-file reload to
1394         half-forget about the earlier Schedulers, causing an exception
1395         when a Change arrived and was handed to a half-connected
1396         Scheduler. The exception was in scheduler.py line 54ish:
1397           self.parent.submitBuildSet(bs)
1398           exceptions.AttributeError: 'NoneType' object has no attribute
1399           'submitBuildSet'
1400         (BuildMaster.addChange): update to use allSchedulers()
1402         * buildbot/scheduler.py (BaseScheduler.__implements__): fix this
1403         to work properly with twisted-1.3.0, where you must explicitly
1404         include the __implements__ from parent classes
1405         (BaseScheduler.__repr__): make it easier to distinguish distinct
1406         instances
1407         (BaseUpstreamScheduler.__implements__): same
1409         * buildbot/status/builder.py (Status.getSchedulers): update to
1410         use allSchedulers()
1411         * buildbot/test/test_run.py (Run.testMaster): same
1412         * buildbot/test/test_dependencies.py (Dependencies.findScheduler): same
1413         * buildbot/test/test_config.py (ConfigTest.testSchedulers): same,
1414         make sure Scheduler instances are left alone when an identical
1415         config file is reloaded
1416         (ConfigElements.testSchedulers): make sure Schedulers are properly
1417         comparable
1419         * Makefile (TRIALARGS): my local default Twisted version is now
1420         2.1.0, update the trial arguments accordingly
1422 2005-12-22  Brian Warner  <warner@lothar.com>
1424         * docs/examples/twisted_master.cfg: merge changes from pyr: add
1425         new win32 builders
1427         * buildbot/scheduler.py (BaseScheduler.addChange): include a dummy
1428         addChange in the parent class, although I suspect this should be
1429         fixed better in the future.
1431 2005-11-26  Brian Warner  <warner@lothar.com>
1433         * buildbot/scheduler.py (AnyBranchScheduler.addChange): don't
1434         explode when branch==None, thanks to Kevin Turner for the catch
1435         * buildbot/test/test_scheduler.py (Scheduling.testAnyBranch): test
1436         it
1438         * buildbot/__init__.py (version): bump to 0.7.1+ while between
1439         releases
1440         * docs/buildbot.texinfo: same
1442 2005-11-26  Brian Warner  <warner@lothar.com>
1444         * buildbot/__init__.py (version): Releasing buildbot-0.7.1
1445         * docs/buildbot.texinfo: set version number to match
1447 2005-11-26  Brian Warner  <warner@lothar.com>
1449         * NEWS: update for 0.7.1
1451         * buildbot/status/builder.py (BuildStepStatus.unsubscribe): make
1452         sure that unsubscribe works even if we never sent an ETA update.
1453         Also, don't explode on duplicate unsubscribe.
1454         (BuildStepStatus.addLog): make the convenience "return self"-added
1455         watcher automatically unsubscribe when the Step finishes.
1456         (BuildStatus.unsubscribe): same handle-duplicate-unsubscribe
1457         (BuildStatus.stepStarted): same auto-unsubscribe
1458         (BuilderStatus.buildStarted): same auto-unsubscribe
1460         * buildbot/interfaces.py (IStatusReceiver.buildStarted): document
1461         auto-unsubscribe
1462         (IStatusReceiver.stepStarted): same
1463         (IStatusReceiver.logStarted): same
1465         * buildbot/test/test_run.py (Status): move the Status test..
1466         * buildbot/test/test_status.py (Subscription): .. to here
1468 2005-11-25  Brian Warner  <warner@lothar.com>
1470         * NEWS: more updates
1472         * buildbot/locks.py: fix the problem in which loading a master.cfg
1473         file that changes some Builders (but not all of them) can result
1474         in having multiple copies of the same Lock. Now, the real Locks
1475         are kept in a table inside the BotMaster, and the Builders/Steps
1476         use "LockIDs", which are still instances of MasterLock and
1477         SlaveLock. The real Locks are instances of the new RealMasterLock
1478         and RealSlaveLock classes.
1479         * buildbot/master.py (BotMaster.getLockByID): new method to
1480         convert LockIDs into real Locks.
1481         * buildbot/process/base.py (Build.startBuild): convert LockIDs
1482         into real Locks before building
1483         * buildbot/process/step.py (BuildStep.startStep): same
1484         * buildbot/test/test_locks.py (Locks.testLock1a): add a test which
1485         exercises the problem
1488         * docs/buildbot.texinfo (Scheduler Types): give a few hints about
1489         what Schedulers are available
1491         * buildbot/scheduler.py (Nightly): add new Scheduler based upon
1492         work by Dobes Vandermeer and hacked mercilessly by me. This offers
1493         'cron'-style build scheduling at certain times of day, week,
1494         month, or year.
1495         * buildbot/test/test_scheduler.py (Scheduling.testNightly): test it
1497         * buildbot/scheduler.py (Scheduler): change fileIsImportant
1498         handling: treat self.fileIsImportant more as an attribute that
1499         contains a callable than as a method. If the attribute is None,
1500         don't call it and assume all filenames are important. It is still
1501         possible to provide a fileIsImportant method in a subclass,
1502         however.
1503         (AnyBranchScheduler): handle fileIsImportant=None, previously it
1504         was broken
1505         * buildbot/test/test_scheduler.py (Scheduling.testAnyBranch2):
1506         test using AnyBranchScheduler with fileIsImportant=None
1508 2005-11-24  Brian Warner  <warner@lothar.com>
1510         * buildbot/test/test_config.py (StartService): don't claim a fixed
1511         port number, instead set slavePort=0 on the first pass, figure out
1512         what port was allocated, then switch to a config file that uses
1513         the allocated port.
1515         * buildbot/master.py (BuildMaster.loadConfig): close the old
1516         slaveport before opening the new one, because unit tests might
1517         replace slavePort=0 with the same allocated portnumber, and if we
1518         don't wait for the old port to close first, we get a "port already
1519         in use" error. There is a tiny race condition here, but the only
1520         threat is from other programs that bind (statically) to the same
1521         port number we happened to be allocated, and only if those
1522         programs use SO_REUSEADDR, and only if they get control in between
1523         reactor turns.
1525         * Makefile (TRIALARGS): update to handle Twisted > 2.1.0
1527         * buildbot/master.py (BuildMaster.loadConfig_Sources): remove all
1528         deleted ChangeSources before adding any new ones
1529         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): fix
1530         compare_attrs, to make sure that a config-file reload does not
1531         unnecessarily replace an unmodified ChangeSource instance
1532         * buildbot/test/test_config.py (ConfigTest.testSources): update
1534         * buildbot/scheduler.py (AnyBranchScheduler): fix branches=[] to
1535         mean "don't build anything", and add a warning if it gets used
1536         because it isn't actually useful.
1538         * contrib/svn_buildbot.py: update example usage to match the port
1539         number that gets used by the PBChangeSource
1540         * buildbot/scripts/sample.cfg: add example of PBChangeSource
1542 2005-11-22  Brian Warner  <warner@lothar.com>
1544         * NEWS: start collecting items for next release
1546         * buildbot/process/step.py (SVN.computeSourceRevision): assume
1547         revisions are strings
1548         (P4Sync.computeSourceRevision): same
1550         * buildbot/status/html.py (StatusResourceBuild.body): add a link
1551         to the Buildbot's overall status page
1552         (StatusResourceBuilder.body): same
1554 2005-11-15  Brian Warner  <warner@lothar.com>
1556         * buildbot/master.py (BuildMaster.loadConfig): serialize the
1557         config-file loading, specifically to make sure old StatusTargets
1558         are finished shutting down before new ones start up (thus
1559         resolving a bug in which changing the Waterfall object would fail
1560         because both new and old instances were claiming the same
1561         listening port). Also load new Schedulers after all the new
1562         Builders are set up, in case they fire off a new build right away.
1563         * buildbot/test/test_config.py (StartService): test it
1565         * buildbot/status/mail.py (MailNotifier.buildMessage): oops, add
1566         the branch name to the mail body
1568         * buildbot/changes/pb.py (PBChangeSource.compare_attrs): add this.
1569         Without it, a config-file reload fails to update an existing
1570         PBChangeSource.
1571         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): add
1572         username/passwd to compare_attrs, for the same reason
1573         * buildbot/status/html.py (Waterfall): add favicon to
1574         compare_attrs, same reason
1576 2005-11-05  Brian Warner  <warner@lothar.com>
1578         * buildbot/scripts/tryclient.py (createJobfile): stringify the
1579         baserev before stuffing it in the jobfile. This resolves problems
1580         under SVN (and probably Arch) where revisions are expressed as
1581         numbers. I'm inclined to use string-based revisions everywhere in
1582         the future, but this fix should be safe for now. Thanks to Steven
1583         Walter for the patch.
1585         * buildbot/changes/changes.py (ChangeMaster.saveYourself): use
1586         binary mode when opening pickle files, to make windows work
1587         better. Thanks to Dobes Vandermeer for the catch.
1588         * buildbot/status/builder.py (BuildStatus.saveYourself): same
1589         (BuilderStatus.getBuildByNumber): same
1590         (Status.builderAdded): same
1591         * buildbot/master.py (BuildMaster.loadChanges): same
1593         * buildbot/util.py (Swappable): delete unused leftover code
1595         * buildbot/process/step.py (SVN): when building on a non-default
1596         branch, add the word "[branch]" to the VC step's description, so
1597         it is obvious that we're not building the usual stuff. Likewise,
1598         when we are building a specific revision, add the text "rNNN" to
1599         indicate what that revision number is. Thanks to Brad Hards and
1600         Nathaniel Smith for the suggestion.
1601         (Darcs.startVC): same
1602         (Arch.startVC): same
1603         (Bazaar.startVC): same
1605         * buildbot/process/factory.py (GNUAutoconf.__init__): fix a silly
1606         typo, caught by Mark Dillavou, closes SF#1216636.
1608         * buildbot/test/test_status.py (Log.TODO_testDuplicate): add notes
1609         about a test to add some day
1611         * docs/examples/twisted_master.cfg: update: bot1 can now handle
1612         the 'full-2.3' build, and the 'reactors' build is now run under
1613         python-2.4 because the buildslave no longer has gtk/etc bindings
1614         for earlier versions.
1616 2005-11-03  Brian Warner  <warner@lothar.com>
1618         * buildbot/interfaces.py (IBuilderControl.resubmitBuild): new
1619         method, takes an IBuildStatus and rebuilds it. It might make more
1620         sense to add this to IBuildControl instead, but that instance goes
1621         away completely once the build has finished, and resubmitting
1622         builds can take place weeks later.
1623         * buildbot/process/builder.py (BuilderControl.resubmitBuild): same
1624         * buildbot/status/html.py (StatusResourceBuild): also stash an
1625         IBuilderControl so we can use resubmitBuild.
1626         (StatusResourceBuild.body): render "resubmit" button if we can.
1627         Also add hrefs for each BuildStep
1628         (StatusResourceBuild.rebuild): add action for "resubmit" button
1629         (StatusResourceBuilder.getChild): give it an IBuilderControl
1631         * buildbot/status/builder.py (Status.getURLForThing): change the
1632         URL for BuildSteps to have a "step-" prefix, so the magic URLs
1633         that live as targets of buttons like "stop" and "rebuild" can't
1634         collide with them.
1635         * buildbot/status/builder.py (Status.getURLForThing): same
1636         * buildbot/status/html.py (StatusResourceBuild.getChild): same
1637         (StepBox.getBox): same
1638         * buildbot/test/test_web.py (GetURL): same
1639         (Logfile): same
1641         * buildbot/process/step.py (SVN.__init__): put svnurl/baseURL
1642         exclusivity checks after Source.__init__ upcall, so misspelled
1643         arguments will be reported more usefully
1644         (Darcs.__init__): same
1646 2005-10-29  Brian Warner  <warner@lothar.com>
1648         * docs/examples/twisted_master.cfg: don't double-fire the 'quick'
1649         builder. Move the Try scheduler off to a separate port.
1651 2005-10-27  Brian Warner  <warner@lothar.com>
1653         * buildbot/clients/gtkPanes.py
1654         (TwoRowClient.remote_builderRemoved): disappearing Builders used
1655         to cause the app to crash, now they don't.
1657         * buildbot/clients/debug.py: display the buildmaster's location
1658         in the window's title bar
1660 2005-10-26  Brian Warner  <warner@lothar.com>
1662         * buildbot/status/mail.py (MailNotifier): urllib.escape the URLs
1663         in case they have spaces or whatnot. Patch from Dobes Vandermeer.
1664         * buildbot/test/test_status.py (MyStatus.getURLForThing): fix it
1666         * buildbot/status/html.py (td): put a single non-breaking space
1667         inside otherwise empty <td> elements, as a workaround for buggy
1668         browsers which would optimize them away (along with any associated
1669         styles, like the kind that create the waterfall grid borders).
1670         Patch from Frerich Raabe.
1672         * buildbot/process/step_twisted.py (Trial): expose the trialMode=
1673         argv-list as an argument, defaulting to ["-to"], which is
1674         appropriate for the Trial that comes with Twisted-2.1.0 and
1675         earlier. The Trial in current Twisted SVN wants
1676         ["--reporter=bwverbose"] instead. Also expose trialArgs=, which
1677         defaults to an empty list.
1678         * buildbot/process/process_twisted.py (TwistedTrial.trialMode):
1679         match it, now that trialMode= is a list instead of a single string
1681         * buildbot/__init__.py (version): bump to 0.7.0+ while between
1682         releases
1683         * docs/buildbot.texinfo: same
1685 2005-10-24  Brian Warner  <warner@lothar.com>
1687         * buildbot/__init__.py (version): Releasing buildbot-0.7.0
1688         * docs/buildbot.texinfo: set version number to match
1690 2005-10-24  Brian Warner  <warner@lothar.com>
1692         * README: update for 0.7.0
1693         * NEWS: same
1694         * docs/buildbot.texinfo: move the freshcvs stuff out of the README
1696         * buildbot/clients/debug.glade: add 'branch' box to fake-commit
1697         * buildbot/clients/debug.py (DebugWidget.do_commit): same. Don't
1698         send the branch= argument unless the user really provided one, to
1699         retain compatibility with older buildmasters that don't accept
1700         that argument.
1701         * buildbot/master.py (DebugPerspective.perspective_fakeChange):
1702         same
1704         * docs/buildbot.texinfo: update lots of stuff
1706         * buildbot/scripts/runner.py (sendchange): add a --branch argument
1707         to the 'buildbot sendchange' command
1708         * buildbot/clients/sendchange.py (Sender.send): same
1709         * buildbot/changes/pb.py (ChangePerspective): same
1710         * buildbot/test/test_changes.py (Sender.testSender): test it
1712         * buildbot/process/step.py (SVN.__init__): change 'base_url' and
1713         'default_branch' argument names to 'baseURL' and 'defaultBranch',
1714         for consistency with other BuildStep arguments that use camelCase.
1715         Well, at least more of them use camelCase (like flunkOnWarnings)
1716         than don't.. I wish I'd picked one style and stuck with it
1717         earlier. Annoying, but it's best done before the release, since
1718         these arguments didn't exist at all in 0.6.6 .
1719         (Darcs): same
1720         * buildbot/test/test_vc.py (SVN.testCheckout): same
1721         (Darcs.testPatch): same
1722         * docs/buildbot.texinfo (SVN): document the change
1723         (Darcs): same, add some build-on-branch docs
1724         * docs/examples/twisted_master.cfg: match change
1726         * buildbot/process/step.py (BuildStep): rename
1727         slaveVersionNewEnough to slaveVersionIsOlderThan, because that's
1728         how it is normally used.
1729         * buildbot/test/test_steps.py (Version.checkCompare): same
1731         * buildbot/process/step.py (CVS.startVC): refuse to build
1732         update/copy -style builds on a non-default branch with an old
1733         buildslave (<=0.6.6) that doesn't know how to do it properly. The
1734         concern is that it will do a VC 'update' in an existing tree when
1735         it is supposed to be switching branches (and therefore clobbering
1736         the tree to do a full checkout), thus building the wrong source.
1737         This used to be a warning, but I think the confusion it is likely
1738         to cause warrants making it an error.
1739         (SVN.startVC): same, also make mode=export on old slaves an error
1740         (Darcs.startVC): same
1741         (Git.startVC): improve error message for non-Git-enabled slaves
1742         (Arch.checkSlaveVersion): same. continue to emit a warning when a
1743         specific revision is built on a slave that doesn't pay attention
1744         to args['revision'], because for slowly-changing trees it will
1745         probably do the right thing, and because we have no way to tell
1746         whether we're asking it to build the most recent version or not.
1747         * buildbot/interfaces.py (BuildSlaveTooOldError): new exception
1749         * buildbot/scripts/runner.py (SlaveOptions.postOptions): assert
1750         that 'master' is in host:portnum format, to catch errors sooner
1752 2005-10-23  Brian Warner  <warner@lothar.com>
1754         * buildbot/process/step_twisted.py (ProcessDocs.createSummary):
1755         when creating the list of warning messages, include the line
1756         immediately after each WARNING: line, since that's usually where
1757         the file and line number wind up.
1759         * docs/examples/twisted_master.cfg: OS-X slave now does QT, add a
1760         TryScheduler
1762         * NEWS: update
1764 2005-10-22  Brian Warner  <warner@lothar.com>
1766         * buildbot/status/html.py (HtmlResource): incorporate valid-HTML
1767         patch from Brad Hards
1768         * buildbot/status/classic.css: same
1769         * buildbot/test/test_web.py (Waterfall): match changes
1771         * buildbot/test/test_steps.py (BuildStep.setUp): set
1772         nextBuildNumber so the test passes
1773         * buildbot/test/test_status.py (MyBuilder): same
1775         * buildbot/status/html.py (StatusResourceBuild.body): revision
1776         might be numeric, so stringify it before html-escapifying it
1777         (CurrentBox.getBox): add a "waiting" state, and show a countdown
1778         timer for the upcoming build
1779         * buildbot/status/classic.css: add background-color attributes for
1780         offline/waiting/building classes
1782         * buildbot/status/builder.py (BuildStatus): derive from
1783         styles.Versioned, fix upgrade of .sourceStamp attribute. Also set
1784         the default (i.e. unknown) .slavename to "???" instead of None,
1785         since even unknown slavenames need to be printed eventually.
1786         (BuilderStatus): also derive from styles.Versioned . More
1787         importantly, determine .nextBuildNumber at creation/unpickling
1788         time by scanning the directory of saved BuildStatus instances and
1789         choosing one larger than the highest-numbered one found. This
1790         should fix the problem where random errors during upgrades cause
1791         the buildbot to forget about earlier builds. .nextBuildNumber is
1792         no longer stored in the pickle.
1793         (Status.builderAdded): if we can't unpickle the BuilderStatus,
1794         at least log the error. Also call Builder.determineNextBuildNumber
1795         once the basedir is set.
1797         * buildbot/master.py (BuildMaster.loadChanges): do
1798         styles.doUpgrade afterwards, in case I decide to make Changes
1799         derived from styles.Versioned some day and forget to make this
1800         change later.
1803         * buildbot/test/test_runner.py (Options.testForceOptions): skip
1804         when running under older pythons (<2.3) in which the shlex module
1805         doesn't have a 'split' function.
1807         * buildbot/process/step.py (ShellCommand.start): make
1808         errorMessages= be a list of strings to stuff in the log before the
1809         command actually starts. This makes it easier to flag multiple
1810         warning messages, e.g. when the Source steps have to deal with an
1811         old buildslave.
1812         (CVS.startVC): handle slaves that don't handle multiple branches
1813         by switching into 'clobber' mode
1814         (SVN.startVC): same. Also reject branches without base_url
1815         (Darcs.startVC): same. Also reject revision= in older slaves
1816         (Arch.checkSlaveVersion): same (just the multiple-branches stuff)
1817         (Bazaar.startVC): same, and test for baz separately than for arch
1819         * buildbot/slave/commands.py (cvs_ver): document new features
1821         * buildbot/process/step.py (BuildStep.slaveVersion): document it
1822         (BuildStep.slaveVersionNewEnough): more useful utility method
1823         * buildbot/test/test_steps.py (Version): start testing it
1825         * buildbot/status/words.py (IrcStatusBot.command_FORCE): note that
1826         the 'force' command requires python2.3, for the shlex.split method
1828         * docs/examples/twisted_master.cfg: remove old freshcvs stuff,
1829         since we don't use it anymore. The Twisted buildbot uses a
1830         PBChangeSource now.
1832 2005-10-21  Brian Warner  <warner@lothar.com>
1834         * buildbot/process/process_twisted.py: rework all BuildFactory
1835         classes to take a 'source' step as an argument, instead of
1836         building up the SVN instance in the factory.
1837         * docs/examples/twisted_master.cfg: enable build-on-branch by
1838         providing a base_url and default_branch
1840         * buildbot/status/words.py (IrcStatusBot.command_FORCE): add
1841         control over --branch and --revision, not that they are always
1842         legal to provide
1843         * buildbot/status/html.py (StatusResourceBuilder.force): same
1844         (StatusResourceBuild.body): display SourceStamp components
1846         * buildbot/scripts/runner.py (ForceOptions): option parser for the
1847         IRC 'force' command, so it can be shared with an eventual
1848         command-line-tool 'buildbot force' mode.
1849         * buildbot/test/test_runner.py (Options.testForceOptions): test it
1851 2005-10-20  Brian Warner  <warner@lothar.com>
1853         * buildbot/status/mail.py (MailNotifier.buildMessage): reformat
1855         * docs/examples/twisted_master.cfg: update to use Schedulers
1857         * buildbot/scripts/sample.cfg: update with Schedulers
1859         * buildbot/interfaces.py (IBuilderControl.requestBuildSoon): new
1860         method specifically for use by HTML "force build" button and the
1861         IRC "force" command. Raises an immediate error if there are no
1862         slaves available.
1863         (IBuilderControl.requestBuild): make this just submit a build, not
1864         try to check for existing slaves or set up any when-finished
1865         Deferreds or anything.
1866         * buildbot/process/builder.py (BuilderControl): same
1867         * buildbot/status/html.py (StatusResourceBuilder.force): same
1868         * buildbot/status/words.py (IrcStatusBot.command_FORCE): same
1869         * buildbot/test/test_slaves.py: same
1870         * buildbot/test/test_web.py: same
1872 2005-10-19  Brian Warner  <warner@lothar.com>
1874         * docs/examples/twisted_master.cfg: re-sync with reality: bring
1875         back python2.2 tests, turn off OS-X threadedselect-reactor tests
1877 2005-10-18  Brian Warner  <warner@lothar.com>
1879         * buildbot/status/html.py: provide 'status' argument to most
1880         StatusResourceFOO objects
1881         (StatusResourceBuild.body): href-ify the Builder name, add "Steps
1882         and Logfiles" section to make the Build page into a more-or-less
1883         comprehensive source of status information about the build
1885         * buildbot/status/mail.py (MailNotifier): include the Build's URL
1886         * buildbot/status/words.py (IrcStatusBot.buildFinished): same
1888 2005-10-17  Brian Warner  <warner@lothar.com>
1890         * buildbot/process/process_twisted.py (TwistedTrial): update Trial
1891         arguments to accomodate Twisted >=2.1.0 . I will have to figure
1892         out what to do about other projects: the correct options for
1893         recent Twisteds will not work for older ones.
1895 2005-10-15  Brian Warner  <warner@lothar.com>
1897         * buildbot/status/builder.py (Status.getURLForThing): add method
1898         to provide a URL for arbitrary IStatusFoo objects. The idea is to
1899         use this in email/IRC status clients to make them more useful, by
1900         providing the end user with hints on where to learn more about the
1901         object being reported on.
1902         * buildbot/test/test_web.py (GetURL): tests for it
1904 2005-10-14  Brian Warner  <warner@lothar.com>
1906         * buildbot/test/test_config.py (ConfigTest._testSources_1): oops,
1907         fix bug resulting from deferredResult changes
1909 2005-10-13  Brian Warner  <warner@lothar.com>
1911         * buildbot/test/test_changes.py: remove use of deferredResult
1912         * buildbot/test/test_config.py: same
1913         * buildbot/test/test_control.py: same
1914         * buildbot/test/test_status.py: same
1915         * buildbot/test/test_vc.py: this is the only remaining use, since
1916         it gets used at module level. This needs to be replaced by some
1917         sort of class-level run-once routine.
1919         * buildbot/status/words.py (IrcStatusBot.command_WATCH): fix typo
1921         * lots: implement multiple slaves per Builder, which means multiple
1922         current builds per Builder. Some highlights:
1923         * buildbot/interfaces.py (IBuilderStatus.getState): return a tuple
1924         of (state,currentBuilds) instead of (state,currentBuild)
1925         (IBuilderStatus.getCurrentBuilds): replace getCurrentBuild()
1926         (IBuildStatus.getSlavename): new method, so you can tell which
1927         slave got used. This only gets set when the build completes.
1928         (IBuildRequestStatus.getBuilds): new method
1930         * buildbot/process/builder.py (SlaveBuilder): add a .state
1931         attribute to track things like ATTACHING and IDLE and BUILDING,
1932         instead of..
1933         (Builder): .. the .slaves attribute here, which has been turned
1934         into a simple list of available slaves. Added a separate
1935         attaching_slaves list to track ones that are not yet ready for
1936         builds.
1937         (Builder.fireTestEvent): put off the test-event callback for a
1938         reactor turn, to make tests a bit more consistent.
1939         (Ping): cleaned up the slaveping a bit, now it disconnects if the
1940         ping fails due to an exception. This needs work, I'm worried that
1941         a code error could lead to a constantly re-connecting slave.
1942         Especially since I'm trying to move to a distinct remote_ping
1943         method, separate from the remote_print that we currently use.
1944         (BuilderControl.requestBuild): return a convenience Deferred that
1945         provides an IBuildStatus when the build finishes.
1946         (BuilderControl.ping): ping all connected slaves, only return True
1947         if they all respond.
1949         * buildbot/slave/bot.py (BuildSlave.stopService): stop trying to
1950         reconnect when we shut down.
1952         * buildbot/status/builder.py: implement new methods, convert
1953         one-build-at-a-time methods to handle multiple builds
1954         * buildbot/status/*.py: do the same in all default status targets
1955         * buildbot/status/html.py: report the build's slavename in the
1956         per-Build page, report all buildslaves on the per-Builder page
1958         * buildbot/test/test_run.py: update/create tests
1959         * buildbot/test/test_slaves.py: same
1960         * buildbot/test/test_scheduler.py: remove stale test
1962         * docs/buildbot.texinfo: document the new builder-specification
1963         'slavenames' parameter
1965 2005-10-12  Brian Warner  <warner@lothar.com>
1967         * buildbot/buildset.py (BuildSet): fix bug where BuildSet did not
1968         report failure correctly, causing Dependent builds to run when
1969         they shouldn't have.
1970         * buildbot/status/builder.py (BuildSetStatus): same
1971         * buildbot/test/test_buildreq.py (Set.testBuildSet): verify it
1972         (Set.testSuccess): test the both-pass case too
1973         * buildbot/test/test_dependencies.py (Dependencies.testRun_Fail):
1974         fix this test: it was ending too early, masking the failure before
1975         (Logger): specialized StatusReceiver to make sure the dependent
1976         builds aren't even started, much less completed.
1978 2005-10-07  Brian Warner  <warner@lothar.com>
1980         * buildbot/slave/bot.py (SlaveBuilder.activity): survive
1981         bot.SlaveBuilder being disowned in the middle of a build
1983         * buildbot/status/base.py (StatusReceiverMultiService): oops, make
1984         this inherit from StatusReceiver. Also upcall in __init__. This
1985         fixes the embarrasing crash when the new buildSetSubmitted method
1986         is invoked and Waterfall/etc don't implement their own.
1987         * buildbot/test/test_run.py: add a TODO note about a test to catch
1988         just this sort of thing.
1990         * buildbot/process/builder.py (Builder.attached): remove the
1991         already-attached warning, this situation is normal. Add some
1992         comments explaining it.
1994 2005-10-02  Brian Warner  <warner@lothar.com>
1996         * buildbot/changes/maildir.py (Maildir.start): Tolerate
1997         OverflowError when setting up dnotify, because some 64-bit systems
1998         have problems with signed-vs-unsigned constants and trip up on the
1999         DN_MULTISHOT flag. Patch from Brad Hards.
2001 2005-09-06  Fred Drake  <fdrake@users.sourceforge.net>
2003         * buildbot/process/step.py (BuildStep, ShellCommand): Add
2004         progressMetrics, description, descriptionDone to the 'parms' list,
2005         and make use the 'parms' list from the implementation class
2006         instead of only BuildStep to initialize the parameters.  This
2007         allows buildbot.process.factory.s() to initialize all the parms,
2008         not just those defined in directly by BuildStep.
2010 2005-09-03  Brian Warner  <warner@lothar.com>
2012         * NEWS: start adding items for the next release
2014         * docs/examples/twisted_master.cfg: (sync with reality) turn off
2015         python2.2 tests, change 'Quick' builder to only use python2.3
2017 2005-09-02  Fred Drake  <fdrake@users.sourceforge.net>
2019         * buildbot/status/html.py (StatusResourceBuilder.body): only show
2020         the "Ping Builder" button if the build control is available; the
2021         user sees an exception otherwise
2023         * docs/buildbot.texinfo (PBChangeSource): fix a typo
2025 2005-09-01  Brian Warner  <warner@lothar.com>
2027         * buildbot/interfaces.py (IBuilderStatus.getState): update
2028         signature, point out that 'build' can be None
2029         (IBuildStatus.getETA): point out ETA can be none
2031         * buildbot/status/html.py (CurrentBox.getBox): tolerate build/ETA
2032         being None
2033         * buildbot/status/words.py (IrcStatusBot.emit_status): same
2035 2005-08-31  Brian Warner  <warner@lothar.com>
2037         * buildbot/status/base.py (StatusReceiver.builderChangedState):
2038         update to match correct signature: removed 'eta' argument
2039         * buildbot/status/mail.py (MailNotifier.builderChangedState): same
2041 2005-08-30  Brian Warner  <warner@lothar.com>
2043         * buildbot/status/builder.py (LogFile): remove the assertion that
2044         blows up when you try to overwrite an existing logfile, instead
2045         just emit a warning. This case gets hit when the buildmaster is
2046         killed and doesn't get a chance to write out the serialized
2047         BuilderStatus object, so the .nextBuildNumber attribute gets out
2048         of date.
2050         * buildbot/scripts/runner.py (sendchange): add --revision_file to
2051         the 'buildbot sendchange' arguments, for the Darcs context file
2052         * docs/buildbot.texinfo (sendchange): document it
2054         * buildbot/status/html.py: add pending/upcoming builds to CurrentBox
2055         * buildbot/interfaces.py (IScheduler.getPendingBuildTimes): new method
2056         (IStatus.getSchedulers): new method
2057         * buildbot/status/builder.py (BuilderStatus): track pendingBuilds
2058         (Status.getSchedulers): implement
2059         * buildbot/process/builder.py (Builder): maintain
2060         BuilderStatus.pendingBuilds
2061         * buildbot/scheduler.py (Scheduler.getPendingBuildTimes): new method
2062         (TryBase.addChange): Try schedulers should ignore Changes
2064         * buildbot/scripts/tryclient.py (getTopdir): implement getTopdir
2065         for 'try' on CVS/SVN
2066         * buildbot/test/test_runner.py (Try.testGetTopdir): test case
2068         * buildbot/scripts/tryclient.py (Try): make jobdir-style 'try'
2069         report status properly.
2070         (Try.createJob): implement unique buildset IDs
2072         * buildbot/status/client.py (StatusClientPerspective): add a
2073         perspective_getBuildSets method for the benefit of jobdir-style
2074         'try'.
2075         * docs/buildbot.texinfo (try): more docs
2076         * buildbot/test/test_scheduler.py (Scheduling.testGetBuildSets):
2077         new test case
2079 2005-08-18  Brian Warner  <warner@lothar.com>
2081         * buildbot/scripts/tryclient.py (Try): make 'try' status reporting
2082         actually work. It's functional but still kind of clunky. Also, it
2083         only works with the pb-style.. needs to be made to work with the
2084         jobdir-style too.
2086         * buildbot/status/client.py (RemoteBuildSet): new class
2087         (RemoteBuildRequest): same
2088         (RemoteBuild.remote_waitUntilFinished): return the RemoteBuild
2089         object, not the internal BuildStatus object.
2090         (RemoteBuild.remote_subscribe): new method to subscribe to builds
2091         outside of the usual buildStarted() return value.
2092         (BuildSubscriber): support class for RemoteBuild.remote_subscribe
2094         * buildbot/scheduler.py (Try_Jobdir): convey buildsetID properly
2095         (Try_Userpass_Perspective.perspective_try): return a remotely
2096         usable BuildSetStatus object
2098         * buildbot/interfaces.py (IBuildStatus): remove obsolete
2099         isStarted()/waitUntilStarted()
2101 2005-08-16  Brian Warner  <warner@lothar.com>
2103         * buildbot/status/builder.py: implement IBuildSetStatus and
2104         IBuildRequestStatus, wire them into place.
2105         * buildbot/buildset.py: same. Add ID, move wait-until-finished
2106         methods into the BuildSetStatus object.
2107         * buildbot/interfaces.py: same
2108         (IStatus.getBuildSets): new method to get pending BuildSets
2109         (IStatusReceiver.buildsetSubmitted): new method which hears about
2110         new BuildSets
2111         * buildbot/master.py (BuildMaster.submitBuildSet): same
2112         * buildbot/process/base.py (BuildRequest): same, replace
2113         waitUntilStarted with subscribe/unsubscribe
2114         * buildbot/process/builder.py (BuilderControl.forceBuild): use
2115         subscribe instead of waitUntilStarted
2116         * buildbot/status/base.py (StatusReceiver.buildsetSubmitted): stub
2117         for new method
2118         * buildbot/status/client.py (StatusClientPerspective.builderRemoved): 
2119         same
2120         * buildbot/test/test_buildreq.py: update for new code
2121         * buildbot/test/test_control.py (Force.testRequest): same
2124         * buildbot/slave/commands.py (Darcs.doVCFull): fix get-revision
2125         for Darcs to not use the tempfile module, so it works under
2126         python-2.2 too. We really didn't need the full cleverness of that
2127         module, since the slave has exclusive control of its own builddir.
2129 2005-08-15  Brian Warner  <warner@lothar.com>
2131         * buildbot/scripts/tryclient.py (CVSExtractor): implement 'try'
2132         for CVS trees. It doesn't work for non-trunk branches,
2133         unfortunately.
2134         * buildbot/test/test_vc.py (CVS.testTry): test it, but skip the
2135         branch test
2137         * Makefile: make it easier to test against python2.2
2139         * buildbot/test/test_vc.py (VCBase.tearDown): provide for
2140         tearDown2, so things like Arch can unregister archives as they're
2141         shutting down. The previous subclass-override-tearDown technique
2142         resulted in a nested maybeWait() and test failures under
2143         Twisted-1.3.0
2145         * buildbot/scripts/tryclient.py (getSourceStamp): extract branches
2146         where we can (Arch), add a branch= argument to set the branch used
2147         when we can't
2148         (BazExtractor): extract the branch too
2149         (TlaExtractor): same
2150         * buildbot/scripts/runner.py (TryOptions): add --branch
2151         * docs/buildbot.texinfo (try): document --branch/try_branch
2153         * buildbot/slave/commands.py (Darcs): implement get-revision for
2154         Darcs, so that 'try' will work. This requires the tempfile module
2155         from python-2.3 .
2157         * buildbot/test/test_vc.py: rewrite tests, getting better coverage
2158         of revisions, branches, and 'try' in the process.
2160 2005-08-11  Brian Warner  <warner@lothar.com>
2162         * buildbot/master.py (DebugPerspective.perspective_pokeIRC): fix
2163         this, it got broken at some point in the last few releases
2164         * buildbot/status/words.py (IrcBuildRequest): reply was broken
2165         (IrcStatusBot.emit_status): handle new IBuilderStatus.getState,
2166         specifically the removal of ETA information from the tuple
2168         * buildbot/locks.py: use %d for id() instead of %x, avoid a silly
2169         warning message
2171         * docs/buildbot.texinfo (try): document both --builder and
2172         'try_builders' in .buildbot/options
2173         * buildbot/scripts/runner.py (TryOptions): add --builder,
2174         accumulate the values into opts['builders']
2175         * buildbot/scripts/tryclient.py (Try.__init__): set builders
2176         * buildbot/test/test_runner.py (Try): add some quick tests to make
2177         sure 'buildbot try --options' and .buildbot/options get parsed
2178         * buildbot/test/test_scheduler.py (Scheduling.testTryUserpass):
2179         use --builder control
2181         * docs/buildbot.texinfo (try): add --port argument to PB style
2183         * buildbot/scripts/tryclient.py (SourceStampExtractor): return an
2184         actual SourceStamp. Still need to extract a branch name, somehow.
2185         (Try): finish implementing the try client side, still need a UI
2186         for specifying which builders to use
2187         (Try.getopt): factor our options/config-file reading
2188         * buildbot/test/test_scheduler.py (Scheduling.testTryUserpass):
2189         test it
2190         * buildbot/test/test_vc.py: match SourceStampExtractor change
2192         * buildbot/scripts/runner.py (Options.opt_verbose): --verbose
2193         causes the twisted log to be sent to stderr
2195         * buildbot/scheduler.py (Try_Userpass): implement the PB style
2197 2005-08-10  Brian Warner  <warner@lothar.com>
2199         * buildbot/scripts/runner.py: Add 'buildbot try' command, jobdir
2200         style is 90% done, still missing status reporting or waiting for
2201         the buildsets to finish, and it is completely untested.
2203         * buildbot/trybuild.py: delete file, move contents to ..
2204         * buildbot/scripts/tryclient.py (getSourceStamp): .. here
2205         * buildbot/test/test_vc.py: match the move
2207         * buildbot/scheduler.py (Try_Jobdir): implement the jobdir style
2208         of the TryScheduler, no buildsetID or status-tracking support yet
2209         * buildbot/test/test_scheduler.py (Scheduling.testTryJobdir): test it
2211         * buildbot/changes/maildir.py (Maildir.setBasedir): make it
2212         possible to set the basedir after __init__ time, so it is easier
2213         to use as a Service-child of the BuildMaster instance
2215         * buildbot/changes/maildirtwisted.py (MaildirService): make a form
2216         that delivers messages to its Service parent instead of requiring
2217         a subclass to be useful. This turns out to be much easier to build
2218         unit tests around.
2220         * buildbot/scripts/tryclient.py (createJob): utility code to
2221         create jobfiles, will eventually be used by 'buildbot try'
2223 2005-08-08  Brian Warner  <warner@lothar.com>
2225         * docs/buildbot.texinfo (try): add docs on the
2226         as-yet-unimplemented Try scheduler
2228         * buildbot/test/test_buildreq.py: move Scheduling tests out to ..
2229         * buildbot/test/test_scheduler.py: .. here
2230         (Scheduling.testTryJobdir): add placeholder test for 'try'
2232         * buildbot/test/test_status.py (Log.testMerge3): update to match new
2233         addEntry merging (>=chunkSize) behavior
2234         (Log.testConsumer): update to handle new callLater(0) behavior
2236         * buildbot/test/test_web.py: rearrange tests a bit, add test for
2237         both the MAX_LENGTH bugfix and the resumeProducing hang.
2239         * buildbot/status/builder.py (LogFileProducer.resumeProducing):
2240         put off the actual resumeProducing for a moment with
2241         reactor.callLater(0). This works around a twisted-1.3.0 bug which
2242         causes large logfiles to hang midway through.
2244         * buildbot/process/step.py (BuildStep.addCompleteLog): break the
2245         logfile up into chunks, both to avoid NetstringReceiver.MAX_LENGTH
2246         and to improve memory usage when streaming the file out to a web
2247         browser.
2248         * buildbot/status/builder.py (LogFile.addEntry): change > to >= to
2249         make this work cleanly
2251 2005-08-03  Brian Warner  <warner@lothar.com>
2253         * buildbot/trybuild.py: new file for 'try' utilities
2254         (getSourceStamp): run in a tree, find out the baserev+patch
2255         * buildbot/test/test_vc.py (VCBase.do_getpatch): test it,
2256         implemented for SVN and Darcs, still working on Arch. I don't know
2257         how to make CVS work yet.
2259         * docs/buildbot.texinfo: document the 'buildbot' command-line
2260         tool, including the not-yet-implemented 'try' feature, and the
2261         in-flux .buildbot/ options directory.
2263 2005-07-20  Brian Warner  <warner@lothar.com>
2265         * buildbot/locks.py: added temporary id() numbers to Lock
2266         descriptions, to track down a not-really-sharing-the-Lock bug
2268         * buildbot/test/runutils.py: must import errno, cut-and-paste bug
2270         * buildbot/test/test_slavecommand.py (ShellBase.failUnlessIn):
2271         needed for python2.2 compatibility
2272         * buildbot/test/test_vc.py: python2.2 compatibility: generators
2273         are from the __future__
2275 2005-07-19  Brian Warner  <warner@lothar.com>
2277         * buildbot/master.py (BuildMaster.loadConfig): give a better error
2278         message when schedulers use unknown builders
2280         * buildbot/process/builder.py (Builder.compareToSetup): make sure
2281         SlaveLock('name') and MasterLock('name') are distinct
2283         * buildbot/master.py (BuildMaster.loadConfig): oops, sanity-check
2284         c['schedulers'] in such a way that we can actually accept
2285         Dependent instances
2286         * buildbot/test/test_config.py: check it
2288         * buildbot/scheduler.py (Dependent.listBuilderNames): oops, add
2289         utility method to *all* the Schedulers
2290         (Periodic.listBuilderNames): same
2292         * docs/buildbot.texinfo (Interlocks): update chapter to match
2293         reality
2295         * buildbot/master.py (BuildMaster.loadConfig): Add sanity checks
2296         to make sure that c['sources'], c['schedulers'], and c['status']
2297         are all lists of the appropriate objects, and that the Schedulers
2298         all point to real Builders
2299         * buildbot/interfaces.py (IScheduler, IUpstreamScheduler): add
2300         'listBuilderNames' utility method to support this
2301         * buildbot/scheduler.py: implement the utility method
2302         * buildbot/test/test_config.py (ConfigTest.testSchedulers): test it
2304         * docs/buildbot.texinfo: add some @cindex entries
2306         * buildbot/test/test_vc.py (Arch.createRepository): set the tla ID
2307         if it wasn't already set: most tla commands will fail unless one
2308         has been set.
2309         (Arch.createRepository): and disable bazaar's revision cache, since
2310         they cause test failures (the multiple repositories we create all
2311         interfere with each other through the cache)
2313         * buildbot/test/test_web.py (WebTest): remove use of deferredResult,
2314         bring it properly up to date with twisted-2.0 test guidelines
2316         * buildbot/master.py (BuildMaster): remove references to old
2317         'interlock' module, this caused a bunch of post-merge test
2318         failures
2319         * buildbot/test/test_config.py: same
2320         * buildbot/process/base.py (Build): same
2322         * buildbot/test/test_slaves.py: stubs for new test case
2324         * buildbot/scheduler.py: add test-case-name tag
2325         * buildbot/test/test_buildreq.py: same
2327         * buildbot/slave/bot.py (SlaveBuilder.__init__): remove some
2328         unnecessary init code
2329         (Bot.remote_setBuilderList): match it
2331         * docs/buildbot.texinfo (@settitle): don't claim version 1.0
2333         * buildbot/changes/mail.py (parseSyncmail): update comment
2335         * buildbot/test/test_slavecommand.py: disable Shell tests on
2336         platforms that don't suport IReactorProcess
2338         * buildbot/status/builder.py (LogFile): remove the 't' mode from
2339         all places where we open logfiles. It causes OS-X to open the file
2340         in some weird mode that that prevents us from mixing reads and
2341         writes to the same filehandle, which we depend upon to implement
2342         _generateChunks properly. This change doesn't appear to break
2343         win32, on which "b" and "t" are treated differently but a missing
2344         flag seems to be interpreted as "t".
2346 2005-07-18  Brian Warner  <warner@lothar.com>
2348         * buildbot/slave/commands.py (ShellCommand): overhaul
2349         error-handling code, to try and make timeout/interrupt work
2350         properly, and make win32 happier
2351         * buildbot/test/test_slavecommand.py: clean up, stop using
2352         reactor.iterate, add tests for timeout and interrupt
2353         * buildbot/test/sleep.py: utility for a new timeout test
2355         * buildbot/twcompat.py: copy over twisted 1.3/2.0 compatibility
2356         code from the local-usebranches branch
2358 2005-07-17  Brian Warner  <warner@lothar.com>
2360         * buildbot/process/process_twisted.py
2361         (TwistedReactorsBuildFactory): change the treeStableTimer to 5
2362         minutes, to match the other twisted BuildFactories, and don't
2363         excuse failures in c/qt/win32 reactors any more.
2365         * docs/examples/twisted_master.cfg: turn off the 'threadless' and
2366         'freebsd' builders, since the buildslaves have been unavailable
2367         for quite a while
2369 2005-07-13  Brian Warner  <warner@lothar.com>
2371         * buildbot/test/test_vc.py (VCBase.do_branch): test the new
2372         build-on-branch feature
2374         * buildbot/process/step.py (Darcs.__init__): add base_url and
2375         default_branch arguments, just like SVN
2376         (Arch.__init__): note that the version= argument is really the
2377         default branch name
2379         * buildbot/slave/commands.py (SourceBase): keep track of the
2380         repository+branch that was used for the last checkout in
2381         SRCDIR/.buildbot-sourcedata . If the contents of this file do not
2382         match, we clobber the directory and perform a fresh checkout
2383         rather than trying to do an in-place update. This should protect
2384         us against trying to get to branch B by doing an update in a tree
2385         obtained from branch A.
2386         (CVS.setup): add CVS-specific sourcedata: root, module, and branch
2387         (SVN.setup): same, just the svnurl
2388         (Darcs.setup): same, just the repourl
2389         (Arch.setup): same, arch coordinates (url), version, and
2390         buildconfig. Also pull the buildconfig from the args dictionary,
2391         which we weren't doing before, so the build-config was effectively
2392         disabled.
2393         (Arch.sourcedirIsUpdateable): don't try to update when we're
2394         moving to a specific revision: arch can't go backwards, so it is
2395         safer to just clobber the tree and checkout a new one at the
2396         desired revision.
2397         (Bazaar.setup): same sourcedata as Arch
2399         * buildbot/test/test_dependencies.py (Dependencies.testRun_Fail):
2400         use maybeWait, to work with twisted-1.3.0 and twcompat
2401         (Dependencies.testRun_Pass): same
2403         * buildbot/test/test_vc.py: rearrange, cleanup
2405         * buildbot/twcompat.py: add defer.waitForDeferred and
2406         utils.getProcessOutputAndValue, so test_vc.py (which uses them)
2407         can work under twisted-1.3.0 .
2409         * buildbot/test/test_vc.py: rewrite. The sample repositories are
2410         now created at setUp time. This increases the runtime of the test
2411         suite considerably (from 91 seconds to 151), but it removes the
2412         need for an offline tarball, which should solve a problem I've
2413         seen where the test host has a different version of svn than the
2414         tarball build host. The new code also validates that mode=update
2415         really picks up recent commits. This approach will also make it
2416         easier to test out branches, because the code which creates the VC
2417         branches is next to the code which uses them. It will also make it
2418         possible to test some change-notification hooks, by actually
2419         performing a VC commit and watching to see the ChangeSource get
2420         notified.
2422 2005-07-12  Brian Warner  <warner@lothar.com>
2424         * docs/buildbot.texinfo (SVN): add branches example
2425         * docs/Makefile (buildbot.ps): add target for postscript manual
2427         * buildbot/test/test_dependencies.py: s/test_interlocks/test_locks/ 
2428         * buildbot/test/test_locks.py: same
2430         * buildbot/process/step.py (Darcs): comment about default branches
2432         * buildbot/master.py (BuildMaster.loadConfig): don't look for
2433         c['interlocks'] in the config file, complain if it is present.
2434         Scan all locks in c['builders'] to make sure the Locks they use
2435         are uniquely named.
2436         * buildbot/test/test_config.py: remove old c['interlocks'] test,
2437         add some tests to check for non-uniquely-named Locks
2438         * buildbot/test/test_vc.py (Patch.doPatch): fix factory.steps,
2439         since the unique-Lock validation code requires it now
2441         * buildbot/locks.py: fix test-case-name
2443         * buildbot/interlock.py: remove old file
2445 2005-07-11  Brian Warner  <warner@lothar.com>
2447         * buildbot/test/test_interlock.py: rename to..
2448         * buildbot/test/test_locks.py: .. something shorter
2450         * buildbot/slave/bot.py (BuildSlave.stopService): newer Twisted
2451         versions (after 2.0.1) changed internet.TCPClient to shut down the
2452         connection in stopService. Change the code to handle this
2453         gracefully.
2455         * buildbot/process/base.py (Build): handle whole-Build locks
2456         * buildbot/process/builder.py (Builder.compareToSetup): same
2457         * buildbot/test/test_interlock.py: make tests work
2459         * buildbot/process/step.py (BuildStep.startStep): complain if a
2460         Step tries to claim a lock that's owned by its own Build
2461         (BuildStep.releaseLocks): typo
2463         * buildbot/locks.py (MasterLock): use ComparableMixin so config
2464         file reloads don't replace unchanged Builders
2465         (SlaveLock): same
2466         * buildbot/test/test_config.py (ConfigTest.testInterlocks):
2467         rewrite to cover new Locks instead of old c['interlocks']
2468         * buildbot/test/runutils.py (RunMixin.connectSlaves): remember
2469         slave2 too
2472         * buildbot/test/test_dependencies.py (Dependencies.setUp): always
2473         start the master and connect the buildslave
2475         * buildbot/process/step.py (FailingDummy.done): finish with a
2476         FAILURE status rather than raising an exception
2478         * buildbot/process/base.py (BuildRequest.mergeReasons): don't try to
2479         stringify a BuildRequest.reason that is None
2481         * buildbot/scheduler.py (BaseUpstreamScheduler.buildSetFinished):
2482         minor fix
2483         * buildbot/status/builder.py (BuildSetStatus): implement enough to
2484         allow scheduler.Dependent to work
2485         * buildbot/buildset.py (BuildSet): set .reason and .results
2487         * buildbot/test/test_interlock.py (Locks.setUp): connect both
2488         slaves, to make the test stop hanging. It still fails, of course,
2489         because I haven't even started to implement Locks.
2491         * buildbot/test/runutils.py (RunMixin.connectSlaves): new utility
2493         * docs/buildbot.texinfo (Build-Dependencies): redesign the feature
2494         * buildbot/interfaces.py (IUpstreamScheduler): new Interface
2495         * buildbot/scheduler.py (BaseScheduler): factor out common stuff
2496         (Dependent): new class for downstream build dependencies
2497         * buildbot/test/test_dependencies.py: tests (still failing)
2499         * buildbot/buildset.py (BuildSet.waitUntilSuccess): minor notes
2501 2005-07-07  Brian Warner  <warner@lothar.com>
2503         * buildbot/test/runutils.py (RunMixin): factored this class out..
2504         * buildbot/test/test_run.py: .. from here
2505         * buildbot/test/test_interlock.py: removed old c['interlock'] tests,
2506         added new buildbot.locks tests (which all hang right now)
2507         * buildbot/locks.py (SlaveLock, MasterLock): implement Locks
2508         * buildbot/process/step.py: claim/release per-BuildStep locks
2510         * docs/Makefile: add 'buildbot.html' target
2512         * buildbot/process/step.py (CVS.__init__): allow branch=None to be
2513         interpreted as "HEAD", so that all VC steps can accept branch=None
2514         and have it mean the "default branch".
2516         * docs/buildbot.texinfo: add Schedulers, Dependencies, and Locks
2518 2005-07-07  Brian Warner  <warner@lothar.com>
2520         * docs/examples/twisted_master.cfg: update to match current usage
2522         * docs/buildbot.texinfo (System Architecture): comment out the
2523         image, it doesn't exist yet and just screws up the HTML manual.
2525 2005-07-05  Brian Warner  <warner@lothar.com>
2527         * debian/.cvsignore: oops, missed one. Removing leftover file.
2529 2005-06-17  Brian Warner  <warner@lothar.com>
2531         * buildbot/test/test_vc.py (VCSupport.__init__): svn --version
2532         changed its output in 1.2.0, don't mistakenly think that the
2533         subversion we find isn't capable of supporting our tests.
2535         * debian/*: remove the debian/ directory and its contents, to make
2536         life easier for the proper Debian maintainer
2537         * MANIFEST.in: same
2538         * Makefile (release): same
2540 2005-06-07  Brian Warner  <warner@lothar.com>
2542         * everything: create a distinct SourceStamp class to replace the
2543         ungainly 4-tuple, let it handle merging instead of BuildRequest.
2544         Changed the signature of Source.startVC to include the revision
2545         information (instead of passing it through self.args). Implement
2546         branches for SVN (now only Darcs/Git is missing support). Add more
2547         Scheduler tests.
2549 2005-06-06  Brian Warner  <warner@lothar.com>
2551         * everything: rearrange build scheduling. Create a new Scheduler
2552         object (configured in c['schedulers'], which submit BuildSets to a
2553         set of Builders. Builders can now use multiple slaves. Builds can
2554         be run on alternate branches, either requested manually or driven
2555         by changes. This changed some of the Status classes. Interlocks
2556         are out of service until they've been properly split into Locks
2557         and Dependencies. treeStableTimer, isFileImportant, and
2558         periodicBuild have all been moved from the Builder to the
2559         Scheduler.
2560         (BuilderStatus.currentBigState): removed the 'waiting' and
2561         'interlocked' states, removed the 'ETA' argument.
2563 2005-05-24  Brian Warner  <warner@lothar.com>
2565         * buildbot/pbutil.py (ReconnectingPBClientFactory): Twisted-1.3
2566         erroneously abandons the connection (in clientConnectionFailed)
2567         for non-UserErrors, which means that if we lose the connection due
2568         to a network problem or a timeout, we'll never try to reconnect.
2569         Fix this by not upcalling to the buggy parent method. Note:
2570         twisted-2.0 fixes this, but the function only has 3 lines so it
2571         makes more sense to copy it than to try and detect the buggyness
2572         of the parent class. Fixes SF#1207588.
2574         * buildbot/changes/changes.py (Change.branch): doh! Add a
2575         class-level attribute to accomodate old Change instances that were
2576         pickled before 0.6.5 (where .branch was added for new Changes).
2577         This fixes the exception that occurs when you try to look at an
2578         old Change (through asHTML).
2580         * buildbot/__init__.py (version): bump to 0.6.6+ while between
2581         releases
2583 2005-05-23  Brian Warner  <warner@lothar.com>
2585         * buildbot/__init__.py (version): release 0.6.6
2587 2005-05-23  Brian Warner  <warner@lothar.com>
2589         * NEWS: update for 0.6.6 release
2590         * debian/changelog: same
2592         * buildbot/scripts/runner.py (start): put the basedir in sys.path
2593         before starting: this was done by twistd back when we spawned it,
2594         now that we're importing the pieces and running them in the
2595         current process, we have to do it ourselves. This allows
2596         master.cfg to import files from the same directory without
2597         explicitly manipulating PYTHONPATH. Thanks to Thomas Vander
2598         Stichele for the catch.
2599         (Options.opt_version): Add a --version command (actually, just make
2600         the existing --version command emit Buildbot's version too)
2602         * buildbot/status/builder.py (HTMLLogFile.upgrade): oops! second
2603         fix to make this behave like other LogFiles, this time to handle
2604         existing LogFiles on disk. (add the missing .upgrade method)
2605         * buildbot/test/test_status.py (Log.testHTMLUpgrade): test it
2607 2005-05-21  Brian Warner  <warner@lothar.com>
2609         * buildbot/test/test_runner.py (Create.testMaster): match the
2610         rawstring change in runner.py:masterTAC
2612         * buildbot/test/test_config.py (ConfigTest.testIRC): skip unless
2613         TwistedWords is installed
2614         * buildbot/test/test_status.py: same, with TwistedMail
2616         * buildbot/master.py: remove old IRC/Waterfall imports (used by
2617         some old, deprecated, and removed config keys). This should enable
2618         you to use the base buildbot functionality with Twisted-2.0.0 when
2619         you don't also have TwistedWeb and TwistedWords installed
2621 2005-05-20  Brian Warner  <warner@lothar.com>
2623         * buildbot/scripts/runner.py (run): call sendchange(), not
2624         do_sendchange(): thus 'buildbot sendchange' was broken in 0.6.5
2625         (run): call stop("HUP"), not "-HUP", 'buildbot stop' was broken.
2626         (stop): don't wait for process to die when sending SIGHUP
2627         (masterTAC): use a rawstring for basedir=, otherwise '\' in the
2628         directory name gets interpreted, which you don't want
2629         (slaveTAC): same
2631         * buildbot/__init__.py (version): bump to 0.6.5+ while between
2632         releases
2634 2005-05-18  Brian Warner  <warner@lothar.com>
2636         * buildbot/__init__.py (version): Releasing buildbot-0.6.5
2638 2005-05-18  Brian Warner  <warner@lothar.com>
2640         * README: update for 0.6.5
2641         * debian/changelog: same
2643         * buildbot/changes/changes.py: rename tag= to branch=, since
2644         that's how we're using it, and my design for the upcoming "build a
2645         specific branch" feature wants it. also, tag= was too CVS-centric
2646         * buildbot/changes/mail.py (parseSyncmail): same
2647         * buildbot/process/base.py (Build.isBranchImportant): same
2648         * buildbot/test/test_mailparse.py (Test3.testMsgS4): same
2649         * docs/buildbot.texinfo (Attributes of Changes): same
2651         * NEWS: update tag=, update for upcoming release
2653 2005-05-17  Brian Warner  <warner@lothar.com>
2655         * buildbot/scripts/runner.py (stop): actually poll once per
2656         second, instead of re-killing the poor daemon once per second.
2657         Sleep briefly (0.1s) before the first poll, since there's a good
2658         chance we can avoid waiting the full second if the daemon shuts
2659         down quickly. Also remove the sys.exit() at the end.
2660         (start): remove the unneighborly sys.exit()
2662         * Makefile: improve permission-setting to not kick Arch so badly
2664         * buildbot/scripts/runner.py (SlaveOptions.optParameters): set a
2665         default --keepalive=600, since it doesn't hurt very much, and it's
2666         a hassle to discover that you need it.
2667         * buildbot/test/test_runner.py (Create.testSlave): test it
2669         * buildbot/status/words.py (IrcStatusBot.buildFinished): Teach the
2670         IRC bot about EXCEPTION
2672         * buildbot/status/client.py (PBListener): upcall more correctly
2674         * buildbot/process/base.py (Build.allStepsDone): if a step caused
2675         an exception mark the overall build with EXCEPTION, not SUCCESS
2677         * buildbot/scripts/runner.py (makefile_sample): remove the leading
2678         newline
2679         * buildbot/status/mail.py (MailNotifier): oops, forgot to upcall
2680         * Makefile: update some release-related stuff
2682         * buildbot/slave/commands.py (ShellCommand.kill): if somehow this
2683         gets called when there isn't actually an active process, just end
2684         the Command instead of blowing up. I don't know how it gets into
2685         this state, but the twisted win32 buildslave will sometimes hang,
2686         and when it shakes its head and comes back, it thinks it's still
2687         running a Command. The next build causes this command to be
2688         interrupted, but the lack of self.process.pid breaks the interrupt
2689         attempt.
2691         * NEWS: document changes since the last release
2693         * buildbot/scripts/runner.py (start): change 'buildbot start' to
2694         look for Makefile.buildbot instead of a bare Makefile . The
2695         'buildbot start' does not install this file, so you have to
2696         manually copy it if you want to customize startup behavior.
2697         (createMaster): change 'buildbot master' command to create
2698         Makefile.sample instead of Makefile, to create master.cfg.sample
2699         instead of master.cfg (requiring you to copy it before the
2700         buildmaster can be started). Both sample files are kept up to
2701         date, i.e. they are overwritten if they have been changed. The
2702         'buildbot.tac' file is *not* overwritten, but if the new contents
2703         don't match the old, a 'buildbot.tac.new' file is created and the
2704         user is warned. This seems to be a much more sane way to handle
2705         startup files. Also, don't sys.exit(0) when done, so we can run
2706         unit tests against it.
2707         (createSlave): same. Don't overwrite the sample info/ files.
2708         * buildbot/scripts/sample.mk: remove. the contents were pulled
2709         into runner.py, since they need to match the behavior of start()
2710         * setup.py: same
2711         * MANIFEST.in: same
2713         * docs/buildbot.texinfo (Launching the daemons): document it
2714         * buildbot/test/test_runner.py (Create): test it
2716         * buildbot/test/test_vc.py (SetupMixin.failUnlessIn): Add a
2717         version that can handle string-in-string tests, because otherwise
2718         python-2.2 fails the tests. It'd be tremendous if Trial's test
2719         took two strings under 2.2 too.
2721         * everything: fixed all deprecation warnings when running against
2722         Twisted-2.0 . (at least all the ones in buildbot code, there are a
2723         few that come from Twisted itself). This involved putting most of
2724         the Twisted-version specific code in the new buildbot.twcompat
2725         module, and creating some abstract base classes in
2726         buildbot.changes.base and buildbot.status.base (which might be
2727         useful anyway). __implements__ is a nuisance and requires an ugly
2728         'if' clause everywhere.
2730         * buildbot/test/test_status.py (Mail.testMail): add a 0.1 second
2731         delay before finishing the test: it seems that smtp.sendmail
2732         doesn't hang up on the server, so we must wait a moment so it can
2733         hang up on us. This removes the trial warning about an unclean
2734         reactor.
2736 2005-05-16  Brian Warner  <warner@lothar.com>
2738         * buildbot/process/step.py (Source): add 'retry' argument. It is a
2739         tuple of (delay, repeats).
2740         * buildbot/test/test_vc.py (Retry): test it
2741         * docs/buildbot.texinfo (Source Checkout): document it
2742         * buildbot/slave/commands.py (SourceBase): add 'retry' parameter.
2743         (SourceBase.maybeDoVCRetry): If 'retry' is set, failures in
2744         doVCFull() are handled by re-trying the checkout (after a delay)
2745         some number of times.
2746         (ShellCommand._startCommand): make header lines easier to read
2748         * buildbot/test/test_web.py (WebTest.tearDown): factor out master
2749         shutdown
2750         (WebTest.test_logfile): make sure master gets shut down, silences
2751         some "unclean reactor" test errors
2753         * buildbot/test/test_changes.py (Sender.tearDown): spin the
2754         reactor once after shutdown, something in certain versions of
2755         Twisted trigger a test failure. 1.3.0 is ok, 2.0.0 fails, 2.0.1pre
2756         fails, svn-trunk is ok.
2758         * buildbot/test/test_slavecommand.py (Shell.testShellZ): add a
2759         second win32 error message
2761         * buildbot/test/test_run.py (Status.testSlave): be smarter about
2762         validating the ETA, so the tests don't fail on slow systems
2764 2005-05-15  Brian Warner  <warner@lothar.com>
2766         * buildbot/status/builder.py (HTMLLogFile): make this behave like
2767         the new LogFile class, so upgrading works properly
2768         (LogFileProducer.resumeProducing): survive resumeProducing after
2769         we've exhausted the chunkGenerator
2771         * buildbot/test/test_web.py (WebTest.test_logfile): validate HTML
2772         logs too
2773         * buildbot/test/test_status.py (Log.testAdd): validate hasContents
2774         (Log.testUpgrade): same
2776         * docs/buildbot.texinfo (Maintenance): describe how to delete old
2777         Builds and logs with a cron job.
2779         * buildbot/status/builder.py (LogFile): revamp LogFiles. Got rid
2780         of the old non-offline LogFile, added code to upgrade these to
2781         new-style contents-live-on-disk instances at load time (in a way
2782         that doesn't invalidate the old Build pickles, so upgrading to
2783         0.6.5 is not a one-way operation). Got rid of everything related
2784         to 'stub' builds.
2785         (LogFile.__init__): create LogFiles with the parent step status,
2786         the log's name, and a builder-relative filename where it can keep
2787         the contents on disk.
2788         (LogFile.hasContents): new method, clients are advised to call it
2789         before getText or getChunks and friends. If it returns False, the
2790         log's contents have been deleted and getText() will raise an
2791         error.
2792         (LogFile.getChunks): made it a generator
2793         (LogFile.subscribeConsumer): new method, takes a Twisted-style
2794         Consumer (except one that takes chunks instead of strings). This
2795         enables streaming of very large logfiles without storing the whole
2796         thing in memory.
2797         (BuildStatus.generateLogfileName): create names like
2798         12-log-compile-output, with a _0 suffix if required to be unique
2799         (BuildStatus.upgradeLogfiles): transform any old-style (from 0.6.4
2800         or earlier) logfiles into new-style ones
2801         (BuilderStatus): remove everything related to 'stub' builds. There
2802         is now only one build cache, and we don't strip logs from old
2803         builds anymore.
2804         (BuilderStatus.getBuildByNumber): check self.currentBuild too,
2805         since we no longer fight to keep it in the cache
2807         * buildbot/status/html.py (TextLog.render_GET): use a
2808         ChunkConsumer to stream the log entries efficiently.
2809         (ChunkConsumer): wrapper which consumes chunks and writes
2810         formatted HTML.
2812         * buildbot/test/test_twisted.py (Parse.testParse): use a
2813         LogFile-like object instead of a real one
2815         * buildbot/test/test_status.py (MyLog): handle new LogFile code
2816         (Log.testMerge3): validate more merge behavior
2817         (Log.testChunks): validate LogFile.getChunks
2818         (Log.testUpgrade): validate old-style LogFile upgrading
2819         (Log.testSubscribe): validate LogFile.subscribe
2820         (Log.testConsumer): validate LogFile.subscribeConsumer
2822         * buildbot/interfaces.py (IStatusLogStub): remove
2823         (IStatusLog.subscribeConsumer): new method
2824         (IStatusLog.hasContents): new method
2825         (IStatusLogConsumer): describes things passed to subscribeConsumer
2827         * buildbot/status/html.py (StepBox.getBox): Don't offer an href to
2828         the log contents if it does not have any contents.
2829         (StatusResourceBuildStep.body): same
2830         (StatusResourceBuildStep.getChild): give a 404 for empty logs
2832 2005-05-14  Brian Warner  <warner@lothar.com>
2834         * buildbot/test/test_web.py (WebTest.test_logfile): add 5-second
2835         timeouts to try and make the windows metabuildslave not hang
2837 2005-05-13  Mike Taylor  <bear@code-bear.com>
2839         * buildbot/slave/commands.py (rmdirRecursive): added a check
2840         to ensure the path passed into rmdirRecursive actually exists.
2841         On win32 a non-existant path would generate an exception.
2843 2005-05-13  Brian Warner  <warner@lothar.com>
2845         * buildbot/slave/commands.py (rmdirRecursive): replacement for
2846         shutil.rmtree which behaves correctly on windows in the face of
2847         files that you have to chmod before deleting. Thanks to Bear at
2848         the OSAF for the routine.
2849         (SourceBase.doClobber): use rmdirRecursive
2851 2005-05-12  Brian Warner  <warner@lothar.com>
2853         * buildbot/status/builder.py (OfflineLogFile.getChunks): have this
2854         method generate chunks instead of returning a big list. This
2855         allows the same method to be used for both old LogFile and new
2856         OfflineLogFile.
2857         (OfflineLogFile.getText): use the generator
2858         (OfflineLogFile.subscribe): same
2859         * buildbot/status/html.py (TextLog.resumeProducing): same
2860         * buildbot/interfaces.py (IStatusLog.getChunks): document it
2862         * buildbot/test/test_web.py (WebTest.test_logfile): Add a test to
2863         point out that OfflineLogFile does not currently work with
2864         html.Waterfall . Fixing this is high-priority.
2866         * buildbot/scripts/runner.py (start): add --logfile=twistd.log, since
2867         apparently windows defaults to using stdout
2869         * buildbot/test/test_slavecommand.py (Shell.testShellZ): log a
2870         better message on failure so I can figure out the win32 problem
2872         * buildbot/slave/commands.py (ShellCommand._startCommand): update
2873         log messages to include more useful copies of the command being
2874         run, the argv array, and the child command's environment.
2875         (Git.doVCFull): update cg-close usage, patch from Brandon Philips.
2877 2005-05-11  Brian Warner  <warner@lothar.com>
2879         * setup.py: oops, install debug.glade so 'buildbot debugclient'
2880         will actually work
2881         * Makefile: update the deb-snapshot version
2883         * docs/buildbot.texinfo: move all .xhtml docs into a new
2884         .texinfo-format document, adding a lot of material in the process.
2885         This is starting to look like a real user's manual. Removed all
2886         the Lore-related files: *.xhtml, *.css, template.tpl .
2887         * docs/Makefile: simple makefile to run 'makeinfo'
2888         * buildbot/scripts/sample.cfg: rearrange slightly
2889         * MANIFEST.in: include .info and .textinfo, don't include *.xhtml
2891 2005-05-10  Brian Warner  <warner@lothar.com>
2893         * buildbot/scripts/runner.py (start): Twisted-1.3.0 used a
2894         different name for the internal twistw module, handle it.
2896         * MANIFEST.in: we deleted plugins.tml, so stop shipping it
2897         * setup.py: .. and stop trying to install it
2899         * buildbot/process/step.py (Git): added support for 'cogito' (aka
2900         'git'), the new linux kernel VC system (http://kernel.org/git/).
2901         Thanks to Brandon Philips for the patch.
2902         * buildbot/slave/commands.py (Git): same
2904 2005-05-06  Brian Warner  <warner@lothar.com>
2906         * buildbot/status/builder.py (OfflineLogFile): replace the default
2907         LogFile with a form that appends its new contents to a disk file
2908         as they arrive. The complete log data is never kept in RAM. This
2909         is the first step towards handling very large (100MB+) logfiles
2910         without choking quite so badly. (The other half is
2911         producer/consumer on the HTML pages).
2912         (BuildStepStatus.addLog): use OfflineLogFile by default
2913         (BuildStatus.getLogfileName): helper code to give the
2914         OfflineLogFile a filename to work with
2916         * buildbot/test/test_status.py (Results.testAddResults): update
2917         tests to handle new asserts
2918         * buildbot/test/test_vc.py (Patch.doPatch): same
2919         * buildbot/test/test_steps.py (BuildStep.setUp): same
2921 2005-05-05  Brian Warner  <warner@lothar.com>
2923         * buildbot/scripts/runner.py (start): if there is no Makefile,
2924         launch the app by importing twistd's internals and calling run(),
2925         rather than spawning a new twistd process. This stands a much
2926         better chance of working under windows.
2927         (stop): kill the process with os.kill instead of spawning
2928         /bin/kill, again to reduce the number of external programs which
2929         windows might not have in the PATH. Also wait up to 5 seconds for
2930         the process to go away, allowing things like 'buildbot stop;
2931         buildbot start' to be reliable in the face of slow shutdowns.
2933         * buildbot/master.py (Dispatcher.__getstate__): remove old
2934         .tap-related methods
2935         (BuildMaster.__getstate__): same
2936         (makeService): same
2937         * buildbot/slave/bot.py (makeService): same
2938         (Options.longdesc): same
2939         * buildbot/scripts/runner.py: copy over some old mktap option text
2941         * buildbot/scripts/runner.py (masterTAC): stop using mktap.
2942         'buildbot master' now creates a buildbot.tac file, so there is no
2943         longer a create-instance/save/reload sequence. mktap is dead, long
2944         live twistd -y.
2945         * buildbot/scripts/sample.mk: use twistd -y, not -f
2946         * buildbot/test/test_config.py: remove mktap-based test
2947         * buildbot/bb_tap.py, buildbot/plugins.tml: delete old files
2948         * README: don't reference mktap
2950         * docs/source.xhtml: document some of the attributes that Changes
2951         might have
2953         * docs/steps.xhtml (Bazaar): document the Bazaar checkout step
2955         * general: merge in Change(tag=) patch from Thomas Vander Stichele.
2956         [org.apestaart@thomas--buildbot/buildbot--cvstag--0-dev--patch-2]
2957         * buildbot/changes/changes.py (Change)
2958         * buildbot/changes/mail.py (parseSyncmail)
2959         * buildbot/test/test_mailparse.py (Test3.getNoPrefix)
2960         (Test3.testMsgS5)
2961         * buildbot/process/base.py (Build.isTagImportant)
2962         (Build.addChange)
2965 2005-05-04  Brian Warner  <warner@lothar.com>
2967         * buildbot/clients/sendchange.py (Sender.send): tear down the PB
2968         connection after sending the change, so that unit tests don't
2969         complain about sockets being left around
2971         * buildbot/status/html.py (WaterfallStatusResource.body): fix
2972         exception in phase=0 rendering
2973         * buildbot/test/test_web.py (WebTest.test_waterfall): test it
2975         * buildbot/changes/dnotify.py (DNotify.__init__): remove debug msg
2977         * buildbot/master.py (BuildMaster.loadConfig): finally remove
2978         deprecated config keys: webPortnum, webPathname, irc, manholePort,
2979         and configuring builders with tuples.
2980         * buildbot/test/test_config.py: stop testing compatibility with
2981         deprecated config keys
2982         * buildbot/test/test_run.py: same
2984 2005-05-03  Brian Warner  <warner@lothar.com>
2986         * contrib/arch_buildbot.py: survive if there are no logfiles
2987         (username): just use a string, os.getlogin isn't reliable
2989         * buildbot/scripts/runner.py (sendchange): oops, fix the command
2990         so 'buildbot sendchange' actually works. The earlier test only
2991         covered the internal (non-reactor-running) form.
2993         * contrib/arch_buildbot.py: utility that can run as an Arch hook
2994         script to notify the buildmaster about changes
2996         * buildbot/scripts/runner.py (sendchange): new command to send a
2997         change to a buildbot.changes.pb.PBChangeSource receiver.
2998         * buildbot/test/test_changes.py (Sender): test it
3000         * buildbot/master.py (BuildMaster.startService): mark .readConfig
3001         after any reading of the config file, not just when we do it in
3002         startService. This makes some tests a bit cleaner.
3004         * buildbot/changes/pb.py: add some log messages
3006         * buildbot/process/base.py (Build.startBuild): fix a bug that
3007         caused an exception when the build terminated in the very first
3008         step.
3009         (Build.stepDone): let steps return a status of EXCEPTION. This
3010         terminates the build right away, and sets the build's overall
3011         status to EXCEPTION too.
3012         * buildbot/process/step.py (BuildStep.failed): return a status of
3013         EXCEPTION when that is what has happened.
3015         * buildbot/process/step.py (Arch.computeSourceRevision): finally
3016         implement this, allowing Arch-based projects to get precise
3017         checkouts instead of always using the latest code
3018         (Bazaar): create variant of Arch to let folks use baz instead of
3019         tla. Requires a new buildslave too.
3020         * buildbot/slave/commands.py (Arch): add 'revision' argument
3021         (Bazaar): create variant of Arch that uses baz instead of tla.
3022         Remove the code that extracts the archive name from the
3023         register-archive output, since baz doesn't provide it, and require
3024         the user provide both the archive name and its location.
3025         * buildbot/test/test_vc.py (VC.testBazaar): added tests
3027 2005-05-02  Brian Warner  <warner@lothar.com>
3029         * buildbot/scripts/sample.cfg: improve docs for c['buildbotURL'],
3030         thanks to Nick Trout.
3032         * buildbot/scripts/runner.py (Maker.makefile): chmod before edit,
3033         deals better with source Makefile coming from a read-only CVS
3034         checkout. Thanks to Nick Trout for the catch.
3036         * buildbot/__init__.py (version): bump to 0.6.4+ while between
3037         releases
3039 2005-04-28  Brian Warner  <warner@lothar.com>
3041         * buildbot/__init__.py (version): Releasing buildbot-0.6.4
3043         * debian/changelog: update for 0.6.4
3045 2005-04-28  Brian Warner  <warner@lothar.com>
3047         * README.w32: add a checklist of steps for getting buildbot
3048         running on windows.
3049         * MANIFEST.in: include it in the tarball
3051         * NEWS: update
3053         * buildbot/master.py (BuildMaster.upgradeToVersion3): deal with
3054         broken .tap files from 0.6.3 by getting rid of .services,
3055         .namedServices, and .change_svc at load time.
3057 2005-04-27  Brian Warner  <warner@lothar.com>
3059         * NEWS: update in preparation for new release
3061         * buildbot/test/test_config.py (Save.testSave): don't pull in
3062         twisted.scripts.twistd, we don't need it and it isn't for windows
3063         anyway.
3065         * buildbot/changes/changes.py (ChangeMaster.saveYourself):
3066         accomodate win32 which can't do atomic-rename
3068 2005-04-27  Brian Warner  <warner@lothar.com>
3070         * buildbot/test/test_run.py (Disconnect.testBuild2): crank up some
3071         timeouts to help the slow metabuildbot not flunk them so much
3072         (Disconnect.testBuild3): same
3073         (Disconnect.testBuild4): same
3074         (Disconnect.testInterrupt): same
3076         * buildbot/master.py (BuildMaster.loadChanges): fix change_svc
3077         setup, it was completely broken for new buildmasters (those which
3078         did not have a 'change.pck' already saved. Thanks to Paul Warren
3079         for catching this (embarrassing!) bug.
3080         (Dispatcher.__getstate__): don't save our registered avatar
3081         factories, since they'll be re-populated when the config file is
3082         re-read.
3083         (BuildMaster.__init__): add a dummy ChangeMaster, used only by
3084         tests (since the real mktap-generated BuildMaster doesn't save
3085         this attribute).
3086         (BuildMaster.__getstate__): don't save any service children,
3087         they'll all be re-populated when the config file is re-read.
3088         * buildbot/test/test_config.py (Save.testSave): test for this
3090 2005-04-26  Brian Warner  <warner@lothar.com>
3092         * buildbot/buildbot.png: use a new, smaller (16x16) icon image,
3093         rendered with Blender.. looks a bit nicer.
3094         * buildbot/docs/images/icon.blend: add the Blender file for it
3096         * buildbot/slave/commands.py (ShellCommand._startCommand): prepend
3097         'cmd.exe' (or rather os.environ['COMSPEC']) to the argv list when
3098         running under windows. This appears to be the best way to allow
3099         BuildSteps to do something normal like 'trial -v buildbot.test' or
3100         'make foo' and still expect it to work. The idea is to make the
3101         BuildSteps look as much like what a developer would type when
3102         compiling or testing the tree by hand. This approach probably has
3103         problems when there are spaces in the arguments, so if you've got
3104         windows buildslaves, you'll need to pay close attention to your
3105         commands.
3107         * buildbot/status/html.py (WaterfallStatusResource.body): add the
3108         timezone to the timestamp column.
3109         * buildbot/test/test_web.py (WebTest.test_waterfall): test it
3111         * buildbot/scripts/runner.py (loadOptions): do something sane for
3112         windows, I think. We use %APPDATA%/buildbot instead of
3113         ~/.buildbot, but we still search everywhere from the current
3114         directory up to the root for a .buildbot/ subdir. The "is it under
3115         $HOME" security test was replaced with "is it owned by the current
3116         user", which is only performed under posix.
3117         * buildbot/test/test_runner.py (Options.testFindOptions): update
3118         tests to match. The "is it owned by the current user" check is
3119         untested. The test has been re-enabled for windows.
3121         * buildbot/test/test_slavecommand.py (Shell.checkOutput): replace
3122         any "\n" in the expected output with the platform-specific line
3123         separator. Make this separator "\r\n" on PTYs under unix, they
3124         seem to do that and I don't know why
3126         * buildbot/test/test_runner.py (Options.optionsFile): disable on
3127         windows for now, I don't know what ~/.buildbot/ should mean there.
3129         * buildbot/test/test_run.py (BuilderNames.testGetBuilderNames):
3130         win32 compatibility, don't use "/tmp"
3131         (Basedir.testChangeBuilddir): remove more unixisms
3133 2005-04-26  Brian Warner  <warner@lothar.com>
3135         * buildbot/test/test_control.py (Force.rmtree): python2.2
3136         compatibility, apparently its shutil.rmtree ignore_errors=
3137         argument is ignored.
3138         * buildbot/test/test_run.py (Run.rmtree): same
3139         (RunMixin.setUp): same
3141         * buildbot/test/test_runner.py (make): python2.2 has os.sep but
3142         not os.path.sep
3144         * buildbot/test/test_twisted.py (Parse.failUnlessIn): 2.2 has no
3145         'substring in string' operator, must use string.find(substr)!=-1
3146         * buildbot/test/test_vc.py (Patch.failUnlessIn): same
3147         * buildbot/test/test_web.py (WebTest.failUnlessIn): same
3149         * buildbot/scripts/runner.py (loadOptions): add code to search for
3150         ~/.buildbot/, a directory with things like 'options', containing
3151         defaults for various 'buildbot' subcommands. .buildbot/ can be in
3152         the current directory, your $HOME directory, or anywhere
3153         inbetween, as long as you're somewhere inside your home directory.
3154         (debugclient): look in ~/.buildbot/options for master and passwd
3155         (statuslog): look in ~/.buildbot/options for 'masterstatus'
3156         * buildbot/test/test_runner.py (Options.testFindOptions): test it
3158         * buildbot/status/client.py (makeRemote): new approach to making
3159         IRemote(None) be None, which works under Twisted-2.0
3160         * buildbot/test/test_status.py (Client.testAdaptation): test it
3162         * buildbot/status/builder.py (Status.builderAdded): when loading a
3163         pickled BuilderStatus in from disk, set its name after loading.
3164         The config file might have changed its name (but not its
3165         directory) while it wasn't looking.
3166         
3167         * buildbot/process/builder.py (Builder.attached): always return a
3168         Deferred, even if the builder was already attached
3169         * buildbot/test/test_run.py (Basedir.testChangeBuilddir): test it
3171 2005-04-25  Brian Warner  <warner@lothar.com>
3173         * buildbot/status/words.py (IrcStatusBot.buildFinished): fix a
3174         category-related exception when announcing a build has finished
3176         * buildbot/status/html.py (StatusResourceChanges.body): oops, don't
3177         reference no-longer-existent changemaster.sources
3178         * buildbot/test/test_web.py (WebTest.test_waterfall): test for it
3180         * buildbot/__init__.py (version): bump to 0.6.3+ while between
3181         releases
3183 2005-04-25  Brian Warner  <warner@lothar.com>
3185         * buildbot/__init__.py (version): Releasing buildbot-0.6.3
3187         * debian/changelog: update for 0.6.3
3189 2005-04-25  Brian Warner  <warner@lothar.com>
3191         * MANIFEST.in: make sure debug.glade is in the tarball
3193         * README (REQUIREMENTS): list necessary Twisted-2.0 packages
3195         * NEWS: update for the imminent 0.6.3 release
3197         * buildbot/status/html.py (HtmlResource.content): make the
3198         stylesheet <link> always point at "buildbot.css".
3199         (StatusResource.getChild): map "buildbot.css" to a static.File
3200         containing whatever css= argument was provided to Waterfall()
3201         (Waterfall): provide the "classic" css as the default.
3202         * docs/waterfall.classic.css: move default CSS from here ..
3203         * buildbot/status/classic.css: .. to here
3205         * MANIFEST.in: make sure classic.css is included in the tarball
3206         * setup.py: and that it is installed too, under buildbot/status/
3208         * buildbot/master.py (BuildMaster): oops, set .change_svc=None at
3209         the module level, because buildbot.tap files from 0.6.2 don't have
3210         it in their attribute dictionary.
3212         * buildbot/slave/bot.py (Bot.startService): make sure the basedir
3213         really exists at startup, might save some confusion somewhere.
3215 2005-04-24  Thomas Vander Stichele  <thomas at apestaart dot org>
3217         * docs/waterfall.classic.css:
3218           add a stylesheet that's almost the same as the "classic"
3219           buildbot style
3221         * buildbot/status/builder.py:
3222           add EXCEPTION as a result - this is a problem for the bot
3223           maintainer, not a build problem for the changers
3224         * buildbot/process/step.py:
3225           use EXCEPTION instead of FAILURE for exceptions
3226         * buildbot/status/html.py:
3227           add build_get_class to get a class out of a build/buildstep
3228           finish naming the classes
3229           split out sourceNames to changeNames and builderNames so we
3230           can style them separately
3231         * docs/config.xhtml:
3232           finish documenting classes as they are right now
3234         * buildbot/status/html.py:
3235           name the classes as we agreed on IRC
3236         * docs/config.xhtml:
3237           and document them
3239         * buildbot/status/html.py:
3240           same for cssclass->class_
3242         * buildbot/status/html.py:
3243           as decided on IRC, use class_ for the "class" attribute to not
3244           conflict with the class keyword, and clean up the messy **{} stuff.
3246         * buildbot/status/mail.py:
3247           put back "builders" argument, and fix docstring, because the
3248           code *ignores* builders listed in this argument
3250         * buildbot/process/builder.py:
3251           remove FIXME notes - category is now indeed a cvar of BuilderStatus
3253         * docs/config.xhtml:
3254           describe the category argument for builders
3256         * buildbot/status/builder.py:
3257           Fix a silly bug due to merging
3259         * buildbot/process/builder.py:
3260           remove category from the process Builder ...
3261         * buildbot/status/builder.py:
3262           ... and add it to BuilderStatus instead.
3263           Set category on unpickled builder statuses, they might not have it.
3264         * buildbot/master.py:
3265           include category when doing builderAdded
3266         * buildbot/status/mail.py:
3267           return None instead of self for builders we are not interested in.
3268         * buildbot/test/test_run.py:
3269           fix a bug due to only doing deferredResult on "dummy" waiting
3270         * buildbot/test/test_status.py:
3271           add checks for the Mail IStatusReceiver returning None or self
3273         * buildbot/status/html.py:
3274           fix testsuite by prefixing page title with BuildBot
3276         * buildbot/status/builder.py:
3277           have .category in builder status ...
3278         * buildbot/process/builder.py:
3279           ... and set it from Builder
3280         * buildbot/status/html.py:
3281           make .css a class variable 
3282         * buildbot/test/test_status.py:
3283           write more tests to cover our categories stuff ...
3284         * buildbot/status/mail.py:
3285           ... and fix the bug that this uncovered
3287         * buildbot/changes/mail.py:
3288         * buildbot/changes/pb.py:
3289         * buildbot/master.py:
3290         * buildbot/process/base.py:
3291         * buildbot/process/factory.py:
3292         * buildbot/process/interlock.py:
3293         * buildbot/process/step.py:
3294         * buildbot/process/step_twisted.py:
3295         * buildbot/slave/commands.py:
3296         * buildbot/status/builder.py:
3297         * buildbot/status/client.py:
3298         * buildbot/status/html.py:
3299         * buildbot/status/mail.py:
3300         * buildbot/status/progress.py:
3301         * buildbot/test/test_changes.py:
3302         * buildbot/test/test_config.py:
3303         * buildbot/test/test_control.py:
3304         * buildbot/test/test_interlock.py:
3305         * buildbot/test/test_maildir.py:
3306         * buildbot/test/test_mailparse.py:
3307         * buildbot/test/test_run.py:
3308         * buildbot/test/test_slavecommand.py:
3309         * buildbot/test/test_status.py:
3310         * buildbot/test/test_steps.py:
3311         * buildbot/test/test_twisted.py:
3312         * buildbot/test/test_util.py:
3313         * buildbot/test/test_vc.py:
3314         * buildbot/test/test_web.py:
3315         * buildbot/util.py:
3316           add test-case-name at the top of a whole set of files
3318         * buildbot/status/builder.py:
3319           keep order of addition when getting builder names
3320         * buildbot/status/words.py:
3321         * buildbot/test/test_run.py:
3322           add test for getBuilderNames
3324         * buildbot/process/base.py:
3325         * buildbot/process/step.py:
3326         * buildbot/status/builder.py:
3327         * buildbot/status/html.py:
3328           make buildbot css-able
3329           replace the color code for purple with purple, don't understand
3330           why it wasn't purple to start with
3332         * buildbot/status/words.py:
3333           ok, so it doesn't look like BuilderStatus.remote is still valid.
3334           Use what waterfall uses instead.
3336         * buildbot/interfaces.py:
3337         * buildbot/status/builder.py:
3338         * buildbot/status/html.py:
3339         * buildbot/status/mail.py:
3340         * buildbot/status/words.py:
3341         * buildbot/test/test_run.py:
3342           use categories everywhere and make it be a list.  More sensible
3343           for the future.  Also make words actually respect this in
3344           buildFinished.
3346         * buildbot/interfaces.py:
3347           add category argument to getBuilderNames
3348         * buildbot/process/builder.py:
3349         * buildbot/status/builder.py:
3350         * buildbot/status/html.py:
3351         * buildbot/status/mail.py:
3352         * buildbot/status/words.py:
3353         * buildbot/test/test_run.py:
3354           move from specifying builders by name to specifying the category
3356         * buildbot/status/html.py:
3357         * buildbot/status/words.py:
3358           add "builders=" to __init__ of status clients so they can
3359           limit themselves to the given list of builders to report on
3361         * buildbot/status/html.py: set the title to the product name
3363 2005-04-23  Thomas Vander Stichele  <thomas at apestaart dot org>
3365         * buildbot/interfaces.py:
3366         * buildbot/status/builder.py:
3367           more documentation.  Hm, not sure if ChangeLog entries make sense
3368           here...
3370 2005-04-23  Brian Warner  <warner@lothar.com>
3372         * buildbot/test/test_vc.py (SetupMixin.do_vc): increase timeouts
3374         * buildbot/test/test_slavecommand.py (Shell): increase timeouts
3376         * buildbot/scripts/runner.py: make 'statuslog' and 'statusgui' be
3377         the sub-commands that log buildmaster status to stdout and to a
3378         GUI window, respectively.
3380         * buildbot/clients/gtkPanes.py: overhaul. basic two-row
3381         functionality is working again, but all the step-status and ETA
3382         stuff is missing. Commented out a lot of code pending more
3383         overhaul work.
3385         * buildbot/status/client.py: make sure that IRemote(None) is None
3387         * buildbot/changes/changes.py: import defer, oops
3388         (ChangeMaster): remove the .sources list, rely upon the fact that
3389         MultiServices can be treated as sequences of their children. This
3390         cleans up the add/remove ChangeSource routines a lot, as we keep
3391         exactly one list of the current sources instead of three.
3393         * buildbot/master.py (BuildMaster.__init__): remove .sources, set
3394         up an empty ChangeMaster at init time.
3395         (BuildMaster.loadChanges): if there are changes to be had from
3396         disk, replace self.change_svc with the new ones. If not, keep
3397         using the empty ChangeMaster set up in __init__.
3398         (BuildMaster.loadConfig_Sources): use list(self.change_svc)
3399         instead of a separate list, makes the code a bit cleaner.
3400         * buildbot/test/test_config.py (ConfigTest.testSimple): match it
3401         (ConfigTest.testSources): same, also wait for loadConfig to finish.
3402         Extend the test to make sure we can get rid of the sources when
3403         we're done.
3405 2005-04-22  Brian Warner  <warner@lothar.com>
3407         * buildbot/scripts/runner.py (Maker.mkinfo): create the info/admin
3408         and info/host files when making the slave directory
3410         * buildbot/test/test_run.py (RunMixin.shutdownSlave): remove the
3411         whendone= argument, just return the Deferred and let the caller do
3412         what they want with it.
3413         (Disconnect.testBuild1): wait for shutdownSlave
3414         (Basedir.testChangeBuilddir): new test to make sure changes to the
3415         builddir actually get propagated to the slave
3417         * buildbot/slave/bot.py (SlaveBuilder.setBuilddir): use an
3418         explicit method, rather than passing the builddir in __init__ .
3419         Make sure to update self.basedir too, this was broken before.
3420         (Bot.remote_setBuilderList): use b.setBuilddir for both new
3421         builders and for ones that have just had their builddir changed.
3422         (BotFactory): add a class-level .perspective attribute, so
3423         BuildSlave.waitUntilDisconnected won't get upset when the
3424         connection hasn't yet been established
3425         (BuildSlave.__init__): keep track of the bot.Bot instance, so
3426         tests can reach through it to inspect the SlaveBuilders
3428         * buildbot/process/base.py (Build.buildException): explain the
3429         log.err with a log.msg
3430         * buildbot/process/builder.py (Builder.startBuild): same
3431         (Builder._startBuildFailed): improve error message
3433         * buildbot/pbutil.py (RBCP.failedToGetPerspective): if the failure
3434         occurred because we lost the brand-new connection, retry instead
3435         of giving up. If not, it's probably an authorization failure, and
3436         it makes sense to stop trying. Make sure we log.msg the reason
3437         that we're log.err'ing the failure, otherwise test failures are
3438         really hard to figure out.
3440         * buildbot/master.py: change loadConfig() to return a Deferred
3441         that doesn't fire until the change has been fully implemented.
3442         This means any connected slaves have been updated with the new
3443         builddir. This change makes it easier to test the code which
3444         actually implements this builddir-updating.
3445         (BotPerspective.addBuilder): return Deferred
3446         (BotPerspective.removeBuilder): same
3447         (BotPerspective.attached): same
3448         (BotPerspective._attached): same. finish with remote_print before
3449         starting the getSlaveInfo, instead of doing them in parallel
3450         (BotPerspective.list_done): same
3451         (BotMaster.removeSlave): same. Fix the typo that meant we weren't
3452         actually calling slave.disconnect()
3453         (BotMaster.addBuilder): same
3454         (BotMaster.removeBuilder): same
3455         (BuildMaster.loadConfig): same
3456         (BuildMaster.loadConfig_Slaves): same
3457         (BuildMaster.loadConfig_Sources): same
3458         (BuildMaster.loadConfig_Builders): same
3459         (BuildMaster.loadConfig_status): same
3461         * buildbot/changes/changes.py (ChangeMaster.removeSource): return
3462         a Deferred that fires when the source is finally removed
3464         * buildbot/slave/commands.py (SourceBase.doClobber): when removing
3465         the previous tree on win32, where we have to do it synchronously,
3466         make sure we return a Deferred anyway.
3467         (SourceBase.doCopy): same
3469         * buildbot/scripts/runner.py (statusgui): use the text client for
3470         now, while I rewrite the Gtk one
3471         * buildbot/clients/base.py: strip out old code, leaving just the
3472         basic print-message-on-event functionality. I also remove the
3473         ReconnectingPBClientFactory, but it does at least quit when it
3474         loses the connection instead of going silent
3476 2005-04-21  Brian Warner  <warner@lothar.com>
3478         * Makefile: minor tweaks
3480         * NEWS: point out deprecation warnings, new features for
3481         /usr/bin/buildbot
3483         * buildbot/master.py (BuildMaster.loadConfig): emit
3484         DeprecationWarnings for Builders defined with tuples. Rearrange
3485         code to facility removal of deprecated configuration keys in the
3486         next release.
3488         * buildbot/scripts/runner.py (createMaster,createSlave): rewrite
3489         'buildbot' command to put a little Makefile in the target that
3490         helps you re-create the buildbot.tap file, start or stop the
3491         master/slave, and reconfigure (i.e. SIGHUP) the master. Also chmod
3492         all the files 0600, since they contain passwords.
3493         (start): if there is a Makefile, and /usr/bin/make exists, use
3494         'make start' in preference to a raw twistd command. This lets
3495         slave admins put things like PYTHONPATH variables in their
3496         Makefiles and have them still work when the slave is started with
3497         'buildbot start ~/slave/foo'. The test is a bit clunky, it would
3498         be nice to first try the 'make' command and only fall back to
3499         twistd if it fails. TODO: the Makefile's "start" command does not
3500         add the --reactor=win32 argument when running under windows.
3501         (Options.debugclient, Options.statusgui): add sub-commands to launch
3502         the debug client (formerly in contrib/debugclient.py) and the
3503         Gtk status application (currently broken)
3504         * buildbot/clients/debug.py: move from contrib/debugclient.py
3505         * buildbot/clients/debug.glade: same
3507         * buildbot/test/test_trial.py: remove it. This requires some
3508         functionality out of Twisted that isn't there yet, and until then
3509         having it around just confuses things.
3511         * buildbot/test/test_slavecommand.py (Shell): test both with and
3512         without PTYs, and make sure that command output is properly
3513         interleaved in the with-PTY case. I think the without-PTY test
3514         should pass on windows, where we never use PTYs anyway.
3516 2005-04-20  Brian Warner  <warner@lothar.com>
3518         * README (REQUIREMENTS): mention Twisted-2.0.0 compatibility
3520         * MANIFEST.in: add epyrun, gen-reference, buildbot.png
3522         * NEWS: start creating entries for the next release
3524         * buildbot/slave/commands.py (ShellCommand.__init__): use os.pathsep
3526         * buildbot/test/test_web.py (WebTest.test_webPortnum): add timeout
3527         (WebTest.test_webPathname): same
3528         (WebTest.test_webPathname_port): same
3529         (WebTest.test_waterfall): use the default favicon rather than
3530         rooting around the filesystem for it. Open the expected-icon file
3531         in binary mode, to make win32 tests happier (thanks to Nick Trout
3532         for the catch)
3533         * buildbot/status/html.py (buildbot_icon): win32 portability
3535         * buildbot/test/test_slavecommand.py (SlaveCommandTestCase.testShellZ):
3536         win32-compatibility fixes from Nick Trout, the "file not found" message
3537         is different under windows
3538         (FakeSlaveBuilder.__init__): clean up setup a bit
3539         * buildbot/test/test_vc.py (VCSupport.__init__): win32: use os.pathsep
3541 2005-04-19  Brian Warner  <warner@lothar.com>
3543         * buildbot/test/test_vc.py (SetupMixin.setUpClass): fix the
3544         skip-if-repositories-are-unavailable test to not kill the trial
3545         that comes with Twisted-1.3.0
3547         * setup.py: install buildbot.png icon file when installing code
3549         * buildbot/slave/commands.py (ShellCommand._startCommand): log the
3550         environment used by the command, at least on the child side.
3552         * buildbot/status/html.py (TextLog.pauseProducing): add a note,
3553         this method needs to be added and implemented because it gets
3554         called under heavy load. I don't quite understand the
3555         producer/consumer API enough to write it.
3556         (StatusResource.getChild): add a resource for /favicon.ico
3557         (Waterfall.__init__): add favicon= argument
3558         * buildbot/test/test_web.py (WebTest.test_waterfall): test it
3559         (WebTest.test_webPortnum): stop using deprecated 'webPortnum'
3560         (WebTest.test_webPathname): same
3561         (WebTest.test_webPathname_port): same
3562         * docs/config.xhtml: mention favicon=
3563         * buildbot/buildbot.png: add a default icon, dorky as it is
3565 2005-04-18  Thomas Vander Stichele  <thomas at apestaart dot org>
3567         * buildbot/master.py:
3568         * buildbot/process/base.py:
3569         * buildbot/process/builder.py:
3570         * buildbot/process/interlock.py:
3571         * buildbot/status/builder.py:
3572         * buildbot/status/html.py:
3573         * buildbot/status/mail.py:
3574         * buildbot/status/words.py:
3575           new documentation while digging through the code
3577 2005-04-17  Brian Warner  <warner@lothar.com>
3579         * general: try to fix file modes on all .py files: a+r, a-x,
3580         but let buildbot/clients/*.py be +x since they're tools
3582         * docs/epyrun (addMod): when an import fails, say why
3584         * Makefile: Add a 'docs' target, hack on the PYTHONPATH stuff
3586 2005-04-17  Thomas Vander Stichele  <thomas at apestaart dot org>
3588         * buildbot/process/base.py:
3589         * buildbot/process/builder.py:
3590         * buildbot/status/builder.py:
3591           new documentation while digging through the code
3593 2005-04-17  Thomas Vander Stichele  <thomas at apestaart dot org>
3595         * buildbot/changes/changes.py:
3596         * buildbot/changes/p4poller.py:
3597         * buildbot/interfaces.py:
3598         * buildbot/process/base.py:
3599         * buildbot/process/builder.py:
3600         * buildbot/process/step.py:
3601         * buildbot/process/step_twisted.py:
3602         * buildbot/slave/bot.py:
3603         * buildbot/slave/commands.py:
3604         * buildbot/status/builder.py:
3605           fix all docstrings to make epydoc happy.  In the process of fixing
3606           some, I also moved pieces of docs, and removed some deprecated
3607           documentation
3609 2005-04-17  Thomas Vander Stichele  <thomas at apestaart dot org>
3611         * buildbot/process/builder.py:
3612         * buildbot/process/interlock.py:
3613         * buildbot/process/process_twisted.py:
3614         * buildbot/process/step.py:
3615           BuildProcess -> Build, as it looks like that's what happened
3616         * buildbot/process/base.py:
3617         * buildbot/process/factory.py:
3618           update epydoc stuff
3620 2005-04-17  Brian Warner  <warner@lothar.com>
3622         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
3623         update compile command to accomodate the Twisted split.. now
3624         instead of './setup.py build_ext -i', you do './setup.py all
3625         build_ext -i', to run build_ext over all sub-projects.
3626         (FullTwistedBuildFactory): same
3627         (TwistedReactorsBuildFactory): same
3629         * buildbot/status/html.py (TextLog.finished): null out self.req
3630         when we're done, otherwise the reference cycle of TextLog to .req
3631         to .notifications to a Deferred to TextLog.stop keeps them from
3632         being collected, and consumes a huge (610MB on pyramid at last
3633         check) amount of memory.
3635 2005-04-11  Brian Warner  <warner@lothar.com>
3637         * buildbot/test/test_vc.py (VCSupport.__init__): use abspath() to
3638         normalize the VC-repository location.. makes SVN happier with
3639         certain test environments.
3641         * buildbot/process/step.py (RemoteShellCommand.__init__): let each
3642         RemoteShellCommand gets its own .env dictionary, so that code in
3643         start() doesn't mutate the original. I think this should fix the
3644         step_twisted.Trial problem where multiple identical components
3645         kept getting added to PYTHONPATH= over and over again.
3647         * general: merge org.apestaart@thomas/buildbot--doc--0--patch-3,
3648         adding epydoc-format docstrings to many classes. Thanks to Thomas
3649         Vander Stichele for the patches.
3650         * docs/epyrun, docs/gen-reference: add epydoc-generating tools
3651         * buildbot/status/mail.py, buildbot/process/step_twisted.py: same
3652         * buildbot/slave/bot.py, commands.py, registry.py: same
3654 2005-04-05  Brian Warner  <warner@lothar.com>
3656         * buildbot/slave/commands.py (SourceBase.doCopy): use cp -p to
3657         preserve timestamps, helps incremental builds of large trees.
3658         Patch from Rene Rivera.
3660         * buildbot/slave/bot.py (SlaveBuilder.commandComplete): oops, log
3661         'failure' and not the non-existent 'why'. Thanks to Rene Rivera
3662         for the catch.
3664 2005-04-03  Brian Warner  <warner@lothar.com>
3666         * buildbot/master.py (BuildMaster.loadConfig): only call exec()
3667         with one dict, apparently exec has some scoping bugs when used
3668         with both global/local dicts. Thanks to Nathaniel Smith for the
3669         catch.
3671 2005-04-02  Brian Warner  <warner@lothar.com>
3673         * buildbot/process/step_twisted.py (countFailedTests): the new
3674         trial in Twisted-2.0 emits a slightly different status line than
3675         old trial ("PASSED.." instead of "OK.."). Handle it so we don't
3676         mistakenly think the test count is unparseable.
3677         (Trial.start): note that for some reason each build causes another
3678         copy of self.testpath to be prepended to PYTHONPATH. This needs to
3679         be fixed but I'm not sure quite where the problem is.
3681 2005-04-01  Brian Warner  <warner@lothar.com>
3683         * buildbot/test/test_run.py (Run.testMaster): change some uses of
3684         deferredResult to avoid hangs/warnings under twisted-2.0
3685         (RunMixin.tearDown): same
3686         (RunMixin.shutdownSlave): same
3687         (Disconnect.testIdle1): same
3688         (Disconnect.testBuild2): same: wait one second after the build
3689         finishes for test to really be done.. this should be cleaned up to
3690         avoid wasting that second. Builder.detach uses a callLater(0),
3691         either that should be done in-line (something else needed that
3692         behavior), or it should return a Deferred that fires when the
3693         builder is really offline.
3694         (Disconnect.testBuild3): same
3695         (Disconnect.testDisappear): same
3697         * buildbot/test/test_web.py: rearrange server-setup and teardown
3698         code to remove unclean-reactor warnings from twisted-2.0
3700         * buildbot/test/test_vc.py: rearrange probe-for-VC-program routine
3701         so the tests don't hang under twisted-2.0
3703 2005-03-31  Brian Warner  <warner@lothar.com>
3705         * buildbot/slave/bot.py (Bot.remote_setBuilderList): fix typo that
3706         caused a warning each time the master changed our set of builders
3708         * buildbot/status/builder.py (BuildStatus.saveYourself): under
3709         w32, don't unlink the file unless it already exists. Thanks to
3710         Baptiste Lepilleur for the catch.
3711         (BuilderStatus.saveYourself): same
3713 2005-02-01  Brian Warner  <warner@lothar.com>
3715         * buildbot/status/html.py (TextLog.getChild): use a /text child
3716         URL, such as http://foo.com/svn-hello/builds/1/test/0/text instead
3717         of http://foo.com/svn-hello/builds/1/test/0 , to retrieve the
3718         logfile as text/plain (no markup, no headers). This replaces the
3719         previous scheme (which used an ?text=1 argument), and gets us back
3720         to a relative link (which works better when the buildbot lives
3721         behind another web server, such as Apache configured as a reverse
3722         proxy). Thanks to Gerald Combs for spotting the problem.
3724         * buildbot/__init__.py (version): bump to 0.6.2+ while between
3725         releases
3727 2004-12-13  Brian Warner  <warner@lothar.com>
3729         * buildbot/__init__.py (version): Releasing buildbot-0.6.2
3731         * debian/changelog: update for 0.6.2
3732         * NEWS: finalize for 0.6.2
3734 2004-12-11  Brian Warner  <warner@lothar.com>
3736         * NEWS: bring it up to date
3738         * buildbot/slave/bot.py (BotFactory): revamp keepalive/lost-master
3739         detection code. Require some sign of life from the buildmaster
3740         every BotFactory.keepaliveInterval seconds. Provoke this
3741         indication at BotFactory.keepaliveTimeout seconds before the
3742         deadline by sending a keepalive request. We don't actually care if
3743         that request is answered in a timely fashion, what we care about
3744         is that .activity() is called before the deadline. .activity() is
3745         triggered by any PB message from the master (including an ack to
3746         one of the slave's status-update messages). With this new scheme,
3747         large status messages over slow pipes are OK, as long as any given
3748         message can be sent (and thus acked) within .keepaliveTimeout
3749         seconds (which defaults to 30).
3750         (SlaveBuilder.remote_startCommand): record activity
3751         (SlaveBuilder.ackUpdate): same
3752         (SlaveBuilder.ackComplete): same
3753         (BotFactory.gotPerspective): same
3754         * buildbot/test/test_run.py (Disconnect.testSlaveTimeout): test it
3756 2004-12-09  Brian Warner  <warner@lothar.com>
3758         * buildbot/status/html.py (StatusResourceBuilder.getChild): remove
3759         debug message
3761         * buildbot/process/step_twisted.py (Trial._commandComplete):
3762         update self.cmd when we start the 'cat test.log' transfer. Without
3763         this, we cannot interrupt the correct RemoteCommand when we lose
3764         the connection.
3766         * buildbot/process/step.py (RemoteCommand.interrupt): don't bother
3767         trying to tell the slave to stop the command if we're already
3768         inactive, or if we no longer have a .remote
3770         * buildbot/process/builder.py (Builder._detached): don't let an
3771         exception in currentBuild.stopBuild() prevent the builder from
3772         being marked offline
3774 2004-12-07  Brian Warner  <warner@lothar.com>
3776         * buildbot/status/words.py (IrcStatusBot.getBuilder): catch the
3777         KeyError that happens when you ask for a non-existent Builder, and
3778         translate it into a UsageError.
3780         * buildbot/test/test_run.py (Disconnect.testBuild4): validate that
3781         losing the slave in the middle of a remote step is handled too
3783         * buildbot/process/step.py (ShellCommand.interrupt): 'reason' can
3784         be a Failure, so be sure to stringify it before using it as the
3785         contents of the 'interrupt' logfile
3786         (RemoteCommand.interrupt): use stringified 'why' in
3787         remote_interruptCommand too, just in case
3789 2004-12-06  Brian Warner  <warner@lothar.com>
3791         * buildbot/slave/commands.py (Arch.doVCUpdate): use 'tla replay'
3792         instead of 'tla update', which is more efficient in case we've
3793         missed a couple of patches since the last update.
3795         * debian/changelog: update for previous (0.6.1) release. Obviously
3796         this needs to be handled better.
3798 2004-12-05  Brian Warner  <warner@lothar.com>
3800         * NEWS: update for stuff since last release
3802         * buildbot/master.py (DebugPerspective.attached): return 'self', to
3803         match the maybeDeferred change in Dispatcher.requestAvatar
3804         * buildbot/changes/pb.py (ChangePerspective.attached): same
3805         * buildbot/status/client.py (StatusClientPerspective.attached): same
3806         * buildbot/process/builder.py (Builder._attached3): same
3807         * buildbot/pbutil.py (NewCredPerspective.attached): same
3809         * buildbot/status/html.py (WaterfallStatusResource.phase2): Add
3810         the date to the top-most box, if it is not the same as today's
3811         date.
3813         * docs/slave.xhtml: provide a buildslave setup checklist
3815         * docs/source.xhtml (Arch): correct terminology
3817 2004-12-04  Brian Warner  <warner@lothar.com>
3819         * buildbot/test/test_slavecommand.py: use sys.executable instead
3820         of hard-coding 'python' for child commands, might help portability
3822         * docs/examples/twisted_master.cfg: update to current usage
3824         * buildbot/status/words.py (IrcStatusBot.command_STOP): add a
3825         'stop build' command to the IRC bot
3827         * buildbot/master.py (Dispatcher.requestAvatar): remove debug
3828         message that broke PBChangeSource
3830         * buildbot/slave/bot.py: clean up shutdown/lose-master code
3831         (SlaveBuilder): make some attributes class-level, remove the old
3832         "update queue" which existed to support resuming a build after the
3833         master connection was lost. Try to reimplement that feature later.
3834         (SlaveBuilder.stopCommand): clear self.command when the
3835         SlaveCommand finishes, so that we don't try to kill a leftover one
3836         at shutdown time.
3837         (SlaveBuilder.commandComplete): same, merge with commandFailed and
3838         .finishCommand
3840         * buildbot/slave/commands.py (SourceBase): set self.command for
3841         all VC commands, so they can be interrupted.
3843 2004-12-03  Brian Warner  <warner@lothar.com>
3845         * buildbot/master.py: clean up slave-handling code, to handle
3846         slave-disconnect and multiple-connect better
3847         (BotPerspective): make these long-lasting, exactly one per bot
3848         listed in the config file.
3849         (BotPerspective.attached): if a slave connects while an existing
3850         one appears to still be connected, disconnect the old one first.
3851         (BotPerspective.disconnect): new method to forcibly disconnect a
3852         buildslave. Use some hacks to empty the transmit buffer quickly to
3853         avoid the long (20-min?) TCP timeout that could occur if the old
3854         slave has dropped off the net.
3855         (BotMaster): Keep persistent BotPerspectives in .slaves, let them
3856         own their own SlaveStatus objects. Remove .attached/.detached, add
3857         .addSlave/.removeSlave, treat slaves like Builders (config file
3858         parsing sends deltas to the BotMaster). Inform the slave
3859         instances, i.e. the BotPerspective, about addBuilder and
3860         removeBuilder.
3861         (BotMaster.getPerspective): turns into a single dict lookup
3862         (Dispatcher.requestAvatar): allow .attached to return a Deferred,
3863         which gives BotPerspective.attached a chance to disconnect the old
3864         slave first.
3865         (BuildMaster.loadConfig): add code (disabled) to validate that all
3866         builders use known slaves (listed in c['bots']). The check won't
3867         work with tuple-specified builders, which are deprecated but not
3868         yet invalid, so the check is disabled for now.
3869         (BuildMaster.loadConfig_Slaves): move slave-config into a separate
3870         routine, do the add/changed/removed dance with them like we do
3871         with builders.
3872         (BuildMaster.loadConfig_Sources): move source-config into a
3873         separate routine too
3875         * buildbot/status/builder.py (Status.getSlave): get the
3876         SlaveStatus object from the BotPerspective, not the BotMaster.
3878         * buildbot/test/test_run.py: bunch of new tests for losing the
3879         buildslave at various points in the build, handling a slave that
3880         connects multiple times, and making sure we can interrupt a
3881         running build
3883         * buildbot/slave/bot.py (BuildSlave): make it possible to use
3884         something other than 'Bot' for the Bot object, to make certain
3885         test cases easier to write.
3886         (BuildSlave.waitUntilDisconnected): utility method for testing
3888 2004-11-30  Brian Warner  <warner@lothar.com>
3890         * buildbot/test/test_run.py (RunMixin): refactor, remove debug msg
3892         * buildbot/interfaces.py (IBuilderControl.ping): add timeout=
3893         argument, return a Deferred that always fires with True or False.
3894         I don't use an errback to indicate 'ping failed' so that callers
3895         are free to ignore the deferred without causing spurious errors in
3896         the logs.
3897         * buildbot/process/builder.py (BuilderControl.ping): implement it
3899         * buildbot/test/test_run.py (Status.testDisappear): test ping
3900         (Status.disappearSlave): fix it
3902 2004-11-30  Brian Warner  <warner@lothar.com>
3904         * buildbot/interfaces.py (IBuildControl): add .stopBuild
3905         (IBuilderControl): add .getBuild(num), only works for the current
3906         build, of course, although it might be interesting to offer
3907         something for builds in the .waiting or .interlocked state.
3909         * buildbot/process/base.py (Build): have .stopBuild just do the
3910         interrupt, then let the build die by itself.
3911         (BuildControl): add .stopBuild, and add a point-event named
3912         'interrupt' just after the build so status viewers can tell that
3913         someone killed it.
3914         (BuilderControl): add .getBuild
3916         * buildbot/process/step.py (Dummy): use haltOnFailure so it really
3917         stops when you kill it, good for testing
3918         (ShellCommand.interrupt): add a logfile named 'interrupt' which
3919         contains the 'reason' text.
3921         * buildbot/status/html.py: Add Stop Build button, if the build can
3922         still be stopped. Send a Redirect (to the top page) one second
3923         later, hopefully long enough for the interrupt to have an effect.
3924         Move make_row() up to top-level to share it between Stop Build and
3925         Force Build.
3927         * buildbot/slave/commands.py: only kill the child process once
3929         * buildbot/test/test_run.py: add testInterrupt
3931 2004-11-29  Brian Warner  <warner@lothar.com>
3933         * buildbot/process/base.py: Refactor command interruption. The
3934         Build is now responsible for noticing that the slave has gone
3935         away: Build.lostRemote() interrupts the current step and makes
3936         sure that no further ones will be started.
3937         
3938         * buildbot/process/builder.py: When the initial remote_startBuild
3939         message fails, log it: this usually indicates that the slave has
3940         gone away, but we don't really start paying attention until they
3941         fail to respond to the first step's command.
3943         * buildbot/process/step.py (RemoteCommand): Does *not* watch for
3944         slave disconnect. Now sports a new interrupt() method. Error
3945         handling was simplified a lot by chaining deferreds, so
3946         remoteFailed/remoteComplete were merged into a single
3947         remoteComplete method (which can now get a Failure object).
3948         Likewise failed/finished were merged into just _finished.
3949         (BuildStep): Add interrupt(why) method, and if why is a
3950         ConnectionLost Failure then the step is failed with some useful
3951         error text.
3953         * buildbot/slave/bot.py: stop the current command when the remote
3954         Step reference is lost, and when the slave is shut down.
3955         (Bot): make it a MultiService, so it can have children. Use
3956         stopService to tell when the slave is shutting down.
3957         (SlaveBuilder): make it a Service, and a child of the Bot. Add
3958         remote_interruptCommand (which asks the current SlaveCommand to
3959         stop but allows it to keep emitting status messages), and
3960         stopCommand (which tells it to shut up and die).
3962         * buildbot/slave/commands.py: make commands interruptible
3963         (ShellCommand.kill): factor out os.kill logic
3964         (Command): factor out setup()
3965         (Command.sendStatus): don't send status if .running is false, this
3966         happens when the command has been halted.
3967         (Command.interrupt): new method, used to tell the command to die
3968         (SlaveShellCommand): implement .interrupt
3969         (DummyCommand): implement .interrupt
3970         (SourceBase, etc): factor out setup(), don't continue substeps if
3971         .interrupted is set
3973         * buildbot/status/builder.py: fix all waitUntilFinished() methods
3974         so they can be called after finishing
3976         * buildbot/test/test_run.py: new tests for disconnect behavior,
3977         refactor slave-shutdown routines, add different kinds of
3978         slave-shutdown
3980 2004-11-27  Brian Warner  <warner@lothar.com>
3982         * buildbot/status/words.py (IrcStatusBot.convertTime): utility
3983         method to express ETA time like "2m45s" instead of "165 seconds"
3985 2004-11-24  Brian Warner  <warner@lothar.com>
3987         * buildbot/test/test_vc.py (VC.testArch): unregister the test
3988         archive after the test completes, to avoid cluttering the user's
3989         'tla archives' listing with a bogus entry. Arch doesn't happen to
3990         provide any way to override the use of ~/.arch-params/, so there
3991         isn't a convenient way to avoid touching the setup of the user who
3992         runs the test.
3993         (VC_HTTP.testArchHTTP): same
3995 2004-11-23  Brian Warner  <warner@lothar.com>
3997         * buildbot/status/html.py (TextLog): split render() up into
3998         render_HEAD and render_GET. Use a Producer when sending log
3999         chunks, to reduce memory requirements and avoid sending huge
4000         non-Banana-able strings over web.distrib connections. Requires
4001         peeking under the covers of IStatusLog.
4002         (TextLog.resumeProducing): fix the "as text" link, handle client
4003         disconnects that occur while we're still sending old chunks.
4005         * buildbot/status/builder.py (HTMLLogFile.waitUntilFinished): oops,
4006         use defer.succeed, not the non-existent defer.success
4007         (LogFile.waitUntilFinished): same
4008         (LogFile.subscribe): don't add watchers to a finished logfile
4010         * buildbot/__init__.py (version): bump to 0.6.1+ while between
4011         releases
4013 2004-11-23  Brian Warner  <warner@lothar.com>
4015         * buildbot/__init__.py (version): Releasing buildbot-0.6.1
4017 2004-11-23  Brian Warner  <warner@lothar.com>
4019         * NEWS: update for the 0.6.1 release
4020         * MANIFEST.in: add new files
4022         * README (INSTALLATION): explain how to enable the extra VC tests
4024         * buildbot/status/builder.py (LogFile): add .runEntries at the class
4025         level to, so old pickled builds can be displayed ok
4027 2004-11-22  Brian Warner  <warner@lothar.com>
4029         * NEWS: summarize updates since last release
4031         * README (SLAVE): fix usage of 'buildbot slave' command. Thanks to
4032         Yoz Grahame. Closes SF#1050138.
4034         * docs/changes.xhtml (FreshCVSSourceNewcred): fix typo. Closes
4035         SF#1042563.
4037         * buildbot/process/step_twisted.py (Trial): update docs a bit
4039         * docs/factories.xhtml: fix Trial factory docs to match reality.
4040         Closes: SF#1049758.
4042         * buildbot/process/factory.py (Trial.__init__): add args for
4043         randomly= and recurse=, making them available to instantiators
4044         instead of only to subclassers. Closes: SF#1049759.
4046 2004-11-15  Brian Warner  <warner@lothar.com>
4048         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
4049         try to teach the Quick factory to use multiple versions of python
4051 2004-11-12  Brian Warner  <warner@lothar.com>
4053         * buildbot/status/builder.py (BuilderStatus.saveYourself): use a
4054         safer w32-compatible approach, and only use it on windows
4055         (BuildStatus.saveYourself): same
4057 2004-11-11  Brian Warner  <warner@lothar.com>
4059         * buildbot/status/builder.py (LogFile.addEntry): smarter way to do
4060         it: one string merge per chunk. There are now separate .entries
4061         and .runEntries lists: when enumerating over all chunks, make sure
4062         to look at both.
4063         * buildbot/test/test_status.py (Log): more tests
4065         * buildbot/status/builder.py (LogFile.addEntry): Merge string
4066         chunks together, up to 10kb per chunk. This ought to cut down on
4067         the CPU-burning overhead of large log files. Thanks to Alexander
4068         Staubo for spotting the problem.
4069         * buildbot/test/test_status.py (Log): tests for same
4071 2004-11-10  Brian Warner  <warner@lothar.com>
4073         * buildbot/status/mail.py (MailNotifier.buildMessage): add a Date
4074         header to outbound mail
4075         * buildbot/test/test_status.py (Mail.testBuild1): test for same
4077 2004-11-08  Brian Warner  <warner@lothar.com>
4079         * buildbot/status/builder.py (BuilderStatus.saveYourself): w32
4080         can't do os.rename() onto an existing file, so catch the exception
4081         and unlink the target file first. This introduces a slight window
4082         where the existing file could be lost, but the main failure case
4083         (disk full) should still be handled safely.
4084         (BuildStatus.saveYourself): same
4086         * buildbot/changes/pb.py (ChangePerspective): use a configurable
4087         separator character instead of os.sep, because the filenames being
4088         split here are coming from the VC system, which can have a
4089         different pathname convention than the local host. This should
4090         help a buildmaster running on windows that uses a CVS repository
4091         which runs under unix.
4092         * buildbot/changes/mail.py (MaildirSource): same, for all parsers
4094         * buildbot/process/step_twisted.py (Trial.createSummary): survive
4095         when there are no test failures to be parsed
4097         * buildbot/scripts/runner.py (createMaster): use shutil.copy()
4098         instead of the unix-specific os.system("cp"), thanks to Elliot
4099         Murphy for this and the other buildbot-vs-windows catches.
4100         * buildbot/test/test_maildir.py (MaildirTest.deliverMail): same
4102         * contrib/windows/buildbot.bat: prefix a '@', apparently to not
4103         echo the command as it is run
4105         * setup.py: install sample.mk too, not just sample.cfg
4106         (scripts): install contrib/windows/buildbot.bat on windows
4108 2004-11-07  Brian Warner  <warner@lothar.com>
4110         * buildbot/process/builder.py (Builder._detached): clear the
4111         self.currentBuild reference, otherwise the next build will be
4112         skipped because we think the Builder is already in use.
4114         * docs/examples/twisted_master.cfg: update to match current usage
4115         on the Twisted buildbot
4117 2004-10-29  Brian Warner  <warner@lothar.com>
4119         * buildbot/status/mail.py (MailNotifier): fix typo in docs
4121 2004-10-28  Brian Warner  <warner@lothar.com>
4123         * buildbot/slave/commands.py (SourceBase): refactor subclasses to
4124         have separate doVCUpdate/doVCFull methods. Catch an update failure
4125         and respond by clobbering the source directory and re-trying. This
4126         will handle local changes (like replacing a file with a directory)
4127         that will cause CVS and SVN updates to fail.
4128         * buildbot/test/test_vc.py (SetupMixin.do_vc): test the same
4130         * buildbot/process/step.py (LoggedRemoteCommand.__repr__): avoid a
4131         python-2.4 warning
4133 2004-10-19  Brian Warner  <warner@lothar.com>
4135         * buildbot/process/step_twisted.py (Trial.createSummary): bugfixes
4137         * buildbot/status/html.py (StatusResourceTestResults): display any
4138         TestResults that the Build might have
4139         (StatusResourceTestResult): and the logs for each TestResult
4140         (StatusResourceBuild): add link from the per-build page
4142 2004-10-15  Brian Warner  <warner@lothar.com>
4144         * buildbot/process/step_twisted.py (Trial.createSummary): parse
4145         the 'problems' portion of stdout, add TestResults to our build
4146         * buildbot/test/test_twisted.py (Parse.testParse): test it
4148         * buildbot/interfaces.py (IBuildStatus.getTestResults): new method
4149         to retrieve a dict of accumulated test results
4150         (ITestResult): define what a single test result can do
4151         * buildbot/status/builder.py (TestResult): implement ITestResult
4152         (BuildStatus.getTestResults): retrieve dict of TestResults
4153         (BuildStatus.addTestResult): add TestResults
4154         * buildbot/test/test_status.py (Results.testAddResults): test it
4156 2004-10-14  Brian Warner  <warner@lothar.com>
4158         * buildbot/test/test_maildir.py (MaildirTest): use shutil.rmtree
4159         instead of os.system("rm -rf") for win32 portability
4161         * buildbot/test/test_slavecommand.py (SlaveCommandTestCase): use
4162         SignalMixin instead of starting/stopping the reactor, which is
4163         likely to cause problems with other tests
4165         * buildbot/slave/commands.py (SourceBase.doCopy): remove leftover
4166         self.copyComplete() call. Yoz Grahame makes the catch.
4168         * contrib/windows/buildbot.bat: helper script to deal with path
4169         issues. Thanks to Yoz Grahame.
4171         * buildbot/master.py (BuildMaster.startService): don't register a
4172         SIGHUP handler if the signal module has no SIGHUP attribute.
4173         Apparently win32 does this.
4175         * buildbot/scripts/runner.py (start): add --reactor=win32 on win32
4177         * buildbot/test/test_web.py (WebTest.test_webPathname): skip the
4178         test if the reactor can't offer UNIX sockets
4180         * buildbot/status/html.py (StatusResourceBuild.body): fix syntax
4181         error introduced in the last commit. We really need that
4182         metabuildbot :).
4184 2004-10-12  Brian Warner  <warner@lothar.com>
4186         * buildbot/changes/mail.py (MaildirSource.describe): fix exception
4187         when describing a maildir source. Thanks to Stephen Davis.
4189         * buildbot/status/words.py (IrcStatusBot.command_WATCH): round off
4190         ETA seconds
4192         * buildbot/scripts/runner.py (createMaster): install Makefile too
4193         (start): add --no_save to 'start' command
4194         * buildbot/scripts/sample.mk: simple convenience Makefile with 
4195         start/stop/reload targets
4197         * buildbot/__init__.py (version): bump to 0.6.0+ while between
4198         releases
4200 2004-09-30  Brian Warner  <warner@lothar.com>
4202         * setup.py: Releasing buildbot-0.6.0
4204 2004-09-30  Brian Warner  <warner@lothar.com>
4206         * MANIFEST.in: add debian/*, sample.cfg, more docs files. Remove
4207         test_trial.py from the source tarball until support is complete.
4209         * NEWS: update for 0.6.0 release
4210         * buildbot/__init__.py (version): same
4211         * README: same
4213         * buildbot/status/words.py (IrcStatusBot.command_SOURCE): add
4214         'source' command to tell users where to get the Buildbot source
4216         * docs/examples/*.cfg: update to modern standards
4218         * NEWS: update for release
4220         * buildbot/scripts/runner.py (createMaster): remove the
4221         -shutdown.tap stuff now that it isn't necessary
4222         (createSlave): same
4223         (start): launch buildbot.tap, not buildbot-shutdown.tap
4226         * buildbot/status/mail.py (Domain): shorten class name
4227         (MailNotifier): if lookup= is a string, pass it to Domain()
4228         * buildbot/test/test_status.py (Mail.testBuild1): new class name
4229         (Mail.testBuild2): test the string-to-Domain shortcut
4230         (Mail.testMail): fix test
4233         * buildbot/scripts/sample.cfg: improve the build-the-buildbot
4234         example config file
4236         * buildbot/status/builder.py (BuildStatus.__setstate__): re-set
4237         more attributes on load
4238         (BuilderStatus.stubBuildCacheSize): bump to 30, this was too low
4239         to accomodate the whole waterfall page at once, and the thrashing
4240         results in a lot of unnecessary loads
4241         (BuildStatus.saveYourself): use binary pickles, not fluffy text
4242         (BuilderStatus.saveYourself): same
4243         (BuilderStatus.eventGenerator): stop generating on the first missing
4244         build. We assume that saved builds are deleted oldest-first.
4245         (BuildStepStatus.__getstate__): .progress might not exist
4247         * buildbot/changes/changes.py (ChangeMaster): make it
4248         serializable, in $masterdir/changes.pck
4249         (ChangeMaster.stopService): save on shutdown
4250         * buildbot/master.py (BuildMaster.loadChanges): load at startup
4251         * buildbot/test/test_config.py: load Changes before config file
4254         * buildbot/slave/commands.py (ShellCommand.doTimeout): put the
4255         "Oh my god, you killed the command" header on a separate line
4257         * buildbot/status/builder.py (BuilderStatus.getStubBuildByNumber):
4258         skip over corrupted build pickles
4259         (BuilderStatus.getFullBuildByNumber): same
4260         (BuilderStatus.eventGenerator): skip over unavailable builds
4261         (BuildStatus.saveYourself): save builds to a .tmp file first, then
4262         do an atomic rename. This prevents a corrupted pickle when some
4263         internal serialization error occurs.
4264         (BuilderStatus.saveYourself): same
4266         * buildbot/slave/commands.py (SlaveShellCommand): oops, restore
4267         the timeout for shell commands, it got lost somehow
4269         * buildbot/status/builder.py (BuilderStatus.eventGenerator): if we
4270         run out of build steps, return the rest of the builder events
4272         * buildbot/interfaces.py (IBuilderControl.ping): add method
4274         * buildbot/process/builder.py (BuilderControl.ping): move
4275         slave-ping to BuilderControl, and fix the failure case in the
4276         process (Event.finish() is the verb, Event.finished is the noun).
4278         * buildbot/status/html.py (StatusResourceBuilder.ping): ping
4279         through the BuilderControl instead of the BuilderStatus
4280         (EventBox): add adapter for builder.Event, allowing builder events to
4281         be displayed in the waterfall display
4283         * buildbot/master.py (BotMaster.stopService): add a 'master
4284         shutdown' event to the builder's log
4285         (BuildMaster.startService): and a 'master started' on startup
4287         * buildbot/status/builder.py (BuilderStatus.eventGenerator): merge
4288         builder events into the BuildStep event stream
4289         (Status.builderAdded): add a 'builder created' event
4292         * buildbot/status/words.py (IrcStatusBot.command_WATCH): new
4293         command to announce the completion of a running build
4294         (IrcStatusBot.command_FORCE): announce when the build finishes
4296         * buildbot/status/builder.py (BuilderStatus.addFullBuildToCache):
4297         don't evict unfinished builds from the cache: they must stay in
4298         the full-cache until their logfiles have stopped changing. Make
4299         sure the eviction loop terminates if an unfinished build was hit.
4300         (HTMLLogFile.getTextWithHeaders): return HTML as if it were text.
4301         This lets exceptions be dumped in an email status message. Really
4302         we need LogFiles which contain both text and HTML, instead of two
4303         separate classes.
4304         (BuildStatus.__getstate__): handle self.finished=False
4305         (Status.builderAdded): if the pickle is corrupted, abandon the
4306         history and create a new BuilderStatus object.
4308         * buildbot/process/base.py (Build.stopBuild): tolerate lack of a
4309         self.progress attribute, helped one test which doesn't fully set
4310         up the Build object.
4312         * buildbot/interfaces.py (IStatusLogStub): split out some of the
4313         IStatusLog methods into an Interface that is implemented by "stub"
4314         logs, for which all the actual text chunks are on disk (in the
4315         pickled Build instance). To show the log contents, you must first
4316         adapt the stub log to a full IStatusLog object.
4318         * buildbot/status/builder.py (LogFileStub): create separate stub
4319         log objects, which can be upgraded to a real one if necessary.
4320         (LogFile): make them persistable, and let them stubify themselves
4321         (HTMLLogFile): same
4322         (BuildStepStatus): same
4323         (BuildStatus): same
4324         (BuildStatus.saveYourself): save the whole build out to disk
4325         (BuilderStatus): make it persistable
4326         (BuilderStatus.saveYourself): save the builder to disk
4327         (BuilderStatus.addFullBuildToCache): implement two caches which
4328         hold Build objects: a small one which holds full Builds, and a
4329         larger one which holds "stubbed" Builds (ones with their LogFiles
4330         turned into LogFileStubs). This reduces memory usage by the
4331         buildmaster by not keeping more than a few (default is 2) whole
4332         build logs in RAM all the time.
4333         (BuilderStatus.getBuild): rewrite to pull from disk (through the
4334         cache)
4335         (BuilderStatus.eventGenerator): rewrite since .builds went away
4336         (BuilderStatus.buildStarted): remove the .builds array. Add the
4337         build to the "full" cache when it starts.
4338         (BuilderStatus._buildFinished): save the build to disk when it
4339         finishes
4340         (Status): give it a basedir (same as the BuildMaster's basedir)
4341         where the builder pickles can be saved
4342         (Status.builderAdded): create the BuilderStatus ourselves, by
4343         loading a pickle from disk (or creating a new instance if there
4344         was none on disk). Return the BuilderStatus so the master can glue
4345         it into the new Builder object.
4347         * buildbot/master.py (BotMaster.stopService): on shutdown, tell
4348         all BuilderStatuses to save themselves out to disk. This is in
4349         lieu of saving anything important in the main Application pickle
4350          (the -shutdown.tap file).
4351         (BuildMaster.__init__): give Status() a basedir for its files
4352         (BuildMaster.loadConfig_Builders): do status.builderAdded first,
4353         to get the BuilderStatus, then give it to the Builder (instead of
4354         doing it the other way around). It's ok if the status announces
4355         the new Builder before it's really ready, as the outside world can
4356         only see the BuilderStatus object anyway (and it is ready before
4357         builderAdded returns). Use the builder's "builddir" (which
4358         normally specifies where the slave will run the builder) as the
4359         master's basedir (for saving serialized builds).
4361         * buildbot/status/html.py (StatusResourceBuildStep.getChild):
4362         coerce the logfile to IStatusLog before trying to get the text
4363         chunks out of it. This will pull the full (non-stubified) Build in
4364         from disk if necessary.
4365         (TextLog): fix the adapter registration
4367         * buildbot/test/test_control.py (Force.setUp): create the basedir
4368         * buildbot/test/test_web.py: same
4369         * buildbot/test/test_vc.py (SetupMixin.setUp): same
4370         * buildbot/test/test_status.py (Mail.makeBuild): match new setup
4371         * buildbot/test/test_run.py (Run.testMaster): same
4372         (Status.setUp): same
4374 2004-09-29  Fred L. Drake, Jr.  <fdrake@acm.org>
4376         * buildbot/status/html.py (Waterfall.__init__): store actual
4377         allowForce flag passed in rather than using True for everyone;
4378         make sure setting it to False doesn't cause a NameError
4379         (Waterfall.setup).
4380         (StatusResourceBuilder.__init__) add the builder name to the page
4381         title.
4382         (StatusResourceBuilder.body) move HTML generation for a name/value
4383         row into a helper method (StatusResourceBuilder.make_row); only
4384         generate the "Force Build" form if allowForce was True and the
4385         slave is connected.  Use class attributes in the generated HTML to
4386         spread a little CSS-joy.
4388 2004-09-28  Brian Warner  <warner@lothar.com>
4390         * buildbot/process/step_twisted.py (Trial.createSummary): fix
4391         warning-scanner to not ignore things like
4392         'ComponentsDeprecationWarning' and 'exceptions.RuntimeWarning'
4394         * buildbot/status/html.py (StatusResource.control): add some
4395         class-level values for .control in an attempt to make upgrading
4396         smoother
4398         * buildbot/util.py (ComparableMixin): survive missing attributes,
4399         such as when a class is modified and we're comparing old instances
4400         against new ones
4402         * buildbot/status/words.py (IrcStatusBot.privmsg): clean up
4403         failure handling, remove a redundant try/except block. Don't
4404         return the full traceback to the IRC channel.
4405         (IrcStatusBot.command_FORCE): catch new exceptions, return useful
4406         error messages. Get ETA properly.
4408         * buildbot/status/html.py (StatusResourceBuild.body): html.escape
4409         the reason, since (at least) IRC message will have <> in them.
4410         (StatusResourceBuilder.__init__): take an IBuilderControl
4411         (StatusResourceBuilder.force): use the IBuilderControl we get in
4412         the constructor instead of trying to make our own. Catch the
4413         new exceptions and ignore them for now (until we make an
4414         intermediate web page where we could show the error message)
4415         (StatusResource): create with an IControl, use it to give an
4416         IBuilderControl to all children
4417         (Waterfall): take an allowForce= option, pass an IControl object
4418         to StatusResource if it is True
4420         * buildbot/test/test_web.py (ConfiguredMaster): handle IControl
4422         * buildbot/master.py (BotPerspective.perspective_forceBuild):
4423         catch new exceptions and return string forms
4425         * buildbot/interfaces.py: add NoSlaveError, BuilderInUseError
4426         * buildbot/process/builder.py (Builder.forceBuild): raise them
4427         * buildbot/test/test_control.py (Force.testNoSlave): new test
4428         (Force.testBuilderInUse): same
4431         * buildbot/status/words.py (IrcStatusBot): enable build-forcing
4433         * buildbot/test/test_run.py: use IControl
4434         * buildbot/test/test_vc.py: same
4436         * buildbot/status/html.py (StatusResourceBuilder.force): rewrite
4437         to use IControl. Still offline.
4438         * buildbot/status/words.py (IrcStatusBot.command_FORCE): same
4440         * buildbot/process/builder.py (Builder.doPeriodicBuild): set
4441         who=None so periodic builds don't send out status mail
4442         (Builder.forceBuild): include reason in the log message
4443         (BuilderControl.forceBuild): rename 'name' to 'who'
4445         * buildbot/master.py (BotPerspective.perspective_forceBuild): add
4446         'who' parameter, but make it None by default so builds forced by
4447         slave admins don't cause status mail to be sent to anybody
4448         (BotMaster.forceBuild): same. this method is deprecated.
4449         (DebugPerspective.perspective_forceBuild): same, use IControl.
4450         (DebugPerspective.perspective_fakeChange): use IControl..
4451         (Dispatcher.requestAvatar): .. so don't set .changemaster
4453         * buildbot/interfaces.py (IBuilderControl.forceBuild): rename 'who'
4454         parameter to avoid confusion with the name of the builder
4457         * buildbot/status/mail.py: refine comment about needing 2.3
4459         * buildbot/status/html.py: move all imports to the top
4461         * buildbot/test/test_control.py: test new interfaces
4462         * buildbot/test/test_run.py (Status): handle new interfaces
4463         * buildbot/test/test_vc.py (SetupMixin.doBuild): same
4465         * buildbot/process/base.py (BuildControl): implement IBuildControl
4466         and its lonely getStatus() method
4468         * buildbot/process/builder.py (BuilderControl): implement
4469         IBuilderControl, obtained by adapting the Builder instance
4470         (Builder.startBuild): return a BuilderControl instead of a
4471         Deferred. The caller can use bc.getStatus().waitUntilFinished() to
4472         accomplish the same thing.
4474         * buildbot/master.py: move all import statements to the top
4475         (Control): implement IControl, obtained by adapting the
4476         BuildMaster instance.
4478         * buildbot/interfaces.py: add IControl, IBuilderControl, and
4479         IBuildControl. These are used to force builds. Eventually they
4480         will provide ways to reconfigure the Builders, pause or abandon a
4481         Build, and perhaps control the BuildMaster itself.
4483 2004-09-26  Brian Warner  <warner@lothar.com>
4485         * buildbot/util.py (ComparableMixin): survive twisted>1.3.0 which
4486         ends up comparing us against something without a .__class__
4488 2004-09-24  Brian Warner  <warner@lothar.com>
4490         * buildbot/scripts/runner.py: rearrange option parsing a lot, to get
4491         usage text right.
4493         * Makefile: add 'deb-snapshot' target, to create a timestamped
4494         .deb package
4496         * debian/rules (binary-indep): skip CVS/ files in dh_installexamples
4498 2004-09-23  Brian Warner  <warner@lothar.com>
4500         * buildbot/__init__.py (version): move version string here
4501         * setup.py: get version string from buildbot.version
4502         * buildbot/status/html.py (WaterfallStatusResource.body): add
4503         buildbot version to the page footer
4504         * buildbot/status/words.py (IrcStatusBot.command_VERSION): provide
4505         version when asked
4507         * buildbot/master.py (BotMaster.getPerspective): detect duplicate
4508         slaves, let the second know where the first one is coming from
4509         (BuildMaster.__init__): turn on .unsafeTracebacks so the slave can
4510         see our exceptions. It would be nice if there were a way to just
4511         send them the exception type and value, not the full traceback.
4514         * buildbot/status/mail.py (MailNotifier): add a new argument
4515         sendToInterestedUsers=, which can be set to False to disable the
4516         usual send-to-blamelist behavior.
4517         (top): handle python-2.2 which has no email.MIMEMultipart
4518         (MailNotifier.buildMessage): don't send logs without MIMEMultipart
4519         (MailNotifier.disownServiceParent): unsubscribe on removal
4521         * buildbot/test/test_status.py (Mail.testBuild2): test it
4524         * buildbot/status/progress.py (Expectations.wavg): tolerate
4525         current=None, which happens when steps start failing badly
4526         * buildbot/test/test_status.py (Progress.testWavg): test for it
4528         * buildbot/process/step.py (SVN.startVC): when the (old) slave
4529         doesn't understand args['revision'], emit a warning instead of
4530         bailing completely. Updating to -rHEAD is probably close enough.
4532         * buildbot/process/step_twisted.py (Trial.start): fix sanity-check
4534         * buildbot/test/test_status.py: at least import bb.status.client
4535         even if we don't have any test coverage for it yet
4537         * contrib/svn_buildbot.py: don't require python2.3
4538         (main): wait, do require it (for sets.py), but explain how to
4539         make it work under python2.2
4541 2004-09-23  Brian Warner  <warner@lothar.com>
4543         * contrib/svn_buildbot.py: include the revision number in the Change
4545         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): use when=,
4546         using util.now() because FreshCVS is a realtime service
4548         * buildbot/status/event.py: delete dead code
4549         * buildbot/process/step.py: don't import dead Event class
4550         * buildbot/process/step_twisted.py: same
4551         * buildbot/status/builder.py: same
4552         * buildbot/status/client.py: same
4554         * buildbot/test/test_process.py: kill buggy out-of-date disabled test
4556         * buildbot/changes/changes.py (Change): set .when from an __init__
4557         argument (which defaults to now()), rather than having
4558         ChangeMaster.addChange set it later.
4559         (ChangeMaster.addChange): same
4561         * buildbot/changes/mail.py (parseFreshCVSMail): pass in when=
4562         (parseSyncmail): same. Just use util.now() for now.
4563         (parseBonsaiMail): parse the timestamp field for when=
4565         * buildbot/test/test_vc.py (SourceStamp.addChange): page in when=
4566         instead of setting .when after the fact
4568 2004-09-22  slyphon
4570         * buildbot/slave/trial.py: new SlaveCommand to machine-parse test
4571         results when the target project uses retrial. Still under
4572         development.
4573         * buildbot/test/test_trial.py: same
4575 2004-09-21  Brian Warner  <warner@lothar.com>
4577         * buildbot/status/mail.py (MailNotifier.__init__): include
4578         success/warnings/failure in the Subject line
4579         (MailNotifier.buildMessage): add the buildbot's URL to the body,
4580         use step.logname for the addLogs=True attachment filenames
4581         * buildbot/test/test_status.py (Mail): test Subject lines
4582         (Mail.testLogs): test attachment filenames
4584         * buildbot/master.py (DebugPerspective.perspective_fakeChange):
4585         accept a 'who' argument from the debug tool
4586         * contrib/debugclient.py (DebugWidget.do_commit): send 'who'
4587         * contrib/debug.glade: add text box to set 'who'
4589         * buildbot/interfaces.py (IBuildStatus.getBuilder): replace
4590         .getBuilderName with .getBuilder().getName(), more flexible
4591         (IStatusLog.getName): logs have short names, but you can prefix
4592         them with log.getStep().getName() to make them more useful
4593         * buildbot/status/builder.py: same
4594         * buildbot/status/client.py: same
4595         * buildbot/status/html.py: same
4596         * buildbot/test/test_run.py (Status.testSlave): same
4597         * buildbot/process/step.py: tweak logfile names
4599         * buildbot/status/mail.py (MailNotifier): add lookup, change
4600         argument to extraRecipients. The notifier is now aimed at sending
4601         mail to the people involved in a particular build, with additional
4602         constant recipients as a secondary function.
4604         * buildbot/test/test_status.py: add coverage for IEmailLookup,
4605         including slow-lookup and failing-lookup. Make sure the blamelist
4606         members are included.
4608         * buildbot/interfaces.py: new interfaces IEmailSender+IEmailLookup
4609         (IBuildStatus.getResponsibleUsers): rename from getBlamelist
4610         (IBuildStatus.getInterestedUsers): new method
4611         * buildbot/status/builder.py (BuildStatus.getResponsibleUsers): same
4612         * buildbot/status/client.py (remote_getResponsibleUsers): same
4613         * buildbot/status/html.py (StatusResourceBuild.body): same
4614         * buildbot/test/test_run.py (Status.testSlave): same
4616 2004-09-20  Brian Warner  <warner@lothar.com>
4618         * docs/users.xhtml: update concepts
4620         * Makefile: add a convenience makefile, for things like 'make
4621         test'. It is not included in the source tarball.
4623 2004-09-16  Brian Warner  <warner@lothar.com>
4625         * NEWS: mention /usr/bin/buildbot, debian/*
4627         * debian/*: add preliminary debian packaging. Many thanks to
4628         Kirill Lapshin (and Kevin Turner) for the hard work. I've mangled
4629         it considerably since it left their hands, I am responsible for
4630         all breakage that's resulted.
4632         * bin/buildbot: create a top-level 'buildbot' command, to be
4633         installed in /usr/bin/buildbot . For now it's just a simple
4634         frontend to mktap/twistd/kill, but eventually it will be the entry
4635         point to the 'try' command and also a status client. It is also
4636         intended to support the upcoming debian-packaging init.d scripts.
4637         * buildbot/scripts/runner.py: the real work is done here
4638         * buildbot/scripts/__init__.py: need this too
4639         * buildbot/scripts/sample.cfg: this is installed in new
4640         buildmaster directories
4641         * setup.py: install new stuff
4643 2004-09-15  Brian Warner  <warner@lothar.com>
4645         * buildbot/test/test_vc.py: skip SVN tests if svn can't handle the
4646         'file:' schema (the version shipped with OS-X was built without the
4647         ra_local plugin).
4648         (SetupMixin.tearDown): stop the goofy twisted.web timer which
4649         updates the log-timestamp, to make sure it isn't still running after
4650         the test finishes
4652         * docs/config.xhtml: Add projectName, projectURL, buildbotURL
4653         values to the config file.
4654         * docs/examples/hello.cfg: add examples
4655         * buildbot/interfaces.py (IStatus.getBuildbotURL): define accessors
4656         * buildbot/status/builder.py (Status.getProjectURL): implement them
4657         * buildbot/master.py (BuildMaster.loadConfig): set them from config
4658         * buildbot/test/test_config.py (ConfigTest.testSimple): test them
4659         * buildbot/status/html.py (WaterfallStatusResource): display them
4662         * buildbot/test/test_vc.py (FakeBuilder.name): add attribute so
4663         certain error cases don't suffer a secondary exception.
4664         (top): Skip tests if the corresponding VC tool is not installed.
4666         * buildbot/process/factory.py (Trial): introduce separate
4667         'buildpython' and 'trialpython' lists, since trialpython=[] is
4668         what you want to invoke /usr/bin/python, whereas ./setup.py is
4669         less likely to be executable. Add env= parameter to pass options
4670         to test cases (which is how I usually write tests, I don't know if
4671         anyone else does it this way).
4673         * buildbot/process/step_twisted.py (Trial): handle python=None.
4674         Require 'testpath' be a string, not a list. Fix tests= typo.
4675         (Trial.start): sanity-check any PYTHONPATH value for stringness.
4677         * buildbot/process/step.py (RemoteCommand._remoteFailed): goofy
4678         way to deal with the possibility of removing the disconnect notify
4679         twice.
4680         (CVS): add a 'login' parameter to give a password to 'cvs login',
4681         commonly used with pserver methods (where pw="" or pw="guest")
4683         * buildbot/slave/commands.py (SourceBase): move common args
4684         extraction and setup() to __init__, so everything is ready by the
4685         time setup() is called
4686         (CVS.start): call 'cvs login' if a password was supplied
4687         (ShellCommand): special-case PYTHONPATH: prepend the master's
4688         value to any existing slave-local value.
4690         * buildbot/process/builder.py (Builder.updateBigStatus): if we
4691         don't have a remote, mark the builder as Offline. This whole
4692         function should probably go away and be replaced by individual
4693         deltas.
4694         (Builder.buildFinished): return the results to the build-finished
4695         deferred callback, helps with testing
4697 2004-09-14  Brian Warner  <warner@lothar.com>
4699         * buildbot/test/test_vc.py: put all the repositories needed to run
4700         the complete tests into a single small (1.3MB) tarball, so I can
4701         make that tarball available on the buildbot web site. Test HTTP
4702         access (for Arch and Darcs) by spawning a temporary web server
4703         while the test runs.
4705         * docs/users.xhtml: new document, describe Buildbot's limited
4706         understanding of different human users
4708         * buildbot/test/test_vc.py: rearrange test cases a bit
4710         * buildbot/process/step_twisted.py (Trial): handle testpath=
4711         * buildbot/process/factory.py (Trial): update to use step.Trial
4713         * buildbot/slave/commands.py (ShellCommandPP): fix fatal typo
4715         * buildbot/status/builder.py (BuildStatus.getText): add text2 to
4716         the overall build text (which gives you 'failed 2 tests' rather
4717         than just 'failed')
4718         (BuildStepStatus.text2): default to [], not None
4720         * buildbot/process/step_twisted.py (Trial.commandComplete): text2
4721         must be a list
4723 2004-09-12  Brian Warner  <warner@lothar.com>
4725         * buildbot/master.py (BotPerspective._commandsUnavailable): don't
4726         log the whole exception if it's just an AttributeError (old slave)
4728         * buildbot/process/step.py (ShellCommand.__init__): stash .workdir
4729         so (e.g.) sub-commands can be run in the right directory.
4730         (ShellCommand.start): accept an optional errorMessage= argument
4731         to make life easier for SVN.start
4732         (SVN.startVC): put the "can't do mode=export" warning in the LogFile
4733         headers
4734         (ShellCommand.start): move ['dir'] compatibility hack..
4735         (RemoteShellCommand.start): .. to here so everyone can use it
4737         * buildbot/process/step_twisted.py (Trial): use .workdir
4739         * buildbot/process/step_twisted.py (BuildDebs.getText): fix the
4740         text displayed when debuild fails completely
4741         (Trial): snarf _trial_temp/test.log from the slave and display it
4743 2004-09-11  Brian Warner  <warner@lothar.com>
4745         * buildbot/process/step_twisted.py (ProcessDocs.getText): typo
4747         * buildbot/process/process_twisted.py (TwistedTrial.tests): oops,
4748         set to 'twisted', so --recurse can find twisted/web/test/*, etc
4750         * buildbot/process/step.py (ShellCommand): call .createSummary
4751         before .evaluateCommand instead of the other way around. This
4752         makes it slightly easier to count warnings and then use that to
4753         set results=WARNINGS
4754         * buildbot/process/step_twisted.py: cosmetic, swap the methods
4756         * buildbot/process/base.py (Build.buildFinished): update status
4757         before doing progress. It's embarrassing for the build to be stuck
4758         in the "building" state when an exceptions occurs elsewhere..
4760         * buildbot/status/progress.py (Expectations.expectedBuildTime):
4761         python2.2 doesn't have 'sum'
4763         * buildbot/status/builder.py (Status.getBuilderNames): return a copy,
4764         to prevent clients from accidentally sorting it
4766         * buildbot/master.py (Manhole): add username/password
4767         (BuildMaster.loadConfig): use c['manhole']=Manhole() rather than
4768         c['manholePort'], deprecate old usage
4769         * docs/config.xhtml: document c['manhole']
4770         * docs/examples/hello.cfg: show example of using a Manhole
4773         * buildbot/test/test_steps.py (FakeBuilder.getSlaveCommandVersion):
4774         pretend the slave is up to date
4776         * buildbot/status/builder.py (BuildStepStatus.stepFinished): 'log',
4777         the module, overlaps with 'log', the local variable
4779         * buildbot/status/html.py: oops, 2.2 needs __future__ for generators
4781         * buildbot/process/builder.py (Builder.getSlaveCommandVersion):
4782         new method to let Steps find out the version of their
4783         corresponding SlaveCommand.
4784         * buildbot/process/step.py (BuildStep.slaveVersion): utility method
4785         (ShellCommand.start): add 'dir' argument for <=0.5.0 slaves
4786         (CVS.startVC): backwards compatibility for <=0.5.0 slaves
4787         (SVN.startVC): same
4788         (Darcs.startVC): detect old slaves (missing the 'darcs' command)
4789         (Arch.startVC): same
4790         (P4Sync.startVC): same
4792         * buildbot/process/step.py (LoggedRemoteCommand.start): return the
4793         Deferred so we can catch errors in remote_startCommand
4794         (RemoteShellCommand.start): same
4796         * docs/examples/twisted_master.cfg: update sample config file
4798         * buildbot/slave/commands.py (ShellCommandPP): write to stdin
4799         after connectionMade() is called, not before. Close stdin at that
4800         point too.
4802         * buildbot/process/process_twisted.py: update to use Trial, clean
4803         up argument passing (move to argv arrays instead of string
4804         commands)
4806         * buildbot/process/step_twisted.py (Trial): new step to replace
4807         RunUnitTests, usable by any trial-using project (not just
4808         Twisted). Arguments have changed, see the docstring for details.
4810         * buildbot/process/base.py (Build.startBuild): this now returns a
4811         Deferred. Exceptions that occur during setupBuild are now
4812         caught better and lead to fewer build_status weirdnesses, like
4813         finishing a build that was never started.
4814         (Build.buildFinished): fire the Deferred instead of calling
4815         builder.buildFinished directly. The callback argument is this
4816         Build, everything else can be extracted from it, including the
4817         new build.results attribute.
4818         * buildbot/process/builder.py (Builder.startBuild): same
4819         (Builder.buildFinished): same, extract results from build
4821         * buildbot/process/step.py (ShellCommands): remove dead code
4823 2004-09-08  Brian Warner  <warner@lothar.com>
4825         * buildbot/test/test_vc.py (VC.doPatch): verify that a new build
4826         doesn't try to use the leftover patched workdir
4827         (SourceStamp): test source-stamp computation for CVS and SVN
4829         * buildbot/slave/commands.py (SourceBase.doPatch): mark the
4830         patched workdir ('touch .buildbot-patched') so we don't try to
4831         update it later
4832         (SourceBase.start): add ['revision'] for all Source steps
4833         (CVS): change args: use ['branch'] for -r, remove ['files']
4834         (CVS.buildVC): fix revision/branch stuff
4835         (SVN): add revision stuff
4837         * buildbot/process/step.py (BuildStep.__init__): reject unknown
4838         kwargs (except 'workdir') to avoid silent spelling errors
4839         (ShellCommand.__init__): same
4840         (Source): new base class for CVS/SVN/etc. Factor out everything
4841         common, add revision computation (perform the checkout with a -D
4842         DATE or -r REVISION that gets exactly the sources described by the
4843         last Change), overridable with step.alwaysUseLatest. Add patch
4844         handling (build.getSourceStamp can trigger the use of a base
4845         revision and a patch).
4846         (CVS, SVN, Darcs, Arch, P4Sync): refactor, remove leftover arguments
4847         * docs/steps.xhtml: update docs
4848         * docs/source.xhtml: mention .checkoutDelay
4849         * docs/examples/hello.cfg: show use of checkoutDelay, alwaysUseLatest
4851         * buildbot/process/base.py (Build.setSourceStamp): add a
4852         .sourceStamp attribute to each Build. If set, this indicates that
4853         the build should be done with something other than the most
4854         recent source tree. This will be used to implement "try" builds.
4855         (Build.allChanges): new support method
4856         (Build.lastChangeTime): remove, functionality moved to Source steps
4857         (Build.setupBuild): copy the Step args before adding ['workdir'],
4858         to avoid modifying the BuildFactory (and thus triggering spurious
4859         config changes)
4862         * buildbot/status/html.py: rename s/commits/changes/
4863         (StatusResourceChanges): same
4864         (CommitBox.getBox): same, update URL
4865         (WaterfallStatusResource): same
4866         (StatusResource.getChild): same
4868         * contrib/debugclient.py (DebugWidget.do_commit): send .revision
4869         * contrib/debug.glade: add optional 'revision' to the fakeChange
4871         * buildbot/changes/changes.py (html_tmpl): display .revision
4872         (ChangeMaster.addChange): note .revision in log
4873         * buildbot/changes/pb.py (ChangePerspective.perspective_addChange):
4874         accept a ['revision'] attribute
4876         * buildbot/process/factory.py (BuildFactory): use ComparableMixin
4878         * buildbot/master.py (BotMaster.getPerspective): update the
4879         .connected flag in SlaveStatus when it connects
4880         (BotMaster.detach): and when it disconnects
4881         (DebugPerspective.perspective_fakeChange): take a 'revision' attr
4882         (BuildMaster.loadConfig_Builders): walk old list correctly
4884         * buildbot/test/test_config.py: fix prefix= usage
4886 2004-09-06  Brian Warner  <warner@lothar.com>
4888         * NEWS: mention P4
4890         * buildbot/changes/p4poller.py (P4Source): New ChangeSource to
4891         poll a P4 depot looking for recent changes. Thanks to Dave
4892         Peticolas for the contribution. Probably needs some testing after
4893         I mangled it.
4895         * buildbot/process/step.py (P4Sync): simple P4 source-updater,
4896         requires manual client setup for each buildslave. Rather
4897         experimental. Thanks again to Dave Peticolas.
4898         * buildbot/slave/commands.py (P4Sync): slave-side source-updater
4900         * buildbot/changes/changes.py (Change): add a .revision attribute,
4901         which will eventually be used to generate source-stamp values.
4903         * buildbot/process/step.py (RemoteCommand.start): use
4904         notifyOnDisconnect to notice when we lose the slave, then treat it
4905         like an exception. This allows LogFiles to be closed and the build
4906         to be wrapped up normally. Be sure to remove the disconnect
4907         notification when the step completes so we don't accumulate a
4908         bazillion such notifications which will fire weeks later (when the
4909         slave finally disconnects normally). Fixes SF#915807, thanks to
4910         spiv (Andrew Bennetts) for the report.
4911         (LoggedRemoteCommand): move __init__ code to RemoteCommand, since it
4912         really isn't Logged- specific
4913         (LoggedRemoteCommand.remoteFailed): Add an extra newline to the
4914         header, since it's almost always going to be appended to an
4915         incomplete line
4916         * buildbot/test/test_steps.py (BuildStep.testShellCommand1):
4917         update test to handle use of notifyOnDisconnect
4919         * buildbot/status/builder.py (BuilderStatus.currentlyOffline):
4920         don't clear .ETA and .currentBuild when going offline, let the
4921         current build clean up after itself
4923         * buildbot/process/builder.py (Builder.detached): wait a moment
4924         before doing things like stopping the current build, because the
4925         current step will probably notice the disconnect and cleanup the
4926         build by itself
4927         * buildbot/test/test_run.py (Status.tearDown): update test to
4928         handle asynchronous build-detachment
4930         * buildbot/process/base.py (Build.stopBuild): minor shuffles
4932         * buildbot/status/html.py (WaterfallStatusResource.buildGrid):
4933         hush a debug message
4935 2004-09-05  Brian Warner  <warner@lothar.com>
4937         * buildbot/changes/maildir.py (Maildir.start): catch an IOError
4938         when the dnotify fcntl() fails and fall back to polling. Linux 2.2
4939         kernels do this: the fcntl module has the F_NOTIFY constant, but
4940         the kernel itself doesn't support the operation. Thanks to Olly
4941         Betts for spotting the problem.
4943         * buildbot/process/step.py (Darcs): new source-checkout command
4944         (Arch): new source-checkout command
4945         (todo_P4): fix constructor syntax, still just a placeholder
4946         * buildbot/test/test_vc.py (VC.testDarcs): test it
4947         (VC.testDarcsHTTP): same, via localhost HTTP
4948         (VC.testArch): same
4949         (VC.testArchHTTP): same
4950         * NEWS: mention new features
4952         * buildbot/slave/commands.py (ShellCommand): add .keepStdout,
4953         which tells the step to stash stdout text locally (in .stdout).
4954         Slave-side Commands can use this to make decisions based upon the
4955         output of the the ShellCommand (not just the exit code).
4956         (Darcs): New source-checkout command
4957         (Arch): New source-checkout command, uses .keepStdout in one place
4958         where it needs to discover the archive's default name.
4960         * docs/steps.xhtml: Document options taken by Darcs and Arch.
4961         * docs/source.xhtml: add brief descriptions of Darcs and Arch
4962         * docs/examples/hello.cfg: add examples of Darcs and Arch checkout
4964         * buildbot/process/step.py (ShellCommand.describe): add an
4965         alternate .descriptionDone attribute which provides descriptive
4966         text when the step is complete. .description can be ["compiling"],
4967         for use while the step is running, then .descriptionDone can be
4968         ["compile"], used alone when the step succeeds or with "failed" when
4969         it does not. Updated other steps to use the new text.
4970         * buildbot/process/step_twisted.py: same
4971         * buildbot/test/test_run.py: update tests to match
4973 2004-08-30  Brian Warner  <warner@lothar.com>
4975         * buildbot/process/step.py (ShellCommand.createSummary): fix docs
4976         (CVS.__init__): send 'patch' argument to slave
4977         (CVS.start): don't create the LoggedRemoteCommand until start(),
4978         so we can catch a .patch added after __init__
4979         (SVN.__init__): add 'patch' to SVN too
4980         (SVN.start): same
4982         * buildbot/slave/commands.py (ShellCommand): add a 'stdin'
4983         argument, to let commands push data into the process' stdin pipe.
4984         Move usePTY to a per-instance attribute, and clear it if 'stdin'
4985         is in use, since closing a PTY doesn't really affect the process
4986         in the right way (in particular, I couldn't run /usr/bin/patch
4987         under a pty).
4988         (SourceBase.doPatch): handle 'patch' argument
4990         * buildbot/test/test_vc.py (VC.doPatch): test 'patch' argument for
4991         both CVS and SVN
4993         * buildbot/slave/commands.py (cvs_ver): fix version-parsing goo
4994         * buildbot/slave/bot.py (Bot.remote_getCommands): send command
4995         versions to master
4996         * buildbot/master.py (BotPerspective.got_commands): get command
4997         versions from slave, give to each builder
4998         * buildbot/process/builder.py (Builder.attached): stash slave
4999         command versions in .remoteCommands
5001         * docs/steps.xhtml: bring docs in-line with reality
5003         * buildbot/process/step.py (CVS.__init__): more brutal
5004         compatibility code removal
5005         (SVN.__init__): same
5007         * buildbot/slave/commands.py (SlaveShellCommand): update docs
5008         (SlaveShellCommand.start): require ['workdir'] argument, remove
5009         the ['dir'] fallback (compatibility will come later)
5010         (SourceBase): update docs
5011         (SourceBase.start): remove ['directory'] fallback
5012         (CVS): update docs
5013         (SVN): update docs
5014         * buildbot/test/test_config.py (ConfigTest.testBuilders): update test
5015         * buildbot/test/test_steps.py (BuildStep.testShellCommand1): same
5016         * buildbot/test/test_slavecommand.py (SlaveCommandTestCase): same
5018         * buildbot/process/step.py (RemoteShellCommand.__init__): add
5019         want_stdout/want_stderr. remove old 'dir' keyword (to simplify the
5020         code.. I will figure out 0.5.0-compatibility hooks later)
5022 2004-08-30  Brian Warner  <warner@lothar.com>
5024         * buildbot/process/process_twisted.py: rewrite in terms of new
5025         BuildFactory base class. It got significantly shorter. Yay
5026         negative code days.
5028         * buildbot/process/step_twisted.py (HLint.start): fix to make it
5029         work with the new "self.build isn't nailed down until we call
5030         step.start()" scheme: specifically, __init__ is called before the
5031         build has decided on which Changes are going in, so we don't scan
5032         build.allFiles() for .xhtml files until start()
5033         (HLint.commandComplete): use getText(), not getStdout()
5034         (RunUnitTests.start): same: don't use .build until start()
5035         (RunUnitTests.describe): oops, don't report (None) when using
5036         the default reactor
5037         (RunUnitTests.commandComplete): use getText()
5038         (RunUnitTests.createSummary): same
5039         (BuildDebs.commandComplete): same
5041         * buildbot/process/step.py (RemoteShellCommand.__init__): don't
5042         set args['command'] until start(), since our BuildStep is allowed
5043         to change their mind up until that point
5044         (TreeSize.commandComplete): use getText(), not getStdout()
5046         * docs/examples/twisted_master.cfg: update to current standards
5048         * docs/factories.xhtml: update
5049         * buildbot/process/factory.py: implement all the common factories
5050         described in the docs. The Trial factory doesn't work yet, and
5051         I've probably broken all the process_twisted.py factories in the
5052         process. There are compatibility classes left in for things like
5053         the old BasicBuildFactory, but subclasses of them are unlikely to
5054         work.
5055         * docs/examples/glib_master.cfg: use new BuildFactories
5056         * docs/examples/hello.cfg: same
5058         * buildbot/test/test_config.py (ConfigTest.testBuilders): remove
5059         explicit 'workdir' args
5061         * buildbot/process/base.py (BuildFactory): move factories to ..
5062         * buildbot/process/factory.py (BuildFactory): .. here
5063         * buildbot/process/process_twisted.py: handle move
5064         * buildbot/test/test_config.py: same
5065         * buildbot/test/test_run.py: same
5066         * buildbot/test/test_steps.py: same
5067         * buildbot/test/test_vc.py: same
5068         * docs/factories.xhtml: same
5070         * NEWS: mention config changes that require updating master.cfg
5072         * buildbot/process/base.py (Build.setupBuild): add a 'workdir'
5073         argument to all steps that weren't given one already, pointing at
5074         the "build/" directory.
5076         * docs/examples/hello.cfg: remove explicit 'workdir' args
5078         * docs/factories.xhtml: document standard BuildFactory clases,
5079         including a bunch which are have not yet been written
5081 2004-08-29  Brian Warner  <warner@lothar.com>
5083         * buildbot/interfaces.py (IBuildStepStatus.getResults): move
5084         result constants (SUCCESS, WARNINGS, FAILURE, SKIPPED) to
5085         buildbot.status.builder so they aren't quite so internal
5086         * buildbot/process/base.py, buildbot/process/builder.py: same
5087         * buildbot/process/maxq.py, buildbot/process/step.py: same
5088         * buildbot/process/step_twisted.py, buildbot/status/builder.py: same
5089         * buildbot/status/mail.py, buildbot/test/test_run.py: same
5090         * buildbot/test/test_status.py, buildbot/test/test_vc.py: same
5092         * buildbot/status/html.py (StatusResourceBuildStep): oops, update
5093         to handle new getLogs()-returns-list behavior
5094         (StatusResourceBuildStep.getChild): same
5095         (StepBox.getBox): same
5096         (WaterfallStatusResource.phase0): same
5098         * docs/source.xhtml: document how Buildbot uses version-control
5099         systems (output side: how we get source trees)
5100         * docs/changes.xhtml: rename from sources.xhtml, documents VC
5101         systems (input side: how we learn about Changes)
5103         * buildbot/master.py (Manhole): use ComparableMixin
5104         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): same
5105         * buildbot/changes/mail.py (MaildirSource): same
5106         * buildbot/status/client.py (PBListener): same
5107         * buildbot/status/html.py (Waterfall): same
5108         * buildbot/status/words.py (IRC): same
5110         * NEWS: start describing new features
5112         * buildbot/status/mail.py (MailNotifier): finish implementation.
5113         The message body is still a bit sparse.
5114         * buildbot/test/test_status.py (Mail): test it
5116         * buildbot/util.py (ComparableMixin): class to provide the __cmp__
5117         and __hash__ methods I wind up adding everywhere. Specifically
5118         intended to support the buildbot config-file update scheme where
5119         we compare, say, the old list of IStatusTargets against the new
5120         one and don't touch something which shows up on both lists.
5121         * buildbot/test/test_util.py (Compare): test case for it
5123         * buildbot/interfaces.py (IBuildStatus): change .getLogs() to
5124         return a list instead of a dict
5125         (IBuildStepStatus.getLogs): same. The idea is that steps create
5126         logs with vaguely unique names (although their uniqueness is not
5127         guaranteed). Thus a compilation step should create its sole
5128         logfile with the name 'compile', and contribute it to the
5129         BuildStatus. If a step has two logfiles, try to create them with
5130         different names (like 'test.log' and 'test.summary'), and only
5131         contribute the important ones to the overall BuildStatus.
5132         * buildbot/status/builder.py (Event.getLogs): same
5133         (BuildStepStatus): fix default .text and .results
5134         (BuildStepStatus.addLog): switch to list-like .getLogs()
5135         (BuildStepStatus.stepFinished): same
5136         (BuildStatus.text): fix default .text
5137         (BuildStatus.getLogs): temporary hack to return all logs (from all
5138         child BuildStepStatus objects). Needs to be fixed to only report
5139         the significant ones (as contributed by the steps themselves)
5140         * buildbot/test/test_run.py: handle list-like .getLogs()
5141         * buildbot/test/test_steps.py (BuildStep.testShellCommand1): same
5143 2004-08-28  Brian Warner  <warner@lothar.com>
5145         * buildbot/process/builder.py (Builder.attached): serialize the
5146         attachment process, so the attach-watcher isn't called until the
5147         slave is really available. Add detached watchers too, which makes
5148         testing easier.
5150         * buildbot/test/test_vc.py: test VC modes (clobber/update/etc)
5152         * buildbot/test/test_swap.py: remove dead code
5154         * buildbot/slave/commands.py (ShellCommandPP): add debug messages
5155         (ShellCommand.start): treat errors in _startCommand/spawnProcess
5156         sort of as if the command being run exited with a -1. There may
5157         still be some holes in this scheme.
5158         (CVSCommand): add 'revision' tag to the VC commands, make sure the
5159         -r option appears before the module list
5160         * buildbot/process/step.py (CVS): add 'revision' argument
5162         * buildbot/slave/bot.py (SlaveBuilder._ackFailed): catch failures
5163         when sending updates or stepComplete messages to the master, since
5164         we don't currently care whether they arrive or not. When we revamp
5165         the master/slave protocol to really resume interrupted builds,
5166         this will need revisiting.
5167         (lostRemote): remove spurious print
5169         * buildbot/master.py (BotPerspective.attached): serialize the
5170         new-builder interrogation process, to make testing easier
5171         (BotMaster.waitUntilBuilderDetached): convenience function
5173         * buildbot/status/builder.py (BuilderStatus): prune old builds
5174         (BuildStatus.pruneSteps): .. and steps
5175         (BuildStepStatus.pruneLogs): .. and logs
5176         (BuilderStatus.getBuild): handle missing builds
5177         * buildbot/status/html.py (StatusResourceBuild.body): display build
5178         status in the per-build page
5179         (BuildBox.getBox): color finished builds in the per-build box
5181 2004-08-27  Brian Warner  <warner@lothar.com>
5183         * buildbot/status/mail.py (MailNotifier): new notification class,
5184         not yet finished
5186         * buildbot/slave/commands.py (SourceBase): refactor SVN and CVS into
5187         variants of a common base class which handles all the mode= logic
5189         * buildbot/interfaces.py (IBuildStatus.getPreviousBuild): add
5190         convenience method
5191         * buildbot/status/builder.py (BuildStatus.getPreviousBuild): same
5193 2004-08-26  Brian Warner  <warner@lothar.com>
5195         * buildbot/test/test_slavecommand.py: accomodate new slavecommand
5196         interfaces
5198         * buildbot/test/test_run.py: update to new Logfile interface, new
5199         buildbot.slave modules
5200         * buildbot/test/test_steps.py: same, remove Swappable, add timeouts
5202         * MANIFEST.in: new sample config file
5203         * docs/examples/hello.cfg: same
5205         * buildbot/process/step_twisted.py: remove dead import
5207         * buildbot/process/step.py (RemoteCommand.run): catch errors
5208         during .start
5209         (RemoteCommand.remote_update): ignore updates that arrive after
5210         we've shut down
5211         (RemoteCommand.remote_complete): ignore duplicate complete msgs
5212         (RemoteCommand._remoteComplete): cleanup failure handling, reduce
5213         the responsibilities of the subclass's methods
5214         (BuildStep.failed): catch errors during failure processing
5215         (BuildStep.addHTMLLog): provide all-HTML logfiles (from Failures)
5216         (CVS): move to a mode= argument (described in docstring), rather
5217         than the ungainly clobber=/export=/copydir= combination.
5218         (SVN): add mode= functionality to SVN too
5219         (todo_Darcs, todo_Arch, todo_P4): placeholders for future work
5221         * buildbot/process/base.py (Build.startNextStep): catch errors
5222         during s.startStep()
5224         * buildbot/clients/base.py: update to new PB client interface.
5225         gtkPanes is still broken
5227         * buildbot/bot.py, buildbot/slavecommand.py: move to..
5228         * buildbot/slave/bot.py, buildbot/slave/commands.py: .. new directory
5229         * setup.py: add buildbot.slave module
5230         * buildbot/bb_tap.py: handle move
5231         * buildbot/slave/registry.py: place to register commands, w/versions
5232         * buildbot/slave/bot.py: major simplifications
5233         (SlaveBuilder.remote_startCommand): use registry for slave commands,
5234         instead of a fixed table. Eventually this will make the slave more
5235         extensible. Use 'start' method on the command, not .startCommand.
5236         Fix unsafeTracebacks handling (I think).
5237         * buildbot/slave/commands.py: major cleanup. ShellCommand is now a
5238         helper class with a .start method that returns a Deferred.
5239         SlaveShellCommand is the form reached by the buildmaster. Commands
5240         which use multiple ShellCommands can just chain them as Deferreds,
5241         with some helper methods in Command (_abandonOnFailure and
5242         _checkAbandoned) to bail on rc!=0.
5243         (CVSCommand): prefer new mode= argument
5244         (SVNFetch): add mode= argument
5246         * buildbot/master.py (DebugPerspective.perspective_forceBuild):
5247         put a useful reason string on the build
5249         * buildbot/status/builder.py (LogFile): do LogFile right: move the
5250         core functionality into an IStatusLog object
5251         (BuildStatus.sendETAUpdate): don't send empty build-eta messages
5252         * buildbot/status/html.py (TextLog): HTML-rendering goes here
5253         (StatusResourceBuild.body): use proper accessor methods
5254         * buildbot/status/client.py (RemoteLog): PB-access goes here
5255         (StatusClientPerspective.perspective_subscribe): add "full" mode,
5256         which delivers log contents too
5257         (PBListener.__cmp__): make PBListeners comparable, thus removeable
5258         * buildbot/status/event.py: remove old Logfile completely
5260         * buildbot/interfaces.py (IStatusLog.subscribe): make the
5261         subscription interface for IStatusLog subscriptions just like all
5262         other the status subscriptions
5263         (IStatusReceiver.logChunk): method called on subscribers
5265 2004-08-24  Brian Warner  <warner@lothar.com>
5267         * buildbot/process/builder.py (Builder._pong): oops, ping response
5268         includes a result (the implicit None returned by remote_print).
5269         Accept it so the _pong method handles the response correctly.
5271 2004-08-06  Brian Warner  <warner@lothar.com>
5273         * buildbot/test/test_config.py: update IRC, PBListener tests
5275         * buildbot/status/client.py (StatusClientPerspective): total
5276         rewrite to match new IStatus interfaces. New subscription scheme.
5277         There are still a few optimizations to make (sending down extra
5278         information with event messages so the client doesn't have to do a
5279         round trip). The logfile-retrieval code is probably still broken.
5280         Moved the PB service into its own port, you can no longer share a
5281         TCP socket between a PBListener and, say, the slaveport (this
5282         should be fixed eventually).
5283         * buildbot/clients/base.py (Client): revamp to match. still needs
5284         a lot of work, but basic event reporting works fine. gtkPanes is
5285         completely broken.
5287         * buildbot/status/words.py (IRC): move to c['status']. Each IRC
5288         instance talks to a single irc server. Threw out all the old
5289         multi-server handling code. Still need to add back in
5290         builder-control (i.e. "force build")
5292         * buildbot/status/html.py (StatusResourceBuildStep.body): add some
5293         more random text to the as-yet-unreachable per-step page
5295         * buildbot/status/builder.py (BuildStepStatus.sendETAUpdate):
5296         rename to stepETAUpdate
5297         (BuildStatus.subscribe): add build-wide ETA updates
5298         (BuilderStatus.getState): remove more cruft
5299         (BuilderStatus.getCurrentBuild): remove more cruft
5300         (BuilderStatus.buildStarted): really handle tuple-subscription
5301         * buildbot/test/test_run.py (Status.testSlave): handle the
5302         stepETAUpdate rename
5304         * buildbot/master.py (BuildMaster): don't add a default
5305         StatusClientService. Don't add a default IrcStatusFactory. Both
5306         are now added through c['status'] in the config file. c['irc'] is
5307         accepted for backwards compatibility, the only quirk is you cannot
5308         use c['irc'] to specify IRC servers on ports other than 6667.
5310         * buildbot/interfaces.py (IBuildStatus.getCurrentStep): add method
5311         (IStatusReceiver.buildStarted): allow update-interval on subscribe
5312         (IStatusReceiver.buildETAUpdate): send build-wide ETA updates
5313         (IStatusReceiver.stepETAUpdate): rename since it's step-specific
5316         * buildbot/master.py (BuildMaster.startService): SIGHUP now causes
5317         the buildmaster to re-read its config file
5320         * buildbot/test/test_web.py (test_webPortnum): need a new hack to
5321         find out the port our server is running on
5322         (WebTest.test_webPathname_port): same
5324         * buildbot/test/test_config.py (testWebPortnum): test it
5325         (testWebPathname): ditto
5327         * docs/config.xhtml: document new c['status'] configuration option
5329         * buildbot/status/html.py (Waterfall): new top-level class which
5330         can be added to c['status']. This creates the Site as well as the
5331         necessary TCPServer/UNIXServer. It goes through the BuildMaster,
5332         reachable as .parent, for everything.
5334         * buildbot/master.py (Manhole): make it a normal service Child
5335         (BuildMaster.loadConfig_status): c['status'] replaces webPortnum and
5336         webPathname. It will eventually replace c['irc'] and the implicit
5337         PB listener as well. c['webPortnum'] and c['webPathname'] are left
5338         in as (deprecated) backward compatibility hooks for now.
5341         * buildbot/process/builder.py (Builder.buildFinished): don't
5342         inform out builder_status about a finished build, as it finds out
5343         through its child BuildStatus object
5345         * buildbot/status/html.py: extensive revamp. Use adapters to make
5346         Boxes out of BuildStepStatus and friends. Acknowledge that Steps
5347         have both starting and finishing times and adjust the waterfall
5348         display accordingly, using spacers if necessary. Use SlaveStatus
5349         to get buildslave info.
5350         (StatusResourceBuildStep): new just-one-step resource, used to get
5351         logfiles. No actual href to it yet.
5353         * buildbot/status/event.py (Logfile.doSwap): disable Swappable for
5354         the time being, until I get the file-naming scheme right
5356         * buildbot/status/builder.py (Event): clean started/finished names
5357         (BuildStatus.isFinished): .finished is not None is the right test
5358         (BuildStatus.buildStarted): track started/finished times ourselves
5359         (BuilderStatus.getSlave): provide access to SlaveStatus object
5360         (BuilderStatus.getLastFinishedBuild): all builds are now in
5361         .builds, even the currently-running one. Accomodate this change.
5362         (BuilderStatus.eventGenerator): new per-builder event generator.
5363         Returns BuildStepStatus and BuildStatus objects, since they can
5364         both be adapted as necessary.
5365         (BuilderStatus.addEvent): clean up started/finished attributes
5366         (BuilderStatus.startBuild,finishBuild): remove dead code
5367         (SlaveStatus): new object to provide ISlaveStatus
5369         * buildbot/process/step.py (ShellCommand.getColor): actually
5370         return the color instead of setting it ourselves
5371         (CVS.__init__): pull .timeout and .workdir options out of
5372         **kwargs, since BuildStep will ignore them. Without this neither
5373         will be sent to the slave correctly.
5374         (SVN.__init__): same
5376         * buildbot/process/builder.py (Builder): move flags to class-level
5377         attributes
5378         (Builder.attached): remove .remoteInfo, let the BotPerspective and
5379         SlaveStatus handle that
5381         * buildbot/process/base.py (Build.firstEvent): remove dead code
5382         (Build.stopBuild): bugfix
5384         * buildbot/changes/pb.py (PBChangeSource.describe): add method
5386         * buildbot/changes/changes.py (Change): add IStatusEvent methods
5387         (ChangeMaster.eventGenerator): yield Changes, since there are now
5388         Adapters to turn them into HTML boxes
5390         * buildbot/master.py (BotMaster): track SlaveStatus from BotMaster
5391         (BotPerspective.attached): feed a SlaveStatus object
5392         (BuildMaster.loadConfig): add a manhole port (debug over telnet)
5393         (BuildMaster.loadConfig_Builders): give BuilderStatus a parent
5395         * buildbot/interfaces.py: API additions
5396         (ISlaveStatus): place to get slave status
5398 2004-08-04  Brian Warner  <warner@lothar.com>
5400         * buildbot/slavecommand.py (DummyCommand.finished): send rc=0 when
5401         the delay finishes, so the step is marked as SUCCESS
5403         * buildbot/test/test_run.py (Status.testSlave): cover more of
5404         IBuildStatus and IBuildStepStatus
5406         * buildbot/status/progress.py (StepProgress): move some flags to
5407         class-level attributes
5408         (StepProgress.remaining): if there are no other progress metrics
5409         to go by, fall back to elapsed time
5410         (StepProgress.setExpectations): take a dict of metrics instead of
5411         a list
5412         (BuildProgress.setExpectationsFrom): pull expectations from the
5413         Expectations, instead of having it push them to the BuildProgress
5414         (Expectations): move some flags to class-level attributes
5415         (Expectations.__init__): copy per-step times from the
5416         BuildProgress too
5417         (Expectations.expectedBuildTime): new method for per-build ETA
5419         * buildbot/status/event.py (Logfile): move some flags to
5420         class-level attributes
5421         (Logfile.logProgressTo): better method name, let step set the
5422         progress axis name (instead of always being "output")
5424         * buildbot/status/builder.py (BuildStepStatus.getTimes): track the
5425         times directly, rather than depending upon the (possibly missing)
5426         .progress object. Use 'None' to indicate "not started/finished
5427         yet"
5428         (BuildStepStatus.getExpectations): oops, return the full list of
5429         expectations
5430         (BuilderStatus._buildFinished): append finished builds to .builds
5432         * buildbot/process/step.py (BuildStep): add separate .useProgress
5433         flag, since empty .progressMetrics[] still implies that time is a
5434         useful predictor
5435         (CVS): set up the cmd in __init__, instead of waiting for start()
5437         * buildbot/process/base.py (Build.startBuild): disable the 'when'
5438         calculation, this will eventually turn into a proper sourceStamp
5439         (Build.setupBuild): tell the Progress to load from the Expectations,
5440         instead of having the Expectations stuff things into the Progress
5441         (Build.buildException): add a build-level errback to make sure the
5442         build's Deferred fires even in case of exceptions
5444         * buildbot/master.py (BotMaster.forceBuild): convey the reason into
5445         the forced build
5446         * buildbot/process/builder.py (Builder.forceBuild): convey the
5447         reason instead of creating a fake Change
5449         * docs/examples/twisted_master.cfg: update to match reality
5451         * buildbot/test/test_config.py, buildbot/test/test_process.py:
5452         * buildbot/test/test_run.py, buildbot/test/test_steps.py:
5453         fix or remove broken/breaking tests
5455         * buildbot/status/event.py (Logfile.__len__): remove evil method
5457         * buildbot/status/builder.py (BuildStepStatus.stepStarted): tolerate
5458         missing .build, for test convenience
5460         * buildbot/process/step_twisted.py: import fixes
5462         * buildbot/process/step.py (BuildStep.failed): exception is FAILURE
5464         * buildbot/master.py (BuildMaster.loadConfig_Builders): leftover
5465         .statusbag reference
5467         * buildbot/bot.py (BuildSlave.stopService): tear down the TCP
5468         connection at shutdown, and stop it from reconnecting
5470         * buildbot/test/test_run.py (Run.testSlave): use a RemoteDummy to
5471         chase down remote-execution bugs
5473         * buildbot/process/step.py: more fixes, remove
5474         BuildStep.setStatus()
5475         * buildbot/status/builder.py: move setStatus() functionality into
5476         BuildStatus.addStep
5477         * buildbot/status/event.py: minor fixes
5479 2004-08-03  Brian Warner  <warner@lothar.com>
5481         * buildbot/process/base.py, buildbot/process/builder.py
5482         * buildbot/process/step.py, buildbot/status/builder.py
5483         * buildbot/status/event.py, buildbot/test/test_run.py:
5484         fix status delivery, get a basic test case working
5485         * buildbot/master.py: finish implementing basic status delivery,
5486         temporarily disable HTML/IRC/PB status sources
5488         * buildbot/bot.py (Bot.remote_setBuilderList): remove debug noise
5490         * buildbot/status/progress.py (BuildProgress): remove dead code
5492         * buildbot/interfaces.py
5493         * buildbot/process/base.py, buildbot/process/builder.py
5494         * buildbot/process/step.py, buildbot/process/step_twisted.py
5495         * buildbot/status/builder.py: Complete overhaul of the all
5496         status-delivery code, unifying all types of status clients (HTML,
5497         IRC, PB). See interfaces.IBuildStatus for an idea of what it will
5498         look like. This commit is a checkpointing of the work-in-progress:
5499         the input side is mostly done (Builders/Builds sending status
5500         to the BuilderStatus/BuildStatus objects), but the output side has
5501         not yet been started (HTML resources querying BuilderStatus
5502         objects). Things are probably very broken right now and may remain
5503         so for several weeks, I apologize for the disruption.
5505         * buildbot/status/event.py: add a setHTML method to use pre-rendered
5506         HTML as the log's contents. Currently used for exception tracebacks.
5507         * buildbot/status/progress.py: minor spelling changes
5509 2004-08-02  Brian Warner  <warner@lothar.com>
5511         * docs/config.xhtml: XHTML fixes, makes raw .xhtml files viewable
5512         in mozilla. Also added stylesheets copied from Twisted's docs.
5513         Remember that these files are meant to be run through Lore first.
5514         Thanks to Philipp Frauenfelder for the fixes.
5515         * docs/factories.xhtml, docs/sources.xhtml, docs/steps.xhtml: same
5516         * docs/stylesheet-unprocessed.css, docs/stylesheet.css: same
5517         * docs/template.tpl: added a Lore template
5519 2004-07-29  Brian Warner  <warner@lothar.com>
5521         * buildbot/interfaces.py: revamp status delivery. This is the
5522         preview: these are the Interfaces that will be provided by new
5523         Builder code, and to which the current HTML/IRC/PB status
5524         displayers will be adapted.
5526         * buildbot/slavecommand.py (ShellCommand.start): look for .usePTY
5527         on the SlaveBuilder, not the Bot.
5528         * buildbot/bot.py (Bot.remote_setBuilderList): copy Bot.usePTY to
5529         SlaveBuilder.usePTY
5530         * buildbot/test/test_slavecommand.py (FakeSlaveBuilder.usePTY):
5531         set .usePTY on the FakeSlaveBuilder
5533 2004-07-25  Brian Warner  <warner@lothar.com>
5535         * buildbot/changes/freshcvs.py: add some debug log messages
5536         (FreshCVSConnectionFactory.gotPerspective): pre-emptively fix the
5537         disabled 'setFilter' syntax
5538         (FreshCVSSourceNewcred.__init__): warn about prefix= values that
5539         don't end with a slash
5541         * buildbot/process/base.py (Builder._pong_failed): add TODO note
5543         * setup.py: bump to 0.5.0+ while between releases
5545 2004-07-23  Brian Warner  <warner@lothar.com>
5547         * setup.py (version): Releasing buildbot-0.5.0
5549 2004-07-23  Brian Warner  <warner@lothar.com>
5551         * README: update for 0.5.0 release
5553         * NEWS: update for 0.5.0 release
5555 2004-07-22  Brian Warner  <warner@lothar.com>
5557         * buildbot/slavecommand.py (ShellCommand): make usePTY a
5558         mktap-time configuration flag (--usepty=1, --usepty=0)
5559         * buildbot/bot.py: same
5561         * buildbot/master.py (BotPerspective.got_dirs): don't complain about
5562         an 'info' directory being unwanted
5564         * buildbot/changes/freshcvs.py (FreshCVSSource): flip the
5565         newcred/oldcred switch. Newcred (for CVSToys-1.0.10 and later) is now
5566         the default. To communicate with an oldcred daemond (CVSToys-1.0.9
5567         and earlier), use a FreshCVSSourceOldcred instead.
5568         (test): simple test routine: connect to server, print changes
5570         * buildbot/changes/changes.py (Change.getTime): make it possible
5571         to print un-timestamped changes
5573         * buildbot/master.py (makeApp): delete ancient dead code
5574         (BuildMaster.loadTheConfigFile): make "master.cfg" name configurable
5575         * buildbot/test/test_config.py (testFindConfigFile): test it
5577         * docs/examples/twisted_master.cfg (b22w32): use iocp reactor
5578         instead of win32 one
5581         * buildbot/master.py (BuildMaster.loadConfig_Builders): config file
5582         now takes a dictionary instead of a tuple. See docs/config.xhtml for
5583         details.
5585         * buildbot/process/base.py (Builder.__init__): change constructor
5586         to accept a dictionary of config data, rather than discrete
5587         name/slave/builddir/factory arguments
5589         * docs/examples/twisted_master.cfg: update to new syntax
5590         * docs/examples/glib_master.cfg: same
5591         * buildbot/test/test_config.py (ConfigTest.testBuilders): some
5592         rough tests of the new syntax
5594         
5595         * buildbot/master.py (BuildMaster.loadConfig): allow webPathname
5596         to be an int, which means "run a web.distrib sub-server on a TCP
5597         port". This lets you publish the buildbot status page to a remote
5598         twisted.web server (using distrib.ResourceSubscription). Also
5599         rename the local attributes used to hold these web things so
5600         they're more in touch with reality.
5601         * buildbot/test/test_web.py: test webPortnum and webPathname
5602         * docs/config.xhtml: document this new use of webPathname
5604         * docs/config.xhtml: new document, slightly ahead of reality
5605         
5606         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred.notify): fix
5607         'prefix' handling: treat it as a simple string to check with
5608         .startswith, instead of treating it as a directory. This allows
5609         sub-directories to be used. If you use prefix=, you should give it
5610         a string that starts just below the CVSROOT and ends with a slash.
5611         This prefix will be stripped from all filenames, and filenames
5612         which do not start with it will be ignored.
5614 2004-07-20  Cory Dodt  <corydodt@twistedmatrix.com>
5616         * contrib/svn_buildbot.py: Add --include (synonym for --filter)
5617         and --exclude (inverse of --include).  SVN post-commit hooks
5618         now have total control over which changes get sent to buildbot and which
5619         do not.
5621 2004-07-10  Brian Warner  <warner@lothar.com>
5623         * buildbot/test/test_twisted.py (Case1.testCountFailedTests): fix
5624         test case to match new API
5626         * buildbot/status/event.py (Logfile.getEntries): fix silly bug
5627         which crashed HTML display when self.entries=[] (needed to
5628         distinguish between [], which means "no entries yet", and None,
5629         which means "the entries have been swapped out to disk, go fetch
5630         them").
5632 2004-07-04  Brian Warner  <warner@lothar.com>
5634         * buildbot/process/step_twisted.py (countFailedTests): Count
5635         skips, expectedFailures, and unexpectedSuccesses. Start scanning
5636         10kb from the end because any import errors are wedged there and
5637         they would make us think the test log was unparseable.
5638         (RunUnitTests.finishStatus): add skip/todo counts to the event box
5640 2004-06-26  Brian Warner  <warner@lothar.com>
5642         * buildbot/process/step_twisted.py (RemovePYCs): turn the
5643         delete-*.pyc command into an actual BuildStep, so we can label it
5644         nicely
5645         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
5646         (FullTwistedBuildFactory): same
5648 2004-06-25  Cory Dodt  <corydodt@twistedmatrix.com>
5650         * contrib/fakechange.py: Add an errback when sending the fake 
5651         change, so we know it didn't work.
5653 2004-06-25  Christopher Armstrong  <radix@twistedmatrix.com>
5655         * buildbot/process/step_twisted.py: Delete *.pyc files before
5656         calling trial, so it doesn't catch any old .pyc files whose .py
5657         files have been moved or deleted.
5659         * buildbot/process/step_twisted.py (RunUnitTests): 1) Add a new
5660         parameter, 'recurse', that passes -R to trial. 2) have 'runAll'
5661         imply 'recurse'. 3) Make the default 'allTests' be ["twisted"]
5662         instead of ["twisted.test"], so that the end result is "trial -R
5663         twisted".
5665         * contrib/svn_buildbot.py: Add a --filter parameter that accepts a
5666         regular expression to match filenames that should be ignored when
5667         changed. Also add a --revision parameter that specifies the
5668         revision to examine, which is useful for debugging.
5670 2004-06-25  Brian Warner  <warner@lothar.com>
5672         * buildbot/process/step_twisted.py (trialTextSummarizer): create a
5673         summary of warnings (like DeprecationWarnings), next to the
5674         "summary" file
5676 2004-05-13  Brian Warner  <warner@lothar.com>
5678         * docs/examples/twisted_master.cfg: enable the win32 builder, as
5679         we now have a w32 build slave courtesy of Mike Taylor.
5681         * buildbot/process/base.py (Build.checkInterlocks): OMG this was
5682         so broken. Fixed a race condition that tripped up interlocked
5683         builds and caused the status to be stuck at "Interlocked" forever.
5684         The twisted buildbot's one interlocked build just so happened to
5685         never hit this case until recently (the feeding builds both pass
5686         before the interlocked build is attempted.. usually it has to wait
5687         a while).
5688         (Builder._pong_failed): fix method signature
5690         * setup.py: bump to 0.4.3+ while between releases
5692 2004-04-30  Brian Warner  <warner@lothar.com>
5694         * setup.py (version): Releasing buildbot-0.4.3
5696 2004-04-30  Brian Warner  <warner@lothar.com>
5698         * MANIFEST.in: add the doc fragments in  docs/*.xhtml
5700         * README: update for 0.4.3 release
5702         * NEWS: update for 0.4.3 release
5704         * buildbot/master.py (BuildMaster.__getstate__): make sure
5705         Versioned.__getstate__ is invoked, for upgrade from 0.4.2
5707         * buildbot/process/step_twisted.py (RunUnitTests.trial): add
5708         .trial as a class attribute, for upgrade from 0.4.2
5710         * buildbot/changes/changes.py (Change.links): add .links for
5711         upgrade from 0.4.2
5713         * buildbot/status/event.py (Logfile.__getstate__): get rid of both
5714         .textWatchers and .htmlWatchers at save time, since they are both
5715         volatile, should allow smooth 0.4.2 upgrade
5717         * buildbot/process/step.py (CVS.finishStatus): catch failed
5718         CVS/SVN commands so we can make the status box red
5720 2004-04-29  Brian Warner  <warner@lothar.com>
5722         * buildbot/changes/freshcvs.py
5723         (FreshCVSConnectionFactory.gotPerspective): add (commented-out)
5724         code to do setFilter(), which tells the freshcvs daemon to not
5725         send us stuff that we're not interested in. I will uncomment it
5726         when a new version of CVSToys is available in which setFilter()
5727         actually works, and I get a chance to test it better.
5729         * docs/examples/twisted_master.cfg: start using a PBChangeSource
5731         * buildbot/master.py (Dispatcher): use a registration scheme
5732         instead of hardwired service names
5733         (BuildMaster): keep track of the Dispatcher to support
5734         registration
5736         * buildbot/changes/changes.py (ChangeMaster): create a distinct
5737         PBChangeSource class instead of having it be an undocumented
5738         internal feature of the ChangeMaster. Split out the code into a
5739         new file.
5740         * buildbot/changes/pb.py (PBChangeSource): same
5741         * buildbot/test/test_changes.py: a few tests for PBChangeSource
5743         * docs/{factories|sources|steps}.xhtml: document some pieces
5745         * docs/examples/twisted_master.cfg: use SVN instead of CVS, stop
5746         using FCMaildirSource
5747         (f23osx): update OS-X builder to use python2.3, since the slave
5748         was updated to Panther (10.3.3)
5750 2004-03-21  Brian Warner  <warner@lothar.com>
5752         * buildbot/process/process_twisted.py: factor out doCheckout, change
5753         to use SVN instead of CVS
5755         * buildbot/process/base.py (BasicBuildFactory): refactor to make
5756         an SVN subclass easier
5757         (BasicSVN): subclass which uses Subversion instead of CVS
5759 2004-03-15  Christopher Armstrong  <radix@twistedmatrix.com>
5761         * buildbot/slavecommand.py (ShellCommand.start): use COMSPEC instead
5762         of /bin/sh on win32
5763         (CVSCommand.cvsComplete): don't assume chdir worked on win32
5765 2004-02-25  Brian Warner  <warner@lothar.com>
5767         * buildbot/slavecommand.py (ShellCommand): ['commands'] argument
5768         is now either a list (which is passed to spawnProcess directly) or
5769         a string (which gets passed to /bin/sh -c). This removes the useSH
5770         flag and the ArgslistCommand class. Also send status header at the
5771         start and end of each command, instead of having the master-side
5772         code do that.
5773         (CVSCommand): fix the doUpdate command, it failed to do the 'cp
5774         -r'. Update to use list-based arguments.
5775         (SVNFetch): use list-based arguments, use ['dir'] argument to
5776         simplify code.
5777         * buildbot/test/test_steps.py (Commands): match changes
5779         * buildbot/process/step.py (InternalShellCommand.words): handle
5780         command lists
5781         (SVN): inherit from CVS, cleanup
5783         * buildbot/status/event.py (Logfile.content): render in HTML, with
5784         stderr in red and headers (like the name of the command we're
5785         about to run) in blue. Add link to a second URL (url + "?text=1")
5786         to get just stdout/stderr in text/plain without markup. There is
5787         still a problem with .entries=None causing a crash, it seems to occur
5788         when the logfile is read before it is finished.
5790         * buildbot/bot.py (BotFactory.doKeepalive): add a 30-second
5791         timeout to the keepalives, and use it to explicitly do a
5792         loseConnection instead of waiting for TCP to notice the loss. This
5793         ought to clear up the silent-lossage problem.
5794         (unsafeTracebacks): pass exception tracebacks back to the master,
5795         makes it much easier to debug problems
5797 2004-02-23  Brian Warner  <warner@lothar.com>
5799         * buildbot/slavecommand.py (ShellCommand): add useSH flag to pass
5800         the whole command to /bin/sh instead of execve [Johan Dahlin]
5801         (CVSCommand): drop '-r BRANCH' if BRANCH==None instead of usiing
5802         '-r HEAD' [Johan Dahlin]
5803         (CVSCommand.start2): fix cvsdir calculation [Johan Dahlin]
5805         * buildbot/changes/changes.py (Change): add links= argument, add
5806         asHTML method [Johan Dahlin]. Modified to make a bit more
5807         XHTMLish. Still not sure how to best use links= .
5809         * buildbot/status/html.py (StatusResourceCommits.getChild): use 
5810         Change.asHTML to display the change, not asText
5812         * buildbot/status/html.py (StatusResourceBuilder): web button to
5813         ping slave
5815         * buildbot/test/test_run.py: test to actually start a buildmaster
5816         and poke at it
5818         * MANIFEST.in: bring back accidentally-dropped test helper files
5820         * buildbot/test/test_config.py (ConfigTest.testSources): skip tests
5821         that require cvstoys if it is not installed
5823         * buildbot/process/step_twisted.py (RunUnitTests): allow other
5824         values of "bin/trial" [Dave Peticolas]
5825         (RunUnitTests.finishStatus): say "no tests run" instead of "0
5826         tests passed" when we didn't happen to run any tests
5828         * buildbot/process/step.py (Compile): use haltOnFailure instead of
5829         flunkOnFailure [Johan Dahlin]
5831         * buildbot/process/base.py (ConfigurableBuild.setSteps): allow
5832         multiple instances of the same Step class by suffixing "_2", etc,
5833         to the name until it is unique. This name needs to be unique
5834         because it is used as a key in the dictionary that tracks build
5835         progress.
5836         * buildbot/test/test_steps.py (Steps.testMultipleStepInstances):
5837         add test for it
5839         * buildbot/process/base.py (Builder.ping): add "ping slave" command
5841 2004-01-14  Brian Warner  <warner@lothar.com>
5843         * buildbot/status/words.py (IrcStatusBot): when we leave or get
5844         kicked from a channel, log it
5846         * buildbot/master.py (Dispatcher): add "poke IRC" command to say
5847         something over whatever IRC channels the buildmaster is currently
5848         connected to. Added to try and track down a problem in which the
5849         master thinks it is still connected but the IRCd doesn't see it. I
5850         used a styles.Versioned this time, so hopefully users won't have
5851         to rebuild their .tap files this time.
5852         * contrib/debug.glade: add a "Poke IRC" button
5853         * contrib/debugclient.py: same
5855         * setup.py: bump to 0.4.2+ while between releases
5857 2004-01-08  Brian Warner  <warner@lothar.com>
5859         * setup.py (version): Releasing buildbot-0.4.2
5861 2004-01-08  Brian Warner  <warner@lothar.com>
5863         * NEWS: update for 0.4.2 release
5865         * README: document how to run the tests, now that they all pass
5867         * buildbot/changes/maildir.py (Maildir.poll): minor comment
5869         * buildbot/process/step.py (CVS): add a global_options= argument,
5870         which lets you set CVS global options for the command like "-r"
5871         for read-only checkout, or "-R" to avoid writing in the
5872         repository.
5873         * buildbot/slavecommand.py (CVSCommand): same
5875         * buildbot/status/event.py (Logfile): add a .doSwap switch to make
5876         testing easier (it is turned off when testing, to avoid the
5877         leftover timer)
5879         * buildbot/process/step.py (InternalBuildStep): shuffle code a bit
5880         to make it easier to test: break generateStepID() out to a
5881         separate function, only update statusbag if it exists.
5882         (ShellCommands): create useful text for dict-based commands too.
5884         * test/*, buildbot/test/*: move unit tests under the buildbot/
5885         directory
5886         * setup.py (packages): install buildbot.test too
5888         * buildbot/test/test_slavecommand.py: fix it, tests pass now
5889         * buildbot/test/test_steps.py: fix it, tests pass now
5891 2004-01-06  Brian Warner  <warner@lothar.com>
5893         * buildbot/changes/mail.py (parseFreshCVSMail): looks like new
5894         freshcvs mail uses a slightly different syntax for new
5895         directories. Update parser to handle either.
5896         * test/test_mailparse.py (Test1.testMsg9): test for same
5898 2003-12-21  Brian Warner  <warner@lothar.com>
5900         * buildbot/process/process_twisted.py (TwistedDebsBuildFactory): set
5901         'warnOnWarnings' so that lintian errors mark the build orange
5903 2003-12-17  Brian Warner  <warner@lothar.com>
5905         * buildbot/changes/mail.py (parseBonsaiMail): parser for commit
5906         messages emitted by Bonsai, contributed by Stephen Davis.
5908         * test/*: moved all tests to use trial instead of unittest. Some
5909         still fail (test_steps, test_slavecommand, and test_process).
5911         * setup.py (version): bump to 0.4.1+ while between releases
5913 2003-12-09  Brian Warner  <warner@lothar.com>
5915         * setup.py (version): Releasing buildbot-0.4.1
5917 2003-12-09  Brian Warner  <warner@lothar.com>
5919         * NEWS: update for 0.4.1 release
5921         * docs/examples/twisted_master.cfg: add netbsd builder, shuffle
5922         freebsd builder code a little bit
5924         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred.__cmp__):
5925         don't try to compare attributes of different classes
5926         * buildbot/changes/mail.py (MaildirSource.__cmp__): same
5927         (MaildirSource.messageReceived): fix Change delivery
5929         * buildbot/master.py (BuildMaster.loadConfig): insert 'basedir'
5930         into the config file's namespace before loading it, like the
5931         documentation claims it does
5932         * docs/examples/twisted_master.cfg: remove explicit 'basedir'
5933         (useFreshCVS): switch to using a maildir until Twisted's freshcvs
5934         daemon comes back online
5936 2003-12-08  Brian Warner  <warner@lothar.com>
5938         * docs/examples/twisted_master.cfg: provide an explicit 'basedir'
5939         so the example will work with online=0 as well
5941         * buildbot/changes/mail.py (FCMaildirSource, SyncmailMaildirSource):
5942         fix the __implements__ line
5944         * buildbot/changes/maildirtwisted.py (MaildirTwisted): make this
5945         class a twisted.application.service.Service, use startService to
5946         get it moving.
5948         * buildbot/changes/dnotify.py (DNotify): use os.open to get the
5949         directory fd instead of simple open(). I'm sure this used to work,
5950         but the current version of python refuses to open directories with
5951         open().
5953 2003-12-05  Brian Warner  <warner@lothar.com>
5955         * setup.py (version): bump to 0.4.0+ while between releases
5957 2003-12-05  Brian Warner  <warner@lothar.com>
5959         * setup.py (version): Releasing buildbot-0.4.0
5961 2003-12-05  Brian Warner  <warner@lothar.com>
5963         * docs/examples/glib_master.cfg: replace old sample scripts with
5964         new-style config files
5965         * MANIFEST.in: include .cfg files in distribution tarball
5967         * buildbot/changes/freshcvs.py (FreshCVSListener.remote_goodbye):
5968         implement a dummy method to avoid the exception that occurs when
5969         freshcvs sends this to us.
5971         * buildbot/pbutil.py (ReconnectingPBClientFactory.stopFactory):
5972         removed the method, as it broke reconnection. Apparently
5973         stopFactory is called each time the connection attempt fails. Must
5974         rethink this.
5975         (ReconnectingPBClientFactory.__getstate__): squash the _callID
5976         attribute before serialization, since without stopFactory the
5977         reconnect timer may still be active and they aren't serializable.
5979         * test/test_mailparse.py (ParseTest): test with 'self' argument
5981         * buildbot/changes/mail.py (parseFreshCVSMail): add (silly) 'self'
5982         argument, as these "functions" are invoked like methods from class
5983         attributes and therefore always get an instance as the first
5984         argument.
5986         * buildbot/changes/maildir.py (Maildir.start): fix error in error
5987         message: thanks to Stephen Davis for the catch
5989 2003-12-04  Brian Warner  <warner@lothar.com>
5991         * buildbot/pbutil.py: complete rewrite using PBClientFactory and
5992         twisted's standard ReconnectingClientFactory. Handles both oldcred
5993         and newcred connections. Also has a bug-workaround for
5994         ReconnectingClientFactory serializing its connector when it
5995         shouldn't.
5997         * buildbot/bot.py (BotFactory): rewrite connection layer with new
5998         pbutil. Replace makeApp stuff with proper newcred/mktap
5999         makeService(). Don't serialize Ephemerals on shutdown.
6001         * buildbot/changes/changes.py (ChangeMaster): make it a
6002         MultiService and add the sources as children, to get startService
6003         and stopService for free. This also gets rid of the .running flag.
6005         * buildbot/changes/freshcvs.py (FreshCVSSource): rewrite to use
6006         new pbutil, turn into a TCPClient at the same time (to get
6007         startService for free). Two variants exist: FreshCVSSourceOldcred
6008         and FreshCVSSourceNewcred (CVSToys doesn't actualy support newcred
6009         yet, but when it does, we'll be ready).
6010         (FreshCVSSource.notify): handle paths which are empty after the
6011         prefix is stripped. This only happens when the top-level (prefix)
6012         directory is added, at the very beginning of a Repository's life.
6014         * buildbot/clients/base.py: use new pbutil, clean up startup code.
6015         Now the only reconnecting code is in the factory where it belongs.
6016         (Builder.unsubscribe): unregister the disconnect callback when we
6017         delete the builder on command from the master (i.e. when the
6018         buildmaster is reconfigured and that builder goes away). This
6019         fixes a multiple-delete exception when the status client is shut
6020         down afterwards.
6021         * buildbot/clients/gtkPanes.py (GtkClient): cleanup, match the
6022         base Client. 
6024         * buildbot/status/words.py (IrcStatusBot): add some more sillyness
6025         (IrcStatusBot.getBuilderStatus): fix minor exception in error message
6027 2003-10-20  Christopher Armstrong  <radix@twistedmatrix.com>
6029         * contrib/run_maxq.py: Accept a testdir as an argument rather than
6030         a list of globs (ugh). The testdir will be searched for files
6031         named *.tests and run the tests in the order specified in each of
6032         those files. This allows for "dependancies" between tests to be
6033         codified.
6035         * buildbot/process/maxq.py (MaxQ.__init__): Accept a testdir
6036         argument to pass to run_maxq.py, instead of a glob.
6038 2003-10-17  Brian Warner  <warner@lothar.com>
6040         * buildbot/process/step_twisted.py (HLint.start): ignore .xhtml
6041         files that live in the sandbox
6043 2003-10-15  Brian Warner  <warner@lothar.com>
6045         * buildbot/process/step_twisted.py (ProcessDocs.finished): fix
6046         spelling error in "docs" count-warnings output
6047         (HLint.start): stupid thinko meant .xhtml files were ignored
6049         * docs/examples/twisted_master.cfg (reactors): disable cReactor
6050         tests now that cReactor is banished to the sandbox
6052 2003-10-10  Brian Warner  <warner@lothar.com>
6054         * buildbot/process/step_twisted.py (ProcessDocs, HLint): new Twisted
6055         scheme: now .xhtml are sources and .html are generated
6057 2003-10-08  Brian Warner  <warner@lothar.com>
6059         * buildbot/process/step_twisted.py (RunUnitTests.__init__): oops,
6060         we were ignoring the 'randomly' parameter.
6062 2003-10-01  Brian Warner  <warner@lothar.com>
6064         * buildbot/slavecommand.py (ShellCommand.start): set usePTY=1 on
6065         posix, to kill sub-children of aborted slavecommands.
6067         * buildbot/status/builder.py: rename Builder to BuilderStatus.
6068         Clean up initialization: lastBuildStatus remains None until the
6069         first build has been completed.
6071         * buildbot/status/html.py (WaterfallStatusResource.body): handle
6072         None as a lastBuildStatus
6073         * buildbot/clients/gtkPanes.py: same
6075         * buildbot/status/client.py (StatusClientService): keep
6076         BuilderStatus objects in self.statusbags . These objects now live
6077         here in the StatusClientService and are referenced by the Builder
6078         object, rather than the other way around.
6079         * buildbot/status/words.py (IrcStatusBot.getBuilderStatus): same
6080         * buildbot/process/base.py (Builder): same
6081         * test/test_config.py (ConfigTest.testBuilders): same
6083         * buildbot/master.py (BuildMaster.loadConfig_Builders): when modifying
6084         an existing builder, leave the statusbag alone. This will preserve the
6085         event history.
6087         * buildbot/pbutil.py (ReconnectingPB.connect): add initial newcred
6088         hook. This will probably go away in favor of a class in upcoming
6089         Twisted versions.
6091         * buildbot/changes/freshcvs.py (FreshCVSSource.start): Remove old
6092         serviceName from newcred FreshCVSNotifiee setup
6094 2003-09-29  Brian Warner  <warner@lothar.com>
6096         * buildbot/process/process_twisted.py: switch to new reactor
6097         abbreviations
6098         * docs/examples/twisted_master.cfg: same
6100         * README (REQUIREMENTS): mention twisted-1.0.8a3 requirement
6102         * buildbot/status/words.py (IrcStatusBot.getBuilder): use the
6103         botmaster reference instead of the oldapp service lookup
6105         * buildbot/master.py (BuildMaster.__init__): give the
6106         StatusClientService a reference to the botmaster to make it easier to
6107         force builds
6109 2003-09-24  Christopher Armstrong  <radix@twistedmatrix.com>
6111         * buildbot/status/html.py (Box.td): escape hreffy things so you
6112         can have spaces in things like builder names
6113         (StatusResourceBuilder.body)
6114         (WaterfallStatusResource.body)
6115         (WaterfallStatusResource.body0): same
6117 2003-09-25  Brian Warner  <warner@lothar.com>
6119         * buildbot/master.py (BuildMaster.loadConfig_Builders): don't
6120         rearrange the builder list when adding or removing builders: keep
6121         them in the order the user requested.
6122         * test/test_config.py (ConfigTest.testBuilders): verify it
6124         * contrib/debug.glade: give the debug window a name
6126         * buildbot/process/base.py (Builder.buildTimerFired): builders can
6127         now wait on multiple interlocks. Fix code relating to that.
6128         (Builder.checkInterlocks): same
6129         * buildbot/status/builder.py (Builder.currentlyInterlocked): same
6131         * buildbot/master.py (BuildMaster.loadConfig): move from
6132         deprecated pb.BrokerFactory to new pb.PBServerFactory
6133         * test/test_config.py (ConfigTest.testWebPathname): same
6135         * docs/examples/twisted_master.cfg: fix interlock declaration
6137         * buildbot/master.py (BotMaster.addInterlock): move code to attach
6138         Interlocks to their Builders into interlock.py .
6139         (BuildMaster.loadConfig_Interlocks): fix interlock handling
6141         * test/test_config.py (ConfigTest.testInterlocks): validate
6142         interlock handling
6144         * buildbot/process/base.py (Builder.__init__): better comments
6145         * buildbot/process/interlock.py (Interlock.__repr__): same
6146         (Interlock.deactivate): add .active flag, move the code that
6147         attaches/detaches builders into the Interlock
6149 2003-09-24  Christopher Armstrong  <radix@twistedmatrix.com>
6151         * buildbot/process/maxq.py (MaxQ): support for running a set of MaxQ
6152         tests using the new run_maxq.py script, and reporting failures by
6153         parsing its output.
6155         * contrib/run_maxq.py: Hacky little script for running a set of maxq
6156         tests, reporting their success or failure in a buildbot-friendly 
6157         manner.
6159 2003-09-24  Brian Warner  <warner@lothar.com>
6161         * docs/examples/twisted_master.cfg: example of a new-style config
6162         file. This lives in the buildmaster base directory as
6163         "master.cfg".
6165         * contrib/debugclient.py (DebugWidget.do_rebuild): add 'reload'
6166         button to make the master re-read its config file
6168         * buildbot/master.py (BuildMaster.loadConfig): new code to load
6169         buildmaster configuration from a file. This file can be re-read
6170         later, and the buildmaster will update itself to match the new
6171         desired configuration. Also use new Twisted Application class.
6172         * test/Makefile, test/test_config.py: unit tests for same
6174         * buildbot/changes/freshcvs.py (FreshCVSSource.__cmp__): make
6175         FreshCVSSources comparable, to support reload.
6176         * buildbot/changes/mail.py (MaildirSource.__cmp__): same
6178         * buildbot/process/base.py (Builder): make them comparable, make
6179         Interlocks easier to attach, to support reload. Handle
6180         re-attachment of remote slaves.
6181         * buildbot/process/interlock.py (Interlock): same
6183         * buildbot/bot.py, bb_tap.py, changes/changes.py: move to
6184         Twisted's new Application class. Requires Twisted >= 1.0.8 .
6185         buildmaster taps are now constructed with mktap.
6186         * buildbot/status/client.py (StatusClientService): same
6188         * buildbot/status/words.py: move to new Services, add support to
6189         connect to multiple networks, add reload support, allow nickname
6190         to be configured on a per-network basis
6192 2003-09-20  Brian Warner  <warner@lothar.com>
6194         * docs/examples/twisted_master.py (twisted_app): use python2.3 for
6195         the freebsd builder, now that the machine has been upgraded and no
6196         longer has python2.2
6198         * setup.py (version): bump to 0.3.5+ while between releases
6200 2003-09-19  Brian Warner  <warner@lothar.com>
6202         * setup.py (version): Releasing buildbot-0.3.5
6204 2003-09-19  Brian Warner  <warner@lothar.com>
6206         * NEWS: add post-0.3.4 notes
6208         * README (REQUIREMENTS): note twisted-1.0.7 requirement
6210         * MANIFEST.in: add contrib/*
6212         * docs/examples/twisted_master.py (twisted_app): all build slaves must
6213         use a remote root now: cvs.twistedmatrix.com
6215         * buildbot/changes/freshcvs.py (FreshCVSNotifiee.connect): update
6216         to newcred
6217         (FreshCVSNotifieeOldcred): but retain a class that uses oldcred for
6218         compatibility with old servers
6219         (FreshCVSSource.start): and provide a way to use it
6220         (FreshCVSNotifiee.disconnect): handle unconnected notifiee
6222         * docs/examples/twisted_master.py (twisted_app): update to new
6223         makeApp interface.
6224         (twisted_app): listen on new ~buildbot socket
6225         (twisted_app): Twisted CVS has moved to cvs.twistedmatrix.com
6227         * buildbot/process/process_twisted.py: Use 'copydir' on CVS steps
6228         to reduce cvs bandwidth (update instead of full checkout)
6230 2003-09-11  Brian Warner  <warner@lothar.com>
6232         * contrib/fakechange.py: demo how to connect to the changemaster
6233         port. You can use this technique to submit changes to the
6234         buildmaster from source control systems that offer a hook to run a
6235         script when changes are committed.
6237         * contrib/debugclient.py: tool to connect to the debug port. You
6238         can use it to force builds, submit fake changes, and wiggle the
6239         builder state
6241         * buildbot/master.py: the Big NewCred Reorganization. Use a single
6242         'Dispatcher' realm to handle all the different kinds of
6243         connections and Perspectives: buildslaves, the changemaster port,
6244         the debug port, and the status client port. NewCredPerspectives
6245         now have .attached/.detached methods called with the remote 'mind'
6246         reference, much like old perspectives did. All the pb.Services
6247         turned into ordinary app.ApplicationServices .
6248         (DebugService): went away, DebugPerspectives are now created
6249         directly by the Dispatcher.
6250         (makeApp): changed interface a little bit
6252         * buildbot/changes/changes.py: newcred
6253         * buildbot/status/client.py: newcred
6255         * buildbot/clients/base.py: newcred client side changes
6256         * buildbot/bot.py: ditto
6258         * docs/examples/glib_master.py: handle new makeApp() interface
6259         * docs/examples/twisted_master.py: ditto
6261         * buildbot/pbutil.py (NewCredPerspective): add a helper class to
6262         base newcred Perspectives on. This should go away once Twisted
6263         itself provides something sensible.
6266 2003-09-11  Christopher Armstrong  <radix@twistedmatrix.com>
6268         * contrib/svn_buildbot.py: A program that you can call from your
6269         SVNREPO/hooks/post-commit file that will notify a BuildBot master
6270         when a change in an SVN repository has happened. See the top of
6271         the file for some minimal usage info.
6273 2003-09-10  Christopher Armstrong  <radix@twistedmatrix.com>
6275         * buildbot/slavecommand.py (ArglistCommand): Add new
6276         ArglistCommand that takes an argument list rather than a string as
6277         a parameter. Using a st.split() for argv is very bad.
6279         * buildbot/slavecommand.py (SVNFetch): Now has the ability to
6280         update to a particular revision rather than always checking out
6281         (still not very smart about it, there may be cases where the
6282         checkout becomes inconsistent).
6284 2003-09-10  Christopher Armstrong  <radix@twistedmatrix.com>
6286         * buildbot/{bot.py,slavecommand.py,process/step.py}: Rudimentary
6287         SVN fetch support. It can checkout (not update!) a specified
6288         revision from a specified repository to a specified directory.
6290         * buildbot/status/progress.py (Expectations.update): Fix an
6291         obvious bug (apparently created by the change described in the
6292         previous ChangeLog message) by moving a check to *after* the
6293         variable it checks is defined.
6296 2003-09-08  Brian Warner  <warner@lothar.com>
6298         * buildbot/status/progress.py (Expectations.update): hack to catch
6299         an exception TTimo sees: sometimes the update() method seems to
6300         get called before the step has actually finished, so the .stopTime
6301         is not set, so no totalTime() is available and we average None
6302         with the previous value. Catch this and just don't update the
6303         metrics, and emit a log message.
6305 2003-08-24  Brian Warner  <warner@lothar.com>
6307         * buildbot/process/base.py (BasicBuildFactory): accept 'cvsCopy'
6308         parameter to set copydir='original' in CVS commands.
6310         * buildbot/process/step.py (CVS): accept 'copydir' parameter.
6312         * buildbot/slavecommand.py (CVSCommand): add 'copydir' parameter,
6313         which tells the command to maintain a separate original-source CVS
6314         workspace. For each build, this workspace will be updated, then
6315         the tree copied into a new workdir. This reduces CVS bandwidth
6316         (from a full checkout to a mere update) while doubling the local
6317         disk usage (to keep two copies of the tree).
6319 2003-08-21  Brian Warner  <warner@lothar.com>
6321         * buildbot/status/event.py (Logfile.addEntry): if the master web
6322         server dies while we're serving a page, request.write raises
6323         pb.DeadReferenceError . Catch this and treat it like a
6324         notifyFinish event by dropping the request.
6326 2003-08-18  Brian Warner  <warner@lothar.com>
6328         * buildbot/status/words.py (IrcStatusBot.command_FORCE): complain
6329         (instead of blowing up) if a force-build command is given without
6330         a reason field
6332         * buildbot/changes/changes.py (ChangeMaster.getChangeNumbered):
6333         don't blow up if there aren't yet any Changes in the list
6335 2003-08-02  Brian Warner  <warner@lothar.com>
6337         * buildbot/bot.py (updateApplication): don't set the .tap name,
6338         since we shouldn't assume we own the whole .tap file
6340         * buildbot/bb_tap.py (updateApplication): clean up code, detect
6341         'mktap buildbot' (without a subcommand) better
6343 2003-07-29  Brian Warner  <warner@lothar.com>
6345         * buildbot/status/words.py
6346         (IrcStatusFactory.clientConnectionLost): when we lose the
6347         connection to the IRC server, schedule a reconnection attempt.
6349         * buildbot/slavecommand.py (CVSCommand.doClobber): on non-posix,
6350         use shutil.rmtree instead of forking off an "rm -rf" command.
6351         rmtree may take a while and will block until it finishes, so we
6352         use "rm -rf" if available.
6354         * docs/examples/twisted_master.py: turn off kqreactor, it hangs
6355         freebsd buildslave badly
6357         * setup.py (version): bump to 0.3.4+ while between releases
6359 2003-07-28  Brian Warner  <warner@lothar.com>
6361         * setup.py (version): Releasing buildbot-0.3.4
6363 2003-07-28  Brian Warner  <warner@lothar.com>
6365         * NEWS: update in preparation for release
6367         * buildbot/slavecommand.py (ShellCommand.doTimeout): use
6368         process.signalProcess instead of os.kill, to improve w32
6369         portability
6371         * docs/examples/twisted_master.py (twisted_app): turn off
6372         win32eventreactor: the tests hang the buildslave badly
6374         * buildbot/process/base.py (Build.buildFinished): update ETA even on
6375         failed builds, since usually the failures are consistent
6377         * buildbot/process/process_twisted.py (TwistedReactorsBuildFactory):
6378         add compileOpts/compileOpts2 to reactors build
6380         * docs/examples/twisted_master.py (twisted_app): add "-c mingw32"
6381         (twisted_app): use both default and win32eventreactor on w32 build.
6382         Use both default and kqreactor on freebsd build.
6384         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
6385         add compileOpts2, which is put after the build_ext argument. w32
6386         needs "-c mingw32" here.
6388         * buildbot/status/html.py (StatusResourceBuilder.getChild): don't
6389         touch .acqpath, it goes away in recent Twisted releases
6391         * docs/examples/twisted_master.py (twisted_app): use "python" for
6392         the w32 buildslave, not "python2.2"
6394         * buildbot/bot.py (Bot.remote_getSlaveInfo): only look in info/ if
6395         the directory exists.. should hush an exception under w32
6397         * buildbot/slavecommand.py (ShellCommandPP.processEnded): use
6398         ProcessTerminated -provided values for signal and exitCode rather
6399         than parsing the unix status code directly. This should remove one
6400         more roadblock for a w32-hosted buildslave.
6402         * test/test_mailparse.py: add test cases for Syncmail parser
6404         * Buildbot/changes/freshcvsmail.py: remove leftover code, leave a
6405         temporary compatibility import. Note! Start importing
6406         FCMaildirSource from changes.mail instead of changes.freshcvsmail
6408         * buildbot/changes/mail.py (parseSyncmail): finish Syncmail parser
6410 2003-07-27  Brian Warner  <warner@lothar.com>
6412         * NEWS: started adding new features
6414         * buildbot/changes/mail.py: start work on Syncmail parser, move
6415         mail sources into their own file
6417         * buildbot/changes/freshcvs.py (FreshCVSNotifiee): mark the class
6418         as implementing IChangeSource
6419         * buildbot/changes/freshcvsmail.py (FCMaildirSource): ditto
6421         * buildbot/interfaces.py: define the IChangeSource interface
6423 2003-07-26  Brian Warner  <warner@lothar.com>
6425         * buildbot/master.py (makeApp): docstring (thanks to Kevin Turner)
6427 2003-06-25  Brian Warner  <warner@lothar.com>
6429         * buildbot/status/words.py (IrcStatusBot.emit_last): round off
6430         seconds display
6432 2003-06-17  Brian Warner  <warner@lothar.com>
6434         * buildbot/status/words.py: clean up method usage to avoid error
6435         in silly IRC command
6436         (IrcStatusBot.emit_status): round off seconds display
6438         * buildbot/process/base.py (Build): delete the timer when saving
6439         to the .tap file, and restore it (if it should still be running)
6440         upon restore. This should fix the "next build in -34 seconds"
6441         messages that result when the master is restarted while builds are
6442         sitting in the .waiting slot. If the time for the build has
6443         already passed, start it very soon (in 1 second).
6445         * buildbot/status/words.py: more silly commands
6447         * README (REQUIREMENTS): add URLs to all required software
6449         * buildbot/status/words.py ('last'): mention results of, and time
6450         since last build
6452 2003-05-28  Brian Warner  <warner@lothar.com>
6454         * buildbot/status/words.py: add 'last' command
6455         (IrcStatusBot.emit_status): add current-small text to 'status' output
6457         * docs/examples/twisted_master.py (twisted_app): turn on IRC bot
6458         (twisted_app): remove spaces from OS-X builder name
6460         * buildbot/master.py (makeApp): add knob to turn on IRC bot
6461         * buildbot/status/words.py: IRC bot should actually be useful now
6463 2003-05-23  Brian Warner  <warner@lothar.com>
6465         * buildbot/bot.py (Bot.remote_getSlaveInfo): add routines to get
6466         "slave information" from $(slavedir)/info/* . These files are
6467         maintained by the slave administrator, and describe the
6468         machine/environment that is hosting the slave. Information from
6469         them is put into the "Builder" HTML page. Still need to establish
6470         a set of well-known filenames and meanings for this data: at the
6471         moment, *all* info/* files are sent to the master, but only
6472         'admin' and 'host' are used on that end.
6473         * buildbot/status/html.py (StatusResourceBuilder.body): ditto
6474         * buildbot/process/base.py (Builder.setRemoteInfo):  ditto
6475         * buildbot/master.py (BotPerspective.got_info):  ditto
6477 2003-05-22  Brian Warner  <warner@lothar.com>
6479         * setup.py (version): bump version to 0.3.3+ while between releases
6481 2003-05-21  Brian Warner  <warner@lothar.com>
6483         * setup.py: Releasing buildbot-0.3.3
6485 2003-05-21  Brian Warner  <warner@lothar.com>
6487         * NEWS: 0.3.3 news items
6489         * README: describe --keepalive and life behind a NAT box
6491         * buildbot/bot.py (Bot.connected): implement application-level
6492         keepalives to deal with NAT timeouts, turn them on with
6493         --keepalive option or when SO_KEEPALIVE doesn't work.
6495         * buildbot/master.py (BotPerspective): accept keepalives silently
6497         * buildbot/process/base.py (Build.buildException): CopiedFailures
6498         don't carry as much information as local ones, so don't try to
6499         create a big HTMLized version of them.
6501         * buildbot/process/step.py (InternalShellCommand.stepFailed): close
6502         log file when step fails due to an exception, such as when the slave
6503         becomes unreachable
6505         * buildbot/process/step_twisted.py (RunUnitTests): use trial's new
6506         --testmodule argument instead of grepping for test-case-name tags
6507         ourselves. Remove FindUnitTests code.
6508         * buildbot/slavecommand.py, buildbot/bot.py: remove old code
6510         * MANIFEST.in: Add docs/examples, files under test/ . Oops!
6512 2003-05-16  Brian Warner  <warner@lothar.com>
6514         * buildbot/process/base.py (BasicBuildFactory): add 'configureEnv'
6515         argument to allow things like CFLAGS=-O0 to be passed without relying
6516         upon /bin/sh processing on the slave.
6518         * buildbot/process/step.py (InternalShellCommand.start): send
6519         'env' dict to slave
6520         * buildbot/slavecommand.py (ShellCommand.start): create argv with
6521         'split' instead of letting /bin/sh do it. This should also remove
6522         the need for /bin/sh on the buildslave, making it more likely to
6523         work with win32.
6525         * buildbot/status/html.py: html-escape text in blamelist.
6526         Add "force build" button to the Builder page.
6528         * buildbot/process/step_twisted.py (countFailedTests): look at
6529         last 1000 characters for status line, as import errors can put it
6530         before the -200 point.
6532 2003-05-15  Brian Warner  <warner@lothar.com>
6534         * docs/examples/twisted_master.py: use clobber=0 for remote builds
6536         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
6537         make 'clobber' a parameter, so it is possible to have builds which
6538         do full tests but do a cvs update instead of hammering the CVS
6539         server with a full checkout each build
6541         * buildbot/process/step.py (InternalShellCommand): bump default
6542         timeout to 20 minutes
6544         * buildbot/bot.py (Bot.debug_forceBuild): utility method to ask
6545         the master to trigger a build. Run it via manhole.
6547         * buildbot/master.py (BotPerspective.perspective_forceBuild):
6548         allow slaves to trigger any build that they host, to make life
6549         easier for slave admins who are testing out new build processes
6551         * buildbot/process/process_twisted.py (TwistedReactorsBuildFactory):
6552         don't flunk cReactor or qtreactor on failure, since they fail alot
6553         these days. Do warnOnFailure instead.
6555         * buildbot/process/base.py: change Builder.buildable from a list
6556         into a single slot. When we don't have a slave, new builds (once
6557         they make it past the timeout) are now merged into an existing
6558         buildable one instead of being queued. With this change, a slave
6559         which has been away for a while doesn't get pounded with all the
6560         builds it missed, but instead just does a single build.
6562 2003-05-07  Brian Warner  <warner@lothar.com>
6564         * setup.py (version): bump version to 0.3.2+ while between releases
6566 2003-05-07  Brian Warner  <warner@lothar.com>
6568         * setup.py: Releasing buildbot-0.3.2
6570 2003-05-07  Brian Warner  <warner@lothar.com>
6572         * setup.py: fix major packaging error: include subdirectories!
6573         
6574         * NEWS: add changes since last release
6576         * README (REQUIREMENTS): update twisted/python dependencies
6578         * buildbot/status/builder.py (Builder.startBuild): change
6579         BuildProcess API: now they should call startBuild/finishBuild
6580         instead of pushing firstEvent / setLastBuildStatus. Moving towards
6581         keeping a list of builds in the statusbag, to support other kinds of
6582         status delivery.
6583         (Builder.addClient): send current-activity-small to new clients
6584         * buildbot/process/base.py (Build.startBuild, .buildFinished): use
6585         new API
6587         * buildbot/status/client.py: drop RemoteReferences at shutdown
6589         * buildbot/status/event.py (Event.stoppedObserving): oops, add it
6591         * buildbot/status/progress.py (BuildProgress.remote_subscribe):
6592         more debug messages for remote status client
6594         * buildbot/process/step.py (InternalBuildStep.stepComplete)
6595         (.stepFailed): only fire the Deferred once, even if both
6596         stepComplete and stepFailed are called. I think this can happen if
6597         an exception occurs at a weird time.
6599         * buildbot/status/words.py: work-in-progress: IRC status delivery
6601 2003-05-05  Brian Warner  <warner@lothar.com>
6603         * docs/examples/twisted_master.py (twisted_app): hush internal
6604         python2.3 distutils deprecation warnings
6605         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
6606         add compileOpts= argument which inserts extra args before the
6607         "setup.py build_ext" command. This can be used to give -Wignore
6608         warnings, to hush some internal python-2.3 deprecation messages.
6610         * buildbot/process/step_twisted.py (RunUnitTests): parameterize
6611         the ['twisted.test'] default test case to make it easier to change
6612         in subclasses
6614         * buildbot/clients/base.py: switch to pb.Cacheable-style Events
6615         * buildbot/clients/gtkPanes.py: ditto
6617         * buildbot/process/step_twisted.py (RunUnitTests): use randomly=
6618         arg to collapse RunUnitTestsRandomly into RunUnitTests
6619         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
6620         use RunUnitTests(randomly=1) instead of RunUnitTestsRandomly
6622         * buildbot/status/html.py (StatusResource): shuffle Resources
6623         around to fix a bug: both 'http://foo:8080' and 'http://foo:8080/'
6624         would serve the waterfall display, but the internal links were
6625         only valid on the trailing-slash version. The correct behavior is
6626         for the non-slashed one to serve a Redirect to the slashed one.
6627         This only shows up when the buildbot page is hanging off another
6628         server, like a Twisted-Web distributed server.
6630         * buildbot/status/event.py (Event, RemoteEvent): make Events
6631         pb.Cacheable, with RemoteEvent as the cached version. This removes
6632         a lot of explicit send-an-update code.
6633         * buildbot/status/builder.py (Builder): remove send-update code
6634         * buildbot/status/client.py (ClientBuilder): remove send-update
6635         code, and log errors that occur during callRemote (mostly to catch
6636         InsecureJelly exceptions)
6638         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
6639         run Lore with the same python used in the rest of the build
6641         * buildbot/process/step_twisted2.py (RunUnitTestsJelly): moved
6643         * buildbot/process/step_twisted.py (HLint): accept 'python'
6644         argument. Catch rc!=0 and mark the step as failed. This marks the
6645         build orange ("has warnings").
6646         (RunUnitTestsJelly): move out to step_twisted2.py
6648         * buildbot/util.py (ignoreStaleRefs): add utility function
6650         * buildbot/master.py (DebugPerspective.perspective_setCurrentState):
6651         don't fake ETA object, it's too hard to get right
6653 2003-05-02  Brian Warner  <warner@lothar.com>
6655         * docs/examples/twisted_master.py (twisted_app): add FreeBSD builder
6657 2003-05-01  Brian Warner  <warner@lothar.com>
6659         * buildbot/status/html.py (StatusResource.body): oops, I was
6660         missing a <tr>, causing the waterfall page to be misrendered in
6661         everything except Galeon.
6663 2003-04-29  Brian Warner  <warner@lothar.com>
6665         * docs/examples/twisted_master.py: make debuild use python-2.2
6666         explicitly, now that Twisted stopped supporting 2.1
6668         * buildbot/process/step_twisted.py (BuildDebs.finishStatus): oops,
6669         handle tuple results too. I keep forgetting this, which suggests
6670         it needs to be rethought.
6672         * setup.py (setup): bump version to 0.3.1+ while between releases
6673         
6674 2003-04-29  Brian Warner  <warner@lothar.com>
6676         * setup.py: Releasing buildbot-0.3.1
6678 2003-04-29  Brian Warner  <warner@lothar.com>
6680         * README (SUPPORT): add plea to send questions to the mailing list
6682         * NEWS, MANIFEST.in: add description of recent changes
6684         * docs/examples/twisted_master.py: add the code used to create the
6685         Twisted buildmaster, with passwords and such removed out to a
6686         separate file.
6688         * buildbot/changes/changes.py, freshcvs.py, freshcvsmail.py: split
6689         out cvstoys-using bits from generic changes.py, to allow non-cvstoys
6690         buildmasters to not require CVSToys be installed.
6691         * README, docs/examples/glib_master: update to match the change
6693         * buildbot/clients/base.py, buildbot/bot.py,
6694         buildbot/changes/changes.py, buildbot/pbutil.py: copy
6695         ReconnectingPB from CVSToys distribution to remove CVSToys
6696         dependency for build slaves and status clients. Buildmasters which
6697         use FreshCVSSources still require cvstoys be installed, of course.
6699 2003-04-25  Brian Warner  <warner@lothar.com>
6701         * buildbot/process/process_twisted.py (FullTwistedBuildFactory): add
6702         runTestsRandomly arg to turn on trial -z
6704         * buildbot/process/step_twisted.py (TwistedJellyTestResults):
6705         experimental code to use trial's machine-parseable output to get
6706         more detailed test results. Still has some major issues.
6707         (RunUnitTestsRandomly): subclass to add "-z 0" option, runs tests
6708         in random sequence
6710         * buildbot/status/builder.py (Builder.setCurrentBuild):
6711         anticipating moving build history into statusbag, not used yet
6713         * buildbot/status/tests.py: code to centralize test results,
6714         doesn't work quite yet
6716         * buildbot/status/event.py (Event): use hasattr("setName") instead
6717         of isinstance for now.. need better long-term solution
6719         * buildbot/status/html.py: Remove old imports
6721 2003-04-24  Brian Warner  <warner@lothar.com>
6723         * buildbot/process/process_twisted.py (TwistedBuild.isFileImportant):
6724         ignore changes under doc/fun/ and sandbox/
6726         * buildbot/process/step_twisted.py: update pushEvent and friends.
6728         * buildbot/status/html.py (Box.td): replace event.buildername with
6729         event.parent.getSwappableName(). Needs more thought.
6731         * buildbot/status/builder.py (Builder): Replace pushEvent and
6732         getLastEvent with {set|update|addFileTo|finish}CurrentActivity.
6733         Tell events they are being pruned with event.delete().
6735         * buildbot/process/base.py (Build): Remove Builder status-handling
6736         methods. s/pushEvent/setCurrentActivity/.
6738         * buildbot/process/step.py (BuildStep): clean up status delivery.
6739         Gouse builder.statusbag methods instead of intermediate builder
6740         methods. s/updateLastEvent/updateCurrentActivity/.
6741         s/finalizeLastEvent/finishCurrentActivity/. Use
6742         addFileToCurrentActivity for summaryFunction.
6744         * buildbot/status/event.py (Logfile): put data in a Swappable when
6745         .finish is called.
6746         (Event): add more setter methods. Remove .buildername, use .parent
6747         and getSwappableName instead (needs more thought).
6749         * buildbot/util.py (Swappable):
6750         * test/test_swap.py: don't bother setting filename at __init__
6751         time, do it later. Change setFilename args to take parent first,
6752         since it provides the most significant part of the filename.
6754 2003-04-23  Brian Warner  <warner@lothar.com>
6756         * buildbot/status/event.py (Logfile.addEntry): append to previous
6757         entry, if possible
6759         * buildbot/process/step.py (BuildStep.finalizeLastEvent):
6760         anticipating Swappable
6761         (InternalShellCommand.remoteUpdate): split out various log-adding
6762         methods so subclasses can snarf stdout separately
6764         * buildbot/process/base.py (Builder.finalizeLastEvent): more code
6765         in anticipation of Swappable build logs
6766         (Builder.testsFinished): anticipating TestResults, still disabled
6768         * buildbot/status/builder.py (Builder.pruneEvents): only keep the
6769         last 100 events
6771         * buildbot/status/event.py (Logfile): add (disabled) support for
6772         Swappable, not ready for use yet
6774         * buildbot/util.py (Swappable): object which is swapped out to
6775         disk after some period of no use.
6776         * test/test_swap.py: test buildbot.utils.Swappable
6778 2003-04-14  Brian Warner  <warner@lothar.com>
6780         * buildbot/process/base.py (Builder.doPeriodicBuild): add simple
6781         periodic-build timer. Set the .periodicBuildTime on a builder
6782         instance to some number of seconds to activate it.
6784         * buildbot/master.py (BotMaster.forceBuild): change forceBuild API
6786         * buildbot/process/step.py (ShellCommand.finishStatus): use log.msg in
6787         a way that survives result tuples
6789 2003-04-12  Brian Warner  <warner@lothar.com>
6791         * buildbot/process/step.py (ShellCommand.finishStatusSummary):
6792         return a dict instead of a tuple: allow summarizers to provide
6793         multiple summaries if they want
6794         * buildbot/process/step_twisted.py (trialTextSummarizer): return dict
6795         (debuildSummarizer): summarize lintian warnings/errors
6797 2003-04-10  Brian Warner  <warner@lothar.com>
6799         * README (REQUIREMENTS): slave requires twisted-1.0.4a2
6801 2003-04-09  Brian Warner  <warner@lothar.com>
6803         * buildbot/process/step_twisted.py (trialTextSummarizer): Don't create
6804         empty summaries: happens when the tests fail so hard they don't emit
6805         a parseable summary line.
6807         * buildbot/process/step.py (ShellCommand.finishStatusSummary):
6808         Allow summaryFunction to return None to indicate no summary should
6809         be added.
6811         * buildbot/status/event.py (Logfile.removeHtmlWatcher): avoid
6812         writing to stale HTTP requests: notice when they disconnect and
6813         remove the request from the list. Also add CacheToFile from
6814         moshez, will be used later.
6816 2003-04-08  Brian Warner  <warner@lothar.com>
6818         * buildbot/process/step_twisted.py (ProcessDocs.finished): warnings
6819         should be an int, not a list of strings
6821         * buildbot/changes/changes.py (FreshCVSSource.stop): don't disconnect
6822         if we weren't actually connected
6824         * buildbot/process/step_twisted.py (trialTextSummarizer): function
6825         to show the tail end of the trial text output
6827         * buildbot/process/step.py (ShellCommand.finishStatusSummary): add
6828         hook to summarize the results of a ShellCommand
6830 2003-04-07  Brian Warner  <warner@lothar.com>
6832         * buildbot/process/step_twisted.py (RunUnitTests): consolidate all
6833         twisted test suite code into a single class.
6834         * buildbot/process/process_twisted.py: same
6836 2003-04-04  Brian Warner  <warner@lothar.com>
6838         * setup.py, MANIFEST.in: hack to make sure plugins.tml gets installed
6840         * README (SLAVE): document use of mktap to create slave .tap file
6841         (REQUIREMENTS): describe dependencies
6843         * buildbot/bb_tap.py, buildbot/plugins.tml:
6844         * buildbot/bot.py (updateApplication): Add mktap support for creating
6845         buildslave .tap files
6847 2003-03-28  Brian Warner  <warner@lothar.com>
6849         * buildbot/process/step.py (InternalShellCommand.finished): handle
6850         new tuple result values (fix embarrasing bug that appeared during
6851         PyCon demo)
6853 2003-03-27  Brian Warner  <warner@lothar.com>
6855         * docs/examples/glib_master.py, README: add sample buildmaster.tap
6856         -making program
6858 2003-03-25  Brian Warner  <warner@lothar.com>
6860         * buildbot/process/step.py (CVS, ShellCommand): add reason for failure
6861         to overall build status
6862         * buildbot/clients/base.py (Builder): improve event printing
6863         * buildbot/process/base.py (BasicBuildFactory): use specific steps
6864         instead of generic ShellCommand
6865         (Build): Add .stopBuild, use it when slave is detached
6867         * buildbot/process/step.py (Configure,Test): give the steps their
6868         own names and status strings
6870         * buildbot/status/html.py (StatusResource): add "show" argument,
6871         lets you limit the set of Builders being displayed.
6873 2003-03-20  Brian Warner  <warner@lothar.com>
6875         * buildbot/process/basic.py: removed
6877 2003-03-19  Brian Warner  <warner@lothar.com>
6879         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
6880         turn off process-docs by default
6882         * buildbot/process/base.py (Builder.getBuildNumbered): Don't blow up
6883         when displaying build information without anything in allBuilds[]
6885         * buildbot/bot.py (makeApp): really take password from sys.argv
6887 2003-03-18  Brian Warner  <warner@lothar.com>
6889         * buildbot/bot.py (buildApp): take password from sys.argv
6891         * README: replace with more useful text
6893         * setup.py: add a real one
6894         * MANIFEST.in, .cvsignore: more distutils packaging stuff
6895         
6896         * docs/PyCon-2003/: added sources for PyCon paper.
6898         * buildbot/process/base.py, step.py: revamp. BuildProcess is gone,
6899         now Build objects control the process and Builder only handles
6900         slave stuff and distribution of changes/status. A new BuildFactory
6901         class creates Build objects on demand.
6903         Created ConfigurableBuild which takes a list of steps to run. This
6904         makes it a lot easier to set up a new kind of build and moves us
6905         closer to being able to configure a build from a web page.
6907         * buildbot/process/step_twisted.py, process_twisted.py: move to
6908         new model. A lot of code went away.
6909         
6910         * buildbot/status/progress.py (BuildProgress.newProgress): Don't
6911         send lots of empty progress messages to the client.
6913         * buildbot/master.py (makeApp): enforce builder-name uniqueness
6915 2003-02-20  Brian Warner  <warner@lothar.com>
6917         * buildbot/process/step_twisted.py (BuildDebs): count lintian hits
6919         * buildbot/slavecommand.py (ShellCommand): back to usePTY=0. The
6920         Twisted bug that prevented non-pty processes from working just got
6921         fixed, and the bug that leaks ptys is still being investigated.
6923         * buildbot/process/step.py (CVS): send timeout arg to slave
6925         * buildbot/clients/gtkPanes.py: add connection-status row, handle
6926         builders coming and going
6927         * buildbot/clients/base.py: clean up protocol, move to ReconnectingPB
6928         from CVSToys, handle lost-buildmaster
6930         * buildbot/status/client.py (StatusClientService.removeBuilder):
6931         Clean up status client protocol: send builders (with references)
6932         as they are created, rather than sending a list and requiring the
6933         client to figure out which ones are new.
6934         * buildbot/master.py (BotMaster.forceBuild): Log debugclient
6935         attempts to force a build on an unknown builder
6937 2003-02-19  Brian Warner  <warner@lothar.com>
6939         * buildbot/slavecommand.py (CVSCommand): add timeout to sub-commands
6940         * buildbot/slavecommand.py (ShellCommand.start): stop using PTYs until
6941         Twisted stops leaking them.
6942         * buildbot/clients/gtkPanes.py (CompactBuilder): forget ETA when the
6943         builder goes to an idle state.
6945         * buildbot/slavecommand.py (ShellCommand.start): bring back PTYs until
6946         I figure out why CVS commands hang without them, and/or I fix the
6947         hung-command timeout
6949 2003-02-16  Brian Warner  <warner@lothar.com>
6951         * buildbot/process/step_twisted.py: bin/hlint went away, replace
6952         with 'bin/lore --output lint'. Use 'bin/trial -o' to remove
6953         ansi-color markup. Remove GenerateLore step. Count hlint warnings in
6954         GenerateDocs now that they are prefixed with WARNING:.
6956         * buildbot/status/html.py (StatusResource.body): Fix Builder link,
6957         use manual href target instead of request.childLink
6959         * buildbot/clients/gtkPanes.py: Fix progress countdown: update the
6960         display every second, but update the ETA every 5 seconds (or
6961         whenever) as remote_progress messages arrive.
6964 2003-02-12  Brian Warner  <warner@lothar.com>
6966         * *: import current sources from home CVS repository
6967         
6969 # Local Variables:
6970 # add-log-time-format: add-log-iso8601-time-string
6971 # End: