update twisted_master.cfg to current usage
[buildbot.git] / ChangeLog
blob35fc8b9a4d28ba7394fcc67f3f904190645af841
1 2006-09-21  Brian Warner  <warner@lothar.com>
3         * buildbot/scripts/sample.cfg: update to use new BuildStep classes
4         from buildbot.steps
5         * docs/examples/glib_master.cfg: same
6         * docs/examples/hello.cfg: same
7         * docs/examples/twisted_master.cfg: same, update to current usage
9 2006-09-19  Brian Warner  <warner@lothar.com>
11         * buildbot/steps/python.py (PyFlakes): refactor, add summary logs
12         (PyFlakes.createSummary): make it compatible with python-2.2
14         * buildbot/test/test_steps.py (Python.testPyFlakes): add a test
15         for at least the output-parsing parts of PyFlakes
17 2006-09-18  Brian Warner  <warner@lothar.com>
19         * buildbot/steps/python.py: oops, fix import of StringIO
21 2006-09-17  Brian Warner  <warner@lothar.com>
23         * buildbot/test/test_vc.py (VCBase._do_vctest_update_retry_1): it
24         turns out that SVN-1.4.0 doesn't fail to update once you've
25         replaced a file with a directory, unlike older versions of SVN and
26         pretty much every other VC tool we support. Since what we really
27         care about is that the update succeeds anyway, stop checking that
28         the tree got clobbered and just assert that the build succeeded.
29         (VCBase.printLogs): add a utility function for debugging
31         * buildbot/process/step.py: oops, added extra imports by mistake
33         * buildbot/changes/p4poller.py (P4Source._process_describe): do an
34         rstrip() on the first line coming out of the 'p4 describe'
35         process, to remove the stray ^M that Wade Brainerd reports seeing
36         in the 'when' field. Fixes SF#1555985.
38         * buildbot/master.py (BuildMaster.loadConfig): improve the error
39         message logged when c['schedulers'] is not right
40         * buildbot/scheduler.py (Scheduler.__init__): improve error
41         message when a Scheduler() is created with the wrong arguments
42         * buildbot/test/test_config.py (ConfigTest.testSchedulerErrors):
43         verify that these error messages are emitted
45         * buildbot/process/buildstep.py: rename step.py to buildstep.py .
46         The idea is that all the base classes (like BuildStep and
47         RemoteCommand and LogObserver) live in b.p.buildstep, and b.p.step
48         will be a leftover backwards-compatibility file that only contains
49         aliases for the steps that were moved out to buildbot.steps.*
50         * lots: change imports to match
51         * buildbot/process/step.py: add a DeprecationWarning if it ever
52         gets imported
54 2006-09-12  Brian Warner  <warner@lothar.com>
56         * buildbot/scheduler.py (Scheduler.__init__): make sure that
57         builderNames= is actually a sequence, since if you happen to give
58         it a single builder-specification dictionary instead, it won't get
59         caught by the existing assert. Thanks to Brett Neely for the
60         catch.
62         * buildbot/steps/python.py (BuildEPYDoc, PyFlakes): add new steps. No
63         tests yet, alas.
64         * docs/buildbot.texinfo (Python BuildSteps): document them
65         (sendchange): include a link to PBChangeSource, since you need one
67         * buildbot/steps/shell.py: clean up test-case-name line, remove some
68         unnecessary imports
69         * buildbot/steps/dummy.py: same
71 2006-09-08  Brian Warner  <warner@lothar.com>
73         * buildbot/steps/transfer.py (FileUpload,FileDownload): new
74         BuildStep which lets you transfer files from the master to the
75         slave or vice versa. Thanks to Albert Hofkamp for the original
76         patch. Fixes SF#1504631.
77         * buildbot/slave/commands.py (SlaveFileUploadCommand): slave-side
78         support for it
79         (SlaveFileDownloadCommand): same
80         * docs/buildbot.texinfo (Transferring Files): document it
81         * buildbot/test/test_transfer.py: test it
82         * buildbot/test/runutils.py (StepTester): new utility class for
83         testing BuildSteps and RemoteCommands without Builds or Bots or PB
84         * buildbot/test/test_steps.py (CheckStepTester): validate that the
85         utility class works
87         * buildbot/interfaces.py (IStatusLog.readlines): make it easier to
88         walk through StatusLogs one line at a time, mostly for the benefit
89         of ShellCommand.createSummary methods. You can either walk through
90         STDOUT or STDERR, but the default is STDOUT.
92         * buildbot/status/builder.py (LogFile.readlines): implement it.
93         Note that this is not yet memory-efficient, it just pulls the
94         whole file into RAM and then splits it up with a StringIO.
95         Eventually this should be a generator that only pulls chunks from
96         disk as necessary.
97         * buildbot/test/test_status.py (Log.testReadlines): test it
99         * docs/buildbot.texinfo: update to match changes
100         * buildbot/process/factory.py: stop using old definitions
101         * buildbot/process/process_twisted.py: same
102         * buildbot/test/test_*.py: same
104         * buildbot/process/step_twisted.py: move definition to..
105         * buildbot/steps/python_twisted.py: .. here, unfortunately python's
106         relative-import mechanisms prevent this from being named 'twisted'
107         or 'python/twisted' as I would have preferred.
109         * buildbot/process/maxq.py: move definition to..
110         * buildbot/steps/maxq.py: .. here, leave a compatibility import
112         * buildbot/process/step.py: split the user-visible BuildSteps into
113         separate files, all under buildbot/steps/
114         * buildbot/steps/source.py: this holds VC-checkout steps like SVN
115         * buildbot/steps/shell.py: this holds ShellCommand and friends
116         * buildbot/steps/dummy.py: this holds the testing steps like Dummy
118 2006-09-05  Brian Warner  <warner@lothar.com>
120         * lots: run pyflakes, removed a lot of unused imports, changed the
121         form of some conditional imports to remove false pyflakes
122         warnings. There are still a number of warnings left, mostly from
123         imports that are done for their side-effects.
124         * buildbot/test/test_vc.py: import twisted.python.failure, since it
125         was missing
127 2006-08-26  Brian Warner  <warner@lothar.com>
129         * buildbot/test/test_locks.py (Unit.testLater): make the tests
130         compatible with twisted-1.3.0, for some reason I just can't seem
131         to let go of the past.
133 2006-08-25  Brian Warner  <warner@lothar.com>
135         * buildbot/status/mail.py (MailNotifier.__init__): fix typo in docs
137         * buildbot/process/step.py (LoggingBuildStep.startCommand): set up
138         all logfiles= in startCommand(), rather than in start() . This
139         makes it easier to have the 'stdio' log come before any secondary
140         logfiles, which I feel makes the waterfall display more
141         understandable.
142         (LoggingBuildStep.setupLogfiles): move the addLog/cmd.useLog code
143         from ShellCommand up into LoggingBuildStep
144         (LoggingBuildStep.__init__): move the handling of logfiles= from
145         ShellCommand up to LoggingBuildStep, because startCommand is
146         provided by LoggingBuildStep, whereas start() was specific to
147         subclasses like ShellCommand and Source. This removes code
148         duplication in those subclasses.
149         (ShellCommand.__init__): same
150         (ShellCommand.checkForOldSlaveAndLogfiles): split out the check
151         for a slave that's too old to understand logfiles= into a separate
152         method, so it can live in ShellCommand. The rest of
153         setupLogfiles() can live in LoggingBuildStep.
155 2006-08-24  Brian Warner  <warner@lothar.com>
157         * buildbot/locks.py (BaseLock): you can now configure Locks to
158         allow multiple simultaneous owners. They still default to
159         maxCount=1. Fixes SF#1434997. Thanks to James Knight (foom) for
160         the patch.
161         * docs/buildbot.texinfo (Interlocks): document the new options
162         * buildbot/test/test_locks.py: add a bunch of new unit tests
163         * buildbot/process/base.py (Build.acquireLocks): locks now offer
164         waitUntilMaybeAvailable, not waitUntilAvailable
165         * buildbot/process/step.py (BuildStep.acquireLocks): same
166         * buildbot/master.py (BotMaster.getLockByID): real locks now use
167         the whole lockid in their constructor, not just the name. Also,
168         keep track of which real locks we've handed out by the full
169         lockid, not just class+name, otherwise changing just the maxCount=
170         in the master.cfg file would not actually cause a behavioral
171         change
173 2006-08-23  Brian Warner  <warner@lothar.com>
175         * buildbot/__init__.py (version): bump to 0.7.4+ while between
176         releases
177         * docs/buildbot.texinfo: same
179 2006-08-23  Brian Warner  <warner@lothar.com>
181         * buildbot/__init__.py (version): Releasing buildbot-0.7.4
182         * docs/buildbot.texinfo: set version to match
183         * NEWS: update for 0.7.4
184         * buildbot/slave/commands.py (command_version): mention that this
185         version (2.1) was released with buildbot-0.7.4
187 2006-08-22  Brian Warner  <warner@lothar.com>
189         * README: update
191         * CREDITS: new file, list of people who have helped. Thanks!
192         * MANIFEST.in: ship it
194         * MANIFEST.in: stop shipping the old PyCon-2003 paper.. with the
195         new diagrams, the user's manual is more informative than it was.
196         Start shipping the .html user's manual (and generated .png
197         images).
198         * Makefile: update 'release' target to match
200         * buildbot/test/test_web.py (GetURL.testBrokenStuff): delete this
201         test.. I think the web-parts effort will render it pointless well
202         before it ever actually starts to work.
204 2006-08-20  Brian Warner  <warner@lothar.com>
206         * buildbot/changes/pb.py (PBChangeSource): fix and simplify
207         meaning of the prefix= argument. It is now just a string which is
208         stripped from the beginning of the filename. If prefix= is set but
209         not found on any given filename, that filename is ignored. If all
210         filenames in a Change are ignored, the Change is dropped. This is
211         much simpler than the previous sep= nonsense, and I should have
212         implemented it this way from the beginning. Effectively resolves
213         SF#1217699 and SF#1381867. Thanks to Gary Granger and Marius
214         Gedminas for the catch and suggested fixes.
215         (ChangePerspective.perspective_addChange): implement the actual
216         prefix comparison
217         * buildbot/test/test_changes.py (TestChangePerspective): test it
218         * docs/buildbot.texinfo (PBChangeSource): document it, explain
219         how to properly use prefix=
220         * docs/examples/twisted_master.cfg (source): update prefix= by
221         adding the trailing slash
224         * docs/examples/twisted_master.cfg: update to actual practice
226         * buildbot/test/test_web.py (WaterfallSteps.test_urls): oops,
227         update test case to match new link text.. the HREF has both a
228         class= setting and an enclosing [] pair that I didn't match in the
229         test.
231         * docs/buildbot.texinfo (ShellCommand.command=): explain why a
232         list of strings is preferred over a single string with embedded
233         spaces
234         (ShellCommand.description=): explain that either single strings or
235         a list of strings is acceptable, and why you might prefer one over
236         the other. Add an example. Fixes SF#1524659, thanks to Paul
237         Winkler for the catch.
238         (Build Steps): update to use f.addStep() rather than using s()
239         and the constructor list
241         * buildbot/process/step.py (ShellCommand): accept either a single
242         string or a list of strings in both description= and
243         descriptionDone=
244         * buildbot/test/test_steps.py (Steps.test_description): test it
245         * buildbot/test/runutils.py (makeBuildStep): support for that test
247         * contrib/CSS/*.css: add some contributed CSS stylesheets, to make
248         the Waterfall display a bit less ugly. Thanks to John O'Duinn for
249         collecting the files and creating the patch.
251         * docs/buildbot.texinfo (BuildStep URLs): document new feature:
252         per-step URLs that will be displayed on the waterfall display,
253         for things like the HTML output of code-coverage tools, when
254         the results are hosted elsewhere.
255         * buildbot/interfaces.py (IBuildStepStatus.getURLs): document the
256         way to retrieve these URLs
257         * buildbot/status/builder.py (BuildStepStatus.getURLs): implement
258         the method to retrieve these URLs. Also provide backwards
259         compatibility for saved BuildStepStatus instances that didn't have
260         the .urls attribute
261         * buildbot/process/step.py (BuildStep.addURL): method to set these
262         URLs from within a BuildStep
263         * buildbot/status/html.py (StepBox.getBox): emit links to the URLs
264         (StepBox.getBox): give these external links a distinct CSS class
265         named "BuildStep external" so a .css file can display them
266         differently
268         * buildbot/test/test_web.py (WaterfallSteps): test that we really
269         do emit those links
270         * buildbot/test/test_steps.py (Steps): test that we can all the
271         URLs. Also add a bunch of other tests on methods that can be
272         called from within BuildSteps
273         * buildbot/test/runutils.py (makeBuildStep): add utility function
275 2006-08-13  Brian Warner  <warner@lothar.com>
277         * docs/buildbot.texinfo (BuildStep LogFiles): document them
279 2006-08-10  Brian Warner  <warner@lothar.com>
281         * docs/buildbot.texinfo (Index of master.cfg keys): add another
282         index, this one of things like c['sources'] and c['schedulers']
283         (indices): it looks like my clever idea of putting the @fooindex
284         commands in between the @node and the @subsection (to make the
285         HREF anchor jump to slightly above the section title, which works
286         much better in html) confused texinfo horribly, so I'm moving the
287         index tags back to be just after the @subsection marker. I also
288         added extra lines between the @node/@section paragraph and the
289         index tags, since I think maybe texinfo wants to see these be
290         separate paragraphs.
292         * docs/Makefile (images): make sure images get built when
293         rendering the manual
294         * docs/images/Makefile: same
296         * buildbot/scripts/runner.py: rename 'buildbot master' to
297         'buildbot create-master', and 'buildbot slave' to 'buildbot
298         create-slave'
299         * docs/buildbot.texinfo: same
300         * README: same
302         * docs/buildbot.texinfo: reimplement the "useful classes" index
303         with actual texinfo indices. The .info rendering is a bit
304         weird-looking but it works well, and the HTML rendering is quite
305         nice. This also puts the index targets in the regular flow of the
306         text, which is easier to maintain.
308 2006-08-06  Brian Warner  <warner@lothar.com>
310         * buildbot/slave/commands.py (ShellCommand.__init__): patch from
311         Kevin Turner to prefer the environ= argument be a list rather than
312         a string. If it is a list, it will be joined with a platform-local
313         os.pathsep delimiter, and then prepended to any existing
314         $PYTHONPATH value. This works better in cross-platform (i.e.
315         windows buildslaves) environments when you need to push multiple
316         directories onto the front of the path.
317         (SlaveShellCommand): documented the new magic
318         * docs/buildbot.texinfo (ShellCommand): documented the new magic
319         in a user-visible form
321         * buildbot/test/test_vc.py (BaseHelper.dovc): patch from Kevin
322         Turner to prefer lists over strings when creating/running VC
323         commands during unit tests. This is clearly necessary to survive
324         vcexe containing spaces, like "C:\Program Files\darcs.exe". I
325         renamed the wq() function to qw() though, since that's how it's
326         spelled in perl. Eventually I'd prefer all commands to be
327         specified with lists.
329         * buildbot/slave/commands.py (LogFileWatcher): handle logfiles
330         which are deleted (or not yet created) correctly. Also add
331         failsafe code to not explode if the file-watching poller doesn't
332         get started. Thanks to JP Calderone for the catch and the poller
333         patch.
334         * buildbot/test/test_shell.py (SlaveSide._testLogFiles): add test
335         for that case
336         * buildbot/test/emitlogs.py: same
338         * NEWS: summarize recent changes
340         * docs/buildbot.texinfo (Debug options): suggest an .ssh/options
341         clause to avoid the "host key mismatch" warning
343         * buildbot/process/step_twisted.py (Trial.start): if the
344         buildslave is too old to understand logfiles=, fall back to
345         running 'cat _trial_temp/test.log' like before.
346         (Trial.commandComplete): same. this takes advantage of the
347         LoggingBuildStep refactoring to stall commandComplete long enough
348         to run a second RemoteShellCommand.
350         * buildbot/process/step.py (LoggingBuildStep.startCommand):
351         refactor command-completion handling, to allow methods like
352         commandComplete/createSummary/evaluateCommand to return Deferreds.
353         (LoggingBuildStep._commandComplete): delete the refactored method
354         (ShellCommand.setupLogfiles): if the buildslave is too old to
355         understand logfiles=, put a warning message both into twistd.log
356         and into the otherwise empty user-visible LogFiles.
358         * buildbot/process/step.py (LoggedRemoteCommand.useLog): allow
359         callers to provide the slave-side logfile name, rather than
360         forcing it to come from the local name of the LogFile.
361         (BuildStep.getSlaveName): new method
363         * buildbot/process/base.py (Build.getSlaveName): new method, so
364         steps can find out which buildslave they're running on
366         * buildbot/test/test_steps.py (Version.checkCompare): oops, update
367         to match the s/cvs_ver/command_version/ change
369 2006-08-05  Brian Warner  <warner@lothar.com>
371         * buildbot/slave/commands.py (command_version): replace the CVS
372         auto-updated cvs_ver keyword with a manually-updated variable,
373         since CVS is no longer the master repository. Add a description of
374         the remote API change starting in this version (2.1), specifically
375         the fact that SlaveShellCommand now accepts 'initial_stdin',
376         'keep_stdin_open', and 'logfiles'.
378 2006-07-31  Brian Warner  <warner@lothar.com>
380         * docs/buildbot.texinfo (System Architecture): Finally add lots of
381         diagrams to describe how the whole system fits together. The
382         images themselves are kept in SVG files, with ascii-art versions
383         in corresponding .txt files. Texinfo knows how to interpolate the
384         text version into .info files, reference the .png versions from
385         .html files, and include .eps versions in the .ps format.
386         * docs/images/Makefile: tools to create .png and .eps
387         * docs/images/*.svg: created pictures with Inkscape.
388         * .darcs-boring: ignore the generated .eps and .png files
390 2006-07-24  Brian Warner  <warner@lothar.com>
392         * buildbot/master.py (BuildMaster.loadConfig): check for duplicate
393         Scheduler names, since they cause setServiceParent to explode
394         later.
395         * buildbot/test/test_config.py (ConfigTest._testSchedulers_7): test it
397 2006-07-20  Brian Warner  <warner@lothar.com>
399         * buildbot/scripts/sample.cfg: simplify the sample BuildFactory,
400         which runs the buildbot unit tests
402         * docs/buildbot.texinfo (Index of Useful Classes): add a table of
403         classes that are useful in master.cfg
405 2006-07-15  Brian Warner  <warner@lothar.com>
407         * Makefile (some-apidocs): new target to build only some epydocs
409         * setup.py: minor comment.. does the classifiers= argument prevent
410         the setup.py script from working on python2.2/2.3?
412         * buildbot/scripts/sample.cfg: update manhole example, arrange into
413         major sections
415         * buildbot/twcompat.py: fix minor typo in comments
417         * buildbot/manhole.py: move all Manhole-related code out to this
418         module. Implement SSH-based manholes (with TwistedConch), and move
419         to conch's nifty line-editing syntax-coloring REPL shell instead
420         of the boring non-editing monochromatic (and deprecated) old
421         'telnet' protocol.
422         * buildbot/master.py: remove all Manhole-related code
423         (BuildMaster.loadConfig._add): make sure the old manhole is
424         removed before we add the new one
425         * docs/buildbot.texinfo (Debug options): document new Manhole options
427         * buildbot/twcompat.py (_which): fix some epydoc issues
428         * buildbot/status/html.py (Waterfall.__init__): same
430 2006-06-29  Brian Warner  <warner@lothar.com>
432         * buildbot/interfaces.py: get Interface from b.twcompat to hush
433         deprecation warnings under newer Twisteds (by using
434         zope.interface.Interface instead of old twisted.python.components
435         stuff)
436         * buildbot/slave/interfaces.py: same
438 2006-06-28  Brian Warner  <warner@lothar.com>
440         * buildbot/slave/commands.py (SVN): add --non-interactive to all
441         svn commands, so it will fail immediately instead of hanging while
442         it waits for a username/password to be typed in.
444         * buildbot/slave/bot.py (SlaveBuilder.commandComplete): add minor
445         log message if the step was shut down
447         * buildbot/scripts/runner.py (SlaveOptions.longdesc): remove
448         obsolete reference to mktap.
450 2006-06-20  Brian Warner  <warner@lothar.com>
452         * buildbot/test/test_steps.py (BuildStep.testShellCommand1): update
453         test to include new 'logfiles' argument sent from master to slave
455 2006-06-19  Brian Warner  <warner@lothar.com>
457         * buildbot/process/step_twisted.py (Trial): track Progress from
458         _trial_temp/test.log too
460         * buildbot/process/step.py (OutputProgressObserver): generalize
461         the earlier StdioProgressObserver into an OutputProgressObserver
462         that can track LogFiles other than stdio.
463         (LoggingBuildStep.__init__): same
465         * buildbot/process/step_twisted.py (Trial): use logfiles= to track
466         _trial_temp/test.log, not a separate 'cat' command. TODO: this
467         will fail under windows because of os.sep issues. It might have
468         worked before if 'cat' was doing cygwin path conversion.
470         * buildbot/slave/commands.py (LogFileWatcher.__init__): note the
471         creation of LogFileWatchers
472         (ShellCommand._startCommand): and record the files that were
473         watched in the 'headers' section of the ShellCommand output
475         * buildbot/process/step.py (RemoteShellCommand.__init__): duh, you
476         need to actually pass it to the slave if you want it to work.
477         (ShellCommand): document it a bit
479         * buildbot/test/test_shell.py: new test to validate LogFiles
480         * buildbot/test/runutils.py (SlaveCommandTestBase): updates to
481         test LogFiles
482         * buildbot/test/emitlogs.py: enhance to wait for a line on stdin
483         before printing the last batch of lines, to test that the polling
484         logic is working properly
486         * buildbot/process/step.py (LoggedRemoteCommand): improve LogFile
487         handling, making it possible to track multiple logs for a single
488         RemoteCommand. The previous single logfile is now known as the
489         'stdio' log.
490         (LoggedRemoteCommand.remoteUpdate): accept key='log' updates
491         (RemoteShellCommand.__init__): accept logfiles=
492         (LoggingBuildStep.startCommand): stdio_log is now one of many
493         (ShellCommand): added logfiles= argument, as well as a class-level
494         .logfiles attribute, which will be merged together to figure out
495         which logfiles should be tracked. The latter maybe be useful for
496         subclasses of ShellCommand which know they will aways produce
497         secondary logfiles in the same location.
499         * buildbot/slave/commands.py (ShellCommandPP): add writeStdin()
500         and closeStdin() methods, preparing to make it possible to write
501         to a ShellCommand's stdin at any time, not just at startup. These
502         writes are buffered if the child process hasn't started yet.
503         (LogFileWatcher): new helper class to watch arbitrary logfiles
504         while a ShellCommand runs. This class polls the file every two
505         seconds, and sends back 10k chunks to the buildmaster.
506         (ShellCommand): rename stdin= to initialStdin=, and add
507         keepStdinOpen= and logfiles= to arguments. Set up LogFileWatchers
508         at startup.
509         (ShellCommand.addLogfile): LogFile text is sent in updates with a
510         key of "log" and a value of (logname, data).
511         (SlaveShellCommand): add 'initial_stdin', 'keep_stdin_open', and
512         'logfiles' to the master-visible args dictionary.
513         (SourceBase.doPatch): match s/stdin/initialStdin/ change
514         (CVS.start): same
515         (P4.doVCFull): same
516         * buildbot/test/test_vc.py (Patch.testPatch): same
519         * buildbot/test/emit.py: write to a logfile in the current
520         directory. We use this to figure out what was used as a basedir
521         rather than looking to see which copy of emit.py gets run, so that
522         we can run the commands from inside _trial_temp rather than inside
523         buildbot/test
524         * buildbot/test/subdir/emit.py: same
525         * buildbot/test/runutils.py (FakeSlaveBuilder): take a 'basedir'
526         argument rather than running from buildbot/test/
527         (SlaveCommandTestBase.setUpBuilder): explicitly set up the Builder
528         rather than using an implicit setUp()
529         * buildbot/test/test_slavecommand.py (ShellBase.setUp): same
530         (ShellBase.testShell1, etc): use explicit path to emit.py instead
531         of assuming that we're running in buildbot/test/ (and that '.' is
532         on our $PATH)
534         * buildbot/slave/commands.py (Command.doStart): refactor Command
535         startup/completion a bit: now the SlaveBuilder calls doStart(),
536         which is not meant for overridding by subclasses, and doStart()
537         calls start(), which is. Likewise the SlaveBuilder calls
538         doInterrupt(), and subclasses override interrupt(). This also puts
539         responsibility for maintaining .running in Command rather than in
540         SlaveBuilder.
541         (Command.doInterrupt): same
542         (Command.commandComplete): same, this is called when the deferred
543         returned by start() completes.
544         * buildbot/slave/bot.py (SlaveBuilder.remote_startCommand): same
545         (SlaveBuilder.remote_interruptCommand): same
546         (SlaveBuilder.stopCommand): same
548 2006-06-16  Brian Warner  <warner@lothar.com>
550         * buildbot/test/test_shell.py: new test file to contain everything
551         relating to ShellCommand
552         (SlaveSide.testLogFiles): (todo) test for the upcoming "watch
553         multiple logfiles in realtime" feature, not yet implemented
554         * buildbot/test/emitlogs.py: support file for testLogFiles
555         * docs/buildbot.texinfo (ShellCommand): document the feature
557         * buildbot/test/test_steps.py (BuildStep.setUp): rmtree refactoring
559         * buildbot/test/runutils.py (SlaveCommandTestBase): utility class
560         for tests which exercise SlaveCommands in isolation.
562         * buildbot/test/test_slavecommand.py: Move some utilities like
563         SignalMixin and FakeSlaveBuilder from here ..
564         * buildbot/test/runutils.py: .. to here, so they can be used by
565         other test classes too
566         * buildbot/test/test_vc.py: more SignalMixin refactoring
567         * buildbot/test/test_control.py: same
568         * buildbot/test/test_run.py: and some rmtree refactoring
570 2006-06-15  Brian Warner  <warner@lothar.com>
572         * buildbot/test/test_vc.py (P4.testCheckoutBranch): rename from
573         'testBranch' to match other VC tests and have the tests run in
574         roughly increasing order of dependency
576         * buildbot/test/test_steps.py (LogObserver): new test to verify
577         LogObservers can be created at various times and still get
578         connected up properly
580         * buildbot/test/runutils.py (setupBuildStepStatus): utility method
581         to create BuildStepStatus instances that actually work.
583         * buildbot/process/step.py (LogObserver): add outReceived and
584         errReceived base methods, to be overridden
586         * buildbot/status/builder.py (BuildStatus.addStepWithName): change
587         API to take a name instead of a step, reducing the coupling
588         somewhat. This returns the BuildStepStatus object so it can be
589         passed to the new Step, instead of jamming it directly into the
590         Step.
591         * buildbot/process/step.py (BuildStep.setStepStatus): add a setter
592         method
593         * buildbot/process/base.py (Build.setupBuild): use both methods
594         * buildbot/test/test_web.py (Logfile.setUp): rearrange the setup
595         process a bit to match
597 2006-06-14  Brian Warner  <warner@lothar.com>
599         * docs/buildbot.texinfo (Adding LogObservers): add some limited
600         docs on writing new LogObserver classes
601         (Writing New Status Plugins): brief docs on how Status Plugins fit
602         together
604         * buildbot/process/step_twisted.py (TrialTestCaseCounter):
605         implement a LogObserver that counts how many unit tests have been
606         run so far
607         (Trial.__init__): wire it in
608         * buildbot/test/test_twisted.py (Counter): unit test for it
610         * buildbot/process/step_twisted.py (HLint.commandComplete): update
611         to new cmd.logs['stdio'] scheme
612         (Trial.commandComplete): same
613         (BuildDebs.commandComplete): same
615         * buildbot/process/step.py (LoggedRemoteCommand): use a dict of
616         LogFiles, instead of just a single one. The old single logfile is
617         now called "stdio". LoggedRemoteCommand no longer creates a
618         LogFile for you (the code to do that was broken anyway). If you
619         don't create a "stdio" LogFile, then stdout/stderr will be
620         discarded.
621         (LogObserver): implement "LogObservers", which a BuildStep can add
622         to parse the output of a command in real-time. The primary use is
623         to provide more useful information to the Progress code, allowing
624         better ETA estimates.
625         (LogLineObserver): utility subclass which feeds complete lines to
626         the parser instead of bytes.
627         (BuildStep.progressMetrics): this is safer as a tuple
628         (BuildStep.setProgress): utility method, meant to be called by
629         LogObservers
630         (BuildStep.addLogObserver): new method, to be called at any time
631         during the BuildStep (even before any LogFiles have been created),
632         to attach (or schedule for eventual attachment) a LogObserver to a
633         LogFile.
634         (StdioProgressObserver): new LogObserver which replaces the old
635         "output" progress gatherer
636         (LoggingBuildStep.__init__): same
637         (LoggingBuildStep.startCommand): set up the "stdio" LogFile
638         (LoggingBuildStep._commandComplete): must use logs['stdio']
639         instead of the old single ".log" attribute.
640         * buildbot/status/builder.py (LogFile): remove old logProgressTo
641         functionality, now subsumed into StdioProgressObserver
642         * buildbot/test/test_status.py (Subscription._testSlave_2): the
643         log name changed from "output" to "stdio".
646         * buildbot/interfaces.py (ILogFile): add the Interface used from
647         the BuildStep towards the LogFile
648         (ILogObserver): and the one provided by a LogObserver
649         * buildbot/status/builder.py (LogFile): implement it
651         * buildbot/interfaces.py (LOG_CHANNEL_*): move STDOUT / STDERR /
652         HEADER constants here ..
653         * buildbot/status/builder.py (STDOUT): .. from here
655 2006-06-13  Brian Warner  <warner@lothar.com>
657         * buildbot/test/test_p4poller.py (TestP4Poller.failUnlessIn): fix
658         compatibility with python2.2, which doesn't have the 'substr in
659         str' feature.
660         (TestP4Poller.makeTime): utility function to construct the
661         timestamp using the same strptime() approach as p4poller does. It
662         turns out that time.mktime() behaves slightly differently under
663         python2.2, probably something to do with the DST flag, and that
664         causes the test to fail under python2.2. (changing the mktime()
665         arguments to have dst=0 instead of -1 caused it to fail under
666         python2.3. Go figure.)
667         (TestP4Poller._testCheck3): use our makeTime() instead of mktime()
669 2006-06-12  Brian Warner  <warner@lothar.com>
671         * buildbot/process/step.py (P4): merge in patch SF#1473939, adding
672         proper Perforce (P4) support. Many many thanks to Scott Lamb for
673         contributing such an excellent patch, including docs and unit
674         tests! This makes it *so* much easier to apply. I had to update
675         test_vc.py to handle some recent refactorings, but everything else
676         applied smoothly. The only remaining thing I'd like to fix would
677         be to remove the hard-wired port 1666 used by p4d, and allow it to
678         claim any unused port. This would allow two copies of the test
679         suite to run on the same host at the same time, as well as
680         allowing the test suite to run while a real (production) p4d was
681         running on the same host. Oh, and maybe we should add a warning to
682         step.P4 that gets emitted if the slave is too old to provide the
683         'p4' SlaveCommand. Otherwise it looks great. (closes: SF#1473939).
684         * buildbot/slave/commands.py (P4): same
685         (P4Sync): same, some minor updates
686         * buildbot/changes/p4poller.py: same
687         * docs/buildbot.texinfo: same
688         * buildbot/test/test_p4poller.py: same
689         * buildbot/test/test_vc.py (P4): same
691         * setup.py: add Trove classifiers for PyPI
693 2006-06-08  Brian Warner  <warner@allmydata.com>
695         * buildbot/status/client.py
696         (RemoteBuilder.remote_getCurrentBuilds): oops, I screwed up when
697         changing this from getCurrentBuild() to getCurrentBuilds(). Each
698         build needs to be IRemote'd separately, rather than IRemote'ing
699         the whole list at once. I can't wait until newpb's serialization
700         adapters make this unnecessary.
702 2006-06-06  Brian Warner  <warner@lothar.com>
704         * buildbot/process/step.py (WithProperties): make this inherit
705         from ComparableMixin, so that reloading an unchanged config file
706         doesn't cause us to spuriously reload any Builders which use them.
707         * buildbot/test/test_config.py (ConfigTest.testWithProperties):
708         add a test for it
710 2006-06-03  Brian Warner  <warner@lothar.com>
712         * contrib/windows/{setup.py, buildbot_service.py}: add support for
713         running py2exe on windows, contributed by Mark Hammond. Addresses
714         SF#1401121, but I think we still need to include
715         buildbot/scripts/sample.cfg
716         * setup.py: include buildbot_service.py as a script under windows
717         * buildbot/status/html.py: when sys.frozen (i.e. we're running in
718         a py2exe application), get the icon/css datafiles from a different
719         place than usual.
721         * buildbot/status/mail.py (MailNotifier.buildMessage): don't
722         double-escape the build URL. Thanks to Olivier Bonnet for the
723         patch. Fixes SF#1452801.
725 2006-06-02  Brian Warner  <warner@lothar.com>
727         * contrib/svn_buildbot.py (ChangeSender.getChanges): ignore the
728         first six columns of 'svnlook' output, not just the first column,
729         since property changes appear in the other five. Thanks to Olivier
730         Bonnet for the patch. Fixes SF#1398174.
732 2006-06-01  Brian Warner  <warner@lothar.com>
734         * buildbot/test/test_web.py (Logfile.setUp): set the .reason on
735         the fake build, so that title= has something to be set to
737         * buildbot/status/html.py (BuildBox.getBox): set the 'title='
738         attribute of the "Build #NN" link in the yellow start-the-build
739         box to the build's reason. This means that you get a little
740         tooltip explaining why the build was done when you hover over the
741         yellow box. Thanks to Zandr Milewski for the suggestion.
743         * buildbot/clients/gtkPanes.py (Box.setColor): ignore color=None
744         (Box.setETA): handle ETA=None (by stopping the timer)
745         (Box.update): make the [soon] text less different than the usual
746         text, so the rest of the text doesn't flop around so much. It
747         would be awfully nice to figure out how to center this stuff.
748         (ThreeRowBuilder.stepETAUpdate): more debugging printouts
750         * buildbot/process/step.py (ShellCommand): set flunkOnFailure=True
751         by default, so that any ShellCommand which fails marks the overall
752         build as a failure. I should have done this from the beginning.
753         Add flunkOnFailure=False to the arguments if you want to turn off
754         this behavior.
756 2006-05-30  Brian Warner  <warner@lothar.com>
758         * buildbot/clients/gtkPanes.py: add a third row: now it shows
759         last-build/current-build/current-step. Show what step is currently
760         running. Show ETA for both the overall build and the current step.
761         Update GTK calls to modern non-deprecated forms. There's still a
762         lot of dead code and debug noise to remove.
764         * buildbot/process/step_twisted.py (Trial): set the step name, so it
765         shows up properly in status displays
767 2006-05-28  Brian Warner  <warner@lothar.com>
769         * buildbot/test/test_properties.py (Run.testInterpolate): on the
770         build we use to verify that WithProperties works:
772         ** set flunkOnFailure=True so that build failures get noticed
773         ** set workdir='.' so that the build succeeds, otherwise it is trying
774             to touch 'build/something', and 'build/' doesn't exist because
775             usually that's created by a Source step
776         ** set timeout=10, because Twisted-1.3.0 has a race condition that
777             this test somehow triggers, in which the 'touch' process becomes
778             a zombie and we wait for th etimeout before giving up on it.
780         * buildbot/test/runutils.py (RunMixin.logBuildResults): utility method
781         to log the Build results and step logs to the twisted log.
782         (RunMixin.failUnlessBuildSucceeded): use logBuildResults to record
783         what went wrong if a build was expected to succeed but didn't.
785         * buildbot/process/step_twisted.py (Trial): set the default
786         trialMode to '--reporter=bwverbose', which specifies verbose
787         black-and-white text. Back in twisted-1.3/2.0 days we had to use
788         '-to', but those are completely missing in modern Twisteds.
790         * buildbot/scripts/sample.cfg: make the sample Manhole config use
791         a localhost-only port, to encourage better security
793         * docs/buildbot.texinfo (Change Sources): mention
794         darcs_buildbot.py
796         * .darcs-boring: add a Darcs boringfile
798         * README (REQUIREMENTS): stop claiming compatibility with
799         Twisted-1.3.0
801         * contrib/darcs_buildbot.py: write a darcs-commit-hook change
802         sender
804 2006-05-27  Brian Warner  <warner@lothar.com>
806         * buildbot/__init__.py: bump to 0.7.3+ while between releases
807         * docs/buildbot.texinfo: same
809 2006-05-23  Brian Warner  <warner@lothar.com>
811         * buildbot/__init__.py (version): Releasing buildbot-0.7.3
812         * docs/buildbot.texinfo: set version to match
813         * NEWS: update for 0.7.3
815         * docs/buildbot.texinfo (Change Sources): mention hg_buildbot.py,
816         give a quick mapping from VC system to possible ChangeSources
817         (Build Properties): add 'buildername'
819         * buildbot/process/base.py (Build.setupStatus): oops, set
820         'buildername' and 'buildnumber' properties
821         * buildbot/test/test_properties.py (Interpolate.testBuildNumber):
822         test them
824 2006-05-22  Brian Warner  <warner@lothar.com>
826         * docs/buildbot.texinfo (Build Properties): explain the syntax of
827         property interpolation better
829         * README (INSTALLATION): remove old '-v' argument from recommended
830         trial command line
832         * docs/buildbot.texinfo (ShellCommand): add docs for description=
833         and descriptionDone= arguments. Thanks to Niklaus Giger for the
834         patch. SF#1475494.
836         * buildbot/slave/commands.py (SVN.parseGotRevision._parse): use
837         'svnversion' instead of grepping the output of 'svn info', much
838         simpler and avoids CR/LF problems on windows. Thanks to Olivier
839         Bonnet for the suggestion.
840         (SVN.parseGotRevision): oops, older verisons of 'svnversion'
841         require the WC_PATH argument, so run 'svnversion .' instead.
843         * buildbot/interfaces.py (IChangeSource): methods in Interfaces
844         aren't supposed to have 'self' in their argument list
846 2006-05-21  Brian Warner  <warner@lothar.com>
848         * buildbot/process/step.py (ShellCommand.start): make
849         testInterpolate pass. I was passing the uninterpolated command to
850         the RemoteShellCommand constructor
851         (ShellCommand._interpolateProperties): oops, handle non-list
852         commands (i.e. strings with multiple words separated by spaces in
853         them) properly, instead of forgetting about them.
855         * buildbot/test/test_properties.py (Run.testInterpolate): new test
856         to actually try to use build properties in a real build. This test
857         fails.
858         * buildbot/test/runutils.py (RunMixin.requestBuild): utility methods
859         to start and evaluate builds
861         * buildbot/test/test__versions.py: add a pseudo-test to record
862         what version of Twisted/Python/Buildbot are running. This should
863         show up at the beginning of _trial_tmp/test.log, and exists to help
864         debug other problems.
866         * buildbot/status/html.py (Waterfall): add 'robots_txt=' argument,
867         a filename to be served as 'robots.txt' to discourage web spiders.
868         Adapted from a patch by Tobi Vollebregt, thanks!
869         * buildbot/test/test_web.py (Waterfall._test_waterfall_5): test it
870         (Waterfall.test_waterfall): tweak the way that filenames are put
871         into the config file, to accomodate windows pathnames better.
873         * docs/buildbot.texinfo (HTML Waterfall): document it
875         * buildbot/process/process_twisted.py
876         (QuickTwistedBuildFactory.__init__): recent versions of Twisted
877         changed the build process. The new setup.py no longer takes the
878         'all' argument.
879         (FullTwistedBuildFactory.__init__): same
880         (TwistedReactorsBuildFactory.__init__): same
882         * contrib/hg_buildbot.py: wrote a commit script for mercurial, to
883         be placed in the [hooks] section of the central repository (the
884         one that everybody pushes changes to).
886 2006-05-20  Brian Warner  <warner@lothar.com>
888         * buildbot/slave/commands.py (Darcs.doVCFull): when writing the
889         .darcs-context file, use binary mode. I think this was causing a
890         Darcs failure under windows.
892 2006-05-19  Brian Warner  <warner@lothar.com>
894         * buildbot/scripts/tryclient.py (CVSExtractor.getBaseRevision):
895         use a timezone string of +0000 and gmtime, since this timestamp is
896         sent to a buildmaster and %z is broken.
898         * buildbot/test/test_vc.py (CVSHelper.getdate): use no timezone
899         string and localtime, since this timestamp will only be consumed
900         locally, and %z is broken.
902         * buildbot/slave/commands.py (CVS.parseGotRevision): use +0000 and
903         gmtime, since this timestamp is returned to the buildmaster, and
904         %z is broken.
906 2006-05-18  Brian Warner  <warner@lothar.com>
908         * NEWS: update in preparation for next release
910         * buildbot/test/test_vc.py (VCS_Helper): factor out all the
911         setup-repository and do-we-have-the-vc-tools code into a separate
912         "helper" class, which sticks around in a single module-level
913         object. This seems more likely to continue to work in the future
914         than having it hide in the TestCase and hope that TestCases stick
915         around for a long time.
917         * buildbot/test/test_vc.py (MercurialSupport.vc_create): 'hg
918         addremove' has been deprecated in recent versions of mercurial, so
919         use 'hg add' instead
921 2006-05-07  Brian Warner  <warner@lothar.com>
923         * buildbot/scheduler.py (Try_Jobdir.messageReceived): when
924         operating under windows, move the file before opening it, since
925         you can't rename a file that somebody has open.
927         * buildbot/process/base.py (Build.setupBuild): if something goes
928         wrong while creating a Step, log the name and arguments, since the
929         error message when you get the number of arguments wrong is really
930         opaque.
932 2006-05-06  Brian Warner  <warner@lothar.com>
934         * buildbot/process/step_twisted.py (Trial.setupEnvironment): more
935         bugs in twisted-specific code not covered by my unit tests, this
936         time use 'cmd' argument instead of self.cmd
938         * buildbot/process/process_twisted.py (TwistedBuild.isFileImportant):
939         fix stupid braino: either use startwith or find()==0, not both.
940         (TwistedReactorsBuildFactory.__init__): another dumb typo
942         * buildbot/test/test_slavecommand.py (ShellBase.testInterrupt1): 
943         mark this test as TODO under windows, since process-killing seems
944         dodgy there. We'll come back to this later and try to fix it
945         properly.
947         * buildbot/test/test_vc.py (CVSSupport.getdate): use localtime,
948         and don't include a timezone
949         (CVSSupport.vc_try_checkout): stop trying to strip the timezone.
950         This should avoid the windows-with-verbose-timezone-name problem
951         altogether.
952         (Patch.testPatch): add a test which runs 'patch' with less
953         overhead than the full VCBase.do_patch sequence, to try to isolate
954         a windows test failure. This one uses slave.commands.ShellCommand
955         and 'patch', but none of the VC code.
957         * buildbot/slave/commands.py (getCommand): use which() to find the
958         executables for 'cvs', 'svn', etc. This ought to help under
959         windows.
961         * buildbot/test/test_vc.py (VCBase.do_getpatch): Delete the
962         working directory before starting. If an earlier test failed, the
963         leftover directory would mistakenly flunk a later test.
964         (ArchCommon.registerRepository): fix some tla-vs-baz problems.
965         Make sure that we use the right commandlines if which("tla") picks
966         up "tla.exe" (as it does under windows).
967         (TlaSupport.do_get): factor out this tla-vs-baz difference
968         (TlaSupport.vc_create): more tla-vs-baz differences
970         * buildbot/test/test_slavecommand.py
971         (ShellBase.testShellMissingCommand): stop trying to assert
972         anything about the error message: different shells on different
973         OSes with different languages makes it hard, and it really isn't
974         that interesting of a thing to test anyway.
976         * buildbot/test/test_vc.py (CVSSupport.capable): skip CVS tests if
977         we detect cvs-1.10 (which is the version shipped with OS-X 10.3
978         "Panther"), because it has a bug which flunks a couple tests in
979         weird ways. I've checked that cvs-1.12.9 (as shipped with debian)
980         is ok. OS-X 10.4 "Tiger" ships with cvs-1.11, but I haven't been
981         able to test that yet.
983 2006-04-30  Brian Warner  <warner@lothar.com>
985         * buildbot/test/test_vc.py (VCBase.runCommand): set $LC_ALL="C" to
986         make sure child commands emit messages in english, so our regexps
987         will match. Thanks to Nikaus Giger for identifying the problems.
988         (VCBase._do_vctest_export_1): mode="export" is not responsible
989         for setting the "got_revision" property, since in many cases it is
990         not convenient to determine.
991         (SVNSupport.capable): when running 'svn --version' to check for
992         ra_local, we want error messages in english
993         * buildbot/test/test_slavecommand.py 
994         (ShellBase.testShellMissingCommand): set $LC_ALL="C" to get bash
995         to emit the error message in english
997         * buildbot/slave/commands.py (SourceBase.setup): stash a copy of
998         the environment with $LC_ALL="C" so that Commands which need to
999         parse the output of their child processes can obtain it in
1000         english.
1001         (SVN.parseGotRevision): call "svn info" afterwards instead of
1002         watching the output of the "svn update" or "svn checkout".
1003         (Darcs.parseGotRevision): use $LC_ALL="C" when running the command
1004         (Arch.parseGotRevision): same
1005         (Bazaar.parseGotRevision): same
1006         (Mercurial.parseGotRevision): same
1008         * buildbot/scripts/tryclient.py (SourceStampExtractor.dovc): set
1009         $LC_ALL="C" when running commands under 'buildbot try', too
1011         * buildbot/test/__init__.py: remove the global os.environ()
1012         setting, instead we do it just for the tests that run commands and
1013         need to parse their output.
1015         * buildbot/test/test_scheduler.py (Scheduling.testTryJobdir):
1016         remove the overly-short .timeout on this test, because non-DNotify
1017         platforms must fall back to polling which happens at 10 second
1018         intervals, so a 5 second timeout would never succeed.
1020 2006-04-24  Brian Warner  <warner@lothar.com>
1022         * docs/buildbot.texinfo (Installing the code): update trial
1023         invocation, SF#1469116 by Niklaus Giger.
1024         (Attributes of Changes): updated branch-name examples to be
1025         a bit more realistic, SF#1475240 by Stephen Davis.
1027         * contrib/windows/buildbot2.bat: utility wrapper for windows
1028         developers, contributed by Nick Trout (after a year of neglect..
1029         sorry!). SF#1194231.
1031         * buildbot/test/test_vc.py (*.capable): store the actual VC
1032         binary's pathname in VCS[vcname], so it can be retrieved later
1033         (CVSSupport.vc_try_checkout): incorporate Niklaus Giger's patch to
1034         strip out non-numeric timezone information, specifically the funky
1035         German string that his system produced that confuses CVS.
1036         (DarcsSupport.vc_create): use dovc() instead of vc(), this should
1037         allow Darcs tests to work on windows
1038         * buildbot/scripts/tryclient.py (SourceStampExtractor): use
1039         procutils.which() everywhere, to allow tryclient to work under
1040         windows. Also from Niklaus Giger, SF#1463394.
1042         * buildbot/twcompat.py (which): move the replacement for a missing
1043         twisted.python.procutils.which from test_vc.py to here, so it can
1044         be used in other places too (specifically tryclient.py)
1046 2006-04-23  Brian Warner  <warner@lothar.com>
1048         * buildbot/status/html.py (StatusResourceBuild.body): replace the
1049         bare buildbotURL/projectName line with a proper DIV, along with a
1050         CSS class of "title", from Stefan Seefeld (SF#1461675).
1051         (WaterfallStatusResource.body0): remove the redundant 'table'
1052         class from the table
1053         (WaterfallStatusResource.body): same. Also add class="LastBuild"
1054         to the top-row TR, and class="Activity" to the second-row TR,
1055         rather than putting them in the individual TD nodes.
1057         * buildbot/test/test_vc.py (VCBase.checkGotRevision): test
1058         'got_revision' build property for all VC systems that implement
1059         accurate ones: SVN, Darcs, Arch, Bazaar, Mercurial.
1061         * buildbot/slave/commands.py (SourceBase._handleGotRevision): try
1062         to determine which revision we actually obtained
1063         (CVS.parseGotRevision): implement this for CVS, which just means
1064         to grab a timestamp. Not ideal, and it depends upon the buildslave
1065         having a clock that is reasonably well syncronized with the server,
1066         but it's better than nothing.
1067         (SVN.parseGotRevision): implement it for SVN, which is accurate
1068         (Darcs.parseGotRevision): same
1069         (Arch.parseGotRevision): same
1070         (Bazaar.parseGotRevision): same
1071         (Mercurial.parseGotRevision): same
1073         * buildbot/process/step.py (LoggedRemoteCommand.remoteUpdate):
1074         keep a record of all non-stdout/stderr/header/rc status updates,
1075         for the benefit of RemoteCommands that send other useful things,
1076         like got_revision
1077         (Source.commandComplete): put any 'got_revision' status values
1078         into a build property of the same name
1081         * buildbot/process/step_twisted.py (Trial): update to deal with
1082         new ShellCommand refactoring
1084         * docs/buildbot.texinfo (Build Properties): document new feature
1085         that allows BuildSteps to get/set Build-wide properties like which
1086         revision was requested and/or checked out.
1088         * buildbot/interfaces.py (IBuildStatus.getProperty): new method
1089         * buildbot/status/builder.py (BuildStatus.getProperty): implement
1090         it. Note that this bumps the persistenceVersion of the saved Build
1091         object, so add the necessary upgrade-old-version logic to include
1092         an empty properties dict.
1094         * buildbot/process/base.py (Build.setProperty): implement it
1095         (Build.getProperty): same
1096         (Build.startBuild): change build startup to set 'branch',
1097         'revision', and 'slavename' properties at the right time
1099         * buildbot/process/step.py (BuildStep.__init__): change setup to
1100         require 'build' argument in a better way
1101         (LoggingBuildStep): split ShellCommand into two pieces, for better
1102         subclassing elsewhere. LoggingBuildStep is a BuildStep which runs
1103         a single RemoteCommand that sends stdout/stderr status text. It
1104         also provides the usual commandComplete / createSummary /
1105         evaluateCommand / getText methods to be overridden...
1106         (ShellCommand): .. whereas ShellCommand is specifically for
1107         running RemoteShellCommands. Other shell-like BuildSteps (like
1108         Source) can inherit from LoggingBuildStep instead of ShellCommand
1109         (WithProperties): marker class to do build-property interpolation
1110         (Source): inherit from LoggingBuildStep instead of ShellCommand
1111         (RemoteDummy): same
1113         * buildbot/test/test_properties.py: test new functionality
1115 2006-04-21  Brian Warner  <warner@lothar.com>
1117         * buildbot/test/test_vc.py: rename testBranch to
1118         testCheckoutBranch to keep the tests in about the right
1119         alphabetical order
1121 2006-04-18  Brian Warner  <warner@lothar.com>
1123         * docs/buildbot.texinfo (PBListener): improve cross-references
1124         between PBListener and 'buildbot statusgui', thanks to John Pye
1125         for the suggestion.
1127 2006-04-17  Brian Warner  <warner@lothar.com>
1129         * buildbot/twcompat.py (maybeWait): handle SkipTest properly when
1130         running under Twisted-1.3.0, otherwise skipped tests are reported
1131         as errors.
1133         * all: use isinstance() instead of 'type(x) is foo', suggested by
1134         Neal Norwitz
1136         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
1137         oops, fix a brain-fade from the other week, when making the
1138         addStep changes. I changed all the __init__ upcalls to use the
1139         wrong superclass name.
1140         (FullTwistedBuildFactory.__init__): same
1141         (TwistedDebsBuildFactory.__init__): same
1142         (TwistedReactorsBuildFactory.__init__): same
1143         (TwistedBuild.isFileImportant): use .startswith for clarity,
1144         thanks to Neal Norwitz for the suggestions.
1146         * contrib/viewcvspoll.py: script to poll a viewcvs database for
1147         changes, then deliver them over PB to a remote buildmaster.
1149         * contrib/svnpoller.py: added script by John Pye to poll a remote
1150         SVN repository (by running 'svn log') from a cronjob, and run
1151         'buildbot sendchange' to deliver the changes to a remote
1152         buildmaster.
1153         * contrib/svn_watcher.py: added script by Niklaus Giger (a
1154         modification of svnpoller.py), same purpose, but this one loops
1155         internally (rather than expecting to run from a cronjob) and works
1156         under windows.
1157         * contrib/README.txt: same
1159 2006-04-11  Brian Warner  <warner@lothar.com>
1161         * all: fix a number of incorrect names and missing imports, thanks
1162         to Anthony Baxter for the patch.
1163         * buildbot/status/html.py (WaterfallStatusResource.statusToHTML): 
1164         remove unused buggy method.
1165         * buildbot/status/builder.py (BuildStatus.saveYourself): rmtree
1166         comes from shutil, not "shutils"
1167         * buildbot/process/step.py (TreeSize.evaluateCommand): fix bad name
1168         (Arch.checkSlaveVersion): same
1169         * buildbot/process/step_twisted.py (Trial.commandComplete): same, in
1170         some disabled code
1171         * buildbot/process/step_twisted2.py: add some missing imports
1172         * buildbot/twcompat.py (_deferGenerator): fix cut-and-paste error,
1173         this code used to live in twisted.internet.defer
1175 2006-04-10  Brian Warner  <warner@lothar.com>
1177         * buildbot/process/step.py (Mercurial): add Mercurial support
1178         * buildbot/slave/commands.py (Mercurial): same
1179         * buildbot/scripts/tryclient.py (MercurialExtractor): same
1180         * buildbot/test/test_vc.py (Mercurial): same, checkout over HTTP is
1181         not yet tested, but 'try' support *is* covered
1182         * docs/buildbot.texinfo (Mercurial): document it
1184         * buildbot/process/step.py (LoggedRemoteCommand.remoteUpdate): add
1185         some debugging messages (turned off)
1186         * buildbot/test/test_vc.py: improve debug messages
1188 2006-04-07  Brian Warner  <warner@lothar.com>
1190         * buildbot/test/test_vc.py (which): define our own which() in case
1191         we can't import twisted.python.procutils, because procutils doesn't
1192         exist in Twisted-1.3
1194         * docs/buildbot.texinfo (Interlocks): fix some typos, mention use
1195         of SlaveLocks for performance tests
1197         * docs/examples/twisted_master.cfg: update to match current usage
1199         * buildbot/changes/p4poller.py (P4Source): add new arguments:
1200         password, p4 binary, pollinterval, maximum history to check.
1201         Patch from an anonymous sf.net contributor, SF#1219384.
1202         * buildbot/process/step.py (P4Sync.__init__): add username,
1203         password, and client arguments.
1204         * buildbot/slave/commands.py (P4Sync): same
1206 2006-04-05  Brian Warner  <warner@lothar.com>
1208         * buildbot/process/factory.py (BuildFactory.addStep): new method
1209         to add steps to a BuildFactory. Use it instead of f.steps.append,
1210         and you can probably avoid using the s() convenience function.
1211         Patch from Neal Norwitz, sf.net #1412605.
1212         (other): update all factories to use addStep
1213         * buildbot/process/process_twisted.py: update all factories to use
1214         addStep.
1216 2006-04-03  Brian Warner  <warner@lothar.com>
1218         * buildbot/test/test_vc.py: modified find-the-VC-command logic to
1219         work under windows too. Adapted from a patch by Niklaus Giger,
1220         addresses SF#1463399.
1222         * buildbot/test/__init__.py: set $LANG to 'C', to insure that
1223         spawned commands emit parseable results in english and not some
1224         other language. Patch from Niklaus Giger, SF#1463395.
1226         * README (INSTALLATION): discourage users from running unit tests on
1227         a "network drive", patch from Niklaus Giger, SF#1463394.
1229 2006-03-22  Brian Warner  <warner@lothar.com>
1231         * contrib/svn_buildbot.py: rearrange, add an easy-to-change
1232         function to turn a repository-relative pathname into a (branch,
1233         branch-relative-filename) tuple. Change this function to handle
1234         the branch naming policy used by your Subversion repository.
1235         Thanks to AllMyData.com for sponsoring this work.
1237 2006-03-16  Brian Warner  <warner@lothar.com>
1239         * buildbot/scripts/sample.cfg: add python-mode declaration for
1240         vim. Thanks to John Pye for the patch.
1242         * docs/buildbot.texinfo (Launching the daemons): fix @reboot job
1243         command line, mention the importance of running 'crontab' as the
1244         buildmaster/buildslave user. Thanks to John Pye for the catch.
1246 2006-03-13  Brian Warner  <warner@lothar.com>
1248         * buildbot/status/words.py (IRC): add an optional password=
1249         argument, which will be sent to Nickserv in an IDENTIFY message at
1250         login, to claim the nickname. freenode requires this before the
1251         bot can sent (or reply to) private messages. Thanks to Clement
1252         Stenac for the patch.
1253         * docs/buildbot.texinfo (IRC Bot): document it
1255         * buildbot/status/builder.py (LogFile.merge): don't write chunks
1256         larger than chunkSize. Fixes SF#1349253.
1257         * buildbot/test/test_status.py (Log.testLargeSummary): test it
1258         (Log.testConsumer): update to match new internal chunking behavior
1260 2006-03-12  Brian Warner  <warner@lothar.com>
1262         * buildbot/test/test_vc.py: remove the last use of waitForDeferred
1264         * buildbot/test/test_maildir.py (MaildirTest): rename the
1265         'timeout' method, as it collides with trial's internals
1267         * buildbot/scripts/runner.py: add 'buildbot restart' command
1268         (stop): don't sys.exit() out of here, otherwise restart can't work
1269         * docs/buildbot.texinfo (Shutdown): document it
1271         * buildbot/buildset.py (BuildSet.__init__): clean up docstring
1272         * buildbot/status/html.py (Waterfall.__init__): same
1273         * buildbot/process/builder.py (Builder.startBuild): same
1274         * buildbot/process/base.py (BuildRequest): same
1275         * buildbot/sourcestamp.py (SourceStamp): same
1276         * buildbot/scheduler.py (Nightly): same
1278         * buildbot/__init__.py (version): bump to 0.7.2+ while between
1279         releases
1280         * docs/buildbot.texinfo: same
1282 2006-02-17  Brian Warner  <warner@lothar.com>
1284         * buildbot/__init__.py (version): Releasing buildbot-0.7.2
1285         * docs/buildbot.texinfo: set version number to match
1286         * NEWS: update for 0.7.2
1288 2006-02-16  Brian Warner  <warner@lothar.com>
1290         * docs/buildbot.texinfo (Build Dependencies): add cindex tag
1292 2006-02-09  Brian Warner  <warner@lothar.com>
1294         * docs/buildbot.texinfo (How Different VC Systems Specify Sources):
1295         add text to explain per-build branch parameters
1296         * NEWS: mention --umask
1298 2006-02-08  Brian Warner  <warner@lothar.com>
1300         * buildbot/scripts/runner.py (Maker.makeSlaveTAC): remove unused
1301         method
1302         (SlaveOptions.optParameters): add --umask, to make it possible to
1303         make buildslave-generated files (including build products) be
1304         world-readable
1305         (slaveTAC): same
1306         * buildbot/slave/bot.py (BuildSlave.startService): same
1308 2006-01-23  Brian Warner  <warner@lothar.com>
1310         * buildbot/status/builder.py: urllib.quote() all URLs that include
1311         Builder names, so that builders can include characters like '/'
1312         and ' ' without completely breaking the resulting HTML. Thanks to
1313         Kevin Turner for the patch.
1314         * buildbot/status/html.py: same
1315         * buildbot/test/test_web.py (GetURL.testBuild): match changes
1317         * NEWS: update in preparation for upcoming release
1319 2006-01-18  Brian Warner  <warner@lothar.com>
1321         * docs/examples/twisted_master.cfg: update to match the Twisted
1322         buildbot: remove python2.2, switch to exarkun's buildslaves,
1323         disable the .deb builder until we figure out how to build twisted
1324         .debs from SVN, add some ktrace debugging to the OS-X build
1325         process and remove the qt build, remove threadless builders,
1326         change freebsd builder to use landonf's buildslave.
1328 2006-01-12  Brian Warner  <warner@lothar.com>
1330         * buildbot/master.py (Manhole.__init__): let port= be a strports
1331         specification string, but handle a regular int for backwards
1332         compatibility. This allows "tcp:12345:interface=127.0.0.1" to be
1333         used in master.cfg to limit connections to just the local host.
1334         (BuildMaster.loadConfig): same for c['slavePortnum']
1335         * buildbot/scheduler.py (Try_Userpass.__init__): same
1336         * buildbot/status/client.py (PBListener.__init__): same
1337         * buildbot/status/html.py (Waterfall.__init__): same, for both
1338         http_port and distrib_port. Include backwards-compatibility checks
1339         so distrib_port can be a filename string and still mean unix:/foo
1340         * docs/buildbot.texinfo (Setting the slaveport): document it
1341         (Debug options): same
1342         (HTML Waterfall): same
1343         (PBListener): same
1344         (try): same
1345         * buildbot/test/test_config.py (ConfigTest): test it
1347         * buildbot/master.py (BuildMaster.loadConfig): wait for the
1348         slaveport's disownServiceParent deferred to fire before opening
1349         the new one. Fixes an annoying bug in the unit tests.
1351 2006-01-03  Brian Warner  <warner@lothar.com>
1353         * buildbot/master.py (BuildMaster): remove the .schedulers
1354         attribute, replacing it with an allSchedulers() method that looks
1355         for all IService children that implement IScheduler. Having only
1356         one parent/child relationship means fewer opportunities for bugs.
1357         (BuildMaster.allSchedulers): new method
1358         (BuildMaster.loadConfig_Schedulers): update to use allSchedulers,
1359         also fix ugly bug that caused any config-file reload to
1360         half-forget about the earlier Schedulers, causing an exception
1361         when a Change arrived and was handed to a half-connected
1362         Scheduler. The exception was in scheduler.py line 54ish:
1363           self.parent.submitBuildSet(bs)
1364           exceptions.AttributeError: 'NoneType' object has no attribute
1365           'submitBuildSet'
1366         (BuildMaster.addChange): update to use allSchedulers()
1368         * buildbot/scheduler.py (BaseScheduler.__implements__): fix this
1369         to work properly with twisted-1.3.0, where you must explicitly
1370         include the __implements__ from parent classes
1371         (BaseScheduler.__repr__): make it easier to distinguish distinct
1372         instances
1373         (BaseUpstreamScheduler.__implements__): same
1375         * buildbot/status/builder.py (Status.getSchedulers): update to
1376         use allSchedulers()
1377         * buildbot/test/test_run.py (Run.testMaster): same
1378         * buildbot/test/test_dependencies.py (Dependencies.findScheduler): same
1379         * buildbot/test/test_config.py (ConfigTest.testSchedulers): same,
1380         make sure Scheduler instances are left alone when an identical
1381         config file is reloaded
1382         (ConfigElements.testSchedulers): make sure Schedulers are properly
1383         comparable
1385         * Makefile (TRIALARGS): my local default Twisted version is now
1386         2.1.0, update the trial arguments accordingly
1388 2005-12-22  Brian Warner  <warner@lothar.com>
1390         * docs/examples/twisted_master.cfg: merge changes from pyr: add
1391         new win32 builders
1393         * buildbot/scheduler.py (BaseScheduler.addChange): include a dummy
1394         addChange in the parent class, although I suspect this should be
1395         fixed better in the future.
1397 2005-11-26  Brian Warner  <warner@lothar.com>
1399         * buildbot/scheduler.py (AnyBranchScheduler.addChange): don't
1400         explode when branch==None, thanks to Kevin Turner for the catch
1401         * buildbot/test/test_scheduler.py (Scheduling.testAnyBranch): test
1402         it
1404         * buildbot/__init__.py (version): bump to 0.7.1+ while between
1405         releases
1406         * docs/buildbot.texinfo: same
1408 2005-11-26  Brian Warner  <warner@lothar.com>
1410         * buildbot/__init__.py (version): Releasing buildbot-0.7.1
1411         * docs/buildbot.texinfo: set version number to match
1413 2005-11-26  Brian Warner  <warner@lothar.com>
1415         * NEWS: update for 0.7.1
1417         * buildbot/status/builder.py (BuildStepStatus.unsubscribe): make
1418         sure that unsubscribe works even if we never sent an ETA update.
1419         Also, don't explode on duplicate unsubscribe.
1420         (BuildStepStatus.addLog): make the convenience "return self"-added
1421         watcher automatically unsubscribe when the Step finishes.
1422         (BuildStatus.unsubscribe): same handle-duplicate-unsubscribe
1423         (BuildStatus.stepStarted): same auto-unsubscribe
1424         (BuilderStatus.buildStarted): same auto-unsubscribe
1426         * buildbot/interfaces.py (IStatusReceiver.buildStarted): document
1427         auto-unsubscribe
1428         (IStatusReceiver.stepStarted): same
1429         (IStatusReceiver.logStarted): same
1431         * buildbot/test/test_run.py (Status): move the Status test..
1432         * buildbot/test/test_status.py (Subscription): .. to here
1434 2005-11-25  Brian Warner  <warner@lothar.com>
1436         * NEWS: more updates
1438         * buildbot/locks.py: fix the problem in which loading a master.cfg
1439         file that changes some Builders (but not all of them) can result
1440         in having multiple copies of the same Lock. Now, the real Locks
1441         are kept in a table inside the BotMaster, and the Builders/Steps
1442         use "LockIDs", which are still instances of MasterLock and
1443         SlaveLock. The real Locks are instances of the new RealMasterLock
1444         and RealSlaveLock classes.
1445         * buildbot/master.py (BotMaster.getLockByID): new method to
1446         convert LockIDs into real Locks.
1447         * buildbot/process/base.py (Build.startBuild): convert LockIDs
1448         into real Locks before building
1449         * buildbot/process/step.py (BuildStep.startStep): same
1450         * buildbot/test/test_locks.py (Locks.testLock1a): add a test which
1451         exercises the problem
1454         * docs/buildbot.texinfo (Scheduler Types): give a few hints about
1455         what Schedulers are available
1457         * buildbot/scheduler.py (Nightly): add new Scheduler based upon
1458         work by Dobes Vandermeer and hacked mercilessly by me. This offers
1459         'cron'-style build scheduling at certain times of day, week,
1460         month, or year.
1461         * buildbot/test/test_scheduler.py (Scheduling.testNightly): test it
1463         * buildbot/scheduler.py (Scheduler): change fileIsImportant
1464         handling: treat self.fileIsImportant more as an attribute that
1465         contains a callable than as a method. If the attribute is None,
1466         don't call it and assume all filenames are important. It is still
1467         possible to provide a fileIsImportant method in a subclass,
1468         however.
1469         (AnyBranchScheduler): handle fileIsImportant=None, previously it
1470         was broken
1471         * buildbot/test/test_scheduler.py (Scheduling.testAnyBranch2):
1472         test using AnyBranchScheduler with fileIsImportant=None
1474 2005-11-24  Brian Warner  <warner@lothar.com>
1476         * buildbot/test/test_config.py (StartService): don't claim a fixed
1477         port number, instead set slavePort=0 on the first pass, figure out
1478         what port was allocated, then switch to a config file that uses
1479         the allocated port.
1481         * buildbot/master.py (BuildMaster.loadConfig): close the old
1482         slaveport before opening the new one, because unit tests might
1483         replace slavePort=0 with the same allocated portnumber, and if we
1484         don't wait for the old port to close first, we get a "port already
1485         in use" error. There is a tiny race condition here, but the only
1486         threat is from other programs that bind (statically) to the same
1487         port number we happened to be allocated, and only if those
1488         programs use SO_REUSEADDR, and only if they get control in between
1489         reactor turns.
1491         * Makefile (TRIALARGS): update to handle Twisted > 2.1.0
1493         * buildbot/master.py (BuildMaster.loadConfig_Sources): remove all
1494         deleted ChangeSources before adding any new ones
1495         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): fix
1496         compare_attrs, to make sure that a config-file reload does not
1497         unnecessarily replace an unmodified ChangeSource instance
1498         * buildbot/test/test_config.py (ConfigTest.testSources): update
1500         * buildbot/scheduler.py (AnyBranchScheduler): fix branches=[] to
1501         mean "don't build anything", and add a warning if it gets used
1502         because it isn't actually useful.
1504         * contrib/svn_buildbot.py: update example usage to match the port
1505         number that gets used by the PBChangeSource
1506         * buildbot/scripts/sample.cfg: add example of PBChangeSource
1508 2005-11-22  Brian Warner  <warner@lothar.com>
1510         * NEWS: start collecting items for next release
1512         * buildbot/process/step.py (SVN.computeSourceRevision): assume
1513         revisions are strings
1514         (P4Sync.computeSourceRevision): same
1516         * buildbot/status/html.py (StatusResourceBuild.body): add a link
1517         to the Buildbot's overall status page
1518         (StatusResourceBuilder.body): same
1520 2005-11-15  Brian Warner  <warner@lothar.com>
1522         * buildbot/master.py (BuildMaster.loadConfig): serialize the
1523         config-file loading, specifically to make sure old StatusTargets
1524         are finished shutting down before new ones start up (thus
1525         resolving a bug in which changing the Waterfall object would fail
1526         because both new and old instances were claiming the same
1527         listening port). Also load new Schedulers after all the new
1528         Builders are set up, in case they fire off a new build right away.
1529         * buildbot/test/test_config.py (StartService): test it
1531         * buildbot/status/mail.py (MailNotifier.buildMessage): oops, add
1532         the branch name to the mail body
1534         * buildbot/changes/pb.py (PBChangeSource.compare_attrs): add this.
1535         Without it, a config-file reload fails to update an existing
1536         PBChangeSource.
1537         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): add
1538         username/passwd to compare_attrs, for the same reason
1539         * buildbot/status/html.py (Waterfall): add favicon to
1540         compare_attrs, same reason
1542 2005-11-05  Brian Warner  <warner@lothar.com>
1544         * buildbot/scripts/tryclient.py (createJobfile): stringify the
1545         baserev before stuffing it in the jobfile. This resolves problems
1546         under SVN (and probably Arch) where revisions are expressed as
1547         numbers. I'm inclined to use string-based revisions everywhere in
1548         the future, but this fix should be safe for now. Thanks to Steven
1549         Walter for the patch.
1551         * buildbot/changes/changes.py (ChangeMaster.saveYourself): use
1552         binary mode when opening pickle files, to make windows work
1553         better. Thanks to Dobes Vandermeer for the catch.
1554         * buildbot/status/builder.py (BuildStatus.saveYourself): same
1555         (BuilderStatus.getBuildByNumber): same
1556         (Status.builderAdded): same
1557         * buildbot/master.py (BuildMaster.loadChanges): same
1559         * buildbot/util.py (Swappable): delete unused leftover code
1561         * buildbot/process/step.py (SVN): when building on a non-default
1562         branch, add the word "[branch]" to the VC step's description, so
1563         it is obvious that we're not building the usual stuff. Likewise,
1564         when we are building a specific revision, add the text "rNNN" to
1565         indicate what that revision number is. Thanks to Brad Hards and
1566         Nathaniel Smith for the suggestion.
1567         (Darcs.startVC): same
1568         (Arch.startVC): same
1569         (Bazaar.startVC): same
1571         * buildbot/process/factory.py (GNUAutoconf.__init__): fix a silly
1572         typo, caught by Mark Dillavou, closes SF#1216636.
1574         * buildbot/test/test_status.py (Log.TODO_testDuplicate): add notes
1575         about a test to add some day
1577         * docs/examples/twisted_master.cfg: update: bot1 can now handle
1578         the 'full-2.3' build, and the 'reactors' build is now run under
1579         python-2.4 because the buildslave no longer has gtk/etc bindings
1580         for earlier versions.
1582 2005-11-03  Brian Warner  <warner@lothar.com>
1584         * buildbot/interfaces.py (IBuilderControl.resubmitBuild): new
1585         method, takes an IBuildStatus and rebuilds it. It might make more
1586         sense to add this to IBuildControl instead, but that instance goes
1587         away completely once the build has finished, and resubmitting
1588         builds can take place weeks later.
1589         * buildbot/process/builder.py (BuilderControl.resubmitBuild): same
1590         * buildbot/status/html.py (StatusResourceBuild): also stash an
1591         IBuilderControl so we can use resubmitBuild.
1592         (StatusResourceBuild.body): render "resubmit" button if we can.
1593         Also add hrefs for each BuildStep
1594         (StatusResourceBuild.rebuild): add action for "resubmit" button
1595         (StatusResourceBuilder.getChild): give it an IBuilderControl
1597         * buildbot/status/builder.py (Status.getURLForThing): change the
1598         URL for BuildSteps to have a "step-" prefix, so the magic URLs
1599         that live as targets of buttons like "stop" and "rebuild" can't
1600         collide with them.
1601         * buildbot/status/builder.py (Status.getURLForThing): same
1602         * buildbot/status/html.py (StatusResourceBuild.getChild): same
1603         (StepBox.getBox): same
1604         * buildbot/test/test_web.py (GetURL): same
1605         (Logfile): same
1607         * buildbot/process/step.py (SVN.__init__): put svnurl/baseURL
1608         exclusivity checks after Source.__init__ upcall, so misspelled
1609         arguments will be reported more usefully
1610         (Darcs.__init__): same
1612 2005-10-29  Brian Warner  <warner@lothar.com>
1614         * docs/examples/twisted_master.cfg: don't double-fire the 'quick'
1615         builder. Move the Try scheduler off to a separate port.
1617 2005-10-27  Brian Warner  <warner@lothar.com>
1619         * buildbot/clients/gtkPanes.py
1620         (TwoRowClient.remote_builderRemoved): disappearing Builders used
1621         to cause the app to crash, now they don't.
1623         * buildbot/clients/debug.py: display the buildmaster's location
1624         in the window's title bar
1626 2005-10-26  Brian Warner  <warner@lothar.com>
1628         * buildbot/status/mail.py (MailNotifier): urllib.escape the URLs
1629         in case they have spaces or whatnot. Patch from Dobes Vandermeer.
1630         * buildbot/test/test_status.py (MyStatus.getURLForThing): fix it
1632         * buildbot/status/html.py (td): put a single non-breaking space
1633         inside otherwise empty <td> elements, as a workaround for buggy
1634         browsers which would optimize them away (along with any associated
1635         styles, like the kind that create the waterfall grid borders).
1636         Patch from Frerich Raabe.
1638         * buildbot/process/step_twisted.py (Trial): expose the trialMode=
1639         argv-list as an argument, defaulting to ["-to"], which is
1640         appropriate for the Trial that comes with Twisted-2.1.0 and
1641         earlier. The Trial in current Twisted SVN wants
1642         ["--reporter=bwverbose"] instead. Also expose trialArgs=, which
1643         defaults to an empty list.
1644         * buildbot/process/process_twisted.py (TwistedTrial.trialMode):
1645         match it, now that trialMode= is a list instead of a single string
1647         * buildbot/__init__.py (version): bump to 0.7.0+ while between
1648         releases
1649         * docs/buildbot.texinfo: same
1651 2005-10-24  Brian Warner  <warner@lothar.com>
1653         * buildbot/__init__.py (version): Releasing buildbot-0.7.0
1654         * docs/buildbot.texinfo: set version number to match
1656 2005-10-24  Brian Warner  <warner@lothar.com>
1658         * README: update for 0.7.0
1659         * NEWS: same
1660         * docs/buildbot.texinfo: move the freshcvs stuff out of the README
1662         * buildbot/clients/debug.glade: add 'branch' box to fake-commit
1663         * buildbot/clients/debug.py (DebugWidget.do_commit): same. Don't
1664         send the branch= argument unless the user really provided one, to
1665         retain compatibility with older buildmasters that don't accept
1666         that argument.
1667         * buildbot/master.py (DebugPerspective.perspective_fakeChange):
1668         same
1670         * docs/buildbot.texinfo: update lots of stuff
1672         * buildbot/scripts/runner.py (sendchange): add a --branch argument
1673         to the 'buildbot sendchange' command
1674         * buildbot/clients/sendchange.py (Sender.send): same
1675         * buildbot/changes/pb.py (ChangePerspective): same
1676         * buildbot/test/test_changes.py (Sender.testSender): test it
1678         * buildbot/process/step.py (SVN.__init__): change 'base_url' and
1679         'default_branch' argument names to 'baseURL' and 'defaultBranch',
1680         for consistency with other BuildStep arguments that use camelCase.
1681         Well, at least more of them use camelCase (like flunkOnWarnings)
1682         than don't.. I wish I'd picked one style and stuck with it
1683         earlier. Annoying, but it's best done before the release, since
1684         these arguments didn't exist at all in 0.6.6 .
1685         (Darcs): same
1686         * buildbot/test/test_vc.py (SVN.testCheckout): same
1687         (Darcs.testPatch): same
1688         * docs/buildbot.texinfo (SVN): document the change
1689         (Darcs): same, add some build-on-branch docs
1690         * docs/examples/twisted_master.cfg: match change
1692         * buildbot/process/step.py (BuildStep): rename
1693         slaveVersionNewEnough to slaveVersionIsOlderThan, because that's
1694         how it is normally used.
1695         * buildbot/test/test_steps.py (Version.checkCompare): same
1697         * buildbot/process/step.py (CVS.startVC): refuse to build
1698         update/copy -style builds on a non-default branch with an old
1699         buildslave (<=0.6.6) that doesn't know how to do it properly. The
1700         concern is that it will do a VC 'update' in an existing tree when
1701         it is supposed to be switching branches (and therefore clobbering
1702         the tree to do a full checkout), thus building the wrong source.
1703         This used to be a warning, but I think the confusion it is likely
1704         to cause warrants making it an error.
1705         (SVN.startVC): same, also make mode=export on old slaves an error
1706         (Darcs.startVC): same
1707         (Git.startVC): improve error message for non-Git-enabled slaves
1708         (Arch.checkSlaveVersion): same. continue to emit a warning when a
1709         specific revision is built on a slave that doesn't pay attention
1710         to args['revision'], because for slowly-changing trees it will
1711         probably do the right thing, and because we have no way to tell
1712         whether we're asking it to build the most recent version or not.
1713         * buildbot/interfaces.py (BuildSlaveTooOldError): new exception
1715         * buildbot/scripts/runner.py (SlaveOptions.postOptions): assert
1716         that 'master' is in host:portnum format, to catch errors sooner
1718 2005-10-23  Brian Warner  <warner@lothar.com>
1720         * buildbot/process/step_twisted.py (ProcessDocs.createSummary):
1721         when creating the list of warning messages, include the line
1722         immediately after each WARNING: line, since that's usually where
1723         the file and line number wind up.
1725         * docs/examples/twisted_master.cfg: OS-X slave now does QT, add a
1726         TryScheduler
1728         * NEWS: update
1730 2005-10-22  Brian Warner  <warner@lothar.com>
1732         * buildbot/status/html.py (HtmlResource): incorporate valid-HTML
1733         patch from Brad Hards
1734         * buildbot/status/classic.css: same
1735         * buildbot/test/test_web.py (Waterfall): match changes
1737         * buildbot/test/test_steps.py (BuildStep.setUp): set
1738         nextBuildNumber so the test passes
1739         * buildbot/test/test_status.py (MyBuilder): same
1741         * buildbot/status/html.py (StatusResourceBuild.body): revision
1742         might be numeric, so stringify it before html-escapifying it
1743         (CurrentBox.getBox): add a "waiting" state, and show a countdown
1744         timer for the upcoming build
1745         * buildbot/status/classic.css: add background-color attributes for
1746         offline/waiting/building classes
1748         * buildbot/status/builder.py (BuildStatus): derive from
1749         styles.Versioned, fix upgrade of .sourceStamp attribute. Also set
1750         the default (i.e. unknown) .slavename to "???" instead of None,
1751         since even unknown slavenames need to be printed eventually.
1752         (BuilderStatus): also derive from styles.Versioned . More
1753         importantly, determine .nextBuildNumber at creation/unpickling
1754         time by scanning the directory of saved BuildStatus instances and
1755         choosing one larger than the highest-numbered one found. This
1756         should fix the problem where random errors during upgrades cause
1757         the buildbot to forget about earlier builds. .nextBuildNumber is
1758         no longer stored in the pickle.
1759         (Status.builderAdded): if we can't unpickle the BuilderStatus,
1760         at least log the error. Also call Builder.determineNextBuildNumber
1761         once the basedir is set.
1763         * buildbot/master.py (BuildMaster.loadChanges): do
1764         styles.doUpgrade afterwards, in case I decide to make Changes
1765         derived from styles.Versioned some day and forget to make this
1766         change later.
1769         * buildbot/test/test_runner.py (Options.testForceOptions): skip
1770         when running under older pythons (<2.3) in which the shlex module
1771         doesn't have a 'split' function.
1773         * buildbot/process/step.py (ShellCommand.start): make
1774         errorMessages= be a list of strings to stuff in the log before the
1775         command actually starts. This makes it easier to flag multiple
1776         warning messages, e.g. when the Source steps have to deal with an
1777         old buildslave.
1778         (CVS.startVC): handle slaves that don't handle multiple branches
1779         by switching into 'clobber' mode
1780         (SVN.startVC): same. Also reject branches without base_url
1781         (Darcs.startVC): same. Also reject revision= in older slaves
1782         (Arch.checkSlaveVersion): same (just the multiple-branches stuff)
1783         (Bazaar.startVC): same, and test for baz separately than for arch
1785         * buildbot/slave/commands.py (cvs_ver): document new features
1787         * buildbot/process/step.py (BuildStep.slaveVersion): document it
1788         (BuildStep.slaveVersionNewEnough): more useful utility method
1789         * buildbot/test/test_steps.py (Version): start testing it
1791         * buildbot/status/words.py (IrcStatusBot.command_FORCE): note that
1792         the 'force' command requires python2.3, for the shlex.split method
1794         * docs/examples/twisted_master.cfg: remove old freshcvs stuff,
1795         since we don't use it anymore. The Twisted buildbot uses a
1796         PBChangeSource now.
1798 2005-10-21  Brian Warner  <warner@lothar.com>
1800         * buildbot/process/process_twisted.py: rework all BuildFactory
1801         classes to take a 'source' step as an argument, instead of
1802         building up the SVN instance in the factory.
1803         * docs/examples/twisted_master.cfg: enable build-on-branch by
1804         providing a base_url and default_branch
1806         * buildbot/status/words.py (IrcStatusBot.command_FORCE): add
1807         control over --branch and --revision, not that they are always
1808         legal to provide
1809         * buildbot/status/html.py (StatusResourceBuilder.force): same
1810         (StatusResourceBuild.body): display SourceStamp components
1812         * buildbot/scripts/runner.py (ForceOptions): option parser for the
1813         IRC 'force' command, so it can be shared with an eventual
1814         command-line-tool 'buildbot force' mode.
1815         * buildbot/test/test_runner.py (Options.testForceOptions): test it
1817 2005-10-20  Brian Warner  <warner@lothar.com>
1819         * buildbot/status/mail.py (MailNotifier.buildMessage): reformat
1821         * docs/examples/twisted_master.cfg: update to use Schedulers
1823         * buildbot/scripts/sample.cfg: update with Schedulers
1825         * buildbot/interfaces.py (IBuilderControl.requestBuildSoon): new
1826         method specifically for use by HTML "force build" button and the
1827         IRC "force" command. Raises an immediate error if there are no
1828         slaves available.
1829         (IBuilderControl.requestBuild): make this just submit a build, not
1830         try to check for existing slaves or set up any when-finished
1831         Deferreds or anything.
1832         * buildbot/process/builder.py (BuilderControl): same
1833         * buildbot/status/html.py (StatusResourceBuilder.force): same
1834         * buildbot/status/words.py (IrcStatusBot.command_FORCE): same
1835         * buildbot/test/test_slaves.py: same
1836         * buildbot/test/test_web.py: same
1838 2005-10-19  Brian Warner  <warner@lothar.com>
1840         * docs/examples/twisted_master.cfg: re-sync with reality: bring
1841         back python2.2 tests, turn off OS-X threadedselect-reactor tests
1843 2005-10-18  Brian Warner  <warner@lothar.com>
1845         * buildbot/status/html.py: provide 'status' argument to most
1846         StatusResourceFOO objects
1847         (StatusResourceBuild.body): href-ify the Builder name, add "Steps
1848         and Logfiles" section to make the Build page into a more-or-less
1849         comprehensive source of status information about the build
1851         * buildbot/status/mail.py (MailNotifier): include the Build's URL
1852         * buildbot/status/words.py (IrcStatusBot.buildFinished): same
1854 2005-10-17  Brian Warner  <warner@lothar.com>
1856         * buildbot/process/process_twisted.py (TwistedTrial): update Trial
1857         arguments to accomodate Twisted >=2.1.0 . I will have to figure
1858         out what to do about other projects: the correct options for
1859         recent Twisteds will not work for older ones.
1861 2005-10-15  Brian Warner  <warner@lothar.com>
1863         * buildbot/status/builder.py (Status.getURLForThing): add method
1864         to provide a URL for arbitrary IStatusFoo objects. The idea is to
1865         use this in email/IRC status clients to make them more useful, by
1866         providing the end user with hints on where to learn more about the
1867         object being reported on.
1868         * buildbot/test/test_web.py (GetURL): tests for it
1870 2005-10-14  Brian Warner  <warner@lothar.com>
1872         * buildbot/test/test_config.py (ConfigTest._testSources_1): oops,
1873         fix bug resulting from deferredResult changes
1875 2005-10-13  Brian Warner  <warner@lothar.com>
1877         * buildbot/test/test_changes.py: remove use of deferredResult
1878         * buildbot/test/test_config.py: same
1879         * buildbot/test/test_control.py: same
1880         * buildbot/test/test_status.py: same
1881         * buildbot/test/test_vc.py: this is the only remaining use, since
1882         it gets used at module level. This needs to be replaced by some
1883         sort of class-level run-once routine.
1885         * buildbot/status/words.py (IrcStatusBot.command_WATCH): fix typo
1887         * lots: implement multiple slaves per Builder, which means multiple
1888         current builds per Builder. Some highlights:
1889         * buildbot/interfaces.py (IBuilderStatus.getState): return a tuple
1890         of (state,currentBuilds) instead of (state,currentBuild)
1891         (IBuilderStatus.getCurrentBuilds): replace getCurrentBuild()
1892         (IBuildStatus.getSlavename): new method, so you can tell which
1893         slave got used. This only gets set when the build completes.
1894         (IBuildRequestStatus.getBuilds): new method
1896         * buildbot/process/builder.py (SlaveBuilder): add a .state
1897         attribute to track things like ATTACHING and IDLE and BUILDING,
1898         instead of..
1899         (Builder): .. the .slaves attribute here, which has been turned
1900         into a simple list of available slaves. Added a separate
1901         attaching_slaves list to track ones that are not yet ready for
1902         builds.
1903         (Builder.fireTestEvent): put off the test-event callback for a
1904         reactor turn, to make tests a bit more consistent.
1905         (Ping): cleaned up the slaveping a bit, now it disconnects if the
1906         ping fails due to an exception. This needs work, I'm worried that
1907         a code error could lead to a constantly re-connecting slave.
1908         Especially since I'm trying to move to a distinct remote_ping
1909         method, separate from the remote_print that we currently use.
1910         (BuilderControl.requestBuild): return a convenience Deferred that
1911         provides an IBuildStatus when the build finishes.
1912         (BuilderControl.ping): ping all connected slaves, only return True
1913         if they all respond.
1915         * buildbot/slave/bot.py (BuildSlave.stopService): stop trying to
1916         reconnect when we shut down.
1918         * buildbot/status/builder.py: implement new methods, convert
1919         one-build-at-a-time methods to handle multiple builds
1920         * buildbot/status/*.py: do the same in all default status targets
1921         * buildbot/status/html.py: report the build's slavename in the
1922         per-Build page, report all buildslaves on the per-Builder page
1924         * buildbot/test/test_run.py: update/create tests
1925         * buildbot/test/test_slaves.py: same
1926         * buildbot/test/test_scheduler.py: remove stale test
1928         * docs/buildbot.texinfo: document the new builder-specification
1929         'slavenames' parameter
1931 2005-10-12  Brian Warner  <warner@lothar.com>
1933         * buildbot/buildset.py (BuildSet): fix bug where BuildSet did not
1934         report failure correctly, causing Dependent builds to run when
1935         they shouldn't have.
1936         * buildbot/status/builder.py (BuildSetStatus): same
1937         * buildbot/test/test_buildreq.py (Set.testBuildSet): verify it
1938         (Set.testSuccess): test the both-pass case too
1939         * buildbot/test/test_dependencies.py (Dependencies.testRun_Fail):
1940         fix this test: it was ending too early, masking the failure before
1941         (Logger): specialized StatusReceiver to make sure the dependent
1942         builds aren't even started, much less completed.
1944 2005-10-07  Brian Warner  <warner@lothar.com>
1946         * buildbot/slave/bot.py (SlaveBuilder.activity): survive
1947         bot.SlaveBuilder being disowned in the middle of a build
1949         * buildbot/status/base.py (StatusReceiverMultiService): oops, make
1950         this inherit from StatusReceiver. Also upcall in __init__. This
1951         fixes the embarrasing crash when the new buildSetSubmitted method
1952         is invoked and Waterfall/etc don't implement their own.
1953         * buildbot/test/test_run.py: add a TODO note about a test to catch
1954         just this sort of thing.
1956         * buildbot/process/builder.py (Builder.attached): remove the
1957         already-attached warning, this situation is normal. Add some
1958         comments explaining it.
1960 2005-10-02  Brian Warner  <warner@lothar.com>
1962         * buildbot/changes/maildir.py (Maildir.start): Tolerate
1963         OverflowError when setting up dnotify, because some 64-bit systems
1964         have problems with signed-vs-unsigned constants and trip up on the
1965         DN_MULTISHOT flag. Patch from Brad Hards.
1967 2005-09-06  Fred Drake  <fdrake@users.sourceforge.net>
1969         * buildbot/process/step.py (BuildStep, ShellCommand): Add
1970         progressMetrics, description, descriptionDone to the 'parms' list,
1971         and make use the 'parms' list from the implementation class
1972         instead of only BuildStep to initialize the parameters.  This
1973         allows buildbot.process.factory.s() to initialize all the parms,
1974         not just those defined in directly by BuildStep.
1976 2005-09-03  Brian Warner  <warner@lothar.com>
1978         * NEWS: start adding items for the next release
1980         * docs/examples/twisted_master.cfg: (sync with reality) turn off
1981         python2.2 tests, change 'Quick' builder to only use python2.3
1983 2005-09-02  Fred Drake  <fdrake@users.sourceforge.net>
1985         * buildbot/status/html.py (StatusResourceBuilder.body): only show
1986         the "Ping Builder" button if the build control is available; the
1987         user sees an exception otherwise
1989         * docs/buildbot.texinfo (PBChangeSource): fix a typo
1991 2005-09-01  Brian Warner  <warner@lothar.com>
1993         * buildbot/interfaces.py (IBuilderStatus.getState): update
1994         signature, point out that 'build' can be None
1995         (IBuildStatus.getETA): point out ETA can be none
1997         * buildbot/status/html.py (CurrentBox.getBox): tolerate build/ETA
1998         being None
1999         * buildbot/status/words.py (IrcStatusBot.emit_status): same
2001 2005-08-31  Brian Warner  <warner@lothar.com>
2003         * buildbot/status/base.py (StatusReceiver.builderChangedState):
2004         update to match correct signature: removed 'eta' argument
2005         * buildbot/status/mail.py (MailNotifier.builderChangedState): same
2007 2005-08-30  Brian Warner  <warner@lothar.com>
2009         * buildbot/status/builder.py (LogFile): remove the assertion that
2010         blows up when you try to overwrite an existing logfile, instead
2011         just emit a warning. This case gets hit when the buildmaster is
2012         killed and doesn't get a chance to write out the serialized
2013         BuilderStatus object, so the .nextBuildNumber attribute gets out
2014         of date.
2016         * buildbot/scripts/runner.py (sendchange): add --revision_file to
2017         the 'buildbot sendchange' arguments, for the Darcs context file
2018         * docs/buildbot.texinfo (sendchange): document it
2020         * buildbot/status/html.py: add pending/upcoming builds to CurrentBox
2021         * buildbot/interfaces.py (IScheduler.getPendingBuildTimes): new method
2022         (IStatus.getSchedulers): new method
2023         * buildbot/status/builder.py (BuilderStatus): track pendingBuilds
2024         (Status.getSchedulers): implement
2025         * buildbot/process/builder.py (Builder): maintain
2026         BuilderStatus.pendingBuilds
2027         * buildbot/scheduler.py (Scheduler.getPendingBuildTimes): new method
2028         (TryBase.addChange): Try schedulers should ignore Changes
2030         * buildbot/scripts/tryclient.py (getTopdir): implement getTopdir
2031         for 'try' on CVS/SVN
2032         * buildbot/test/test_runner.py (Try.testGetTopdir): test case
2034         * buildbot/scripts/tryclient.py (Try): make jobdir-style 'try'
2035         report status properly.
2036         (Try.createJob): implement unique buildset IDs
2038         * buildbot/status/client.py (StatusClientPerspective): add a
2039         perspective_getBuildSets method for the benefit of jobdir-style
2040         'try'.
2041         * docs/buildbot.texinfo (try): more docs
2042         * buildbot/test/test_scheduler.py (Scheduling.testGetBuildSets):
2043         new test case
2045 2005-08-18  Brian Warner  <warner@lothar.com>
2047         * buildbot/scripts/tryclient.py (Try): make 'try' status reporting
2048         actually work. It's functional but still kind of clunky. Also, it
2049         only works with the pb-style.. needs to be made to work with the
2050         jobdir-style too.
2052         * buildbot/status/client.py (RemoteBuildSet): new class
2053         (RemoteBuildRequest): same
2054         (RemoteBuild.remote_waitUntilFinished): return the RemoteBuild
2055         object, not the internal BuildStatus object.
2056         (RemoteBuild.remote_subscribe): new method to subscribe to builds
2057         outside of the usual buildStarted() return value.
2058         (BuildSubscriber): support class for RemoteBuild.remote_subscribe
2060         * buildbot/scheduler.py (Try_Jobdir): convey buildsetID properly
2061         (Try_Userpass_Perspective.perspective_try): return a remotely
2062         usable BuildSetStatus object
2064         * buildbot/interfaces.py (IBuildStatus): remove obsolete
2065         isStarted()/waitUntilStarted()
2067 2005-08-16  Brian Warner  <warner@lothar.com>
2069         * buildbot/status/builder.py: implement IBuildSetStatus and
2070         IBuildRequestStatus, wire them into place.
2071         * buildbot/buildset.py: same. Add ID, move wait-until-finished
2072         methods into the BuildSetStatus object.
2073         * buildbot/interfaces.py: same
2074         (IStatus.getBuildSets): new method to get pending BuildSets
2075         (IStatusReceiver.buildsetSubmitted): new method which hears about
2076         new BuildSets
2077         * buildbot/master.py (BuildMaster.submitBuildSet): same
2078         * buildbot/process/base.py (BuildRequest): same, replace
2079         waitUntilStarted with subscribe/unsubscribe
2080         * buildbot/process/builder.py (BuilderControl.forceBuild): use
2081         subscribe instead of waitUntilStarted
2082         * buildbot/status/base.py (StatusReceiver.buildsetSubmitted): stub
2083         for new method
2084         * buildbot/status/client.py (StatusClientPerspective.builderRemoved): 
2085         same
2086         * buildbot/test/test_buildreq.py: update for new code
2087         * buildbot/test/test_control.py (Force.testRequest): same
2090         * buildbot/slave/commands.py (Darcs.doVCFull): fix get-revision
2091         for Darcs to not use the tempfile module, so it works under
2092         python-2.2 too. We really didn't need the full cleverness of that
2093         module, since the slave has exclusive control of its own builddir.
2095 2005-08-15  Brian Warner  <warner@lothar.com>
2097         * buildbot/scripts/tryclient.py (CVSExtractor): implement 'try'
2098         for CVS trees. It doesn't work for non-trunk branches,
2099         unfortunately.
2100         * buildbot/test/test_vc.py (CVS.testTry): test it, but skip the
2101         branch test
2103         * Makefile: make it easier to test against python2.2
2105         * buildbot/test/test_vc.py (VCBase.tearDown): provide for
2106         tearDown2, so things like Arch can unregister archives as they're
2107         shutting down. The previous subclass-override-tearDown technique
2108         resulted in a nested maybeWait() and test failures under
2109         Twisted-1.3.0
2111         * buildbot/scripts/tryclient.py (getSourceStamp): extract branches
2112         where we can (Arch), add a branch= argument to set the branch used
2113         when we can't
2114         (BazExtractor): extract the branch too
2115         (TlaExtractor): same
2116         * buildbot/scripts/runner.py (TryOptions): add --branch
2117         * docs/buildbot.texinfo (try): document --branch/try_branch
2119         * buildbot/slave/commands.py (Darcs): implement get-revision for
2120         Darcs, so that 'try' will work. This requires the tempfile module
2121         from python-2.3 .
2123         * buildbot/test/test_vc.py: rewrite tests, getting better coverage
2124         of revisions, branches, and 'try' in the process.
2126 2005-08-11  Brian Warner  <warner@lothar.com>
2128         * buildbot/master.py (DebugPerspective.perspective_pokeIRC): fix
2129         this, it got broken at some point in the last few releases
2130         * buildbot/status/words.py (IrcBuildRequest): reply was broken
2131         (IrcStatusBot.emit_status): handle new IBuilderStatus.getState,
2132         specifically the removal of ETA information from the tuple
2134         * buildbot/locks.py: use %d for id() instead of %x, avoid a silly
2135         warning message
2137         * docs/buildbot.texinfo (try): document both --builder and
2138         'try_builders' in .buildbot/options
2139         * buildbot/scripts/runner.py (TryOptions): add --builder,
2140         accumulate the values into opts['builders']
2141         * buildbot/scripts/tryclient.py (Try.__init__): set builders
2142         * buildbot/test/test_runner.py (Try): add some quick tests to make
2143         sure 'buildbot try --options' and .buildbot/options get parsed
2144         * buildbot/test/test_scheduler.py (Scheduling.testTryUserpass):
2145         use --builder control
2147         * docs/buildbot.texinfo (try): add --port argument to PB style
2149         * buildbot/scripts/tryclient.py (SourceStampExtractor): return an
2150         actual SourceStamp. Still need to extract a branch name, somehow.
2151         (Try): finish implementing the try client side, still need a UI
2152         for specifying which builders to use
2153         (Try.getopt): factor our options/config-file reading
2154         * buildbot/test/test_scheduler.py (Scheduling.testTryUserpass):
2155         test it
2156         * buildbot/test/test_vc.py: match SourceStampExtractor change
2158         * buildbot/scripts/runner.py (Options.opt_verbose): --verbose
2159         causes the twisted log to be sent to stderr
2161         * buildbot/scheduler.py (Try_Userpass): implement the PB style
2163 2005-08-10  Brian Warner  <warner@lothar.com>
2165         * buildbot/scripts/runner.py: Add 'buildbot try' command, jobdir
2166         style is 90% done, still missing status reporting or waiting for
2167         the buildsets to finish, and it is completely untested.
2169         * buildbot/trybuild.py: delete file, move contents to ..
2170         * buildbot/scripts/tryclient.py (getSourceStamp): .. here
2171         * buildbot/test/test_vc.py: match the move
2173         * buildbot/scheduler.py (Try_Jobdir): implement the jobdir style
2174         of the TryScheduler, no buildsetID or status-tracking support yet
2175         * buildbot/test/test_scheduler.py (Scheduling.testTryJobdir): test it
2177         * buildbot/changes/maildir.py (Maildir.setBasedir): make it
2178         possible to set the basedir after __init__ time, so it is easier
2179         to use as a Service-child of the BuildMaster instance
2181         * buildbot/changes/maildirtwisted.py (MaildirService): make a form
2182         that delivers messages to its Service parent instead of requiring
2183         a subclass to be useful. This turns out to be much easier to build
2184         unit tests around.
2186         * buildbot/scripts/tryclient.py (createJob): utility code to
2187         create jobfiles, will eventually be used by 'buildbot try'
2189 2005-08-08  Brian Warner  <warner@lothar.com>
2191         * docs/buildbot.texinfo (try): add docs on the
2192         as-yet-unimplemented Try scheduler
2194         * buildbot/test/test_buildreq.py: move Scheduling tests out to ..
2195         * buildbot/test/test_scheduler.py: .. here
2196         (Scheduling.testTryJobdir): add placeholder test for 'try'
2198         * buildbot/test/test_status.py (Log.testMerge3): update to match new
2199         addEntry merging (>=chunkSize) behavior
2200         (Log.testConsumer): update to handle new callLater(0) behavior
2202         * buildbot/test/test_web.py: rearrange tests a bit, add test for
2203         both the MAX_LENGTH bugfix and the resumeProducing hang.
2205         * buildbot/status/builder.py (LogFileProducer.resumeProducing):
2206         put off the actual resumeProducing for a moment with
2207         reactor.callLater(0). This works around a twisted-1.3.0 bug which
2208         causes large logfiles to hang midway through.
2210         * buildbot/process/step.py (BuildStep.addCompleteLog): break the
2211         logfile up into chunks, both to avoid NetstringReceiver.MAX_LENGTH
2212         and to improve memory usage when streaming the file out to a web
2213         browser.
2214         * buildbot/status/builder.py (LogFile.addEntry): change > to >= to
2215         make this work cleanly
2217 2005-08-03  Brian Warner  <warner@lothar.com>
2219         * buildbot/trybuild.py: new file for 'try' utilities
2220         (getSourceStamp): run in a tree, find out the baserev+patch
2221         * buildbot/test/test_vc.py (VCBase.do_getpatch): test it,
2222         implemented for SVN and Darcs, still working on Arch. I don't know
2223         how to make CVS work yet.
2225         * docs/buildbot.texinfo: document the 'buildbot' command-line
2226         tool, including the not-yet-implemented 'try' feature, and the
2227         in-flux .buildbot/ options directory.
2229 2005-07-20  Brian Warner  <warner@lothar.com>
2231         * buildbot/locks.py: added temporary id() numbers to Lock
2232         descriptions, to track down a not-really-sharing-the-Lock bug
2234         * buildbot/test/runutils.py: must import errno, cut-and-paste bug
2236         * buildbot/test/test_slavecommand.py (ShellBase.failUnlessIn):
2237         needed for python2.2 compatibility
2238         * buildbot/test/test_vc.py: python2.2 compatibility: generators
2239         are from the __future__
2241 2005-07-19  Brian Warner  <warner@lothar.com>
2243         * buildbot/master.py (BuildMaster.loadConfig): give a better error
2244         message when schedulers use unknown builders
2246         * buildbot/process/builder.py (Builder.compareToSetup): make sure
2247         SlaveLock('name') and MasterLock('name') are distinct
2249         * buildbot/master.py (BuildMaster.loadConfig): oops, sanity-check
2250         c['schedulers'] in such a way that we can actually accept
2251         Dependent instances
2252         * buildbot/test/test_config.py: check it
2254         * buildbot/scheduler.py (Dependent.listBuilderNames): oops, add
2255         utility method to *all* the Schedulers
2256         (Periodic.listBuilderNames): same
2258         * docs/buildbot.texinfo (Interlocks): update chapter to match
2259         reality
2261         * buildbot/master.py (BuildMaster.loadConfig): Add sanity checks
2262         to make sure that c['sources'], c['schedulers'], and c['status']
2263         are all lists of the appropriate objects, and that the Schedulers
2264         all point to real Builders
2265         * buildbot/interfaces.py (IScheduler, IUpstreamScheduler): add
2266         'listBuilderNames' utility method to support this
2267         * buildbot/scheduler.py: implement the utility method
2268         * buildbot/test/test_config.py (ConfigTest.testSchedulers): test it
2270         * docs/buildbot.texinfo: add some @cindex entries
2272         * buildbot/test/test_vc.py (Arch.createRepository): set the tla ID
2273         if it wasn't already set: most tla commands will fail unless one
2274         has been set.
2275         (Arch.createRepository): and disable bazaar's revision cache, since
2276         they cause test failures (the multiple repositories we create all
2277         interfere with each other through the cache)
2279         * buildbot/test/test_web.py (WebTest): remove use of deferredResult,
2280         bring it properly up to date with twisted-2.0 test guidelines
2282         * buildbot/master.py (BuildMaster): remove references to old
2283         'interlock' module, this caused a bunch of post-merge test
2284         failures
2285         * buildbot/test/test_config.py: same
2286         * buildbot/process/base.py (Build): same
2288         * buildbot/test/test_slaves.py: stubs for new test case
2290         * buildbot/scheduler.py: add test-case-name tag
2291         * buildbot/test/test_buildreq.py: same
2293         * buildbot/slave/bot.py (SlaveBuilder.__init__): remove some
2294         unnecessary init code
2295         (Bot.remote_setBuilderList): match it
2297         * docs/buildbot.texinfo (@settitle): don't claim version 1.0
2299         * buildbot/changes/mail.py (parseSyncmail): update comment
2301         * buildbot/test/test_slavecommand.py: disable Shell tests on
2302         platforms that don't suport IReactorProcess
2304         * buildbot/status/builder.py (LogFile): remove the 't' mode from
2305         all places where we open logfiles. It causes OS-X to open the file
2306         in some weird mode that that prevents us from mixing reads and
2307         writes to the same filehandle, which we depend upon to implement
2308         _generateChunks properly. This change doesn't appear to break
2309         win32, on which "b" and "t" are treated differently but a missing
2310         flag seems to be interpreted as "t".
2312 2005-07-18  Brian Warner  <warner@lothar.com>
2314         * buildbot/slave/commands.py (ShellCommand): overhaul
2315         error-handling code, to try and make timeout/interrupt work
2316         properly, and make win32 happier
2317         * buildbot/test/test_slavecommand.py: clean up, stop using
2318         reactor.iterate, add tests for timeout and interrupt
2319         * buildbot/test/sleep.py: utility for a new timeout test
2321         * buildbot/twcompat.py: copy over twisted 1.3/2.0 compatibility
2322         code from the local-usebranches branch
2324 2005-07-17  Brian Warner  <warner@lothar.com>
2326         * buildbot/process/process_twisted.py
2327         (TwistedReactorsBuildFactory): change the treeStableTimer to 5
2328         minutes, to match the other twisted BuildFactories, and don't
2329         excuse failures in c/qt/win32 reactors any more.
2331         * docs/examples/twisted_master.cfg: turn off the 'threadless' and
2332         'freebsd' builders, since the buildslaves have been unavailable
2333         for quite a while
2335 2005-07-13  Brian Warner  <warner@lothar.com>
2337         * buildbot/test/test_vc.py (VCBase.do_branch): test the new
2338         build-on-branch feature
2340         * buildbot/process/step.py (Darcs.__init__): add base_url and
2341         default_branch arguments, just like SVN
2342         (Arch.__init__): note that the version= argument is really the
2343         default branch name
2345         * buildbot/slave/commands.py (SourceBase): keep track of the
2346         repository+branch that was used for the last checkout in
2347         SRCDIR/.buildbot-sourcedata . If the contents of this file do not
2348         match, we clobber the directory and perform a fresh checkout
2349         rather than trying to do an in-place update. This should protect
2350         us against trying to get to branch B by doing an update in a tree
2351         obtained from branch A.
2352         (CVS.setup): add CVS-specific sourcedata: root, module, and branch
2353         (SVN.setup): same, just the svnurl
2354         (Darcs.setup): same, just the repourl
2355         (Arch.setup): same, arch coordinates (url), version, and
2356         buildconfig. Also pull the buildconfig from the args dictionary,
2357         which we weren't doing before, so the build-config was effectively
2358         disabled.
2359         (Arch.sourcedirIsUpdateable): don't try to update when we're
2360         moving to a specific revision: arch can't go backwards, so it is
2361         safer to just clobber the tree and checkout a new one at the
2362         desired revision.
2363         (Bazaar.setup): same sourcedata as Arch
2365         * buildbot/test/test_dependencies.py (Dependencies.testRun_Fail):
2366         use maybeWait, to work with twisted-1.3.0 and twcompat
2367         (Dependencies.testRun_Pass): same
2369         * buildbot/test/test_vc.py: rearrange, cleanup
2371         * buildbot/twcompat.py: add defer.waitForDeferred and
2372         utils.getProcessOutputAndValue, so test_vc.py (which uses them)
2373         can work under twisted-1.3.0 .
2375         * buildbot/test/test_vc.py: rewrite. The sample repositories are
2376         now created at setUp time. This increases the runtime of the test
2377         suite considerably (from 91 seconds to 151), but it removes the
2378         need for an offline tarball, which should solve a problem I've
2379         seen where the test host has a different version of svn than the
2380         tarball build host. The new code also validates that mode=update
2381         really picks up recent commits. This approach will also make it
2382         easier to test out branches, because the code which creates the VC
2383         branches is next to the code which uses them. It will also make it
2384         possible to test some change-notification hooks, by actually
2385         performing a VC commit and watching to see the ChangeSource get
2386         notified.
2388 2005-07-12  Brian Warner  <warner@lothar.com>
2390         * docs/buildbot.texinfo (SVN): add branches example
2391         * docs/Makefile (buildbot.ps): add target for postscript manual
2393         * buildbot/test/test_dependencies.py: s/test_interlocks/test_locks/ 
2394         * buildbot/test/test_locks.py: same
2396         * buildbot/process/step.py (Darcs): comment about default branches
2398         * buildbot/master.py (BuildMaster.loadConfig): don't look for
2399         c['interlocks'] in the config file, complain if it is present.
2400         Scan all locks in c['builders'] to make sure the Locks they use
2401         are uniquely named.
2402         * buildbot/test/test_config.py: remove old c['interlocks'] test,
2403         add some tests to check for non-uniquely-named Locks
2404         * buildbot/test/test_vc.py (Patch.doPatch): fix factory.steps,
2405         since the unique-Lock validation code requires it now
2407         * buildbot/locks.py: fix test-case-name
2409         * buildbot/interlock.py: remove old file
2411 2005-07-11  Brian Warner  <warner@lothar.com>
2413         * buildbot/test/test_interlock.py: rename to..
2414         * buildbot/test/test_locks.py: .. something shorter
2416         * buildbot/slave/bot.py (BuildSlave.stopService): newer Twisted
2417         versions (after 2.0.1) changed internet.TCPClient to shut down the
2418         connection in stopService. Change the code to handle this
2419         gracefully.
2421         * buildbot/process/base.py (Build): handle whole-Build locks
2422         * buildbot/process/builder.py (Builder.compareToSetup): same
2423         * buildbot/test/test_interlock.py: make tests work
2425         * buildbot/process/step.py (BuildStep.startStep): complain if a
2426         Step tries to claim a lock that's owned by its own Build
2427         (BuildStep.releaseLocks): typo
2429         * buildbot/locks.py (MasterLock): use ComparableMixin so config
2430         file reloads don't replace unchanged Builders
2431         (SlaveLock): same
2432         * buildbot/test/test_config.py (ConfigTest.testInterlocks):
2433         rewrite to cover new Locks instead of old c['interlocks']
2434         * buildbot/test/runutils.py (RunMixin.connectSlaves): remember
2435         slave2 too
2438         * buildbot/test/test_dependencies.py (Dependencies.setUp): always
2439         start the master and connect the buildslave
2441         * buildbot/process/step.py (FailingDummy.done): finish with a
2442         FAILURE status rather than raising an exception
2444         * buildbot/process/base.py (BuildRequest.mergeReasons): don't try to
2445         stringify a BuildRequest.reason that is None
2447         * buildbot/scheduler.py (BaseUpstreamScheduler.buildSetFinished):
2448         minor fix
2449         * buildbot/status/builder.py (BuildSetStatus): implement enough to
2450         allow scheduler.Dependent to work
2451         * buildbot/buildset.py (BuildSet): set .reason and .results
2453         * buildbot/test/test_interlock.py (Locks.setUp): connect both
2454         slaves, to make the test stop hanging. It still fails, of course,
2455         because I haven't even started to implement Locks.
2457         * buildbot/test/runutils.py (RunMixin.connectSlaves): new utility
2459         * docs/buildbot.texinfo (Build-Dependencies): redesign the feature
2460         * buildbot/interfaces.py (IUpstreamScheduler): new Interface
2461         * buildbot/scheduler.py (BaseScheduler): factor out common stuff
2462         (Dependent): new class for downstream build dependencies
2463         * buildbot/test/test_dependencies.py: tests (still failing)
2465         * buildbot/buildset.py (BuildSet.waitUntilSuccess): minor notes
2467 2005-07-07  Brian Warner  <warner@lothar.com>
2469         * buildbot/test/runutils.py (RunMixin): factored this class out..
2470         * buildbot/test/test_run.py: .. from here
2471         * buildbot/test/test_interlock.py: removed old c['interlock'] tests,
2472         added new buildbot.locks tests (which all hang right now)
2473         * buildbot/locks.py (SlaveLock, MasterLock): implement Locks
2474         * buildbot/process/step.py: claim/release per-BuildStep locks
2476         * docs/Makefile: add 'buildbot.html' target
2478         * buildbot/process/step.py (CVS.__init__): allow branch=None to be
2479         interpreted as "HEAD", so that all VC steps can accept branch=None
2480         and have it mean the "default branch".
2482         * docs/buildbot.texinfo: add Schedulers, Dependencies, and Locks
2484 2005-07-07  Brian Warner  <warner@lothar.com>
2486         * docs/examples/twisted_master.cfg: update to match current usage
2488         * docs/buildbot.texinfo (System Architecture): comment out the
2489         image, it doesn't exist yet and just screws up the HTML manual.
2491 2005-07-05  Brian Warner  <warner@lothar.com>
2493         * debian/.cvsignore: oops, missed one. Removing leftover file.
2495 2005-06-17  Brian Warner  <warner@lothar.com>
2497         * buildbot/test/test_vc.py (VCSupport.__init__): svn --version
2498         changed its output in 1.2.0, don't mistakenly think that the
2499         subversion we find isn't capable of supporting our tests.
2501         * debian/*: remove the debian/ directory and its contents, to make
2502         life easier for the proper Debian maintainer
2503         * MANIFEST.in: same
2504         * Makefile (release): same
2506 2005-06-07  Brian Warner  <warner@lothar.com>
2508         * everything: create a distinct SourceStamp class to replace the
2509         ungainly 4-tuple, let it handle merging instead of BuildRequest.
2510         Changed the signature of Source.startVC to include the revision
2511         information (instead of passing it through self.args). Implement
2512         branches for SVN (now only Darcs/Git is missing support). Add more
2513         Scheduler tests.
2515 2005-06-06  Brian Warner  <warner@lothar.com>
2517         * everything: rearrange build scheduling. Create a new Scheduler
2518         object (configured in c['schedulers'], which submit BuildSets to a
2519         set of Builders. Builders can now use multiple slaves. Builds can
2520         be run on alternate branches, either requested manually or driven
2521         by changes. This changed some of the Status classes. Interlocks
2522         are out of service until they've been properly split into Locks
2523         and Dependencies. treeStableTimer, isFileImportant, and
2524         periodicBuild have all been moved from the Builder to the
2525         Scheduler.
2526         (BuilderStatus.currentBigState): removed the 'waiting' and
2527         'interlocked' states, removed the 'ETA' argument.
2529 2005-05-24  Brian Warner  <warner@lothar.com>
2531         * buildbot/pbutil.py (ReconnectingPBClientFactory): Twisted-1.3
2532         erroneously abandons the connection (in clientConnectionFailed)
2533         for non-UserErrors, which means that if we lose the connection due
2534         to a network problem or a timeout, we'll never try to reconnect.
2535         Fix this by not upcalling to the buggy parent method. Note:
2536         twisted-2.0 fixes this, but the function only has 3 lines so it
2537         makes more sense to copy it than to try and detect the buggyness
2538         of the parent class. Fixes SF#1207588.
2540         * buildbot/changes/changes.py (Change.branch): doh! Add a
2541         class-level attribute to accomodate old Change instances that were
2542         pickled before 0.6.5 (where .branch was added for new Changes).
2543         This fixes the exception that occurs when you try to look at an
2544         old Change (through asHTML).
2546         * buildbot/__init__.py (version): bump to 0.6.6+ while between
2547         releases
2549 2005-05-23  Brian Warner  <warner@lothar.com>
2551         * buildbot/__init__.py (version): release 0.6.6
2553 2005-05-23  Brian Warner  <warner@lothar.com>
2555         * NEWS: update for 0.6.6 release
2556         * debian/changelog: same
2558         * buildbot/scripts/runner.py (start): put the basedir in sys.path
2559         before starting: this was done by twistd back when we spawned it,
2560         now that we're importing the pieces and running them in the
2561         current process, we have to do it ourselves. This allows
2562         master.cfg to import files from the same directory without
2563         explicitly manipulating PYTHONPATH. Thanks to Thomas Vander
2564         Stichele for the catch.
2565         (Options.opt_version): Add a --version command (actually, just make
2566         the existing --version command emit Buildbot's version too)
2568         * buildbot/status/builder.py (HTMLLogFile.upgrade): oops! second
2569         fix to make this behave like other LogFiles, this time to handle
2570         existing LogFiles on disk. (add the missing .upgrade method)
2571         * buildbot/test/test_status.py (Log.testHTMLUpgrade): test it
2573 2005-05-21  Brian Warner  <warner@lothar.com>
2575         * buildbot/test/test_runner.py (Create.testMaster): match the
2576         rawstring change in runner.py:masterTAC
2578         * buildbot/test/test_config.py (ConfigTest.testIRC): skip unless
2579         TwistedWords is installed
2580         * buildbot/test/test_status.py: same, with TwistedMail
2582         * buildbot/master.py: remove old IRC/Waterfall imports (used by
2583         some old, deprecated, and removed config keys). This should enable
2584         you to use the base buildbot functionality with Twisted-2.0.0 when
2585         you don't also have TwistedWeb and TwistedWords installed
2587 2005-05-20  Brian Warner  <warner@lothar.com>
2589         * buildbot/scripts/runner.py (run): call sendchange(), not
2590         do_sendchange(): thus 'buildbot sendchange' was broken in 0.6.5
2591         (run): call stop("HUP"), not "-HUP", 'buildbot stop' was broken.
2592         (stop): don't wait for process to die when sending SIGHUP
2593         (masterTAC): use a rawstring for basedir=, otherwise '\' in the
2594         directory name gets interpreted, which you don't want
2595         (slaveTAC): same
2597         * buildbot/__init__.py (version): bump to 0.6.5+ while between
2598         releases
2600 2005-05-18  Brian Warner  <warner@lothar.com>
2602         * buildbot/__init__.py (version): Releasing buildbot-0.6.5
2604 2005-05-18  Brian Warner  <warner@lothar.com>
2606         * README: update for 0.6.5
2607         * debian/changelog: same
2609         * buildbot/changes/changes.py: rename tag= to branch=, since
2610         that's how we're using it, and my design for the upcoming "build a
2611         specific branch" feature wants it. also, tag= was too CVS-centric
2612         * buildbot/changes/mail.py (parseSyncmail): same
2613         * buildbot/process/base.py (Build.isBranchImportant): same
2614         * buildbot/test/test_mailparse.py (Test3.testMsgS4): same
2615         * docs/buildbot.texinfo (Attributes of Changes): same
2617         * NEWS: update tag=, update for upcoming release
2619 2005-05-17  Brian Warner  <warner@lothar.com>
2621         * buildbot/scripts/runner.py (stop): actually poll once per
2622         second, instead of re-killing the poor daemon once per second.
2623         Sleep briefly (0.1s) before the first poll, since there's a good
2624         chance we can avoid waiting the full second if the daemon shuts
2625         down quickly. Also remove the sys.exit() at the end.
2626         (start): remove the unneighborly sys.exit()
2628         * Makefile: improve permission-setting to not kick Arch so badly
2630         * buildbot/scripts/runner.py (SlaveOptions.optParameters): set a
2631         default --keepalive=600, since it doesn't hurt very much, and it's
2632         a hassle to discover that you need it.
2633         * buildbot/test/test_runner.py (Create.testSlave): test it
2635         * buildbot/status/words.py (IrcStatusBot.buildFinished): Teach the
2636         IRC bot about EXCEPTION
2638         * buildbot/status/client.py (PBListener): upcall more correctly
2640         * buildbot/process/base.py (Build.allStepsDone): if a step caused
2641         an exception mark the overall build with EXCEPTION, not SUCCESS
2643         * buildbot/scripts/runner.py (makefile_sample): remove the leading
2644         newline
2645         * buildbot/status/mail.py (MailNotifier): oops, forgot to upcall
2646         * Makefile: update some release-related stuff
2648         * buildbot/slave/commands.py (ShellCommand.kill): if somehow this
2649         gets called when there isn't actually an active process, just end
2650         the Command instead of blowing up. I don't know how it gets into
2651         this state, but the twisted win32 buildslave will sometimes hang,
2652         and when it shakes its head and comes back, it thinks it's still
2653         running a Command. The next build causes this command to be
2654         interrupted, but the lack of self.process.pid breaks the interrupt
2655         attempt.
2657         * NEWS: document changes since the last release
2659         * buildbot/scripts/runner.py (start): change 'buildbot start' to
2660         look for Makefile.buildbot instead of a bare Makefile . The
2661         'buildbot start' does not install this file, so you have to
2662         manually copy it if you want to customize startup behavior.
2663         (createMaster): change 'buildbot master' command to create
2664         Makefile.sample instead of Makefile, to create master.cfg.sample
2665         instead of master.cfg (requiring you to copy it before the
2666         buildmaster can be started). Both sample files are kept up to
2667         date, i.e. they are overwritten if they have been changed. The
2668         'buildbot.tac' file is *not* overwritten, but if the new contents
2669         don't match the old, a 'buildbot.tac.new' file is created and the
2670         user is warned. This seems to be a much more sane way to handle
2671         startup files. Also, don't sys.exit(0) when done, so we can run
2672         unit tests against it.
2673         (createSlave): same. Don't overwrite the sample info/ files.
2674         * buildbot/scripts/sample.mk: remove. the contents were pulled
2675         into runner.py, since they need to match the behavior of start()
2676         * setup.py: same
2677         * MANIFEST.in: same
2679         * docs/buildbot.texinfo (Launching the daemons): document it
2680         * buildbot/test/test_runner.py (Create): test it
2682         * buildbot/test/test_vc.py (SetupMixin.failUnlessIn): Add a
2683         version that can handle string-in-string tests, because otherwise
2684         python-2.2 fails the tests. It'd be tremendous if Trial's test
2685         took two strings under 2.2 too.
2687         * everything: fixed all deprecation warnings when running against
2688         Twisted-2.0 . (at least all the ones in buildbot code, there are a
2689         few that come from Twisted itself). This involved putting most of
2690         the Twisted-version specific code in the new buildbot.twcompat
2691         module, and creating some abstract base classes in
2692         buildbot.changes.base and buildbot.status.base (which might be
2693         useful anyway). __implements__ is a nuisance and requires an ugly
2694         'if' clause everywhere.
2696         * buildbot/test/test_status.py (Mail.testMail): add a 0.1 second
2697         delay before finishing the test: it seems that smtp.sendmail
2698         doesn't hang up on the server, so we must wait a moment so it can
2699         hang up on us. This removes the trial warning about an unclean
2700         reactor.
2702 2005-05-16  Brian Warner  <warner@lothar.com>
2704         * buildbot/process/step.py (Source): add 'retry' argument. It is a
2705         tuple of (delay, repeats).
2706         * buildbot/test/test_vc.py (Retry): test it
2707         * docs/buildbot.texinfo (Source Checkout): document it
2708         * buildbot/slave/commands.py (SourceBase): add 'retry' parameter.
2709         (SourceBase.maybeDoVCRetry): If 'retry' is set, failures in
2710         doVCFull() are handled by re-trying the checkout (after a delay)
2711         some number of times.
2712         (ShellCommand._startCommand): make header lines easier to read
2714         * buildbot/test/test_web.py (WebTest.tearDown): factor out master
2715         shutdown
2716         (WebTest.test_logfile): make sure master gets shut down, silences
2717         some "unclean reactor" test errors
2719         * buildbot/test/test_changes.py (Sender.tearDown): spin the
2720         reactor once after shutdown, something in certain versions of
2721         Twisted trigger a test failure. 1.3.0 is ok, 2.0.0 fails, 2.0.1pre
2722         fails, svn-trunk is ok.
2724         * buildbot/test/test_slavecommand.py (Shell.testShellZ): add a
2725         second win32 error message
2727         * buildbot/test/test_run.py (Status.testSlave): be smarter about
2728         validating the ETA, so the tests don't fail on slow systems
2730 2005-05-15  Brian Warner  <warner@lothar.com>
2732         * buildbot/status/builder.py (HTMLLogFile): make this behave like
2733         the new LogFile class, so upgrading works properly
2734         (LogFileProducer.resumeProducing): survive resumeProducing after
2735         we've exhausted the chunkGenerator
2737         * buildbot/test/test_web.py (WebTest.test_logfile): validate HTML
2738         logs too
2739         * buildbot/test/test_status.py (Log.testAdd): validate hasContents
2740         (Log.testUpgrade): same
2742         * docs/buildbot.texinfo (Maintenance): describe how to delete old
2743         Builds and logs with a cron job.
2745         * buildbot/status/builder.py (LogFile): revamp LogFiles. Got rid
2746         of the old non-offline LogFile, added code to upgrade these to
2747         new-style contents-live-on-disk instances at load time (in a way
2748         that doesn't invalidate the old Build pickles, so upgrading to
2749         0.6.5 is not a one-way operation). Got rid of everything related
2750         to 'stub' builds.
2751         (LogFile.__init__): create LogFiles with the parent step status,
2752         the log's name, and a builder-relative filename where it can keep
2753         the contents on disk.
2754         (LogFile.hasContents): new method, clients are advised to call it
2755         before getText or getChunks and friends. If it returns False, the
2756         log's contents have been deleted and getText() will raise an
2757         error.
2758         (LogFile.getChunks): made it a generator
2759         (LogFile.subscribeConsumer): new method, takes a Twisted-style
2760         Consumer (except one that takes chunks instead of strings). This
2761         enables streaming of very large logfiles without storing the whole
2762         thing in memory.
2763         (BuildStatus.generateLogfileName): create names like
2764         12-log-compile-output, with a _0 suffix if required to be unique
2765         (BuildStatus.upgradeLogfiles): transform any old-style (from 0.6.4
2766         or earlier) logfiles into new-style ones
2767         (BuilderStatus): remove everything related to 'stub' builds. There
2768         is now only one build cache, and we don't strip logs from old
2769         builds anymore.
2770         (BuilderStatus.getBuildByNumber): check self.currentBuild too,
2771         since we no longer fight to keep it in the cache
2773         * buildbot/status/html.py (TextLog.render_GET): use a
2774         ChunkConsumer to stream the log entries efficiently.
2775         (ChunkConsumer): wrapper which consumes chunks and writes
2776         formatted HTML.
2778         * buildbot/test/test_twisted.py (Parse.testParse): use a
2779         LogFile-like object instead of a real one
2781         * buildbot/test/test_status.py (MyLog): handle new LogFile code
2782         (Log.testMerge3): validate more merge behavior
2783         (Log.testChunks): validate LogFile.getChunks
2784         (Log.testUpgrade): validate old-style LogFile upgrading
2785         (Log.testSubscribe): validate LogFile.subscribe
2786         (Log.testConsumer): validate LogFile.subscribeConsumer
2788         * buildbot/interfaces.py (IStatusLogStub): remove
2789         (IStatusLog.subscribeConsumer): new method
2790         (IStatusLog.hasContents): new method
2791         (IStatusLogConsumer): describes things passed to subscribeConsumer
2793         * buildbot/status/html.py (StepBox.getBox): Don't offer an href to
2794         the log contents if it does not have any contents.
2795         (StatusResourceBuildStep.body): same
2796         (StatusResourceBuildStep.getChild): give a 404 for empty logs
2798 2005-05-14  Brian Warner  <warner@lothar.com>
2800         * buildbot/test/test_web.py (WebTest.test_logfile): add 5-second
2801         timeouts to try and make the windows metabuildslave not hang
2803 2005-05-13  Mike Taylor  <bear@code-bear.com>
2805         * buildbot/slave/commands.py (rmdirRecursive): added a check
2806         to ensure the path passed into rmdirRecursive actually exists.
2807         On win32 a non-existant path would generate an exception.
2809 2005-05-13  Brian Warner  <warner@lothar.com>
2811         * buildbot/slave/commands.py (rmdirRecursive): replacement for
2812         shutil.rmtree which behaves correctly on windows in the face of
2813         files that you have to chmod before deleting. Thanks to Bear at
2814         the OSAF for the routine.
2815         (SourceBase.doClobber): use rmdirRecursive
2817 2005-05-12  Brian Warner  <warner@lothar.com>
2819         * buildbot/status/builder.py (OfflineLogFile.getChunks): have this
2820         method generate chunks instead of returning a big list. This
2821         allows the same method to be used for both old LogFile and new
2822         OfflineLogFile.
2823         (OfflineLogFile.getText): use the generator
2824         (OfflineLogFile.subscribe): same
2825         * buildbot/status/html.py (TextLog.resumeProducing): same
2826         * buildbot/interfaces.py (IStatusLog.getChunks): document it
2828         * buildbot/test/test_web.py (WebTest.test_logfile): Add a test to
2829         point out that OfflineLogFile does not currently work with
2830         html.Waterfall . Fixing this is high-priority.
2832         * buildbot/scripts/runner.py (start): add --logfile=twistd.log, since
2833         apparently windows defaults to using stdout
2835         * buildbot/test/test_slavecommand.py (Shell.testShellZ): log a
2836         better message on failure so I can figure out the win32 problem
2838         * buildbot/slave/commands.py (ShellCommand._startCommand): update
2839         log messages to include more useful copies of the command being
2840         run, the argv array, and the child command's environment.
2841         (Git.doVCFull): update cg-close usage, patch from Brandon Philips.
2843 2005-05-11  Brian Warner  <warner@lothar.com>
2845         * setup.py: oops, install debug.glade so 'buildbot debugclient'
2846         will actually work
2847         * Makefile: update the deb-snapshot version
2849         * docs/buildbot.texinfo: move all .xhtml docs into a new
2850         .texinfo-format document, adding a lot of material in the process.
2851         This is starting to look like a real user's manual. Removed all
2852         the Lore-related files: *.xhtml, *.css, template.tpl .
2853         * docs/Makefile: simple makefile to run 'makeinfo'
2854         * buildbot/scripts/sample.cfg: rearrange slightly
2855         * MANIFEST.in: include .info and .textinfo, don't include *.xhtml
2857 2005-05-10  Brian Warner  <warner@lothar.com>
2859         * buildbot/scripts/runner.py (start): Twisted-1.3.0 used a
2860         different name for the internal twistw module, handle it.
2862         * MANIFEST.in: we deleted plugins.tml, so stop shipping it
2863         * setup.py: .. and stop trying to install it
2865         * buildbot/process/step.py (Git): added support for 'cogito' (aka
2866         'git'), the new linux kernel VC system (http://kernel.org/git/).
2867         Thanks to Brandon Philips for the patch.
2868         * buildbot/slave/commands.py (Git): same
2870 2005-05-06  Brian Warner  <warner@lothar.com>
2872         * buildbot/status/builder.py (OfflineLogFile): replace the default
2873         LogFile with a form that appends its new contents to a disk file
2874         as they arrive. The complete log data is never kept in RAM. This
2875         is the first step towards handling very large (100MB+) logfiles
2876         without choking quite so badly. (The other half is
2877         producer/consumer on the HTML pages).
2878         (BuildStepStatus.addLog): use OfflineLogFile by default
2879         (BuildStatus.getLogfileName): helper code to give the
2880         OfflineLogFile a filename to work with
2882         * buildbot/test/test_status.py (Results.testAddResults): update
2883         tests to handle new asserts
2884         * buildbot/test/test_vc.py (Patch.doPatch): same
2885         * buildbot/test/test_steps.py (BuildStep.setUp): same
2887 2005-05-05  Brian Warner  <warner@lothar.com>
2889         * buildbot/scripts/runner.py (start): if there is no Makefile,
2890         launch the app by importing twistd's internals and calling run(),
2891         rather than spawning a new twistd process. This stands a much
2892         better chance of working under windows.
2893         (stop): kill the process with os.kill instead of spawning
2894         /bin/kill, again to reduce the number of external programs which
2895         windows might not have in the PATH. Also wait up to 5 seconds for
2896         the process to go away, allowing things like 'buildbot stop;
2897         buildbot start' to be reliable in the face of slow shutdowns.
2899         * buildbot/master.py (Dispatcher.__getstate__): remove old
2900         .tap-related methods
2901         (BuildMaster.__getstate__): same
2902         (makeService): same
2903         * buildbot/slave/bot.py (makeService): same
2904         (Options.longdesc): same
2905         * buildbot/scripts/runner.py: copy over some old mktap option text
2907         * buildbot/scripts/runner.py (masterTAC): stop using mktap.
2908         'buildbot master' now creates a buildbot.tac file, so there is no
2909         longer a create-instance/save/reload sequence. mktap is dead, long
2910         live twistd -y.
2911         * buildbot/scripts/sample.mk: use twistd -y, not -f
2912         * buildbot/test/test_config.py: remove mktap-based test
2913         * buildbot/bb_tap.py, buildbot/plugins.tml: delete old files
2914         * README: don't reference mktap
2916         * docs/source.xhtml: document some of the attributes that Changes
2917         might have
2919         * docs/steps.xhtml (Bazaar): document the Bazaar checkout step
2921         * general: merge in Change(tag=) patch from Thomas Vander Stichele.
2922         [org.apestaart@thomas--buildbot/buildbot--cvstag--0-dev--patch-2]
2923         * buildbot/changes/changes.py (Change)
2924         * buildbot/changes/mail.py (parseSyncmail)
2925         * buildbot/test/test_mailparse.py (Test3.getNoPrefix)
2926         (Test3.testMsgS5)
2927         * buildbot/process/base.py (Build.isTagImportant)
2928         (Build.addChange)
2931 2005-05-04  Brian Warner  <warner@lothar.com>
2933         * buildbot/clients/sendchange.py (Sender.send): tear down the PB
2934         connection after sending the change, so that unit tests don't
2935         complain about sockets being left around
2937         * buildbot/status/html.py (WaterfallStatusResource.body): fix
2938         exception in phase=0 rendering
2939         * buildbot/test/test_web.py (WebTest.test_waterfall): test it
2941         * buildbot/changes/dnotify.py (DNotify.__init__): remove debug msg
2943         * buildbot/master.py (BuildMaster.loadConfig): finally remove
2944         deprecated config keys: webPortnum, webPathname, irc, manholePort,
2945         and configuring builders with tuples.
2946         * buildbot/test/test_config.py: stop testing compatibility with
2947         deprecated config keys
2948         * buildbot/test/test_run.py: same
2950 2005-05-03  Brian Warner  <warner@lothar.com>
2952         * contrib/arch_buildbot.py: survive if there are no logfiles
2953         (username): just use a string, os.getlogin isn't reliable
2955         * buildbot/scripts/runner.py (sendchange): oops, fix the command
2956         so 'buildbot sendchange' actually works. The earlier test only
2957         covered the internal (non-reactor-running) form.
2959         * contrib/arch_buildbot.py: utility that can run as an Arch hook
2960         script to notify the buildmaster about changes
2962         * buildbot/scripts/runner.py (sendchange): new command to send a
2963         change to a buildbot.changes.pb.PBChangeSource receiver.
2964         * buildbot/test/test_changes.py (Sender): test it
2966         * buildbot/master.py (BuildMaster.startService): mark .readConfig
2967         after any reading of the config file, not just when we do it in
2968         startService. This makes some tests a bit cleaner.
2970         * buildbot/changes/pb.py: add some log messages
2972         * buildbot/process/base.py (Build.startBuild): fix a bug that
2973         caused an exception when the build terminated in the very first
2974         step.
2975         (Build.stepDone): let steps return a status of EXCEPTION. This
2976         terminates the build right away, and sets the build's overall
2977         status to EXCEPTION too.
2978         * buildbot/process/step.py (BuildStep.failed): return a status of
2979         EXCEPTION when that is what has happened.
2981         * buildbot/process/step.py (Arch.computeSourceRevision): finally
2982         implement this, allowing Arch-based projects to get precise
2983         checkouts instead of always using the latest code
2984         (Bazaar): create variant of Arch to let folks use baz instead of
2985         tla. Requires a new buildslave too.
2986         * buildbot/slave/commands.py (Arch): add 'revision' argument
2987         (Bazaar): create variant of Arch that uses baz instead of tla.
2988         Remove the code that extracts the archive name from the
2989         register-archive output, since baz doesn't provide it, and require
2990         the user provide both the archive name and its location.
2991         * buildbot/test/test_vc.py (VC.testBazaar): added tests
2993 2005-05-02  Brian Warner  <warner@lothar.com>
2995         * buildbot/scripts/sample.cfg: improve docs for c['buildbotURL'],
2996         thanks to Nick Trout.
2998         * buildbot/scripts/runner.py (Maker.makefile): chmod before edit,
2999         deals better with source Makefile coming from a read-only CVS
3000         checkout. Thanks to Nick Trout for the catch.
3002         * buildbot/__init__.py (version): bump to 0.6.4+ while between
3003         releases
3005 2005-04-28  Brian Warner  <warner@lothar.com>
3007         * buildbot/__init__.py (version): Releasing buildbot-0.6.4
3009         * debian/changelog: update for 0.6.4
3011 2005-04-28  Brian Warner  <warner@lothar.com>
3013         * README.w32: add a checklist of steps for getting buildbot
3014         running on windows.
3015         * MANIFEST.in: include it in the tarball
3017         * NEWS: update
3019         * buildbot/master.py (BuildMaster.upgradeToVersion3): deal with
3020         broken .tap files from 0.6.3 by getting rid of .services,
3021         .namedServices, and .change_svc at load time.
3023 2005-04-27  Brian Warner  <warner@lothar.com>
3025         * NEWS: update in preparation for new release
3027         * buildbot/test/test_config.py (Save.testSave): don't pull in
3028         twisted.scripts.twistd, we don't need it and it isn't for windows
3029         anyway.
3031         * buildbot/changes/changes.py (ChangeMaster.saveYourself):
3032         accomodate win32 which can't do atomic-rename
3034 2005-04-27  Brian Warner  <warner@lothar.com>
3036         * buildbot/test/test_run.py (Disconnect.testBuild2): crank up some
3037         timeouts to help the slow metabuildbot not flunk them so much
3038         (Disconnect.testBuild3): same
3039         (Disconnect.testBuild4): same
3040         (Disconnect.testInterrupt): same
3042         * buildbot/master.py (BuildMaster.loadChanges): fix change_svc
3043         setup, it was completely broken for new buildmasters (those which
3044         did not have a 'change.pck' already saved. Thanks to Paul Warren
3045         for catching this (embarrassing!) bug.
3046         (Dispatcher.__getstate__): don't save our registered avatar
3047         factories, since they'll be re-populated when the config file is
3048         re-read.
3049         (BuildMaster.__init__): add a dummy ChangeMaster, used only by
3050         tests (since the real mktap-generated BuildMaster doesn't save
3051         this attribute).
3052         (BuildMaster.__getstate__): don't save any service children,
3053         they'll all be re-populated when the config file is re-read.
3054         * buildbot/test/test_config.py (Save.testSave): test for this
3056 2005-04-26  Brian Warner  <warner@lothar.com>
3058         * buildbot/buildbot.png: use a new, smaller (16x16) icon image,
3059         rendered with Blender.. looks a bit nicer.
3060         * buildbot/docs/images/icon.blend: add the Blender file for it
3062         * buildbot/slave/commands.py (ShellCommand._startCommand): prepend
3063         'cmd.exe' (or rather os.environ['COMSPEC']) to the argv list when
3064         running under windows. This appears to be the best way to allow
3065         BuildSteps to do something normal like 'trial -v buildbot.test' or
3066         'make foo' and still expect it to work. The idea is to make the
3067         BuildSteps look as much like what a developer would type when
3068         compiling or testing the tree by hand. This approach probably has
3069         problems when there are spaces in the arguments, so if you've got
3070         windows buildslaves, you'll need to pay close attention to your
3071         commands.
3073         * buildbot/status/html.py (WaterfallStatusResource.body): add the
3074         timezone to the timestamp column.
3075         * buildbot/test/test_web.py (WebTest.test_waterfall): test it
3077         * buildbot/scripts/runner.py (loadOptions): do something sane for
3078         windows, I think. We use %APPDATA%/buildbot instead of
3079         ~/.buildbot, but we still search everywhere from the current
3080         directory up to the root for a .buildbot/ subdir. The "is it under
3081         $HOME" security test was replaced with "is it owned by the current
3082         user", which is only performed under posix.
3083         * buildbot/test/test_runner.py (Options.testFindOptions): update
3084         tests to match. The "is it owned by the current user" check is
3085         untested. The test has been re-enabled for windows.
3087         * buildbot/test/test_slavecommand.py (Shell.checkOutput): replace
3088         any "\n" in the expected output with the platform-specific line
3089         separator. Make this separator "\r\n" on PTYs under unix, they
3090         seem to do that and I don't know why
3092         * buildbot/test/test_runner.py (Options.optionsFile): disable on
3093         windows for now, I don't know what ~/.buildbot/ should mean there.
3095         * buildbot/test/test_run.py (BuilderNames.testGetBuilderNames):
3096         win32 compatibility, don't use "/tmp"
3097         (Basedir.testChangeBuilddir): remove more unixisms
3099 2005-04-26  Brian Warner  <warner@lothar.com>
3101         * buildbot/test/test_control.py (Force.rmtree): python2.2
3102         compatibility, apparently its shutil.rmtree ignore_errors=
3103         argument is ignored.
3104         * buildbot/test/test_run.py (Run.rmtree): same
3105         (RunMixin.setUp): same
3107         * buildbot/test/test_runner.py (make): python2.2 has os.sep but
3108         not os.path.sep
3110         * buildbot/test/test_twisted.py (Parse.failUnlessIn): 2.2 has no
3111         'substring in string' operator, must use string.find(substr)!=-1
3112         * buildbot/test/test_vc.py (Patch.failUnlessIn): same
3113         * buildbot/test/test_web.py (WebTest.failUnlessIn): same
3115         * buildbot/scripts/runner.py (loadOptions): add code to search for
3116         ~/.buildbot/, a directory with things like 'options', containing
3117         defaults for various 'buildbot' subcommands. .buildbot/ can be in
3118         the current directory, your $HOME directory, or anywhere
3119         inbetween, as long as you're somewhere inside your home directory.
3120         (debugclient): look in ~/.buildbot/options for master and passwd
3121         (statuslog): look in ~/.buildbot/options for 'masterstatus'
3122         * buildbot/test/test_runner.py (Options.testFindOptions): test it
3124         * buildbot/status/client.py (makeRemote): new approach to making
3125         IRemote(None) be None, which works under Twisted-2.0
3126         * buildbot/test/test_status.py (Client.testAdaptation): test it
3128         * buildbot/status/builder.py (Status.builderAdded): when loading a
3129         pickled BuilderStatus in from disk, set its name after loading.
3130         The config file might have changed its name (but not its
3131         directory) while it wasn't looking.
3132         
3133         * buildbot/process/builder.py (Builder.attached): always return a
3134         Deferred, even if the builder was already attached
3135         * buildbot/test/test_run.py (Basedir.testChangeBuilddir): test it
3137 2005-04-25  Brian Warner  <warner@lothar.com>
3139         * buildbot/status/words.py (IrcStatusBot.buildFinished): fix a
3140         category-related exception when announcing a build has finished
3142         * buildbot/status/html.py (StatusResourceChanges.body): oops, don't
3143         reference no-longer-existent changemaster.sources
3144         * buildbot/test/test_web.py (WebTest.test_waterfall): test for it
3146         * buildbot/__init__.py (version): bump to 0.6.3+ while between
3147         releases
3149 2005-04-25  Brian Warner  <warner@lothar.com>
3151         * buildbot/__init__.py (version): Releasing buildbot-0.6.3
3153         * debian/changelog: update for 0.6.3
3155 2005-04-25  Brian Warner  <warner@lothar.com>
3157         * MANIFEST.in: make sure debug.glade is in the tarball
3159         * README (REQUIREMENTS): list necessary Twisted-2.0 packages
3161         * NEWS: update for the imminent 0.6.3 release
3163         * buildbot/status/html.py (HtmlResource.content): make the
3164         stylesheet <link> always point at "buildbot.css".
3165         (StatusResource.getChild): map "buildbot.css" to a static.File
3166         containing whatever css= argument was provided to Waterfall()
3167         (Waterfall): provide the "classic" css as the default.
3168         * docs/waterfall.classic.css: move default CSS from here ..
3169         * buildbot/status/classic.css: .. to here
3171         * MANIFEST.in: make sure classic.css is included in the tarball
3172         * setup.py: and that it is installed too, under buildbot/status/
3174         * buildbot/master.py (BuildMaster): oops, set .change_svc=None at
3175         the module level, because buildbot.tap files from 0.6.2 don't have
3176         it in their attribute dictionary.
3178         * buildbot/slave/bot.py (Bot.startService): make sure the basedir
3179         really exists at startup, might save some confusion somewhere.
3181 2005-04-24  Thomas Vander Stichele  <thomas at apestaart dot org>
3183         * docs/waterfall.classic.css:
3184           add a stylesheet that's almost the same as the "classic"
3185           buildbot style
3187         * buildbot/status/builder.py:
3188           add EXCEPTION as a result - this is a problem for the bot
3189           maintainer, not a build problem for the changers
3190         * buildbot/process/step.py:
3191           use EXCEPTION instead of FAILURE for exceptions
3192         * buildbot/status/html.py:
3193           add build_get_class to get a class out of a build/buildstep
3194           finish naming the classes
3195           split out sourceNames to changeNames and builderNames so we
3196           can style them separately
3197         * docs/config.xhtml:
3198           finish documenting classes as they are right now
3200         * buildbot/status/html.py:
3201           name the classes as we agreed on IRC
3202         * docs/config.xhtml:
3203           and document them
3205         * buildbot/status/html.py:
3206           same for cssclass->class_
3208         * buildbot/status/html.py:
3209           as decided on IRC, use class_ for the "class" attribute to not
3210           conflict with the class keyword, and clean up the messy **{} stuff.
3212         * buildbot/status/mail.py:
3213           put back "builders" argument, and fix docstring, because the
3214           code *ignores* builders listed in this argument
3216         * buildbot/process/builder.py:
3217           remove FIXME notes - category is now indeed a cvar of BuilderStatus
3219         * docs/config.xhtml:
3220           describe the category argument for builders
3222         * buildbot/status/builder.py:
3223           Fix a silly bug due to merging
3225         * buildbot/process/builder.py:
3226           remove category from the process Builder ...
3227         * buildbot/status/builder.py:
3228           ... and add it to BuilderStatus instead.
3229           Set category on unpickled builder statuses, they might not have it.
3230         * buildbot/master.py:
3231           include category when doing builderAdded
3232         * buildbot/status/mail.py:
3233           return None instead of self for builders we are not interested in.
3234         * buildbot/test/test_run.py:
3235           fix a bug due to only doing deferredResult on "dummy" waiting
3236         * buildbot/test/test_status.py:
3237           add checks for the Mail IStatusReceiver returning None or self
3239         * buildbot/status/html.py:
3240           fix testsuite by prefixing page title with BuildBot
3242         * buildbot/status/builder.py:
3243           have .category in builder status ...
3244         * buildbot/process/builder.py:
3245           ... and set it from Builder
3246         * buildbot/status/html.py:
3247           make .css a class variable 
3248         * buildbot/test/test_status.py:
3249           write more tests to cover our categories stuff ...
3250         * buildbot/status/mail.py:
3251           ... and fix the bug that this uncovered
3253         * buildbot/changes/mail.py:
3254         * buildbot/changes/pb.py:
3255         * buildbot/master.py:
3256         * buildbot/process/base.py:
3257         * buildbot/process/factory.py:
3258         * buildbot/process/interlock.py:
3259         * buildbot/process/step.py:
3260         * buildbot/process/step_twisted.py:
3261         * buildbot/slave/commands.py:
3262         * buildbot/status/builder.py:
3263         * buildbot/status/client.py:
3264         * buildbot/status/html.py:
3265         * buildbot/status/mail.py:
3266         * buildbot/status/progress.py:
3267         * buildbot/test/test_changes.py:
3268         * buildbot/test/test_config.py:
3269         * buildbot/test/test_control.py:
3270         * buildbot/test/test_interlock.py:
3271         * buildbot/test/test_maildir.py:
3272         * buildbot/test/test_mailparse.py:
3273         * buildbot/test/test_run.py:
3274         * buildbot/test/test_slavecommand.py:
3275         * buildbot/test/test_status.py:
3276         * buildbot/test/test_steps.py:
3277         * buildbot/test/test_twisted.py:
3278         * buildbot/test/test_util.py:
3279         * buildbot/test/test_vc.py:
3280         * buildbot/test/test_web.py:
3281         * buildbot/util.py:
3282           add test-case-name at the top of a whole set of files
3284         * buildbot/status/builder.py:
3285           keep order of addition when getting builder names
3286         * buildbot/status/words.py:
3287         * buildbot/test/test_run.py:
3288           add test for getBuilderNames
3290         * buildbot/process/base.py:
3291         * buildbot/process/step.py:
3292         * buildbot/status/builder.py:
3293         * buildbot/status/html.py:
3294           make buildbot css-able
3295           replace the color code for purple with purple, don't understand
3296           why it wasn't purple to start with
3298         * buildbot/status/words.py:
3299           ok, so it doesn't look like BuilderStatus.remote is still valid.
3300           Use what waterfall uses instead.
3302         * buildbot/interfaces.py:
3303         * buildbot/status/builder.py:
3304         * buildbot/status/html.py:
3305         * buildbot/status/mail.py:
3306         * buildbot/status/words.py:
3307         * buildbot/test/test_run.py:
3308           use categories everywhere and make it be a list.  More sensible
3309           for the future.  Also make words actually respect this in
3310           buildFinished.
3312         * buildbot/interfaces.py:
3313           add category argument to getBuilderNames
3314         * buildbot/process/builder.py:
3315         * buildbot/status/builder.py:
3316         * buildbot/status/html.py:
3317         * buildbot/status/mail.py:
3318         * buildbot/status/words.py:
3319         * buildbot/test/test_run.py:
3320           move from specifying builders by name to specifying the category
3322         * buildbot/status/html.py:
3323         * buildbot/status/words.py:
3324           add "builders=" to __init__ of status clients so they can
3325           limit themselves to the given list of builders to report on
3327         * buildbot/status/html.py: set the title to the product name
3329 2005-04-23  Thomas Vander Stichele  <thomas at apestaart dot org>
3331         * buildbot/interfaces.py:
3332         * buildbot/status/builder.py:
3333           more documentation.  Hm, not sure if ChangeLog entries make sense
3334           here...
3336 2005-04-23  Brian Warner  <warner@lothar.com>
3338         * buildbot/test/test_vc.py (SetupMixin.do_vc): increase timeouts
3340         * buildbot/test/test_slavecommand.py (Shell): increase timeouts
3342         * buildbot/scripts/runner.py: make 'statuslog' and 'statusgui' be
3343         the sub-commands that log buildmaster status to stdout and to a
3344         GUI window, respectively.
3346         * buildbot/clients/gtkPanes.py: overhaul. basic two-row
3347         functionality is working again, but all the step-status and ETA
3348         stuff is missing. Commented out a lot of code pending more
3349         overhaul work.
3351         * buildbot/status/client.py: make sure that IRemote(None) is None
3353         * buildbot/changes/changes.py: import defer, oops
3354         (ChangeMaster): remove the .sources list, rely upon the fact that
3355         MultiServices can be treated as sequences of their children. This
3356         cleans up the add/remove ChangeSource routines a lot, as we keep
3357         exactly one list of the current sources instead of three.
3359         * buildbot/master.py (BuildMaster.__init__): remove .sources, set
3360         up an empty ChangeMaster at init time.
3361         (BuildMaster.loadChanges): if there are changes to be had from
3362         disk, replace self.change_svc with the new ones. If not, keep
3363         using the empty ChangeMaster set up in __init__.
3364         (BuildMaster.loadConfig_Sources): use list(self.change_svc)
3365         instead of a separate list, makes the code a bit cleaner.
3366         * buildbot/test/test_config.py (ConfigTest.testSimple): match it
3367         (ConfigTest.testSources): same, also wait for loadConfig to finish.
3368         Extend the test to make sure we can get rid of the sources when
3369         we're done.
3371 2005-04-22  Brian Warner  <warner@lothar.com>
3373         * buildbot/scripts/runner.py (Maker.mkinfo): create the info/admin
3374         and info/host files when making the slave directory
3376         * buildbot/test/test_run.py (RunMixin.shutdownSlave): remove the
3377         whendone= argument, just return the Deferred and let the caller do
3378         what they want with it.
3379         (Disconnect.testBuild1): wait for shutdownSlave
3380         (Basedir.testChangeBuilddir): new test to make sure changes to the
3381         builddir actually get propagated to the slave
3383         * buildbot/slave/bot.py (SlaveBuilder.setBuilddir): use an
3384         explicit method, rather than passing the builddir in __init__ .
3385         Make sure to update self.basedir too, this was broken before.
3386         (Bot.remote_setBuilderList): use b.setBuilddir for both new
3387         builders and for ones that have just had their builddir changed.
3388         (BotFactory): add a class-level .perspective attribute, so
3389         BuildSlave.waitUntilDisconnected won't get upset when the
3390         connection hasn't yet been established
3391         (BuildSlave.__init__): keep track of the bot.Bot instance, so
3392         tests can reach through it to inspect the SlaveBuilders
3394         * buildbot/process/base.py (Build.buildException): explain the
3395         log.err with a log.msg
3396         * buildbot/process/builder.py (Builder.startBuild): same
3397         (Builder._startBuildFailed): improve error message
3399         * buildbot/pbutil.py (RBCP.failedToGetPerspective): if the failure
3400         occurred because we lost the brand-new connection, retry instead
3401         of giving up. If not, it's probably an authorization failure, and
3402         it makes sense to stop trying. Make sure we log.msg the reason
3403         that we're log.err'ing the failure, otherwise test failures are
3404         really hard to figure out.
3406         * buildbot/master.py: change loadConfig() to return a Deferred
3407         that doesn't fire until the change has been fully implemented.
3408         This means any connected slaves have been updated with the new
3409         builddir. This change makes it easier to test the code which
3410         actually implements this builddir-updating.
3411         (BotPerspective.addBuilder): return Deferred
3412         (BotPerspective.removeBuilder): same
3413         (BotPerspective.attached): same
3414         (BotPerspective._attached): same. finish with remote_print before
3415         starting the getSlaveInfo, instead of doing them in parallel
3416         (BotPerspective.list_done): same
3417         (BotMaster.removeSlave): same. Fix the typo that meant we weren't
3418         actually calling slave.disconnect()
3419         (BotMaster.addBuilder): same
3420         (BotMaster.removeBuilder): same
3421         (BuildMaster.loadConfig): same
3422         (BuildMaster.loadConfig_Slaves): same
3423         (BuildMaster.loadConfig_Sources): same
3424         (BuildMaster.loadConfig_Builders): same
3425         (BuildMaster.loadConfig_status): same
3427         * buildbot/changes/changes.py (ChangeMaster.removeSource): return
3428         a Deferred that fires when the source is finally removed
3430         * buildbot/slave/commands.py (SourceBase.doClobber): when removing
3431         the previous tree on win32, where we have to do it synchronously,
3432         make sure we return a Deferred anyway.
3433         (SourceBase.doCopy): same
3435         * buildbot/scripts/runner.py (statusgui): use the text client for
3436         now, while I rewrite the Gtk one
3437         * buildbot/clients/base.py: strip out old code, leaving just the
3438         basic print-message-on-event functionality. I also remove the
3439         ReconnectingPBClientFactory, but it does at least quit when it
3440         loses the connection instead of going silent
3442 2005-04-21  Brian Warner  <warner@lothar.com>
3444         * Makefile: minor tweaks
3446         * NEWS: point out deprecation warnings, new features for
3447         /usr/bin/buildbot
3449         * buildbot/master.py (BuildMaster.loadConfig): emit
3450         DeprecationWarnings for Builders defined with tuples. Rearrange
3451         code to facility removal of deprecated configuration keys in the
3452         next release.
3454         * buildbot/scripts/runner.py (createMaster,createSlave): rewrite
3455         'buildbot' command to put a little Makefile in the target that
3456         helps you re-create the buildbot.tap file, start or stop the
3457         master/slave, and reconfigure (i.e. SIGHUP) the master. Also chmod
3458         all the files 0600, since they contain passwords.
3459         (start): if there is a Makefile, and /usr/bin/make exists, use
3460         'make start' in preference to a raw twistd command. This lets
3461         slave admins put things like PYTHONPATH variables in their
3462         Makefiles and have them still work when the slave is started with
3463         'buildbot start ~/slave/foo'. The test is a bit clunky, it would
3464         be nice to first try the 'make' command and only fall back to
3465         twistd if it fails. TODO: the Makefile's "start" command does not
3466         add the --reactor=win32 argument when running under windows.
3467         (Options.debugclient, Options.statusgui): add sub-commands to launch
3468         the debug client (formerly in contrib/debugclient.py) and the
3469         Gtk status application (currently broken)
3470         * buildbot/clients/debug.py: move from contrib/debugclient.py
3471         * buildbot/clients/debug.glade: same
3473         * buildbot/test/test_trial.py: remove it. This requires some
3474         functionality out of Twisted that isn't there yet, and until then
3475         having it around just confuses things.
3477         * buildbot/test/test_slavecommand.py (Shell): test both with and
3478         without PTYs, and make sure that command output is properly
3479         interleaved in the with-PTY case. I think the without-PTY test
3480         should pass on windows, where we never use PTYs anyway.
3482 2005-04-20  Brian Warner  <warner@lothar.com>
3484         * README (REQUIREMENTS): mention Twisted-2.0.0 compatibility
3486         * MANIFEST.in: add epyrun, gen-reference, buildbot.png
3488         * NEWS: start creating entries for the next release
3490         * buildbot/slave/commands.py (ShellCommand.__init__): use os.pathsep
3492         * buildbot/test/test_web.py (WebTest.test_webPortnum): add timeout
3493         (WebTest.test_webPathname): same
3494         (WebTest.test_webPathname_port): same
3495         (WebTest.test_waterfall): use the default favicon rather than
3496         rooting around the filesystem for it. Open the expected-icon file
3497         in binary mode, to make win32 tests happier (thanks to Nick Trout
3498         for the catch)
3499         * buildbot/status/html.py (buildbot_icon): win32 portability
3501         * buildbot/test/test_slavecommand.py (SlaveCommandTestCase.testShellZ):
3502         win32-compatibility fixes from Nick Trout, the "file not found" message
3503         is different under windows
3504         (FakeSlaveBuilder.__init__): clean up setup a bit
3505         * buildbot/test/test_vc.py (VCSupport.__init__): win32: use os.pathsep
3507 2005-04-19  Brian Warner  <warner@lothar.com>
3509         * buildbot/test/test_vc.py (SetupMixin.setUpClass): fix the
3510         skip-if-repositories-are-unavailable test to not kill the trial
3511         that comes with Twisted-1.3.0
3513         * setup.py: install buildbot.png icon file when installing code
3515         * buildbot/slave/commands.py (ShellCommand._startCommand): log the
3516         environment used by the command, at least on the child side.
3518         * buildbot/status/html.py (TextLog.pauseProducing): add a note,
3519         this method needs to be added and implemented because it gets
3520         called under heavy load. I don't quite understand the
3521         producer/consumer API enough to write it.
3522         (StatusResource.getChild): add a resource for /favicon.ico
3523         (Waterfall.__init__): add favicon= argument
3524         * buildbot/test/test_web.py (WebTest.test_waterfall): test it
3525         (WebTest.test_webPortnum): stop using deprecated 'webPortnum'
3526         (WebTest.test_webPathname): same
3527         (WebTest.test_webPathname_port): same
3528         * docs/config.xhtml: mention favicon=
3529         * buildbot/buildbot.png: add a default icon, dorky as it is
3531 2005-04-18  Thomas Vander Stichele  <thomas at apestaart dot org>
3533         * buildbot/master.py:
3534         * buildbot/process/base.py:
3535         * buildbot/process/builder.py:
3536         * buildbot/process/interlock.py:
3537         * buildbot/status/builder.py:
3538         * buildbot/status/html.py:
3539         * buildbot/status/mail.py:
3540         * buildbot/status/words.py:
3541           new documentation while digging through the code
3543 2005-04-17  Brian Warner  <warner@lothar.com>
3545         * general: try to fix file modes on all .py files: a+r, a-x,
3546         but let buildbot/clients/*.py be +x since they're tools
3548         * docs/epyrun (addMod): when an import fails, say why
3550         * Makefile: Add a 'docs' target, hack on the PYTHONPATH stuff
3552 2005-04-17  Thomas Vander Stichele  <thomas at apestaart dot org>
3554         * buildbot/process/base.py:
3555         * buildbot/process/builder.py:
3556         * buildbot/status/builder.py:
3557           new documentation while digging through the code
3559 2005-04-17  Thomas Vander Stichele  <thomas at apestaart dot org>
3561         * buildbot/changes/changes.py:
3562         * buildbot/changes/p4poller.py:
3563         * buildbot/interfaces.py:
3564         * buildbot/process/base.py:
3565         * buildbot/process/builder.py:
3566         * buildbot/process/step.py:
3567         * buildbot/process/step_twisted.py:
3568         * buildbot/slave/bot.py:
3569         * buildbot/slave/commands.py:
3570         * buildbot/status/builder.py:
3571           fix all docstrings to make epydoc happy.  In the process of fixing
3572           some, I also moved pieces of docs, and removed some deprecated
3573           documentation
3575 2005-04-17  Thomas Vander Stichele  <thomas at apestaart dot org>
3577         * buildbot/process/builder.py:
3578         * buildbot/process/interlock.py:
3579         * buildbot/process/process_twisted.py:
3580         * buildbot/process/step.py:
3581           BuildProcess -> Build, as it looks like that's what happened
3582         * buildbot/process/base.py:
3583         * buildbot/process/factory.py:
3584           update epydoc stuff
3586 2005-04-17  Brian Warner  <warner@lothar.com>
3588         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
3589         update compile command to accomodate the Twisted split.. now
3590         instead of './setup.py build_ext -i', you do './setup.py all
3591         build_ext -i', to run build_ext over all sub-projects.
3592         (FullTwistedBuildFactory): same
3593         (TwistedReactorsBuildFactory): same
3595         * buildbot/status/html.py (TextLog.finished): null out self.req
3596         when we're done, otherwise the reference cycle of TextLog to .req
3597         to .notifications to a Deferred to TextLog.stop keeps them from
3598         being collected, and consumes a huge (610MB on pyramid at last
3599         check) amount of memory.
3601 2005-04-11  Brian Warner  <warner@lothar.com>
3603         * buildbot/test/test_vc.py (VCSupport.__init__): use abspath() to
3604         normalize the VC-repository location.. makes SVN happier with
3605         certain test environments.
3607         * buildbot/process/step.py (RemoteShellCommand.__init__): let each
3608         RemoteShellCommand gets its own .env dictionary, so that code in
3609         start() doesn't mutate the original. I think this should fix the
3610         step_twisted.Trial problem where multiple identical components
3611         kept getting added to PYTHONPATH= over and over again.
3613         * general: merge org.apestaart@thomas/buildbot--doc--0--patch-3,
3614         adding epydoc-format docstrings to many classes. Thanks to Thomas
3615         Vander Stichele for the patches.
3616         * docs/epyrun, docs/gen-reference: add epydoc-generating tools
3617         * buildbot/status/mail.py, buildbot/process/step_twisted.py: same
3618         * buildbot/slave/bot.py, commands.py, registry.py: same
3620 2005-04-05  Brian Warner  <warner@lothar.com>
3622         * buildbot/slave/commands.py (SourceBase.doCopy): use cp -p to
3623         preserve timestamps, helps incremental builds of large trees.
3624         Patch from Rene Rivera.
3626         * buildbot/slave/bot.py (SlaveBuilder.commandComplete): oops, log
3627         'failure' and not the non-existent 'why'. Thanks to Rene Rivera
3628         for the catch.
3630 2005-04-03  Brian Warner  <warner@lothar.com>
3632         * buildbot/master.py (BuildMaster.loadConfig): only call exec()
3633         with one dict, apparently exec has some scoping bugs when used
3634         with both global/local dicts. Thanks to Nathaniel Smith for the
3635         catch.
3637 2005-04-02  Brian Warner  <warner@lothar.com>
3639         * buildbot/process/step_twisted.py (countFailedTests): the new
3640         trial in Twisted-2.0 emits a slightly different status line than
3641         old trial ("PASSED.." instead of "OK.."). Handle it so we don't
3642         mistakenly think the test count is unparseable.
3643         (Trial.start): note that for some reason each build causes another
3644         copy of self.testpath to be prepended to PYTHONPATH. This needs to
3645         be fixed but I'm not sure quite where the problem is.
3647 2005-04-01  Brian Warner  <warner@lothar.com>
3649         * buildbot/test/test_run.py (Run.testMaster): change some uses of
3650         deferredResult to avoid hangs/warnings under twisted-2.0
3651         (RunMixin.tearDown): same
3652         (RunMixin.shutdownSlave): same
3653         (Disconnect.testIdle1): same
3654         (Disconnect.testBuild2): same: wait one second after the build
3655         finishes for test to really be done.. this should be cleaned up to
3656         avoid wasting that second. Builder.detach uses a callLater(0),
3657         either that should be done in-line (something else needed that
3658         behavior), or it should return a Deferred that fires when the
3659         builder is really offline.
3660         (Disconnect.testBuild3): same
3661         (Disconnect.testDisappear): same
3663         * buildbot/test/test_web.py: rearrange server-setup and teardown
3664         code to remove unclean-reactor warnings from twisted-2.0
3666         * buildbot/test/test_vc.py: rearrange probe-for-VC-program routine
3667         so the tests don't hang under twisted-2.0
3669 2005-03-31  Brian Warner  <warner@lothar.com>
3671         * buildbot/slave/bot.py (Bot.remote_setBuilderList): fix typo that
3672         caused a warning each time the master changed our set of builders
3674         * buildbot/status/builder.py (BuildStatus.saveYourself): under
3675         w32, don't unlink the file unless it already exists. Thanks to
3676         Baptiste Lepilleur for the catch.
3677         (BuilderStatus.saveYourself): same
3679 2005-02-01  Brian Warner  <warner@lothar.com>
3681         * buildbot/status/html.py (TextLog.getChild): use a /text child
3682         URL, such as http://foo.com/svn-hello/builds/1/test/0/text instead
3683         of http://foo.com/svn-hello/builds/1/test/0 , to retrieve the
3684         logfile as text/plain (no markup, no headers). This replaces the
3685         previous scheme (which used an ?text=1 argument), and gets us back
3686         to a relative link (which works better when the buildbot lives
3687         behind another web server, such as Apache configured as a reverse
3688         proxy). Thanks to Gerald Combs for spotting the problem.
3690         * buildbot/__init__.py (version): bump to 0.6.2+ while between
3691         releases
3693 2004-12-13  Brian Warner  <warner@lothar.com>
3695         * buildbot/__init__.py (version): Releasing buildbot-0.6.2
3697         * debian/changelog: update for 0.6.2
3698         * NEWS: finalize for 0.6.2
3700 2004-12-11  Brian Warner  <warner@lothar.com>
3702         * NEWS: bring it up to date
3704         * buildbot/slave/bot.py (BotFactory): revamp keepalive/lost-master
3705         detection code. Require some sign of life from the buildmaster
3706         every BotFactory.keepaliveInterval seconds. Provoke this
3707         indication at BotFactory.keepaliveTimeout seconds before the
3708         deadline by sending a keepalive request. We don't actually care if
3709         that request is answered in a timely fashion, what we care about
3710         is that .activity() is called before the deadline. .activity() is
3711         triggered by any PB message from the master (including an ack to
3712         one of the slave's status-update messages). With this new scheme,
3713         large status messages over slow pipes are OK, as long as any given
3714         message can be sent (and thus acked) within .keepaliveTimeout
3715         seconds (which defaults to 30).
3716         (SlaveBuilder.remote_startCommand): record activity
3717         (SlaveBuilder.ackUpdate): same
3718         (SlaveBuilder.ackComplete): same
3719         (BotFactory.gotPerspective): same
3720         * buildbot/test/test_run.py (Disconnect.testSlaveTimeout): test it
3722 2004-12-09  Brian Warner  <warner@lothar.com>
3724         * buildbot/status/html.py (StatusResourceBuilder.getChild): remove
3725         debug message
3727         * buildbot/process/step_twisted.py (Trial._commandComplete):
3728         update self.cmd when we start the 'cat test.log' transfer. Without
3729         this, we cannot interrupt the correct RemoteCommand when we lose
3730         the connection.
3732         * buildbot/process/step.py (RemoteCommand.interrupt): don't bother
3733         trying to tell the slave to stop the command if we're already
3734         inactive, or if we no longer have a .remote
3736         * buildbot/process/builder.py (Builder._detached): don't let an
3737         exception in currentBuild.stopBuild() prevent the builder from
3738         being marked offline
3740 2004-12-07  Brian Warner  <warner@lothar.com>
3742         * buildbot/status/words.py (IrcStatusBot.getBuilder): catch the
3743         KeyError that happens when you ask for a non-existent Builder, and
3744         translate it into a UsageError.
3746         * buildbot/test/test_run.py (Disconnect.testBuild4): validate that
3747         losing the slave in the middle of a remote step is handled too
3749         * buildbot/process/step.py (ShellCommand.interrupt): 'reason' can
3750         be a Failure, so be sure to stringify it before using it as the
3751         contents of the 'interrupt' logfile
3752         (RemoteCommand.interrupt): use stringified 'why' in
3753         remote_interruptCommand too, just in case
3755 2004-12-06  Brian Warner  <warner@lothar.com>
3757         * buildbot/slave/commands.py (Arch.doVCUpdate): use 'tla replay'
3758         instead of 'tla update', which is more efficient in case we've
3759         missed a couple of patches since the last update.
3761         * debian/changelog: update for previous (0.6.1) release. Obviously
3762         this needs to be handled better.
3764 2004-12-05  Brian Warner  <warner@lothar.com>
3766         * NEWS: update for stuff since last release
3768         * buildbot/master.py (DebugPerspective.attached): return 'self', to
3769         match the maybeDeferred change in Dispatcher.requestAvatar
3770         * buildbot/changes/pb.py (ChangePerspective.attached): same
3771         * buildbot/status/client.py (StatusClientPerspective.attached): same
3772         * buildbot/process/builder.py (Builder._attached3): same
3773         * buildbot/pbutil.py (NewCredPerspective.attached): same
3775         * buildbot/status/html.py (WaterfallStatusResource.phase2): Add
3776         the date to the top-most box, if it is not the same as today's
3777         date.
3779         * docs/slave.xhtml: provide a buildslave setup checklist
3781         * docs/source.xhtml (Arch): correct terminology
3783 2004-12-04  Brian Warner  <warner@lothar.com>
3785         * buildbot/test/test_slavecommand.py: use sys.executable instead
3786         of hard-coding 'python' for child commands, might help portability
3788         * docs/examples/twisted_master.cfg: update to current usage
3790         * buildbot/status/words.py (IrcStatusBot.command_STOP): add a
3791         'stop build' command to the IRC bot
3793         * buildbot/master.py (Dispatcher.requestAvatar): remove debug
3794         message that broke PBChangeSource
3796         * buildbot/slave/bot.py: clean up shutdown/lose-master code
3797         (SlaveBuilder): make some attributes class-level, remove the old
3798         "update queue" which existed to support resuming a build after the
3799         master connection was lost. Try to reimplement that feature later.
3800         (SlaveBuilder.stopCommand): clear self.command when the
3801         SlaveCommand finishes, so that we don't try to kill a leftover one
3802         at shutdown time.
3803         (SlaveBuilder.commandComplete): same, merge with commandFailed and
3804         .finishCommand
3806         * buildbot/slave/commands.py (SourceBase): set self.command for
3807         all VC commands, so they can be interrupted.
3809 2004-12-03  Brian Warner  <warner@lothar.com>
3811         * buildbot/master.py: clean up slave-handling code, to handle
3812         slave-disconnect and multiple-connect better
3813         (BotPerspective): make these long-lasting, exactly one per bot
3814         listed in the config file.
3815         (BotPerspective.attached): if a slave connects while an existing
3816         one appears to still be connected, disconnect the old one first.
3817         (BotPerspective.disconnect): new method to forcibly disconnect a
3818         buildslave. Use some hacks to empty the transmit buffer quickly to
3819         avoid the long (20-min?) TCP timeout that could occur if the old
3820         slave has dropped off the net.
3821         (BotMaster): Keep persistent BotPerspectives in .slaves, let them
3822         own their own SlaveStatus objects. Remove .attached/.detached, add
3823         .addSlave/.removeSlave, treat slaves like Builders (config file
3824         parsing sends deltas to the BotMaster). Inform the slave
3825         instances, i.e. the BotPerspective, about addBuilder and
3826         removeBuilder.
3827         (BotMaster.getPerspective): turns into a single dict lookup
3828         (Dispatcher.requestAvatar): allow .attached to return a Deferred,
3829         which gives BotPerspective.attached a chance to disconnect the old
3830         slave first.
3831         (BuildMaster.loadConfig): add code (disabled) to validate that all
3832         builders use known slaves (listed in c['bots']). The check won't
3833         work with tuple-specified builders, which are deprecated but not
3834         yet invalid, so the check is disabled for now.
3835         (BuildMaster.loadConfig_Slaves): move slave-config into a separate
3836         routine, do the add/changed/removed dance with them like we do
3837         with builders.
3838         (BuildMaster.loadConfig_Sources): move source-config into a
3839         separate routine too
3841         * buildbot/status/builder.py (Status.getSlave): get the
3842         SlaveStatus object from the BotPerspective, not the BotMaster.
3844         * buildbot/test/test_run.py: bunch of new tests for losing the
3845         buildslave at various points in the build, handling a slave that
3846         connects multiple times, and making sure we can interrupt a
3847         running build
3849         * buildbot/slave/bot.py (BuildSlave): make it possible to use
3850         something other than 'Bot' for the Bot object, to make certain
3851         test cases easier to write.
3852         (BuildSlave.waitUntilDisconnected): utility method for testing
3854 2004-11-30  Brian Warner  <warner@lothar.com>
3856         * buildbot/test/test_run.py (RunMixin): refactor, remove debug msg
3858         * buildbot/interfaces.py (IBuilderControl.ping): add timeout=
3859         argument, return a Deferred that always fires with True or False.
3860         I don't use an errback to indicate 'ping failed' so that callers
3861         are free to ignore the deferred without causing spurious errors in
3862         the logs.
3863         * buildbot/process/builder.py (BuilderControl.ping): implement it
3865         * buildbot/test/test_run.py (Status.testDisappear): test ping
3866         (Status.disappearSlave): fix it
3868 2004-11-30  Brian Warner  <warner@lothar.com>
3870         * buildbot/interfaces.py (IBuildControl): add .stopBuild
3871         (IBuilderControl): add .getBuild(num), only works for the current
3872         build, of course, although it might be interesting to offer
3873         something for builds in the .waiting or .interlocked state.
3875         * buildbot/process/base.py (Build): have .stopBuild just do the
3876         interrupt, then let the build die by itself.
3877         (BuildControl): add .stopBuild, and add a point-event named
3878         'interrupt' just after the build so status viewers can tell that
3879         someone killed it.
3880         (BuilderControl): add .getBuild
3882         * buildbot/process/step.py (Dummy): use haltOnFailure so it really
3883         stops when you kill it, good for testing
3884         (ShellCommand.interrupt): add a logfile named 'interrupt' which
3885         contains the 'reason' text.
3887         * buildbot/status/html.py: Add Stop Build button, if the build can
3888         still be stopped. Send a Redirect (to the top page) one second
3889         later, hopefully long enough for the interrupt to have an effect.
3890         Move make_row() up to top-level to share it between Stop Build and
3891         Force Build.
3893         * buildbot/slave/commands.py: only kill the child process once
3895         * buildbot/test/test_run.py: add testInterrupt
3897 2004-11-29  Brian Warner  <warner@lothar.com>
3899         * buildbot/process/base.py: Refactor command interruption. The
3900         Build is now responsible for noticing that the slave has gone
3901         away: Build.lostRemote() interrupts the current step and makes
3902         sure that no further ones will be started.
3903         
3904         * buildbot/process/builder.py: When the initial remote_startBuild
3905         message fails, log it: this usually indicates that the slave has
3906         gone away, but we don't really start paying attention until they
3907         fail to respond to the first step's command.
3909         * buildbot/process/step.py (RemoteCommand): Does *not* watch for
3910         slave disconnect. Now sports a new interrupt() method. Error
3911         handling was simplified a lot by chaining deferreds, so
3912         remoteFailed/remoteComplete were merged into a single
3913         remoteComplete method (which can now get a Failure object).
3914         Likewise failed/finished were merged into just _finished.
3915         (BuildStep): Add interrupt(why) method, and if why is a
3916         ConnectionLost Failure then the step is failed with some useful
3917         error text.
3919         * buildbot/slave/bot.py: stop the current command when the remote
3920         Step reference is lost, and when the slave is shut down.
3921         (Bot): make it a MultiService, so it can have children. Use
3922         stopService to tell when the slave is shutting down.
3923         (SlaveBuilder): make it a Service, and a child of the Bot. Add
3924         remote_interruptCommand (which asks the current SlaveCommand to
3925         stop but allows it to keep emitting status messages), and
3926         stopCommand (which tells it to shut up and die).
3928         * buildbot/slave/commands.py: make commands interruptible
3929         (ShellCommand.kill): factor out os.kill logic
3930         (Command): factor out setup()
3931         (Command.sendStatus): don't send status if .running is false, this
3932         happens when the command has been halted.
3933         (Command.interrupt): new method, used to tell the command to die
3934         (SlaveShellCommand): implement .interrupt
3935         (DummyCommand): implement .interrupt
3936         (SourceBase, etc): factor out setup(), don't continue substeps if
3937         .interrupted is set
3939         * buildbot/status/builder.py: fix all waitUntilFinished() methods
3940         so they can be called after finishing
3942         * buildbot/test/test_run.py: new tests for disconnect behavior,
3943         refactor slave-shutdown routines, add different kinds of
3944         slave-shutdown
3946 2004-11-27  Brian Warner  <warner@lothar.com>
3948         * buildbot/status/words.py (IrcStatusBot.convertTime): utility
3949         method to express ETA time like "2m45s" instead of "165 seconds"
3951 2004-11-24  Brian Warner  <warner@lothar.com>
3953         * buildbot/test/test_vc.py (VC.testArch): unregister the test
3954         archive after the test completes, to avoid cluttering the user's
3955         'tla archives' listing with a bogus entry. Arch doesn't happen to
3956         provide any way to override the use of ~/.arch-params/, so there
3957         isn't a convenient way to avoid touching the setup of the user who
3958         runs the test.
3959         (VC_HTTP.testArchHTTP): same
3961 2004-11-23  Brian Warner  <warner@lothar.com>
3963         * buildbot/status/html.py (TextLog): split render() up into
3964         render_HEAD and render_GET. Use a Producer when sending log
3965         chunks, to reduce memory requirements and avoid sending huge
3966         non-Banana-able strings over web.distrib connections. Requires
3967         peeking under the covers of IStatusLog.
3968         (TextLog.resumeProducing): fix the "as text" link, handle client
3969         disconnects that occur while we're still sending old chunks.
3971         * buildbot/status/builder.py (HTMLLogFile.waitUntilFinished): oops,
3972         use defer.succeed, not the non-existent defer.success
3973         (LogFile.waitUntilFinished): same
3974         (LogFile.subscribe): don't add watchers to a finished logfile
3976         * buildbot/__init__.py (version): bump to 0.6.1+ while between
3977         releases
3979 2004-11-23  Brian Warner  <warner@lothar.com>
3981         * buildbot/__init__.py (version): Releasing buildbot-0.6.1
3983 2004-11-23  Brian Warner  <warner@lothar.com>
3985         * NEWS: update for the 0.6.1 release
3986         * MANIFEST.in: add new files
3988         * README (INSTALLATION): explain how to enable the extra VC tests
3990         * buildbot/status/builder.py (LogFile): add .runEntries at the class
3991         level to, so old pickled builds can be displayed ok
3993 2004-11-22  Brian Warner  <warner@lothar.com>
3995         * NEWS: summarize updates since last release
3997         * README (SLAVE): fix usage of 'buildbot slave' command. Thanks to
3998         Yoz Grahame. Closes SF#1050138.
4000         * docs/changes.xhtml (FreshCVSSourceNewcred): fix typo. Closes
4001         SF#1042563.
4003         * buildbot/process/step_twisted.py (Trial): update docs a bit
4005         * docs/factories.xhtml: fix Trial factory docs to match reality.
4006         Closes: SF#1049758.
4008         * buildbot/process/factory.py (Trial.__init__): add args for
4009         randomly= and recurse=, making them available to instantiators
4010         instead of only to subclassers. Closes: SF#1049759.
4012 2004-11-15  Brian Warner  <warner@lothar.com>
4014         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
4015         try to teach the Quick factory to use multiple versions of python
4017 2004-11-12  Brian Warner  <warner@lothar.com>
4019         * buildbot/status/builder.py (BuilderStatus.saveYourself): use a
4020         safer w32-compatible approach, and only use it on windows
4021         (BuildStatus.saveYourself): same
4023 2004-11-11  Brian Warner  <warner@lothar.com>
4025         * buildbot/status/builder.py (LogFile.addEntry): smarter way to do
4026         it: one string merge per chunk. There are now separate .entries
4027         and .runEntries lists: when enumerating over all chunks, make sure
4028         to look at both.
4029         * buildbot/test/test_status.py (Log): more tests
4031         * buildbot/status/builder.py (LogFile.addEntry): Merge string
4032         chunks together, up to 10kb per chunk. This ought to cut down on
4033         the CPU-burning overhead of large log files. Thanks to Alexander
4034         Staubo for spotting the problem.
4035         * buildbot/test/test_status.py (Log): tests for same
4037 2004-11-10  Brian Warner  <warner@lothar.com>
4039         * buildbot/status/mail.py (MailNotifier.buildMessage): add a Date
4040         header to outbound mail
4041         * buildbot/test/test_status.py (Mail.testBuild1): test for same
4043 2004-11-08  Brian Warner  <warner@lothar.com>
4045         * buildbot/status/builder.py (BuilderStatus.saveYourself): w32
4046         can't do os.rename() onto an existing file, so catch the exception
4047         and unlink the target file first. This introduces a slight window
4048         where the existing file could be lost, but the main failure case
4049         (disk full) should still be handled safely.
4050         (BuildStatus.saveYourself): same
4052         * buildbot/changes/pb.py (ChangePerspective): use a configurable
4053         separator character instead of os.sep, because the filenames being
4054         split here are coming from the VC system, which can have a
4055         different pathname convention than the local host. This should
4056         help a buildmaster running on windows that uses a CVS repository
4057         which runs under unix.
4058         * buildbot/changes/mail.py (MaildirSource): same, for all parsers
4060         * buildbot/process/step_twisted.py (Trial.createSummary): survive
4061         when there are no test failures to be parsed
4063         * buildbot/scripts/runner.py (createMaster): use shutil.copy()
4064         instead of the unix-specific os.system("cp"), thanks to Elliot
4065         Murphy for this and the other buildbot-vs-windows catches.
4066         * buildbot/test/test_maildir.py (MaildirTest.deliverMail): same
4068         * contrib/windows/buildbot.bat: prefix a '@', apparently to not
4069         echo the command as it is run
4071         * setup.py: install sample.mk too, not just sample.cfg
4072         (scripts): install contrib/windows/buildbot.bat on windows
4074 2004-11-07  Brian Warner  <warner@lothar.com>
4076         * buildbot/process/builder.py (Builder._detached): clear the
4077         self.currentBuild reference, otherwise the next build will be
4078         skipped because we think the Builder is already in use.
4080         * docs/examples/twisted_master.cfg: update to match current usage
4081         on the Twisted buildbot
4083 2004-10-29  Brian Warner  <warner@lothar.com>
4085         * buildbot/status/mail.py (MailNotifier): fix typo in docs
4087 2004-10-28  Brian Warner  <warner@lothar.com>
4089         * buildbot/slave/commands.py (SourceBase): refactor subclasses to
4090         have separate doVCUpdate/doVCFull methods. Catch an update failure
4091         and respond by clobbering the source directory and re-trying. This
4092         will handle local changes (like replacing a file with a directory)
4093         that will cause CVS and SVN updates to fail.
4094         * buildbot/test/test_vc.py (SetupMixin.do_vc): test the same
4096         * buildbot/process/step.py (LoggedRemoteCommand.__repr__): avoid a
4097         python-2.4 warning
4099 2004-10-19  Brian Warner  <warner@lothar.com>
4101         * buildbot/process/step_twisted.py (Trial.createSummary): bugfixes
4103         * buildbot/status/html.py (StatusResourceTestResults): display any
4104         TestResults that the Build might have
4105         (StatusResourceTestResult): and the logs for each TestResult
4106         (StatusResourceBuild): add link from the per-build page
4108 2004-10-15  Brian Warner  <warner@lothar.com>
4110         * buildbot/process/step_twisted.py (Trial.createSummary): parse
4111         the 'problems' portion of stdout, add TestResults to our build
4112         * buildbot/test/test_twisted.py (Parse.testParse): test it
4114         * buildbot/interfaces.py (IBuildStatus.getTestResults): new method
4115         to retrieve a dict of accumulated test results
4116         (ITestResult): define what a single test result can do
4117         * buildbot/status/builder.py (TestResult): implement ITestResult
4118         (BuildStatus.getTestResults): retrieve dict of TestResults
4119         (BuildStatus.addTestResult): add TestResults
4120         * buildbot/test/test_status.py (Results.testAddResults): test it
4122 2004-10-14  Brian Warner  <warner@lothar.com>
4124         * buildbot/test/test_maildir.py (MaildirTest): use shutil.rmtree
4125         instead of os.system("rm -rf") for win32 portability
4127         * buildbot/test/test_slavecommand.py (SlaveCommandTestCase): use
4128         SignalMixin instead of starting/stopping the reactor, which is
4129         likely to cause problems with other tests
4131         * buildbot/slave/commands.py (SourceBase.doCopy): remove leftover
4132         self.copyComplete() call. Yoz Grahame makes the catch.
4134         * contrib/windows/buildbot.bat: helper script to deal with path
4135         issues. Thanks to Yoz Grahame.
4137         * buildbot/master.py (BuildMaster.startService): don't register a
4138         SIGHUP handler if the signal module has no SIGHUP attribute.
4139         Apparently win32 does this.
4141         * buildbot/scripts/runner.py (start): add --reactor=win32 on win32
4143         * buildbot/test/test_web.py (WebTest.test_webPathname): skip the
4144         test if the reactor can't offer UNIX sockets
4146         * buildbot/status/html.py (StatusResourceBuild.body): fix syntax
4147         error introduced in the last commit. We really need that
4148         metabuildbot :).
4150 2004-10-12  Brian Warner  <warner@lothar.com>
4152         * buildbot/changes/mail.py (MaildirSource.describe): fix exception
4153         when describing a maildir source. Thanks to Stephen Davis.
4155         * buildbot/status/words.py (IrcStatusBot.command_WATCH): round off
4156         ETA seconds
4158         * buildbot/scripts/runner.py (createMaster): install Makefile too
4159         (start): add --no_save to 'start' command
4160         * buildbot/scripts/sample.mk: simple convenience Makefile with 
4161         start/stop/reload targets
4163         * buildbot/__init__.py (version): bump to 0.6.0+ while between
4164         releases
4166 2004-09-30  Brian Warner  <warner@lothar.com>
4168         * setup.py: Releasing buildbot-0.6.0
4170 2004-09-30  Brian Warner  <warner@lothar.com>
4172         * MANIFEST.in: add debian/*, sample.cfg, more docs files. Remove
4173         test_trial.py from the source tarball until support is complete.
4175         * NEWS: update for 0.6.0 release
4176         * buildbot/__init__.py (version): same
4177         * README: same
4179         * buildbot/status/words.py (IrcStatusBot.command_SOURCE): add
4180         'source' command to tell users where to get the Buildbot source
4182         * docs/examples/*.cfg: update to modern standards
4184         * NEWS: update for release
4186         * buildbot/scripts/runner.py (createMaster): remove the
4187         -shutdown.tap stuff now that it isn't necessary
4188         (createSlave): same
4189         (start): launch buildbot.tap, not buildbot-shutdown.tap
4192         * buildbot/status/mail.py (Domain): shorten class name
4193         (MailNotifier): if lookup= is a string, pass it to Domain()
4194         * buildbot/test/test_status.py (Mail.testBuild1): new class name
4195         (Mail.testBuild2): test the string-to-Domain shortcut
4196         (Mail.testMail): fix test
4199         * buildbot/scripts/sample.cfg: improve the build-the-buildbot
4200         example config file
4202         * buildbot/status/builder.py (BuildStatus.__setstate__): re-set
4203         more attributes on load
4204         (BuilderStatus.stubBuildCacheSize): bump to 30, this was too low
4205         to accomodate the whole waterfall page at once, and the thrashing
4206         results in a lot of unnecessary loads
4207         (BuildStatus.saveYourself): use binary pickles, not fluffy text
4208         (BuilderStatus.saveYourself): same
4209         (BuilderStatus.eventGenerator): stop generating on the first missing
4210         build. We assume that saved builds are deleted oldest-first.
4211         (BuildStepStatus.__getstate__): .progress might not exist
4213         * buildbot/changes/changes.py (ChangeMaster): make it
4214         serializable, in $masterdir/changes.pck
4215         (ChangeMaster.stopService): save on shutdown
4216         * buildbot/master.py (BuildMaster.loadChanges): load at startup
4217         * buildbot/test/test_config.py: load Changes before config file
4220         * buildbot/slave/commands.py (ShellCommand.doTimeout): put the
4221         "Oh my god, you killed the command" header on a separate line
4223         * buildbot/status/builder.py (BuilderStatus.getStubBuildByNumber):
4224         skip over corrupted build pickles
4225         (BuilderStatus.getFullBuildByNumber): same
4226         (BuilderStatus.eventGenerator): skip over unavailable builds
4227         (BuildStatus.saveYourself): save builds to a .tmp file first, then
4228         do an atomic rename. This prevents a corrupted pickle when some
4229         internal serialization error occurs.
4230         (BuilderStatus.saveYourself): same
4232         * buildbot/slave/commands.py (SlaveShellCommand): oops, restore
4233         the timeout for shell commands, it got lost somehow
4235         * buildbot/status/builder.py (BuilderStatus.eventGenerator): if we
4236         run out of build steps, return the rest of the builder events
4238         * buildbot/interfaces.py (IBuilderControl.ping): add method
4240         * buildbot/process/builder.py (BuilderControl.ping): move
4241         slave-ping to BuilderControl, and fix the failure case in the
4242         process (Event.finish() is the verb, Event.finished is the noun).
4244         * buildbot/status/html.py (StatusResourceBuilder.ping): ping
4245         through the BuilderControl instead of the BuilderStatus
4246         (EventBox): add adapter for builder.Event, allowing builder events to
4247         be displayed in the waterfall display
4249         * buildbot/master.py (BotMaster.stopService): add a 'master
4250         shutdown' event to the builder's log
4251         (BuildMaster.startService): and a 'master started' on startup
4253         * buildbot/status/builder.py (BuilderStatus.eventGenerator): merge
4254         builder events into the BuildStep event stream
4255         (Status.builderAdded): add a 'builder created' event
4258         * buildbot/status/words.py (IrcStatusBot.command_WATCH): new
4259         command to announce the completion of a running build
4260         (IrcStatusBot.command_FORCE): announce when the build finishes
4262         * buildbot/status/builder.py (BuilderStatus.addFullBuildToCache):
4263         don't evict unfinished builds from the cache: they must stay in
4264         the full-cache until their logfiles have stopped changing. Make
4265         sure the eviction loop terminates if an unfinished build was hit.
4266         (HTMLLogFile.getTextWithHeaders): return HTML as if it were text.
4267         This lets exceptions be dumped in an email status message. Really
4268         we need LogFiles which contain both text and HTML, instead of two
4269         separate classes.
4270         (BuildStatus.__getstate__): handle self.finished=False
4271         (Status.builderAdded): if the pickle is corrupted, abandon the
4272         history and create a new BuilderStatus object.
4274         * buildbot/process/base.py (Build.stopBuild): tolerate lack of a
4275         self.progress attribute, helped one test which doesn't fully set
4276         up the Build object.
4278         * buildbot/interfaces.py (IStatusLogStub): split out some of the
4279         IStatusLog methods into an Interface that is implemented by "stub"
4280         logs, for which all the actual text chunks are on disk (in the
4281         pickled Build instance). To show the log contents, you must first
4282         adapt the stub log to a full IStatusLog object.
4284         * buildbot/status/builder.py (LogFileStub): create separate stub
4285         log objects, which can be upgraded to a real one if necessary.
4286         (LogFile): make them persistable, and let them stubify themselves
4287         (HTMLLogFile): same
4288         (BuildStepStatus): same
4289         (BuildStatus): same
4290         (BuildStatus.saveYourself): save the whole build out to disk
4291         (BuilderStatus): make it persistable
4292         (BuilderStatus.saveYourself): save the builder to disk
4293         (BuilderStatus.addFullBuildToCache): implement two caches which
4294         hold Build objects: a small one which holds full Builds, and a
4295         larger one which holds "stubbed" Builds (ones with their LogFiles
4296         turned into LogFileStubs). This reduces memory usage by the
4297         buildmaster by not keeping more than a few (default is 2) whole
4298         build logs in RAM all the time.
4299         (BuilderStatus.getBuild): rewrite to pull from disk (through the
4300         cache)
4301         (BuilderStatus.eventGenerator): rewrite since .builds went away
4302         (BuilderStatus.buildStarted): remove the .builds array. Add the
4303         build to the "full" cache when it starts.
4304         (BuilderStatus._buildFinished): save the build to disk when it
4305         finishes
4306         (Status): give it a basedir (same as the BuildMaster's basedir)
4307         where the builder pickles can be saved
4308         (Status.builderAdded): create the BuilderStatus ourselves, by
4309         loading a pickle from disk (or creating a new instance if there
4310         was none on disk). Return the BuilderStatus so the master can glue
4311         it into the new Builder object.
4313         * buildbot/master.py (BotMaster.stopService): on shutdown, tell
4314         all BuilderStatuses to save themselves out to disk. This is in
4315         lieu of saving anything important in the main Application pickle
4316          (the -shutdown.tap file).
4317         (BuildMaster.__init__): give Status() a basedir for its files
4318         (BuildMaster.loadConfig_Builders): do status.builderAdded first,
4319         to get the BuilderStatus, then give it to the Builder (instead of
4320         doing it the other way around). It's ok if the status announces
4321         the new Builder before it's really ready, as the outside world can
4322         only see the BuilderStatus object anyway (and it is ready before
4323         builderAdded returns). Use the builder's "builddir" (which
4324         normally specifies where the slave will run the builder) as the
4325         master's basedir (for saving serialized builds).
4327         * buildbot/status/html.py (StatusResourceBuildStep.getChild):
4328         coerce the logfile to IStatusLog before trying to get the text
4329         chunks out of it. This will pull the full (non-stubified) Build in
4330         from disk if necessary.
4331         (TextLog): fix the adapter registration
4333         * buildbot/test/test_control.py (Force.setUp): create the basedir
4334         * buildbot/test/test_web.py: same
4335         * buildbot/test/test_vc.py (SetupMixin.setUp): same
4336         * buildbot/test/test_status.py (Mail.makeBuild): match new setup
4337         * buildbot/test/test_run.py (Run.testMaster): same
4338         (Status.setUp): same
4340 2004-09-29  Fred L. Drake, Jr.  <fdrake@acm.org>
4342         * buildbot/status/html.py (Waterfall.__init__): store actual
4343         allowForce flag passed in rather than using True for everyone;
4344         make sure setting it to False doesn't cause a NameError
4345         (Waterfall.setup).
4346         (StatusResourceBuilder.__init__) add the builder name to the page
4347         title.
4348         (StatusResourceBuilder.body) move HTML generation for a name/value
4349         row into a helper method (StatusResourceBuilder.make_row); only
4350         generate the "Force Build" form if allowForce was True and the
4351         slave is connected.  Use class attributes in the generated HTML to
4352         spread a little CSS-joy.
4354 2004-09-28  Brian Warner  <warner@lothar.com>
4356         * buildbot/process/step_twisted.py (Trial.createSummary): fix
4357         warning-scanner to not ignore things like
4358         'ComponentsDeprecationWarning' and 'exceptions.RuntimeWarning'
4360         * buildbot/status/html.py (StatusResource.control): add some
4361         class-level values for .control in an attempt to make upgrading
4362         smoother
4364         * buildbot/util.py (ComparableMixin): survive missing attributes,
4365         such as when a class is modified and we're comparing old instances
4366         against new ones
4368         * buildbot/status/words.py (IrcStatusBot.privmsg): clean up
4369         failure handling, remove a redundant try/except block. Don't
4370         return the full traceback to the IRC channel.
4371         (IrcStatusBot.command_FORCE): catch new exceptions, return useful
4372         error messages. Get ETA properly.
4374         * buildbot/status/html.py (StatusResourceBuild.body): html.escape
4375         the reason, since (at least) IRC message will have <> in them.
4376         (StatusResourceBuilder.__init__): take an IBuilderControl
4377         (StatusResourceBuilder.force): use the IBuilderControl we get in
4378         the constructor instead of trying to make our own. Catch the
4379         new exceptions and ignore them for now (until we make an
4380         intermediate web page where we could show the error message)
4381         (StatusResource): create with an IControl, use it to give an
4382         IBuilderControl to all children
4383         (Waterfall): take an allowForce= option, pass an IControl object
4384         to StatusResource if it is True
4386         * buildbot/test/test_web.py (ConfiguredMaster): handle IControl
4388         * buildbot/master.py (BotPerspective.perspective_forceBuild):
4389         catch new exceptions and return string forms
4391         * buildbot/interfaces.py: add NoSlaveError, BuilderInUseError
4392         * buildbot/process/builder.py (Builder.forceBuild): raise them
4393         * buildbot/test/test_control.py (Force.testNoSlave): new test
4394         (Force.testBuilderInUse): same
4397         * buildbot/status/words.py (IrcStatusBot): enable build-forcing
4399         * buildbot/test/test_run.py: use IControl
4400         * buildbot/test/test_vc.py: same
4402         * buildbot/status/html.py (StatusResourceBuilder.force): rewrite
4403         to use IControl. Still offline.
4404         * buildbot/status/words.py (IrcStatusBot.command_FORCE): same
4406         * buildbot/process/builder.py (Builder.doPeriodicBuild): set
4407         who=None so periodic builds don't send out status mail
4408         (Builder.forceBuild): include reason in the log message
4409         (BuilderControl.forceBuild): rename 'name' to 'who'
4411         * buildbot/master.py (BotPerspective.perspective_forceBuild): add
4412         'who' parameter, but make it None by default so builds forced by
4413         slave admins don't cause status mail to be sent to anybody
4414         (BotMaster.forceBuild): same. this method is deprecated.
4415         (DebugPerspective.perspective_forceBuild): same, use IControl.
4416         (DebugPerspective.perspective_fakeChange): use IControl..
4417         (Dispatcher.requestAvatar): .. so don't set .changemaster
4419         * buildbot/interfaces.py (IBuilderControl.forceBuild): rename 'who'
4420         parameter to avoid confusion with the name of the builder
4423         * buildbot/status/mail.py: refine comment about needing 2.3
4425         * buildbot/status/html.py: move all imports to the top
4427         * buildbot/test/test_control.py: test new interfaces
4428         * buildbot/test/test_run.py (Status): handle new interfaces
4429         * buildbot/test/test_vc.py (SetupMixin.doBuild): same
4431         * buildbot/process/base.py (BuildControl): implement IBuildControl
4432         and its lonely getStatus() method
4434         * buildbot/process/builder.py (BuilderControl): implement
4435         IBuilderControl, obtained by adapting the Builder instance
4436         (Builder.startBuild): return a BuilderControl instead of a
4437         Deferred. The caller can use bc.getStatus().waitUntilFinished() to
4438         accomplish the same thing.
4440         * buildbot/master.py: move all import statements to the top
4441         (Control): implement IControl, obtained by adapting the
4442         BuildMaster instance.
4444         * buildbot/interfaces.py: add IControl, IBuilderControl, and
4445         IBuildControl. These are used to force builds. Eventually they
4446         will provide ways to reconfigure the Builders, pause or abandon a
4447         Build, and perhaps control the BuildMaster itself.
4449 2004-09-26  Brian Warner  <warner@lothar.com>
4451         * buildbot/util.py (ComparableMixin): survive twisted>1.3.0 which
4452         ends up comparing us against something without a .__class__
4454 2004-09-24  Brian Warner  <warner@lothar.com>
4456         * buildbot/scripts/runner.py: rearrange option parsing a lot, to get
4457         usage text right.
4459         * Makefile: add 'deb-snapshot' target, to create a timestamped
4460         .deb package
4462         * debian/rules (binary-indep): skip CVS/ files in dh_installexamples
4464 2004-09-23  Brian Warner  <warner@lothar.com>
4466         * buildbot/__init__.py (version): move version string here
4467         * setup.py: get version string from buildbot.version
4468         * buildbot/status/html.py (WaterfallStatusResource.body): add
4469         buildbot version to the page footer
4470         * buildbot/status/words.py (IrcStatusBot.command_VERSION): provide
4471         version when asked
4473         * buildbot/master.py (BotMaster.getPerspective): detect duplicate
4474         slaves, let the second know where the first one is coming from
4475         (BuildMaster.__init__): turn on .unsafeTracebacks so the slave can
4476         see our exceptions. It would be nice if there were a way to just
4477         send them the exception type and value, not the full traceback.
4480         * buildbot/status/mail.py (MailNotifier): add a new argument
4481         sendToInterestedUsers=, which can be set to False to disable the
4482         usual send-to-blamelist behavior.
4483         (top): handle python-2.2 which has no email.MIMEMultipart
4484         (MailNotifier.buildMessage): don't send logs without MIMEMultipart
4485         (MailNotifier.disownServiceParent): unsubscribe on removal
4487         * buildbot/test/test_status.py (Mail.testBuild2): test it
4490         * buildbot/status/progress.py (Expectations.wavg): tolerate
4491         current=None, which happens when steps start failing badly
4492         * buildbot/test/test_status.py (Progress.testWavg): test for it
4494         * buildbot/process/step.py (SVN.startVC): when the (old) slave
4495         doesn't understand args['revision'], emit a warning instead of
4496         bailing completely. Updating to -rHEAD is probably close enough.
4498         * buildbot/process/step_twisted.py (Trial.start): fix sanity-check
4500         * buildbot/test/test_status.py: at least import bb.status.client
4501         even if we don't have any test coverage for it yet
4503         * contrib/svn_buildbot.py: don't require python2.3
4504         (main): wait, do require it (for sets.py), but explain how to
4505         make it work under python2.2
4507 2004-09-23  Brian Warner  <warner@lothar.com>
4509         * contrib/svn_buildbot.py: include the revision number in the Change
4511         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): use when=,
4512         using util.now() because FreshCVS is a realtime service
4514         * buildbot/status/event.py: delete dead code
4515         * buildbot/process/step.py: don't import dead Event class
4516         * buildbot/process/step_twisted.py: same
4517         * buildbot/status/builder.py: same
4518         * buildbot/status/client.py: same
4520         * buildbot/test/test_process.py: kill buggy out-of-date disabled test
4522         * buildbot/changes/changes.py (Change): set .when from an __init__
4523         argument (which defaults to now()), rather than having
4524         ChangeMaster.addChange set it later.
4525         (ChangeMaster.addChange): same
4527         * buildbot/changes/mail.py (parseFreshCVSMail): pass in when=
4528         (parseSyncmail): same. Just use util.now() for now.
4529         (parseBonsaiMail): parse the timestamp field for when=
4531         * buildbot/test/test_vc.py (SourceStamp.addChange): page in when=
4532         instead of setting .when after the fact
4534 2004-09-22  slyphon
4536         * buildbot/slave/trial.py: new SlaveCommand to machine-parse test
4537         results when the target project uses retrial. Still under
4538         development.
4539         * buildbot/test/test_trial.py: same
4541 2004-09-21  Brian Warner  <warner@lothar.com>
4543         * buildbot/status/mail.py (MailNotifier.__init__): include
4544         success/warnings/failure in the Subject line
4545         (MailNotifier.buildMessage): add the buildbot's URL to the body,
4546         use step.logname for the addLogs=True attachment filenames
4547         * buildbot/test/test_status.py (Mail): test Subject lines
4548         (Mail.testLogs): test attachment filenames
4550         * buildbot/master.py (DebugPerspective.perspective_fakeChange):
4551         accept a 'who' argument from the debug tool
4552         * contrib/debugclient.py (DebugWidget.do_commit): send 'who'
4553         * contrib/debug.glade: add text box to set 'who'
4555         * buildbot/interfaces.py (IBuildStatus.getBuilder): replace
4556         .getBuilderName with .getBuilder().getName(), more flexible
4557         (IStatusLog.getName): logs have short names, but you can prefix
4558         them with log.getStep().getName() to make them more useful
4559         * buildbot/status/builder.py: same
4560         * buildbot/status/client.py: same
4561         * buildbot/status/html.py: same
4562         * buildbot/test/test_run.py (Status.testSlave): same
4563         * buildbot/process/step.py: tweak logfile names
4565         * buildbot/status/mail.py (MailNotifier): add lookup, change
4566         argument to extraRecipients. The notifier is now aimed at sending
4567         mail to the people involved in a particular build, with additional
4568         constant recipients as a secondary function.
4570         * buildbot/test/test_status.py: add coverage for IEmailLookup,
4571         including slow-lookup and failing-lookup. Make sure the blamelist
4572         members are included.
4574         * buildbot/interfaces.py: new interfaces IEmailSender+IEmailLookup
4575         (IBuildStatus.getResponsibleUsers): rename from getBlamelist
4576         (IBuildStatus.getInterestedUsers): new method
4577         * buildbot/status/builder.py (BuildStatus.getResponsibleUsers): same
4578         * buildbot/status/client.py (remote_getResponsibleUsers): same
4579         * buildbot/status/html.py (StatusResourceBuild.body): same
4580         * buildbot/test/test_run.py (Status.testSlave): same
4582 2004-09-20  Brian Warner  <warner@lothar.com>
4584         * docs/users.xhtml: update concepts
4586         * Makefile: add a convenience makefile, for things like 'make
4587         test'. It is not included in the source tarball.
4589 2004-09-16  Brian Warner  <warner@lothar.com>
4591         * NEWS: mention /usr/bin/buildbot, debian/*
4593         * debian/*: add preliminary debian packaging. Many thanks to
4594         Kirill Lapshin (and Kevin Turner) for the hard work. I've mangled
4595         it considerably since it left their hands, I am responsible for
4596         all breakage that's resulted.
4598         * bin/buildbot: create a top-level 'buildbot' command, to be
4599         installed in /usr/bin/buildbot . For now it's just a simple
4600         frontend to mktap/twistd/kill, but eventually it will be the entry
4601         point to the 'try' command and also a status client. It is also
4602         intended to support the upcoming debian-packaging init.d scripts.
4603         * buildbot/scripts/runner.py: the real work is done here
4604         * buildbot/scripts/__init__.py: need this too
4605         * buildbot/scripts/sample.cfg: this is installed in new
4606         buildmaster directories
4607         * setup.py: install new stuff
4609 2004-09-15  Brian Warner  <warner@lothar.com>
4611         * buildbot/test/test_vc.py: skip SVN tests if svn can't handle the
4612         'file:' schema (the version shipped with OS-X was built without the
4613         ra_local plugin).
4614         (SetupMixin.tearDown): stop the goofy twisted.web timer which
4615         updates the log-timestamp, to make sure it isn't still running after
4616         the test finishes
4618         * docs/config.xhtml: Add projectName, projectURL, buildbotURL
4619         values to the config file.
4620         * docs/examples/hello.cfg: add examples
4621         * buildbot/interfaces.py (IStatus.getBuildbotURL): define accessors
4622         * buildbot/status/builder.py (Status.getProjectURL): implement them
4623         * buildbot/master.py (BuildMaster.loadConfig): set them from config
4624         * buildbot/test/test_config.py (ConfigTest.testSimple): test them
4625         * buildbot/status/html.py (WaterfallStatusResource): display them
4628         * buildbot/test/test_vc.py (FakeBuilder.name): add attribute so
4629         certain error cases don't suffer a secondary exception.
4630         (top): Skip tests if the corresponding VC tool is not installed.
4632         * buildbot/process/factory.py (Trial): introduce separate
4633         'buildpython' and 'trialpython' lists, since trialpython=[] is
4634         what you want to invoke /usr/bin/python, whereas ./setup.py is
4635         less likely to be executable. Add env= parameter to pass options
4636         to test cases (which is how I usually write tests, I don't know if
4637         anyone else does it this way).
4639         * buildbot/process/step_twisted.py (Trial): handle python=None.
4640         Require 'testpath' be a string, not a list. Fix tests= typo.
4641         (Trial.start): sanity-check any PYTHONPATH value for stringness.
4643         * buildbot/process/step.py (RemoteCommand._remoteFailed): goofy
4644         way to deal with the possibility of removing the disconnect notify
4645         twice.
4646         (CVS): add a 'login' parameter to give a password to 'cvs login',
4647         commonly used with pserver methods (where pw="" or pw="guest")
4649         * buildbot/slave/commands.py (SourceBase): move common args
4650         extraction and setup() to __init__, so everything is ready by the
4651         time setup() is called
4652         (CVS.start): call 'cvs login' if a password was supplied
4653         (ShellCommand): special-case PYTHONPATH: prepend the master's
4654         value to any existing slave-local value.
4656         * buildbot/process/builder.py (Builder.updateBigStatus): if we
4657         don't have a remote, mark the builder as Offline. This whole
4658         function should probably go away and be replaced by individual
4659         deltas.
4660         (Builder.buildFinished): return the results to the build-finished
4661         deferred callback, helps with testing
4663 2004-09-14  Brian Warner  <warner@lothar.com>
4665         * buildbot/test/test_vc.py: put all the repositories needed to run
4666         the complete tests into a single small (1.3MB) tarball, so I can
4667         make that tarball available on the buildbot web site. Test HTTP
4668         access (for Arch and Darcs) by spawning a temporary web server
4669         while the test runs.
4671         * docs/users.xhtml: new document, describe Buildbot's limited
4672         understanding of different human users
4674         * buildbot/test/test_vc.py: rearrange test cases a bit
4676         * buildbot/process/step_twisted.py (Trial): handle testpath=
4677         * buildbot/process/factory.py (Trial): update to use step.Trial
4679         * buildbot/slave/commands.py (ShellCommandPP): fix fatal typo
4681         * buildbot/status/builder.py (BuildStatus.getText): add text2 to
4682         the overall build text (which gives you 'failed 2 tests' rather
4683         than just 'failed')
4684         (BuildStepStatus.text2): default to [], not None
4686         * buildbot/process/step_twisted.py (Trial.commandComplete): text2
4687         must be a list
4689 2004-09-12  Brian Warner  <warner@lothar.com>
4691         * buildbot/master.py (BotPerspective._commandsUnavailable): don't
4692         log the whole exception if it's just an AttributeError (old slave)
4694         * buildbot/process/step.py (ShellCommand.__init__): stash .workdir
4695         so (e.g.) sub-commands can be run in the right directory.
4696         (ShellCommand.start): accept an optional errorMessage= argument
4697         to make life easier for SVN.start
4698         (SVN.startVC): put the "can't do mode=export" warning in the LogFile
4699         headers
4700         (ShellCommand.start): move ['dir'] compatibility hack..
4701         (RemoteShellCommand.start): .. to here so everyone can use it
4703         * buildbot/process/step_twisted.py (Trial): use .workdir
4705         * buildbot/process/step_twisted.py (BuildDebs.getText): fix the
4706         text displayed when debuild fails completely
4707         (Trial): snarf _trial_temp/test.log from the slave and display it
4709 2004-09-11  Brian Warner  <warner@lothar.com>
4711         * buildbot/process/step_twisted.py (ProcessDocs.getText): typo
4713         * buildbot/process/process_twisted.py (TwistedTrial.tests): oops,
4714         set to 'twisted', so --recurse can find twisted/web/test/*, etc
4716         * buildbot/process/step.py (ShellCommand): call .createSummary
4717         before .evaluateCommand instead of the other way around. This
4718         makes it slightly easier to count warnings and then use that to
4719         set results=WARNINGS
4720         * buildbot/process/step_twisted.py: cosmetic, swap the methods
4722         * buildbot/process/base.py (Build.buildFinished): update status
4723         before doing progress. It's embarrassing for the build to be stuck
4724         in the "building" state when an exceptions occurs elsewhere..
4726         * buildbot/status/progress.py (Expectations.expectedBuildTime):
4727         python2.2 doesn't have 'sum'
4729         * buildbot/status/builder.py (Status.getBuilderNames): return a copy,
4730         to prevent clients from accidentally sorting it
4732         * buildbot/master.py (Manhole): add username/password
4733         (BuildMaster.loadConfig): use c['manhole']=Manhole() rather than
4734         c['manholePort'], deprecate old usage
4735         * docs/config.xhtml: document c['manhole']
4736         * docs/examples/hello.cfg: show example of using a Manhole
4739         * buildbot/test/test_steps.py (FakeBuilder.getSlaveCommandVersion):
4740         pretend the slave is up to date
4742         * buildbot/status/builder.py (BuildStepStatus.stepFinished): 'log',
4743         the module, overlaps with 'log', the local variable
4745         * buildbot/status/html.py: oops, 2.2 needs __future__ for generators
4747         * buildbot/process/builder.py (Builder.getSlaveCommandVersion):
4748         new method to let Steps find out the version of their
4749         corresponding SlaveCommand.
4750         * buildbot/process/step.py (BuildStep.slaveVersion): utility method
4751         (ShellCommand.start): add 'dir' argument for <=0.5.0 slaves
4752         (CVS.startVC): backwards compatibility for <=0.5.0 slaves
4753         (SVN.startVC): same
4754         (Darcs.startVC): detect old slaves (missing the 'darcs' command)
4755         (Arch.startVC): same
4756         (P4Sync.startVC): same
4758         * buildbot/process/step.py (LoggedRemoteCommand.start): return the
4759         Deferred so we can catch errors in remote_startCommand
4760         (RemoteShellCommand.start): same
4762         * docs/examples/twisted_master.cfg: update sample config file
4764         * buildbot/slave/commands.py (ShellCommandPP): write to stdin
4765         after connectionMade() is called, not before. Close stdin at that
4766         point too.
4768         * buildbot/process/process_twisted.py: update to use Trial, clean
4769         up argument passing (move to argv arrays instead of string
4770         commands)
4772         * buildbot/process/step_twisted.py (Trial): new step to replace
4773         RunUnitTests, usable by any trial-using project (not just
4774         Twisted). Arguments have changed, see the docstring for details.
4776         * buildbot/process/base.py (Build.startBuild): this now returns a
4777         Deferred. Exceptions that occur during setupBuild are now
4778         caught better and lead to fewer build_status weirdnesses, like
4779         finishing a build that was never started.
4780         (Build.buildFinished): fire the Deferred instead of calling
4781         builder.buildFinished directly. The callback argument is this
4782         Build, everything else can be extracted from it, including the
4783         new build.results attribute.
4784         * buildbot/process/builder.py (Builder.startBuild): same
4785         (Builder.buildFinished): same, extract results from build
4787         * buildbot/process/step.py (ShellCommands): remove dead code
4789 2004-09-08  Brian Warner  <warner@lothar.com>
4791         * buildbot/test/test_vc.py (VC.doPatch): verify that a new build
4792         doesn't try to use the leftover patched workdir
4793         (SourceStamp): test source-stamp computation for CVS and SVN
4795         * buildbot/slave/commands.py (SourceBase.doPatch): mark the
4796         patched workdir ('touch .buildbot-patched') so we don't try to
4797         update it later
4798         (SourceBase.start): add ['revision'] for all Source steps
4799         (CVS): change args: use ['branch'] for -r, remove ['files']
4800         (CVS.buildVC): fix revision/branch stuff
4801         (SVN): add revision stuff
4803         * buildbot/process/step.py (BuildStep.__init__): reject unknown
4804         kwargs (except 'workdir') to avoid silent spelling errors
4805         (ShellCommand.__init__): same
4806         (Source): new base class for CVS/SVN/etc. Factor out everything
4807         common, add revision computation (perform the checkout with a -D
4808         DATE or -r REVISION that gets exactly the sources described by the
4809         last Change), overridable with step.alwaysUseLatest. Add patch
4810         handling (build.getSourceStamp can trigger the use of a base
4811         revision and a patch).
4812         (CVS, SVN, Darcs, Arch, P4Sync): refactor, remove leftover arguments
4813         * docs/steps.xhtml: update docs
4814         * docs/source.xhtml: mention .checkoutDelay
4815         * docs/examples/hello.cfg: show use of checkoutDelay, alwaysUseLatest
4817         * buildbot/process/base.py (Build.setSourceStamp): add a
4818         .sourceStamp attribute to each Build. If set, this indicates that
4819         the build should be done with something other than the most
4820         recent source tree. This will be used to implement "try" builds.
4821         (Build.allChanges): new support method
4822         (Build.lastChangeTime): remove, functionality moved to Source steps
4823         (Build.setupBuild): copy the Step args before adding ['workdir'],
4824         to avoid modifying the BuildFactory (and thus triggering spurious
4825         config changes)
4828         * buildbot/status/html.py: rename s/commits/changes/
4829         (StatusResourceChanges): same
4830         (CommitBox.getBox): same, update URL
4831         (WaterfallStatusResource): same
4832         (StatusResource.getChild): same
4834         * contrib/debugclient.py (DebugWidget.do_commit): send .revision
4835         * contrib/debug.glade: add optional 'revision' to the fakeChange
4837         * buildbot/changes/changes.py (html_tmpl): display .revision
4838         (ChangeMaster.addChange): note .revision in log
4839         * buildbot/changes/pb.py (ChangePerspective.perspective_addChange):
4840         accept a ['revision'] attribute
4842         * buildbot/process/factory.py (BuildFactory): use ComparableMixin
4844         * buildbot/master.py (BotMaster.getPerspective): update the
4845         .connected flag in SlaveStatus when it connects
4846         (BotMaster.detach): and when it disconnects
4847         (DebugPerspective.perspective_fakeChange): take a 'revision' attr
4848         (BuildMaster.loadConfig_Builders): walk old list correctly
4850         * buildbot/test/test_config.py: fix prefix= usage
4852 2004-09-06  Brian Warner  <warner@lothar.com>
4854         * NEWS: mention P4
4856         * buildbot/changes/p4poller.py (P4Source): New ChangeSource to
4857         poll a P4 depot looking for recent changes. Thanks to Dave
4858         Peticolas for the contribution. Probably needs some testing after
4859         I mangled it.
4861         * buildbot/process/step.py (P4Sync): simple P4 source-updater,
4862         requires manual client setup for each buildslave. Rather
4863         experimental. Thanks again to Dave Peticolas.
4864         * buildbot/slave/commands.py (P4Sync): slave-side source-updater
4866         * buildbot/changes/changes.py (Change): add a .revision attribute,
4867         which will eventually be used to generate source-stamp values.
4869         * buildbot/process/step.py (RemoteCommand.start): use
4870         notifyOnDisconnect to notice when we lose the slave, then treat it
4871         like an exception. This allows LogFiles to be closed and the build
4872         to be wrapped up normally. Be sure to remove the disconnect
4873         notification when the step completes so we don't accumulate a
4874         bazillion such notifications which will fire weeks later (when the
4875         slave finally disconnects normally). Fixes SF#915807, thanks to
4876         spiv (Andrew Bennetts) for the report.
4877         (LoggedRemoteCommand): move __init__ code to RemoteCommand, since it
4878         really isn't Logged- specific
4879         (LoggedRemoteCommand.remoteFailed): Add an extra newline to the
4880         header, since it's almost always going to be appended to an
4881         incomplete line
4882         * buildbot/test/test_steps.py (BuildStep.testShellCommand1):
4883         update test to handle use of notifyOnDisconnect
4885         * buildbot/status/builder.py (BuilderStatus.currentlyOffline):
4886         don't clear .ETA and .currentBuild when going offline, let the
4887         current build clean up after itself
4889         * buildbot/process/builder.py (Builder.detached): wait a moment
4890         before doing things like stopping the current build, because the
4891         current step will probably notice the disconnect and cleanup the
4892         build by itself
4893         * buildbot/test/test_run.py (Status.tearDown): update test to
4894         handle asynchronous build-detachment
4896         * buildbot/process/base.py (Build.stopBuild): minor shuffles
4898         * buildbot/status/html.py (WaterfallStatusResource.buildGrid):
4899         hush a debug message
4901 2004-09-05  Brian Warner  <warner@lothar.com>
4903         * buildbot/changes/maildir.py (Maildir.start): catch an IOError
4904         when the dnotify fcntl() fails and fall back to polling. Linux 2.2
4905         kernels do this: the fcntl module has the F_NOTIFY constant, but
4906         the kernel itself doesn't support the operation. Thanks to Olly
4907         Betts for spotting the problem.
4909         * buildbot/process/step.py (Darcs): new source-checkout command
4910         (Arch): new source-checkout command
4911         (todo_P4): fix constructor syntax, still just a placeholder
4912         * buildbot/test/test_vc.py (VC.testDarcs): test it
4913         (VC.testDarcsHTTP): same, via localhost HTTP
4914         (VC.testArch): same
4915         (VC.testArchHTTP): same
4916         * NEWS: mention new features
4918         * buildbot/slave/commands.py (ShellCommand): add .keepStdout,
4919         which tells the step to stash stdout text locally (in .stdout).
4920         Slave-side Commands can use this to make decisions based upon the
4921         output of the the ShellCommand (not just the exit code).
4922         (Darcs): New source-checkout command
4923         (Arch): New source-checkout command, uses .keepStdout in one place
4924         where it needs to discover the archive's default name.
4926         * docs/steps.xhtml: Document options taken by Darcs and Arch.
4927         * docs/source.xhtml: add brief descriptions of Darcs and Arch
4928         * docs/examples/hello.cfg: add examples of Darcs and Arch checkout
4930         * buildbot/process/step.py (ShellCommand.describe): add an
4931         alternate .descriptionDone attribute which provides descriptive
4932         text when the step is complete. .description can be ["compiling"],
4933         for use while the step is running, then .descriptionDone can be
4934         ["compile"], used alone when the step succeeds or with "failed" when
4935         it does not. Updated other steps to use the new text.
4936         * buildbot/process/step_twisted.py: same
4937         * buildbot/test/test_run.py: update tests to match
4939 2004-08-30  Brian Warner  <warner@lothar.com>
4941         * buildbot/process/step.py (ShellCommand.createSummary): fix docs
4942         (CVS.__init__): send 'patch' argument to slave
4943         (CVS.start): don't create the LoggedRemoteCommand until start(),
4944         so we can catch a .patch added after __init__
4945         (SVN.__init__): add 'patch' to SVN too
4946         (SVN.start): same
4948         * buildbot/slave/commands.py (ShellCommand): add a 'stdin'
4949         argument, to let commands push data into the process' stdin pipe.
4950         Move usePTY to a per-instance attribute, and clear it if 'stdin'
4951         is in use, since closing a PTY doesn't really affect the process
4952         in the right way (in particular, I couldn't run /usr/bin/patch
4953         under a pty).
4954         (SourceBase.doPatch): handle 'patch' argument
4956         * buildbot/test/test_vc.py (VC.doPatch): test 'patch' argument for
4957         both CVS and SVN
4959         * buildbot/slave/commands.py (cvs_ver): fix version-parsing goo
4960         * buildbot/slave/bot.py (Bot.remote_getCommands): send command
4961         versions to master
4962         * buildbot/master.py (BotPerspective.got_commands): get command
4963         versions from slave, give to each builder
4964         * buildbot/process/builder.py (Builder.attached): stash slave
4965         command versions in .remoteCommands
4967         * docs/steps.xhtml: bring docs in-line with reality
4969         * buildbot/process/step.py (CVS.__init__): more brutal
4970         compatibility code removal
4971         (SVN.__init__): same
4973         * buildbot/slave/commands.py (SlaveShellCommand): update docs
4974         (SlaveShellCommand.start): require ['workdir'] argument, remove
4975         the ['dir'] fallback (compatibility will come later)
4976         (SourceBase): update docs
4977         (SourceBase.start): remove ['directory'] fallback
4978         (CVS): update docs
4979         (SVN): update docs
4980         * buildbot/test/test_config.py (ConfigTest.testBuilders): update test
4981         * buildbot/test/test_steps.py (BuildStep.testShellCommand1): same
4982         * buildbot/test/test_slavecommand.py (SlaveCommandTestCase): same
4984         * buildbot/process/step.py (RemoteShellCommand.__init__): add
4985         want_stdout/want_stderr. remove old 'dir' keyword (to simplify the
4986         code.. I will figure out 0.5.0-compatibility hooks later)
4988 2004-08-30  Brian Warner  <warner@lothar.com>
4990         * buildbot/process/process_twisted.py: rewrite in terms of new
4991         BuildFactory base class. It got significantly shorter. Yay
4992         negative code days.
4994         * buildbot/process/step_twisted.py (HLint.start): fix to make it
4995         work with the new "self.build isn't nailed down until we call
4996         step.start()" scheme: specifically, __init__ is called before the
4997         build has decided on which Changes are going in, so we don't scan
4998         build.allFiles() for .xhtml files until start()
4999         (HLint.commandComplete): use getText(), not getStdout()
5000         (RunUnitTests.start): same: don't use .build until start()
5001         (RunUnitTests.describe): oops, don't report (None) when using
5002         the default reactor
5003         (RunUnitTests.commandComplete): use getText()
5004         (RunUnitTests.createSummary): same
5005         (BuildDebs.commandComplete): same
5007         * buildbot/process/step.py (RemoteShellCommand.__init__): don't
5008         set args['command'] until start(), since our BuildStep is allowed
5009         to change their mind up until that point
5010         (TreeSize.commandComplete): use getText(), not getStdout()
5012         * docs/examples/twisted_master.cfg: update to current standards
5014         * docs/factories.xhtml: update
5015         * buildbot/process/factory.py: implement all the common factories
5016         described in the docs. The Trial factory doesn't work yet, and
5017         I've probably broken all the process_twisted.py factories in the
5018         process. There are compatibility classes left in for things like
5019         the old BasicBuildFactory, but subclasses of them are unlikely to
5020         work.
5021         * docs/examples/glib_master.cfg: use new BuildFactories
5022         * docs/examples/hello.cfg: same
5024         * buildbot/test/test_config.py (ConfigTest.testBuilders): remove
5025         explicit 'workdir' args
5027         * buildbot/process/base.py (BuildFactory): move factories to ..
5028         * buildbot/process/factory.py (BuildFactory): .. here
5029         * buildbot/process/process_twisted.py: handle move
5030         * buildbot/test/test_config.py: same
5031         * buildbot/test/test_run.py: same
5032         * buildbot/test/test_steps.py: same
5033         * buildbot/test/test_vc.py: same
5034         * docs/factories.xhtml: same
5036         * NEWS: mention config changes that require updating master.cfg
5038         * buildbot/process/base.py (Build.setupBuild): add a 'workdir'
5039         argument to all steps that weren't given one already, pointing at
5040         the "build/" directory.
5042         * docs/examples/hello.cfg: remove explicit 'workdir' args
5044         * docs/factories.xhtml: document standard BuildFactory clases,
5045         including a bunch which are have not yet been written
5047 2004-08-29  Brian Warner  <warner@lothar.com>
5049         * buildbot/interfaces.py (IBuildStepStatus.getResults): move
5050         result constants (SUCCESS, WARNINGS, FAILURE, SKIPPED) to
5051         buildbot.status.builder so they aren't quite so internal
5052         * buildbot/process/base.py, buildbot/process/builder.py: same
5053         * buildbot/process/maxq.py, buildbot/process/step.py: same
5054         * buildbot/process/step_twisted.py, buildbot/status/builder.py: same
5055         * buildbot/status/mail.py, buildbot/test/test_run.py: same
5056         * buildbot/test/test_status.py, buildbot/test/test_vc.py: same
5058         * buildbot/status/html.py (StatusResourceBuildStep): oops, update
5059         to handle new getLogs()-returns-list behavior
5060         (StatusResourceBuildStep.getChild): same
5061         (StepBox.getBox): same
5062         (WaterfallStatusResource.phase0): same
5064         * docs/source.xhtml: document how Buildbot uses version-control
5065         systems (output side: how we get source trees)
5066         * docs/changes.xhtml: rename from sources.xhtml, documents VC
5067         systems (input side: how we learn about Changes)
5069         * buildbot/master.py (Manhole): use ComparableMixin
5070         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): same
5071         * buildbot/changes/mail.py (MaildirSource): same
5072         * buildbot/status/client.py (PBListener): same
5073         * buildbot/status/html.py (Waterfall): same
5074         * buildbot/status/words.py (IRC): same
5076         * NEWS: start describing new features
5078         * buildbot/status/mail.py (MailNotifier): finish implementation.
5079         The message body is still a bit sparse.
5080         * buildbot/test/test_status.py (Mail): test it
5082         * buildbot/util.py (ComparableMixin): class to provide the __cmp__
5083         and __hash__ methods I wind up adding everywhere. Specifically
5084         intended to support the buildbot config-file update scheme where
5085         we compare, say, the old list of IStatusTargets against the new
5086         one and don't touch something which shows up on both lists.
5087         * buildbot/test/test_util.py (Compare): test case for it
5089         * buildbot/interfaces.py (IBuildStatus): change .getLogs() to
5090         return a list instead of a dict
5091         (IBuildStepStatus.getLogs): same. The idea is that steps create
5092         logs with vaguely unique names (although their uniqueness is not
5093         guaranteed). Thus a compilation step should create its sole
5094         logfile with the name 'compile', and contribute it to the
5095         BuildStatus. If a step has two logfiles, try to create them with
5096         different names (like 'test.log' and 'test.summary'), and only
5097         contribute the important ones to the overall BuildStatus.
5098         * buildbot/status/builder.py (Event.getLogs): same
5099         (BuildStepStatus): fix default .text and .results
5100         (BuildStepStatus.addLog): switch to list-like .getLogs()
5101         (BuildStepStatus.stepFinished): same
5102         (BuildStatus.text): fix default .text
5103         (BuildStatus.getLogs): temporary hack to return all logs (from all
5104         child BuildStepStatus objects). Needs to be fixed to only report
5105         the significant ones (as contributed by the steps themselves)
5106         * buildbot/test/test_run.py: handle list-like .getLogs()
5107         * buildbot/test/test_steps.py (BuildStep.testShellCommand1): same
5109 2004-08-28  Brian Warner  <warner@lothar.com>
5111         * buildbot/process/builder.py (Builder.attached): serialize the
5112         attachment process, so the attach-watcher isn't called until the
5113         slave is really available. Add detached watchers too, which makes
5114         testing easier.
5116         * buildbot/test/test_vc.py: test VC modes (clobber/update/etc)
5118         * buildbot/test/test_swap.py: remove dead code
5120         * buildbot/slave/commands.py (ShellCommandPP): add debug messages
5121         (ShellCommand.start): treat errors in _startCommand/spawnProcess
5122         sort of as if the command being run exited with a -1. There may
5123         still be some holes in this scheme.
5124         (CVSCommand): add 'revision' tag to the VC commands, make sure the
5125         -r option appears before the module list
5126         * buildbot/process/step.py (CVS): add 'revision' argument
5128         * buildbot/slave/bot.py (SlaveBuilder._ackFailed): catch failures
5129         when sending updates or stepComplete messages to the master, since
5130         we don't currently care whether they arrive or not. When we revamp
5131         the master/slave protocol to really resume interrupted builds,
5132         this will need revisiting.
5133         (lostRemote): remove spurious print
5135         * buildbot/master.py (BotPerspective.attached): serialize the
5136         new-builder interrogation process, to make testing easier
5137         (BotMaster.waitUntilBuilderDetached): convenience function
5139         * buildbot/status/builder.py (BuilderStatus): prune old builds
5140         (BuildStatus.pruneSteps): .. and steps
5141         (BuildStepStatus.pruneLogs): .. and logs
5142         (BuilderStatus.getBuild): handle missing builds
5143         * buildbot/status/html.py (StatusResourceBuild.body): display build
5144         status in the per-build page
5145         (BuildBox.getBox): color finished builds in the per-build box
5147 2004-08-27  Brian Warner  <warner@lothar.com>
5149         * buildbot/status/mail.py (MailNotifier): new notification class,
5150         not yet finished
5152         * buildbot/slave/commands.py (SourceBase): refactor SVN and CVS into
5153         variants of a common base class which handles all the mode= logic
5155         * buildbot/interfaces.py (IBuildStatus.getPreviousBuild): add
5156         convenience method
5157         * buildbot/status/builder.py (BuildStatus.getPreviousBuild): same
5159 2004-08-26  Brian Warner  <warner@lothar.com>
5161         * buildbot/test/test_slavecommand.py: accomodate new slavecommand
5162         interfaces
5164         * buildbot/test/test_run.py: update to new Logfile interface, new
5165         buildbot.slave modules
5166         * buildbot/test/test_steps.py: same, remove Swappable, add timeouts
5168         * MANIFEST.in: new sample config file
5169         * docs/examples/hello.cfg: same
5171         * buildbot/process/step_twisted.py: remove dead import
5173         * buildbot/process/step.py (RemoteCommand.run): catch errors
5174         during .start
5175         (RemoteCommand.remote_update): ignore updates that arrive after
5176         we've shut down
5177         (RemoteCommand.remote_complete): ignore duplicate complete msgs
5178         (RemoteCommand._remoteComplete): cleanup failure handling, reduce
5179         the responsibilities of the subclass's methods
5180         (BuildStep.failed): catch errors during failure processing
5181         (BuildStep.addHTMLLog): provide all-HTML logfiles (from Failures)
5182         (CVS): move to a mode= argument (described in docstring), rather
5183         than the ungainly clobber=/export=/copydir= combination.
5184         (SVN): add mode= functionality to SVN too
5185         (todo_Darcs, todo_Arch, todo_P4): placeholders for future work
5187         * buildbot/process/base.py (Build.startNextStep): catch errors
5188         during s.startStep()
5190         * buildbot/clients/base.py: update to new PB client interface.
5191         gtkPanes is still broken
5193         * buildbot/bot.py, buildbot/slavecommand.py: move to..
5194         * buildbot/slave/bot.py, buildbot/slave/commands.py: .. new directory
5195         * setup.py: add buildbot.slave module
5196         * buildbot/bb_tap.py: handle move
5197         * buildbot/slave/registry.py: place to register commands, w/versions
5198         * buildbot/slave/bot.py: major simplifications
5199         (SlaveBuilder.remote_startCommand): use registry for slave commands,
5200         instead of a fixed table. Eventually this will make the slave more
5201         extensible. Use 'start' method on the command, not .startCommand.
5202         Fix unsafeTracebacks handling (I think).
5203         * buildbot/slave/commands.py: major cleanup. ShellCommand is now a
5204         helper class with a .start method that returns a Deferred.
5205         SlaveShellCommand is the form reached by the buildmaster. Commands
5206         which use multiple ShellCommands can just chain them as Deferreds,
5207         with some helper methods in Command (_abandonOnFailure and
5208         _checkAbandoned) to bail on rc!=0.
5209         (CVSCommand): prefer new mode= argument
5210         (SVNFetch): add mode= argument
5212         * buildbot/master.py (DebugPerspective.perspective_forceBuild):
5213         put a useful reason string on the build
5215         * buildbot/status/builder.py (LogFile): do LogFile right: move the
5216         core functionality into an IStatusLog object
5217         (BuildStatus.sendETAUpdate): don't send empty build-eta messages
5218         * buildbot/status/html.py (TextLog): HTML-rendering goes here
5219         (StatusResourceBuild.body): use proper accessor methods
5220         * buildbot/status/client.py (RemoteLog): PB-access goes here
5221         (StatusClientPerspective.perspective_subscribe): add "full" mode,
5222         which delivers log contents too
5223         (PBListener.__cmp__): make PBListeners comparable, thus removeable
5224         * buildbot/status/event.py: remove old Logfile completely
5226         * buildbot/interfaces.py (IStatusLog.subscribe): make the
5227         subscription interface for IStatusLog subscriptions just like all
5228         other the status subscriptions
5229         (IStatusReceiver.logChunk): method called on subscribers
5231 2004-08-24  Brian Warner  <warner@lothar.com>
5233         * buildbot/process/builder.py (Builder._pong): oops, ping response
5234         includes a result (the implicit None returned by remote_print).
5235         Accept it so the _pong method handles the response correctly.
5237 2004-08-06  Brian Warner  <warner@lothar.com>
5239         * buildbot/test/test_config.py: update IRC, PBListener tests
5241         * buildbot/status/client.py (StatusClientPerspective): total
5242         rewrite to match new IStatus interfaces. New subscription scheme.
5243         There are still a few optimizations to make (sending down extra
5244         information with event messages so the client doesn't have to do a
5245         round trip). The logfile-retrieval code is probably still broken.
5246         Moved the PB service into its own port, you can no longer share a
5247         TCP socket between a PBListener and, say, the slaveport (this
5248         should be fixed eventually).
5249         * buildbot/clients/base.py (Client): revamp to match. still needs
5250         a lot of work, but basic event reporting works fine. gtkPanes is
5251         completely broken.
5253         * buildbot/status/words.py (IRC): move to c['status']. Each IRC
5254         instance talks to a single irc server. Threw out all the old
5255         multi-server handling code. Still need to add back in
5256         builder-control (i.e. "force build")
5258         * buildbot/status/html.py (StatusResourceBuildStep.body): add some
5259         more random text to the as-yet-unreachable per-step page
5261         * buildbot/status/builder.py (BuildStepStatus.sendETAUpdate):
5262         rename to stepETAUpdate
5263         (BuildStatus.subscribe): add build-wide ETA updates
5264         (BuilderStatus.getState): remove more cruft
5265         (BuilderStatus.getCurrentBuild): remove more cruft
5266         (BuilderStatus.buildStarted): really handle tuple-subscription
5267         * buildbot/test/test_run.py (Status.testSlave): handle the
5268         stepETAUpdate rename
5270         * buildbot/master.py (BuildMaster): don't add a default
5271         StatusClientService. Don't add a default IrcStatusFactory. Both
5272         are now added through c['status'] in the config file. c['irc'] is
5273         accepted for backwards compatibility, the only quirk is you cannot
5274         use c['irc'] to specify IRC servers on ports other than 6667.
5276         * buildbot/interfaces.py (IBuildStatus.getCurrentStep): add method
5277         (IStatusReceiver.buildStarted): allow update-interval on subscribe
5278         (IStatusReceiver.buildETAUpdate): send build-wide ETA updates
5279         (IStatusReceiver.stepETAUpdate): rename since it's step-specific
5282         * buildbot/master.py (BuildMaster.startService): SIGHUP now causes
5283         the buildmaster to re-read its config file
5286         * buildbot/test/test_web.py (test_webPortnum): need a new hack to
5287         find out the port our server is running on
5288         (WebTest.test_webPathname_port): same
5290         * buildbot/test/test_config.py (testWebPortnum): test it
5291         (testWebPathname): ditto
5293         * docs/config.xhtml: document new c['status'] configuration option
5295         * buildbot/status/html.py (Waterfall): new top-level class which
5296         can be added to c['status']. This creates the Site as well as the
5297         necessary TCPServer/UNIXServer. It goes through the BuildMaster,
5298         reachable as .parent, for everything.
5300         * buildbot/master.py (Manhole): make it a normal service Child
5301         (BuildMaster.loadConfig_status): c['status'] replaces webPortnum and
5302         webPathname. It will eventually replace c['irc'] and the implicit
5303         PB listener as well. c['webPortnum'] and c['webPathname'] are left
5304         in as (deprecated) backward compatibility hooks for now.
5307         * buildbot/process/builder.py (Builder.buildFinished): don't
5308         inform out builder_status about a finished build, as it finds out
5309         through its child BuildStatus object
5311         * buildbot/status/html.py: extensive revamp. Use adapters to make
5312         Boxes out of BuildStepStatus and friends. Acknowledge that Steps
5313         have both starting and finishing times and adjust the waterfall
5314         display accordingly, using spacers if necessary. Use SlaveStatus
5315         to get buildslave info.
5316         (StatusResourceBuildStep): new just-one-step resource, used to get
5317         logfiles. No actual href to it yet.
5319         * buildbot/status/event.py (Logfile.doSwap): disable Swappable for
5320         the time being, until I get the file-naming scheme right
5322         * buildbot/status/builder.py (Event): clean started/finished names
5323         (BuildStatus.isFinished): .finished is not None is the right test
5324         (BuildStatus.buildStarted): track started/finished times ourselves
5325         (BuilderStatus.getSlave): provide access to SlaveStatus object
5326         (BuilderStatus.getLastFinishedBuild): all builds are now in
5327         .builds, even the currently-running one. Accomodate this change.
5328         (BuilderStatus.eventGenerator): new per-builder event generator.
5329         Returns BuildStepStatus and BuildStatus objects, since they can
5330         both be adapted as necessary.
5331         (BuilderStatus.addEvent): clean up started/finished attributes
5332         (BuilderStatus.startBuild,finishBuild): remove dead code
5333         (SlaveStatus): new object to provide ISlaveStatus
5335         * buildbot/process/step.py (ShellCommand.getColor): actually
5336         return the color instead of setting it ourselves
5337         (CVS.__init__): pull .timeout and .workdir options out of
5338         **kwargs, since BuildStep will ignore them. Without this neither
5339         will be sent to the slave correctly.
5340         (SVN.__init__): same
5342         * buildbot/process/builder.py (Builder): move flags to class-level
5343         attributes
5344         (Builder.attached): remove .remoteInfo, let the BotPerspective and
5345         SlaveStatus handle that
5347         * buildbot/process/base.py (Build.firstEvent): remove dead code
5348         (Build.stopBuild): bugfix
5350         * buildbot/changes/pb.py (PBChangeSource.describe): add method
5352         * buildbot/changes/changes.py (Change): add IStatusEvent methods
5353         (ChangeMaster.eventGenerator): yield Changes, since there are now
5354         Adapters to turn them into HTML boxes
5356         * buildbot/master.py (BotMaster): track SlaveStatus from BotMaster
5357         (BotPerspective.attached): feed a SlaveStatus object
5358         (BuildMaster.loadConfig): add a manhole port (debug over telnet)
5359         (BuildMaster.loadConfig_Builders): give BuilderStatus a parent
5361         * buildbot/interfaces.py: API additions
5362         (ISlaveStatus): place to get slave status
5364 2004-08-04  Brian Warner  <warner@lothar.com>
5366         * buildbot/slavecommand.py (DummyCommand.finished): send rc=0 when
5367         the delay finishes, so the step is marked as SUCCESS
5369         * buildbot/test/test_run.py (Status.testSlave): cover more of
5370         IBuildStatus and IBuildStepStatus
5372         * buildbot/status/progress.py (StepProgress): move some flags to
5373         class-level attributes
5374         (StepProgress.remaining): if there are no other progress metrics
5375         to go by, fall back to elapsed time
5376         (StepProgress.setExpectations): take a dict of metrics instead of
5377         a list
5378         (BuildProgress.setExpectationsFrom): pull expectations from the
5379         Expectations, instead of having it push them to the BuildProgress
5380         (Expectations): move some flags to class-level attributes
5381         (Expectations.__init__): copy per-step times from the
5382         BuildProgress too
5383         (Expectations.expectedBuildTime): new method for per-build ETA
5385         * buildbot/status/event.py (Logfile): move some flags to
5386         class-level attributes
5387         (Logfile.logProgressTo): better method name, let step set the
5388         progress axis name (instead of always being "output")
5390         * buildbot/status/builder.py (BuildStepStatus.getTimes): track the
5391         times directly, rather than depending upon the (possibly missing)
5392         .progress object. Use 'None' to indicate "not started/finished
5393         yet"
5394         (BuildStepStatus.getExpectations): oops, return the full list of
5395         expectations
5396         (BuilderStatus._buildFinished): append finished builds to .builds
5398         * buildbot/process/step.py (BuildStep): add separate .useProgress
5399         flag, since empty .progressMetrics[] still implies that time is a
5400         useful predictor
5401         (CVS): set up the cmd in __init__, instead of waiting for start()
5403         * buildbot/process/base.py (Build.startBuild): disable the 'when'
5404         calculation, this will eventually turn into a proper sourceStamp
5405         (Build.setupBuild): tell the Progress to load from the Expectations,
5406         instead of having the Expectations stuff things into the Progress
5407         (Build.buildException): add a build-level errback to make sure the
5408         build's Deferred fires even in case of exceptions
5410         * buildbot/master.py (BotMaster.forceBuild): convey the reason into
5411         the forced build
5412         * buildbot/process/builder.py (Builder.forceBuild): convey the
5413         reason instead of creating a fake Change
5415         * docs/examples/twisted_master.cfg: update to match reality
5417         * buildbot/test/test_config.py, buildbot/test/test_process.py:
5418         * buildbot/test/test_run.py, buildbot/test/test_steps.py:
5419         fix or remove broken/breaking tests
5421         * buildbot/status/event.py (Logfile.__len__): remove evil method
5423         * buildbot/status/builder.py (BuildStepStatus.stepStarted): tolerate
5424         missing .build, for test convenience
5426         * buildbot/process/step_twisted.py: import fixes
5428         * buildbot/process/step.py (BuildStep.failed): exception is FAILURE
5430         * buildbot/master.py (BuildMaster.loadConfig_Builders): leftover
5431         .statusbag reference
5433         * buildbot/bot.py (BuildSlave.stopService): tear down the TCP
5434         connection at shutdown, and stop it from reconnecting
5436         * buildbot/test/test_run.py (Run.testSlave): use a RemoteDummy to
5437         chase down remote-execution bugs
5439         * buildbot/process/step.py: more fixes, remove
5440         BuildStep.setStatus()
5441         * buildbot/status/builder.py: move setStatus() functionality into
5442         BuildStatus.addStep
5443         * buildbot/status/event.py: minor fixes
5445 2004-08-03  Brian Warner  <warner@lothar.com>
5447         * buildbot/process/base.py, buildbot/process/builder.py
5448         * buildbot/process/step.py, buildbot/status/builder.py
5449         * buildbot/status/event.py, buildbot/test/test_run.py:
5450         fix status delivery, get a basic test case working
5451         * buildbot/master.py: finish implementing basic status delivery,
5452         temporarily disable HTML/IRC/PB status sources
5454         * buildbot/bot.py (Bot.remote_setBuilderList): remove debug noise
5456         * buildbot/status/progress.py (BuildProgress): remove dead code
5458         * buildbot/interfaces.py
5459         * buildbot/process/base.py, buildbot/process/builder.py
5460         * buildbot/process/step.py, buildbot/process/step_twisted.py
5461         * buildbot/status/builder.py: Complete overhaul of the all
5462         status-delivery code, unifying all types of status clients (HTML,
5463         IRC, PB). See interfaces.IBuildStatus for an idea of what it will
5464         look like. This commit is a checkpointing of the work-in-progress:
5465         the input side is mostly done (Builders/Builds sending status
5466         to the BuilderStatus/BuildStatus objects), but the output side has
5467         not yet been started (HTML resources querying BuilderStatus
5468         objects). Things are probably very broken right now and may remain
5469         so for several weeks, I apologize for the disruption.
5471         * buildbot/status/event.py: add a setHTML method to use pre-rendered
5472         HTML as the log's contents. Currently used for exception tracebacks.
5473         * buildbot/status/progress.py: minor spelling changes
5475 2004-08-02  Brian Warner  <warner@lothar.com>
5477         * docs/config.xhtml: XHTML fixes, makes raw .xhtml files viewable
5478         in mozilla. Also added stylesheets copied from Twisted's docs.
5479         Remember that these files are meant to be run through Lore first.
5480         Thanks to Philipp Frauenfelder for the fixes.
5481         * docs/factories.xhtml, docs/sources.xhtml, docs/steps.xhtml: same
5482         * docs/stylesheet-unprocessed.css, docs/stylesheet.css: same
5483         * docs/template.tpl: added a Lore template
5485 2004-07-29  Brian Warner  <warner@lothar.com>
5487         * buildbot/interfaces.py: revamp status delivery. This is the
5488         preview: these are the Interfaces that will be provided by new
5489         Builder code, and to which the current HTML/IRC/PB status
5490         displayers will be adapted.
5492         * buildbot/slavecommand.py (ShellCommand.start): look for .usePTY
5493         on the SlaveBuilder, not the Bot.
5494         * buildbot/bot.py (Bot.remote_setBuilderList): copy Bot.usePTY to
5495         SlaveBuilder.usePTY
5496         * buildbot/test/test_slavecommand.py (FakeSlaveBuilder.usePTY):
5497         set .usePTY on the FakeSlaveBuilder
5499 2004-07-25  Brian Warner  <warner@lothar.com>
5501         * buildbot/changes/freshcvs.py: add some debug log messages
5502         (FreshCVSConnectionFactory.gotPerspective): pre-emptively fix the
5503         disabled 'setFilter' syntax
5504         (FreshCVSSourceNewcred.__init__): warn about prefix= values that
5505         don't end with a slash
5507         * buildbot/process/base.py (Builder._pong_failed): add TODO note
5509         * setup.py: bump to 0.5.0+ while between releases
5511 2004-07-23  Brian Warner  <warner@lothar.com>
5513         * setup.py (version): Releasing buildbot-0.5.0
5515 2004-07-23  Brian Warner  <warner@lothar.com>
5517         * README: update for 0.5.0 release
5519         * NEWS: update for 0.5.0 release
5521 2004-07-22  Brian Warner  <warner@lothar.com>
5523         * buildbot/slavecommand.py (ShellCommand): make usePTY a
5524         mktap-time configuration flag (--usepty=1, --usepty=0)
5525         * buildbot/bot.py: same
5527         * buildbot/master.py (BotPerspective.got_dirs): don't complain about
5528         an 'info' directory being unwanted
5530         * buildbot/changes/freshcvs.py (FreshCVSSource): flip the
5531         newcred/oldcred switch. Newcred (for CVSToys-1.0.10 and later) is now
5532         the default. To communicate with an oldcred daemond (CVSToys-1.0.9
5533         and earlier), use a FreshCVSSourceOldcred instead.
5534         (test): simple test routine: connect to server, print changes
5536         * buildbot/changes/changes.py (Change.getTime): make it possible
5537         to print un-timestamped changes
5539         * buildbot/master.py (makeApp): delete ancient dead code
5540         (BuildMaster.loadTheConfigFile): make "master.cfg" name configurable
5541         * buildbot/test/test_config.py (testFindConfigFile): test it
5543         * docs/examples/twisted_master.cfg (b22w32): use iocp reactor
5544         instead of win32 one
5547         * buildbot/master.py (BuildMaster.loadConfig_Builders): config file
5548         now takes a dictionary instead of a tuple. See docs/config.xhtml for
5549         details.
5551         * buildbot/process/base.py (Builder.__init__): change constructor
5552         to accept a dictionary of config data, rather than discrete
5553         name/slave/builddir/factory arguments
5555         * docs/examples/twisted_master.cfg: update to new syntax
5556         * docs/examples/glib_master.cfg: same
5557         * buildbot/test/test_config.py (ConfigTest.testBuilders): some
5558         rough tests of the new syntax
5560         
5561         * buildbot/master.py (BuildMaster.loadConfig): allow webPathname
5562         to be an int, which means "run a web.distrib sub-server on a TCP
5563         port". This lets you publish the buildbot status page to a remote
5564         twisted.web server (using distrib.ResourceSubscription). Also
5565         rename the local attributes used to hold these web things so
5566         they're more in touch with reality.
5567         * buildbot/test/test_web.py: test webPortnum and webPathname
5568         * docs/config.xhtml: document this new use of webPathname
5570         * docs/config.xhtml: new document, slightly ahead of reality
5571         
5572         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred.notify): fix
5573         'prefix' handling: treat it as a simple string to check with
5574         .startswith, instead of treating it as a directory. This allows
5575         sub-directories to be used. If you use prefix=, you should give it
5576         a string that starts just below the CVSROOT and ends with a slash.
5577         This prefix will be stripped from all filenames, and filenames
5578         which do not start with it will be ignored.
5580 2004-07-20  Cory Dodt  <corydodt@twistedmatrix.com>
5582         * contrib/svn_buildbot.py: Add --include (synonym for --filter)
5583         and --exclude (inverse of --include).  SVN post-commit hooks
5584         now have total control over which changes get sent to buildbot and which
5585         do not.
5587 2004-07-10  Brian Warner  <warner@lothar.com>
5589         * buildbot/test/test_twisted.py (Case1.testCountFailedTests): fix
5590         test case to match new API
5592         * buildbot/status/event.py (Logfile.getEntries): fix silly bug
5593         which crashed HTML display when self.entries=[] (needed to
5594         distinguish between [], which means "no entries yet", and None,
5595         which means "the entries have been swapped out to disk, go fetch
5596         them").
5598 2004-07-04  Brian Warner  <warner@lothar.com>
5600         * buildbot/process/step_twisted.py (countFailedTests): Count
5601         skips, expectedFailures, and unexpectedSuccesses. Start scanning
5602         10kb from the end because any import errors are wedged there and
5603         they would make us think the test log was unparseable.
5604         (RunUnitTests.finishStatus): add skip/todo counts to the event box
5606 2004-06-26  Brian Warner  <warner@lothar.com>
5608         * buildbot/process/step_twisted.py (RemovePYCs): turn the
5609         delete-*.pyc command into an actual BuildStep, so we can label it
5610         nicely
5611         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
5612         (FullTwistedBuildFactory): same
5614 2004-06-25  Cory Dodt  <corydodt@twistedmatrix.com>
5616         * contrib/fakechange.py: Add an errback when sending the fake 
5617         change, so we know it didn't work.
5619 2004-06-25  Christopher Armstrong  <radix@twistedmatrix.com>
5621         * buildbot/process/step_twisted.py: Delete *.pyc files before
5622         calling trial, so it doesn't catch any old .pyc files whose .py
5623         files have been moved or deleted.
5625         * buildbot/process/step_twisted.py (RunUnitTests): 1) Add a new
5626         parameter, 'recurse', that passes -R to trial. 2) have 'runAll'
5627         imply 'recurse'. 3) Make the default 'allTests' be ["twisted"]
5628         instead of ["twisted.test"], so that the end result is "trial -R
5629         twisted".
5631         * contrib/svn_buildbot.py: Add a --filter parameter that accepts a
5632         regular expression to match filenames that should be ignored when
5633         changed. Also add a --revision parameter that specifies the
5634         revision to examine, which is useful for debugging.
5636 2004-06-25  Brian Warner  <warner@lothar.com>
5638         * buildbot/process/step_twisted.py (trialTextSummarizer): create a
5639         summary of warnings (like DeprecationWarnings), next to the
5640         "summary" file
5642 2004-05-13  Brian Warner  <warner@lothar.com>
5644         * docs/examples/twisted_master.cfg: enable the win32 builder, as
5645         we now have a w32 build slave courtesy of Mike Taylor.
5647         * buildbot/process/base.py (Build.checkInterlocks): OMG this was
5648         so broken. Fixed a race condition that tripped up interlocked
5649         builds and caused the status to be stuck at "Interlocked" forever.
5650         The twisted buildbot's one interlocked build just so happened to
5651         never hit this case until recently (the feeding builds both pass
5652         before the interlocked build is attempted.. usually it has to wait
5653         a while).
5654         (Builder._pong_failed): fix method signature
5656         * setup.py: bump to 0.4.3+ while between releases
5658 2004-04-30  Brian Warner  <warner@lothar.com>
5660         * setup.py (version): Releasing buildbot-0.4.3
5662 2004-04-30  Brian Warner  <warner@lothar.com>
5664         * MANIFEST.in: add the doc fragments in  docs/*.xhtml
5666         * README: update for 0.4.3 release
5668         * NEWS: update for 0.4.3 release
5670         * buildbot/master.py (BuildMaster.__getstate__): make sure
5671         Versioned.__getstate__ is invoked, for upgrade from 0.4.2
5673         * buildbot/process/step_twisted.py (RunUnitTests.trial): add
5674         .trial as a class attribute, for upgrade from 0.4.2
5676         * buildbot/changes/changes.py (Change.links): add .links for
5677         upgrade from 0.4.2
5679         * buildbot/status/event.py (Logfile.__getstate__): get rid of both
5680         .textWatchers and .htmlWatchers at save time, since they are both
5681         volatile, should allow smooth 0.4.2 upgrade
5683         * buildbot/process/step.py (CVS.finishStatus): catch failed
5684         CVS/SVN commands so we can make the status box red
5686 2004-04-29  Brian Warner  <warner@lothar.com>
5688         * buildbot/changes/freshcvs.py
5689         (FreshCVSConnectionFactory.gotPerspective): add (commented-out)
5690         code to do setFilter(), which tells the freshcvs daemon to not
5691         send us stuff that we're not interested in. I will uncomment it
5692         when a new version of CVSToys is available in which setFilter()
5693         actually works, and I get a chance to test it better.
5695         * docs/examples/twisted_master.cfg: start using a PBChangeSource
5697         * buildbot/master.py (Dispatcher): use a registration scheme
5698         instead of hardwired service names
5699         (BuildMaster): keep track of the Dispatcher to support
5700         registration
5702         * buildbot/changes/changes.py (ChangeMaster): create a distinct
5703         PBChangeSource class instead of having it be an undocumented
5704         internal feature of the ChangeMaster. Split out the code into a
5705         new file.
5706         * buildbot/changes/pb.py (PBChangeSource): same
5707         * buildbot/test/test_changes.py: a few tests for PBChangeSource
5709         * docs/{factories|sources|steps}.xhtml: document some pieces
5711         * docs/examples/twisted_master.cfg: use SVN instead of CVS, stop
5712         using FCMaildirSource
5713         (f23osx): update OS-X builder to use python2.3, since the slave
5714         was updated to Panther (10.3.3)
5716 2004-03-21  Brian Warner  <warner@lothar.com>
5718         * buildbot/process/process_twisted.py: factor out doCheckout, change
5719         to use SVN instead of CVS
5721         * buildbot/process/base.py (BasicBuildFactory): refactor to make
5722         an SVN subclass easier
5723         (BasicSVN): subclass which uses Subversion instead of CVS
5725 2004-03-15  Christopher Armstrong  <radix@twistedmatrix.com>
5727         * buildbot/slavecommand.py (ShellCommand.start): use COMSPEC instead
5728         of /bin/sh on win32
5729         (CVSCommand.cvsComplete): don't assume chdir worked on win32
5731 2004-02-25  Brian Warner  <warner@lothar.com>
5733         * buildbot/slavecommand.py (ShellCommand): ['commands'] argument
5734         is now either a list (which is passed to spawnProcess directly) or
5735         a string (which gets passed to /bin/sh -c). This removes the useSH
5736         flag and the ArgslistCommand class. Also send status header at the
5737         start and end of each command, instead of having the master-side
5738         code do that.
5739         (CVSCommand): fix the doUpdate command, it failed to do the 'cp
5740         -r'. Update to use list-based arguments.
5741         (SVNFetch): use list-based arguments, use ['dir'] argument to
5742         simplify code.
5743         * buildbot/test/test_steps.py (Commands): match changes
5745         * buildbot/process/step.py (InternalShellCommand.words): handle
5746         command lists
5747         (SVN): inherit from CVS, cleanup
5749         * buildbot/status/event.py (Logfile.content): render in HTML, with
5750         stderr in red and headers (like the name of the command we're
5751         about to run) in blue. Add link to a second URL (url + "?text=1")
5752         to get just stdout/stderr in text/plain without markup. There is
5753         still a problem with .entries=None causing a crash, it seems to occur
5754         when the logfile is read before it is finished.
5756         * buildbot/bot.py (BotFactory.doKeepalive): add a 30-second
5757         timeout to the keepalives, and use it to explicitly do a
5758         loseConnection instead of waiting for TCP to notice the loss. This
5759         ought to clear up the silent-lossage problem.
5760         (unsafeTracebacks): pass exception tracebacks back to the master,
5761         makes it much easier to debug problems
5763 2004-02-23  Brian Warner  <warner@lothar.com>
5765         * buildbot/slavecommand.py (ShellCommand): add useSH flag to pass
5766         the whole command to /bin/sh instead of execve [Johan Dahlin]
5767         (CVSCommand): drop '-r BRANCH' if BRANCH==None instead of usiing
5768         '-r HEAD' [Johan Dahlin]
5769         (CVSCommand.start2): fix cvsdir calculation [Johan Dahlin]
5771         * buildbot/changes/changes.py (Change): add links= argument, add
5772         asHTML method [Johan Dahlin]. Modified to make a bit more
5773         XHTMLish. Still not sure how to best use links= .
5775         * buildbot/status/html.py (StatusResourceCommits.getChild): use 
5776         Change.asHTML to display the change, not asText
5778         * buildbot/status/html.py (StatusResourceBuilder): web button to
5779         ping slave
5781         * buildbot/test/test_run.py: test to actually start a buildmaster
5782         and poke at it
5784         * MANIFEST.in: bring back accidentally-dropped test helper files
5786         * buildbot/test/test_config.py (ConfigTest.testSources): skip tests
5787         that require cvstoys if it is not installed
5789         * buildbot/process/step_twisted.py (RunUnitTests): allow other
5790         values of "bin/trial" [Dave Peticolas]
5791         (RunUnitTests.finishStatus): say "no tests run" instead of "0
5792         tests passed" when we didn't happen to run any tests
5794         * buildbot/process/step.py (Compile): use haltOnFailure instead of
5795         flunkOnFailure [Johan Dahlin]
5797         * buildbot/process/base.py (ConfigurableBuild.setSteps): allow
5798         multiple instances of the same Step class by suffixing "_2", etc,
5799         to the name until it is unique. This name needs to be unique
5800         because it is used as a key in the dictionary that tracks build
5801         progress.
5802         * buildbot/test/test_steps.py (Steps.testMultipleStepInstances):
5803         add test for it
5805         * buildbot/process/base.py (Builder.ping): add "ping slave" command
5807 2004-01-14  Brian Warner  <warner@lothar.com>
5809         * buildbot/status/words.py (IrcStatusBot): when we leave or get
5810         kicked from a channel, log it
5812         * buildbot/master.py (Dispatcher): add "poke IRC" command to say
5813         something over whatever IRC channels the buildmaster is currently
5814         connected to. Added to try and track down a problem in which the
5815         master thinks it is still connected but the IRCd doesn't see it. I
5816         used a styles.Versioned this time, so hopefully users won't have
5817         to rebuild their .tap files this time.
5818         * contrib/debug.glade: add a "Poke IRC" button
5819         * contrib/debugclient.py: same
5821         * setup.py: bump to 0.4.2+ while between releases
5823 2004-01-08  Brian Warner  <warner@lothar.com>
5825         * setup.py (version): Releasing buildbot-0.4.2
5827 2004-01-08  Brian Warner  <warner@lothar.com>
5829         * NEWS: update for 0.4.2 release
5831         * README: document how to run the tests, now that they all pass
5833         * buildbot/changes/maildir.py (Maildir.poll): minor comment
5835         * buildbot/process/step.py (CVS): add a global_options= argument,
5836         which lets you set CVS global options for the command like "-r"
5837         for read-only checkout, or "-R" to avoid writing in the
5838         repository.
5839         * buildbot/slavecommand.py (CVSCommand): same
5841         * buildbot/status/event.py (Logfile): add a .doSwap switch to make
5842         testing easier (it is turned off when testing, to avoid the
5843         leftover timer)
5845         * buildbot/process/step.py (InternalBuildStep): shuffle code a bit
5846         to make it easier to test: break generateStepID() out to a
5847         separate function, only update statusbag if it exists.
5848         (ShellCommands): create useful text for dict-based commands too.
5850         * test/*, buildbot/test/*: move unit tests under the buildbot/
5851         directory
5852         * setup.py (packages): install buildbot.test too
5854         * buildbot/test/test_slavecommand.py: fix it, tests pass now
5855         * buildbot/test/test_steps.py: fix it, tests pass now
5857 2004-01-06  Brian Warner  <warner@lothar.com>
5859         * buildbot/changes/mail.py (parseFreshCVSMail): looks like new
5860         freshcvs mail uses a slightly different syntax for new
5861         directories. Update parser to handle either.
5862         * test/test_mailparse.py (Test1.testMsg9): test for same
5864 2003-12-21  Brian Warner  <warner@lothar.com>
5866         * buildbot/process/process_twisted.py (TwistedDebsBuildFactory): set
5867         'warnOnWarnings' so that lintian errors mark the build orange
5869 2003-12-17  Brian Warner  <warner@lothar.com>
5871         * buildbot/changes/mail.py (parseBonsaiMail): parser for commit
5872         messages emitted by Bonsai, contributed by Stephen Davis.
5874         * test/*: moved all tests to use trial instead of unittest. Some
5875         still fail (test_steps, test_slavecommand, and test_process).
5877         * setup.py (version): bump to 0.4.1+ while between releases
5879 2003-12-09  Brian Warner  <warner@lothar.com>
5881         * setup.py (version): Releasing buildbot-0.4.1
5883 2003-12-09  Brian Warner  <warner@lothar.com>
5885         * NEWS: update for 0.4.1 release
5887         * docs/examples/twisted_master.cfg: add netbsd builder, shuffle
5888         freebsd builder code a little bit
5890         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred.__cmp__):
5891         don't try to compare attributes of different classes
5892         * buildbot/changes/mail.py (MaildirSource.__cmp__): same
5893         (MaildirSource.messageReceived): fix Change delivery
5895         * buildbot/master.py (BuildMaster.loadConfig): insert 'basedir'
5896         into the config file's namespace before loading it, like the
5897         documentation claims it does
5898         * docs/examples/twisted_master.cfg: remove explicit 'basedir'
5899         (useFreshCVS): switch to using a maildir until Twisted's freshcvs
5900         daemon comes back online
5902 2003-12-08  Brian Warner  <warner@lothar.com>
5904         * docs/examples/twisted_master.cfg: provide an explicit 'basedir'
5905         so the example will work with online=0 as well
5907         * buildbot/changes/mail.py (FCMaildirSource, SyncmailMaildirSource):
5908         fix the __implements__ line
5910         * buildbot/changes/maildirtwisted.py (MaildirTwisted): make this
5911         class a twisted.application.service.Service, use startService to
5912         get it moving.
5914         * buildbot/changes/dnotify.py (DNotify): use os.open to get the
5915         directory fd instead of simple open(). I'm sure this used to work,
5916         but the current version of python refuses to open directories with
5917         open().
5919 2003-12-05  Brian Warner  <warner@lothar.com>
5921         * setup.py (version): bump to 0.4.0+ while between releases
5923 2003-12-05  Brian Warner  <warner@lothar.com>
5925         * setup.py (version): Releasing buildbot-0.4.0
5927 2003-12-05  Brian Warner  <warner@lothar.com>
5929         * docs/examples/glib_master.cfg: replace old sample scripts with
5930         new-style config files
5931         * MANIFEST.in: include .cfg files in distribution tarball
5933         * buildbot/changes/freshcvs.py (FreshCVSListener.remote_goodbye):
5934         implement a dummy method to avoid the exception that occurs when
5935         freshcvs sends this to us.
5937         * buildbot/pbutil.py (ReconnectingPBClientFactory.stopFactory):
5938         removed the method, as it broke reconnection. Apparently
5939         stopFactory is called each time the connection attempt fails. Must
5940         rethink this.
5941         (ReconnectingPBClientFactory.__getstate__): squash the _callID
5942         attribute before serialization, since without stopFactory the
5943         reconnect timer may still be active and they aren't serializable.
5945         * test/test_mailparse.py (ParseTest): test with 'self' argument
5947         * buildbot/changes/mail.py (parseFreshCVSMail): add (silly) 'self'
5948         argument, as these "functions" are invoked like methods from class
5949         attributes and therefore always get an instance as the first
5950         argument.
5952         * buildbot/changes/maildir.py (Maildir.start): fix error in error
5953         message: thanks to Stephen Davis for the catch
5955 2003-12-04  Brian Warner  <warner@lothar.com>
5957         * buildbot/pbutil.py: complete rewrite using PBClientFactory and
5958         twisted's standard ReconnectingClientFactory. Handles both oldcred
5959         and newcred connections. Also has a bug-workaround for
5960         ReconnectingClientFactory serializing its connector when it
5961         shouldn't.
5963         * buildbot/bot.py (BotFactory): rewrite connection layer with new
5964         pbutil. Replace makeApp stuff with proper newcred/mktap
5965         makeService(). Don't serialize Ephemerals on shutdown.
5967         * buildbot/changes/changes.py (ChangeMaster): make it a
5968         MultiService and add the sources as children, to get startService
5969         and stopService for free. This also gets rid of the .running flag.
5971         * buildbot/changes/freshcvs.py (FreshCVSSource): rewrite to use
5972         new pbutil, turn into a TCPClient at the same time (to get
5973         startService for free). Two variants exist: FreshCVSSourceOldcred
5974         and FreshCVSSourceNewcred (CVSToys doesn't actualy support newcred
5975         yet, but when it does, we'll be ready).
5976         (FreshCVSSource.notify): handle paths which are empty after the
5977         prefix is stripped. This only happens when the top-level (prefix)
5978         directory is added, at the very beginning of a Repository's life.
5980         * buildbot/clients/base.py: use new pbutil, clean up startup code.
5981         Now the only reconnecting code is in the factory where it belongs.
5982         (Builder.unsubscribe): unregister the disconnect callback when we
5983         delete the builder on command from the master (i.e. when the
5984         buildmaster is reconfigured and that builder goes away). This
5985         fixes a multiple-delete exception when the status client is shut
5986         down afterwards.
5987         * buildbot/clients/gtkPanes.py (GtkClient): cleanup, match the
5988         base Client. 
5990         * buildbot/status/words.py (IrcStatusBot): add some more sillyness
5991         (IrcStatusBot.getBuilderStatus): fix minor exception in error message
5993 2003-10-20  Christopher Armstrong  <radix@twistedmatrix.com>
5995         * contrib/run_maxq.py: Accept a testdir as an argument rather than
5996         a list of globs (ugh). The testdir will be searched for files
5997         named *.tests and run the tests in the order specified in each of
5998         those files. This allows for "dependancies" between tests to be
5999         codified.
6001         * buildbot/process/maxq.py (MaxQ.__init__): Accept a testdir
6002         argument to pass to run_maxq.py, instead of a glob.
6004 2003-10-17  Brian Warner  <warner@lothar.com>
6006         * buildbot/process/step_twisted.py (HLint.start): ignore .xhtml
6007         files that live in the sandbox
6009 2003-10-15  Brian Warner  <warner@lothar.com>
6011         * buildbot/process/step_twisted.py (ProcessDocs.finished): fix
6012         spelling error in "docs" count-warnings output
6013         (HLint.start): stupid thinko meant .xhtml files were ignored
6015         * docs/examples/twisted_master.cfg (reactors): disable cReactor
6016         tests now that cReactor is banished to the sandbox
6018 2003-10-10  Brian Warner  <warner@lothar.com>
6020         * buildbot/process/step_twisted.py (ProcessDocs, HLint): new Twisted
6021         scheme: now .xhtml are sources and .html are generated
6023 2003-10-08  Brian Warner  <warner@lothar.com>
6025         * buildbot/process/step_twisted.py (RunUnitTests.__init__): oops,
6026         we were ignoring the 'randomly' parameter.
6028 2003-10-01  Brian Warner  <warner@lothar.com>
6030         * buildbot/slavecommand.py (ShellCommand.start): set usePTY=1 on
6031         posix, to kill sub-children of aborted slavecommands.
6033         * buildbot/status/builder.py: rename Builder to BuilderStatus.
6034         Clean up initialization: lastBuildStatus remains None until the
6035         first build has been completed.
6037         * buildbot/status/html.py (WaterfallStatusResource.body): handle
6038         None as a lastBuildStatus
6039         * buildbot/clients/gtkPanes.py: same
6041         * buildbot/status/client.py (StatusClientService): keep
6042         BuilderStatus objects in self.statusbags . These objects now live
6043         here in the StatusClientService and are referenced by the Builder
6044         object, rather than the other way around.
6045         * buildbot/status/words.py (IrcStatusBot.getBuilderStatus): same
6046         * buildbot/process/base.py (Builder): same
6047         * test/test_config.py (ConfigTest.testBuilders): same
6049         * buildbot/master.py (BuildMaster.loadConfig_Builders): when modifying
6050         an existing builder, leave the statusbag alone. This will preserve the
6051         event history.
6053         * buildbot/pbutil.py (ReconnectingPB.connect): add initial newcred
6054         hook. This will probably go away in favor of a class in upcoming
6055         Twisted versions.
6057         * buildbot/changes/freshcvs.py (FreshCVSSource.start): Remove old
6058         serviceName from newcred FreshCVSNotifiee setup
6060 2003-09-29  Brian Warner  <warner@lothar.com>
6062         * buildbot/process/process_twisted.py: switch to new reactor
6063         abbreviations
6064         * docs/examples/twisted_master.cfg: same
6066         * README (REQUIREMENTS): mention twisted-1.0.8a3 requirement
6068         * buildbot/status/words.py (IrcStatusBot.getBuilder): use the
6069         botmaster reference instead of the oldapp service lookup
6071         * buildbot/master.py (BuildMaster.__init__): give the
6072         StatusClientService a reference to the botmaster to make it easier to
6073         force builds
6075 2003-09-24  Christopher Armstrong  <radix@twistedmatrix.com>
6077         * buildbot/status/html.py (Box.td): escape hreffy things so you
6078         can have spaces in things like builder names
6079         (StatusResourceBuilder.body)
6080         (WaterfallStatusResource.body)
6081         (WaterfallStatusResource.body0): same
6083 2003-09-25  Brian Warner  <warner@lothar.com>
6085         * buildbot/master.py (BuildMaster.loadConfig_Builders): don't
6086         rearrange the builder list when adding or removing builders: keep
6087         them in the order the user requested.
6088         * test/test_config.py (ConfigTest.testBuilders): verify it
6090         * contrib/debug.glade: give the debug window a name
6092         * buildbot/process/base.py (Builder.buildTimerFired): builders can
6093         now wait on multiple interlocks. Fix code relating to that.
6094         (Builder.checkInterlocks): same
6095         * buildbot/status/builder.py (Builder.currentlyInterlocked): same
6097         * buildbot/master.py (BuildMaster.loadConfig): move from
6098         deprecated pb.BrokerFactory to new pb.PBServerFactory
6099         * test/test_config.py (ConfigTest.testWebPathname): same
6101         * docs/examples/twisted_master.cfg: fix interlock declaration
6103         * buildbot/master.py (BotMaster.addInterlock): move code to attach
6104         Interlocks to their Builders into interlock.py .
6105         (BuildMaster.loadConfig_Interlocks): fix interlock handling
6107         * test/test_config.py (ConfigTest.testInterlocks): validate
6108         interlock handling
6110         * buildbot/process/base.py (Builder.__init__): better comments
6111         * buildbot/process/interlock.py (Interlock.__repr__): same
6112         (Interlock.deactivate): add .active flag, move the code that
6113         attaches/detaches builders into the Interlock
6115 2003-09-24  Christopher Armstrong  <radix@twistedmatrix.com>
6117         * buildbot/process/maxq.py (MaxQ): support for running a set of MaxQ
6118         tests using the new run_maxq.py script, and reporting failures by
6119         parsing its output.
6121         * contrib/run_maxq.py: Hacky little script for running a set of maxq
6122         tests, reporting their success or failure in a buildbot-friendly 
6123         manner.
6125 2003-09-24  Brian Warner  <warner@lothar.com>
6127         * docs/examples/twisted_master.cfg: example of a new-style config
6128         file. This lives in the buildmaster base directory as
6129         "master.cfg".
6131         * contrib/debugclient.py (DebugWidget.do_rebuild): add 'reload'
6132         button to make the master re-read its config file
6134         * buildbot/master.py (BuildMaster.loadConfig): new code to load
6135         buildmaster configuration from a file. This file can be re-read
6136         later, and the buildmaster will update itself to match the new
6137         desired configuration. Also use new Twisted Application class.
6138         * test/Makefile, test/test_config.py: unit tests for same
6140         * buildbot/changes/freshcvs.py (FreshCVSSource.__cmp__): make
6141         FreshCVSSources comparable, to support reload.
6142         * buildbot/changes/mail.py (MaildirSource.__cmp__): same
6144         * buildbot/process/base.py (Builder): make them comparable, make
6145         Interlocks easier to attach, to support reload. Handle
6146         re-attachment of remote slaves.
6147         * buildbot/process/interlock.py (Interlock): same
6149         * buildbot/bot.py, bb_tap.py, changes/changes.py: move to
6150         Twisted's new Application class. Requires Twisted >= 1.0.8 .
6151         buildmaster taps are now constructed with mktap.
6152         * buildbot/status/client.py (StatusClientService): same
6154         * buildbot/status/words.py: move to new Services, add support to
6155         connect to multiple networks, add reload support, allow nickname
6156         to be configured on a per-network basis
6158 2003-09-20  Brian Warner  <warner@lothar.com>
6160         * docs/examples/twisted_master.py (twisted_app): use python2.3 for
6161         the freebsd builder, now that the machine has been upgraded and no
6162         longer has python2.2
6164         * setup.py (version): bump to 0.3.5+ while between releases
6166 2003-09-19  Brian Warner  <warner@lothar.com>
6168         * setup.py (version): Releasing buildbot-0.3.5
6170 2003-09-19  Brian Warner  <warner@lothar.com>
6172         * NEWS: add post-0.3.4 notes
6174         * README (REQUIREMENTS): note twisted-1.0.7 requirement
6176         * MANIFEST.in: add contrib/*
6178         * docs/examples/twisted_master.py (twisted_app): all build slaves must
6179         use a remote root now: cvs.twistedmatrix.com
6181         * buildbot/changes/freshcvs.py (FreshCVSNotifiee.connect): update
6182         to newcred
6183         (FreshCVSNotifieeOldcred): but retain a class that uses oldcred for
6184         compatibility with old servers
6185         (FreshCVSSource.start): and provide a way to use it
6186         (FreshCVSNotifiee.disconnect): handle unconnected notifiee
6188         * docs/examples/twisted_master.py (twisted_app): update to new
6189         makeApp interface.
6190         (twisted_app): listen on new ~buildbot socket
6191         (twisted_app): Twisted CVS has moved to cvs.twistedmatrix.com
6193         * buildbot/process/process_twisted.py: Use 'copydir' on CVS steps
6194         to reduce cvs bandwidth (update instead of full checkout)
6196 2003-09-11  Brian Warner  <warner@lothar.com>
6198         * contrib/fakechange.py: demo how to connect to the changemaster
6199         port. You can use this technique to submit changes to the
6200         buildmaster from source control systems that offer a hook to run a
6201         script when changes are committed.
6203         * contrib/debugclient.py: tool to connect to the debug port. You
6204         can use it to force builds, submit fake changes, and wiggle the
6205         builder state
6207         * buildbot/master.py: the Big NewCred Reorganization. Use a single
6208         'Dispatcher' realm to handle all the different kinds of
6209         connections and Perspectives: buildslaves, the changemaster port,
6210         the debug port, and the status client port. NewCredPerspectives
6211         now have .attached/.detached methods called with the remote 'mind'
6212         reference, much like old perspectives did. All the pb.Services
6213         turned into ordinary app.ApplicationServices .
6214         (DebugService): went away, DebugPerspectives are now created
6215         directly by the Dispatcher.
6216         (makeApp): changed interface a little bit
6218         * buildbot/changes/changes.py: newcred
6219         * buildbot/status/client.py: newcred
6221         * buildbot/clients/base.py: newcred client side changes
6222         * buildbot/bot.py: ditto
6224         * docs/examples/glib_master.py: handle new makeApp() interface
6225         * docs/examples/twisted_master.py: ditto
6227         * buildbot/pbutil.py (NewCredPerspective): add a helper class to
6228         base newcred Perspectives on. This should go away once Twisted
6229         itself provides something sensible.
6232 2003-09-11  Christopher Armstrong  <radix@twistedmatrix.com>
6234         * contrib/svn_buildbot.py: A program that you can call from your
6235         SVNREPO/hooks/post-commit file that will notify a BuildBot master
6236         when a change in an SVN repository has happened. See the top of
6237         the file for some minimal usage info.
6239 2003-09-10  Christopher Armstrong  <radix@twistedmatrix.com>
6241         * buildbot/slavecommand.py (ArglistCommand): Add new
6242         ArglistCommand that takes an argument list rather than a string as
6243         a parameter. Using a st.split() for argv is very bad.
6245         * buildbot/slavecommand.py (SVNFetch): Now has the ability to
6246         update to a particular revision rather than always checking out
6247         (still not very smart about it, there may be cases where the
6248         checkout becomes inconsistent).
6250 2003-09-10  Christopher Armstrong  <radix@twistedmatrix.com>
6252         * buildbot/{bot.py,slavecommand.py,process/step.py}: Rudimentary
6253         SVN fetch support. It can checkout (not update!) a specified
6254         revision from a specified repository to a specified directory.
6256         * buildbot/status/progress.py (Expectations.update): Fix an
6257         obvious bug (apparently created by the change described in the
6258         previous ChangeLog message) by moving a check to *after* the
6259         variable it checks is defined.
6262 2003-09-08  Brian Warner  <warner@lothar.com>
6264         * buildbot/status/progress.py (Expectations.update): hack to catch
6265         an exception TTimo sees: sometimes the update() method seems to
6266         get called before the step has actually finished, so the .stopTime
6267         is not set, so no totalTime() is available and we average None
6268         with the previous value. Catch this and just don't update the
6269         metrics, and emit a log message.
6271 2003-08-24  Brian Warner  <warner@lothar.com>
6273         * buildbot/process/base.py (BasicBuildFactory): accept 'cvsCopy'
6274         parameter to set copydir='original' in CVS commands.
6276         * buildbot/process/step.py (CVS): accept 'copydir' parameter.
6278         * buildbot/slavecommand.py (CVSCommand): add 'copydir' parameter,
6279         which tells the command to maintain a separate original-source CVS
6280         workspace. For each build, this workspace will be updated, then
6281         the tree copied into a new workdir. This reduces CVS bandwidth
6282         (from a full checkout to a mere update) while doubling the local
6283         disk usage (to keep two copies of the tree).
6285 2003-08-21  Brian Warner  <warner@lothar.com>
6287         * buildbot/status/event.py (Logfile.addEntry): if the master web
6288         server dies while we're serving a page, request.write raises
6289         pb.DeadReferenceError . Catch this and treat it like a
6290         notifyFinish event by dropping the request.
6292 2003-08-18  Brian Warner  <warner@lothar.com>
6294         * buildbot/status/words.py (IrcStatusBot.command_FORCE): complain
6295         (instead of blowing up) if a force-build command is given without
6296         a reason field
6298         * buildbot/changes/changes.py (ChangeMaster.getChangeNumbered):
6299         don't blow up if there aren't yet any Changes in the list
6301 2003-08-02  Brian Warner  <warner@lothar.com>
6303         * buildbot/bot.py (updateApplication): don't set the .tap name,
6304         since we shouldn't assume we own the whole .tap file
6306         * buildbot/bb_tap.py (updateApplication): clean up code, detect
6307         'mktap buildbot' (without a subcommand) better
6309 2003-07-29  Brian Warner  <warner@lothar.com>
6311         * buildbot/status/words.py
6312         (IrcStatusFactory.clientConnectionLost): when we lose the
6313         connection to the IRC server, schedule a reconnection attempt.
6315         * buildbot/slavecommand.py (CVSCommand.doClobber): on non-posix,
6316         use shutil.rmtree instead of forking off an "rm -rf" command.
6317         rmtree may take a while and will block until it finishes, so we
6318         use "rm -rf" if available.
6320         * docs/examples/twisted_master.py: turn off kqreactor, it hangs
6321         freebsd buildslave badly
6323         * setup.py (version): bump to 0.3.4+ while between releases
6325 2003-07-28  Brian Warner  <warner@lothar.com>
6327         * setup.py (version): Releasing buildbot-0.3.4
6329 2003-07-28  Brian Warner  <warner@lothar.com>
6331         * NEWS: update in preparation for release
6333         * buildbot/slavecommand.py (ShellCommand.doTimeout): use
6334         process.signalProcess instead of os.kill, to improve w32
6335         portability
6337         * docs/examples/twisted_master.py (twisted_app): turn off
6338         win32eventreactor: the tests hang the buildslave badly
6340         * buildbot/process/base.py (Build.buildFinished): update ETA even on
6341         failed builds, since usually the failures are consistent
6343         * buildbot/process/process_twisted.py (TwistedReactorsBuildFactory):
6344         add compileOpts/compileOpts2 to reactors build
6346         * docs/examples/twisted_master.py (twisted_app): add "-c mingw32"
6347         (twisted_app): use both default and win32eventreactor on w32 build.
6348         Use both default and kqreactor on freebsd build.
6350         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
6351         add compileOpts2, which is put after the build_ext argument. w32
6352         needs "-c mingw32" here.
6354         * buildbot/status/html.py (StatusResourceBuilder.getChild): don't
6355         touch .acqpath, it goes away in recent Twisted releases
6357         * docs/examples/twisted_master.py (twisted_app): use "python" for
6358         the w32 buildslave, not "python2.2"
6360         * buildbot/bot.py (Bot.remote_getSlaveInfo): only look in info/ if
6361         the directory exists.. should hush an exception under w32
6363         * buildbot/slavecommand.py (ShellCommandPP.processEnded): use
6364         ProcessTerminated -provided values for signal and exitCode rather
6365         than parsing the unix status code directly. This should remove one
6366         more roadblock for a w32-hosted buildslave.
6368         * test/test_mailparse.py: add test cases for Syncmail parser
6370         * Buildbot/changes/freshcvsmail.py: remove leftover code, leave a
6371         temporary compatibility import. Note! Start importing
6372         FCMaildirSource from changes.mail instead of changes.freshcvsmail
6374         * buildbot/changes/mail.py (parseSyncmail): finish Syncmail parser
6376 2003-07-27  Brian Warner  <warner@lothar.com>
6378         * NEWS: started adding new features
6380         * buildbot/changes/mail.py: start work on Syncmail parser, move
6381         mail sources into their own file
6383         * buildbot/changes/freshcvs.py (FreshCVSNotifiee): mark the class
6384         as implementing IChangeSource
6385         * buildbot/changes/freshcvsmail.py (FCMaildirSource): ditto
6387         * buildbot/interfaces.py: define the IChangeSource interface
6389 2003-07-26  Brian Warner  <warner@lothar.com>
6391         * buildbot/master.py (makeApp): docstring (thanks to Kevin Turner)
6393 2003-06-25  Brian Warner  <warner@lothar.com>
6395         * buildbot/status/words.py (IrcStatusBot.emit_last): round off
6396         seconds display
6398 2003-06-17  Brian Warner  <warner@lothar.com>
6400         * buildbot/status/words.py: clean up method usage to avoid error
6401         in silly IRC command
6402         (IrcStatusBot.emit_status): round off seconds display
6404         * buildbot/process/base.py (Build): delete the timer when saving
6405         to the .tap file, and restore it (if it should still be running)
6406         upon restore. This should fix the "next build in -34 seconds"
6407         messages that result when the master is restarted while builds are
6408         sitting in the .waiting slot. If the time for the build has
6409         already passed, start it very soon (in 1 second).
6411         * buildbot/status/words.py: more silly commands
6413         * README (REQUIREMENTS): add URLs to all required software
6415         * buildbot/status/words.py ('last'): mention results of, and time
6416         since last build
6418 2003-05-28  Brian Warner  <warner@lothar.com>
6420         * buildbot/status/words.py: add 'last' command
6421         (IrcStatusBot.emit_status): add current-small text to 'status' output
6423         * docs/examples/twisted_master.py (twisted_app): turn on IRC bot
6424         (twisted_app): remove spaces from OS-X builder name
6426         * buildbot/master.py (makeApp): add knob to turn on IRC bot
6427         * buildbot/status/words.py: IRC bot should actually be useful now
6429 2003-05-23  Brian Warner  <warner@lothar.com>
6431         * buildbot/bot.py (Bot.remote_getSlaveInfo): add routines to get
6432         "slave information" from $(slavedir)/info/* . These files are
6433         maintained by the slave administrator, and describe the
6434         machine/environment that is hosting the slave. Information from
6435         them is put into the "Builder" HTML page. Still need to establish
6436         a set of well-known filenames and meanings for this data: at the
6437         moment, *all* info/* files are sent to the master, but only
6438         'admin' and 'host' are used on that end.
6439         * buildbot/status/html.py (StatusResourceBuilder.body): ditto
6440         * buildbot/process/base.py (Builder.setRemoteInfo):  ditto
6441         * buildbot/master.py (BotPerspective.got_info):  ditto
6443 2003-05-22  Brian Warner  <warner@lothar.com>
6445         * setup.py (version): bump version to 0.3.3+ while between releases
6447 2003-05-21  Brian Warner  <warner@lothar.com>
6449         * setup.py: Releasing buildbot-0.3.3
6451 2003-05-21  Brian Warner  <warner@lothar.com>
6453         * NEWS: 0.3.3 news items
6455         * README: describe --keepalive and life behind a NAT box
6457         * buildbot/bot.py (Bot.connected): implement application-level
6458         keepalives to deal with NAT timeouts, turn them on with
6459         --keepalive option or when SO_KEEPALIVE doesn't work.
6461         * buildbot/master.py (BotPerspective): accept keepalives silently
6463         * buildbot/process/base.py (Build.buildException): CopiedFailures
6464         don't carry as much information as local ones, so don't try to
6465         create a big HTMLized version of them.
6467         * buildbot/process/step.py (InternalShellCommand.stepFailed): close
6468         log file when step fails due to an exception, such as when the slave
6469         becomes unreachable
6471         * buildbot/process/step_twisted.py (RunUnitTests): use trial's new
6472         --testmodule argument instead of grepping for test-case-name tags
6473         ourselves. Remove FindUnitTests code.
6474         * buildbot/slavecommand.py, buildbot/bot.py: remove old code
6476         * MANIFEST.in: Add docs/examples, files under test/ . Oops!
6478 2003-05-16  Brian Warner  <warner@lothar.com>
6480         * buildbot/process/base.py (BasicBuildFactory): add 'configureEnv'
6481         argument to allow things like CFLAGS=-O0 to be passed without relying
6482         upon /bin/sh processing on the slave.
6484         * buildbot/process/step.py (InternalShellCommand.start): send
6485         'env' dict to slave
6486         * buildbot/slavecommand.py (ShellCommand.start): create argv with
6487         'split' instead of letting /bin/sh do it. This should also remove
6488         the need for /bin/sh on the buildslave, making it more likely to
6489         work with win32.
6491         * buildbot/status/html.py: html-escape text in blamelist.
6492         Add "force build" button to the Builder page.
6494         * buildbot/process/step_twisted.py (countFailedTests): look at
6495         last 1000 characters for status line, as import errors can put it
6496         before the -200 point.
6498 2003-05-15  Brian Warner  <warner@lothar.com>
6500         * docs/examples/twisted_master.py: use clobber=0 for remote builds
6502         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
6503         make 'clobber' a parameter, so it is possible to have builds which
6504         do full tests but do a cvs update instead of hammering the CVS
6505         server with a full checkout each build
6507         * buildbot/process/step.py (InternalShellCommand): bump default
6508         timeout to 20 minutes
6510         * buildbot/bot.py (Bot.debug_forceBuild): utility method to ask
6511         the master to trigger a build. Run it via manhole.
6513         * buildbot/master.py (BotPerspective.perspective_forceBuild):
6514         allow slaves to trigger any build that they host, to make life
6515         easier for slave admins who are testing out new build processes
6517         * buildbot/process/process_twisted.py (TwistedReactorsBuildFactory):
6518         don't flunk cReactor or qtreactor on failure, since they fail alot
6519         these days. Do warnOnFailure instead.
6521         * buildbot/process/base.py: change Builder.buildable from a list
6522         into a single slot. When we don't have a slave, new builds (once
6523         they make it past the timeout) are now merged into an existing
6524         buildable one instead of being queued. With this change, a slave
6525         which has been away for a while doesn't get pounded with all the
6526         builds it missed, but instead just does a single build.
6528 2003-05-07  Brian Warner  <warner@lothar.com>
6530         * setup.py (version): bump version to 0.3.2+ while between releases
6532 2003-05-07  Brian Warner  <warner@lothar.com>
6534         * setup.py: Releasing buildbot-0.3.2
6536 2003-05-07  Brian Warner  <warner@lothar.com>
6538         * setup.py: fix major packaging error: include subdirectories!
6539         
6540         * NEWS: add changes since last release
6542         * README (REQUIREMENTS): update twisted/python dependencies
6544         * buildbot/status/builder.py (Builder.startBuild): change
6545         BuildProcess API: now they should call startBuild/finishBuild
6546         instead of pushing firstEvent / setLastBuildStatus. Moving towards
6547         keeping a list of builds in the statusbag, to support other kinds of
6548         status delivery.
6549         (Builder.addClient): send current-activity-small to new clients
6550         * buildbot/process/base.py (Build.startBuild, .buildFinished): use
6551         new API
6553         * buildbot/status/client.py: drop RemoteReferences at shutdown
6555         * buildbot/status/event.py (Event.stoppedObserving): oops, add it
6557         * buildbot/status/progress.py (BuildProgress.remote_subscribe):
6558         more debug messages for remote status client
6560         * buildbot/process/step.py (InternalBuildStep.stepComplete)
6561         (.stepFailed): only fire the Deferred once, even if both
6562         stepComplete and stepFailed are called. I think this can happen if
6563         an exception occurs at a weird time.
6565         * buildbot/status/words.py: work-in-progress: IRC status delivery
6567 2003-05-05  Brian Warner  <warner@lothar.com>
6569         * docs/examples/twisted_master.py (twisted_app): hush internal
6570         python2.3 distutils deprecation warnings
6571         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
6572         add compileOpts= argument which inserts extra args before the
6573         "setup.py build_ext" command. This can be used to give -Wignore
6574         warnings, to hush some internal python-2.3 deprecation messages.
6576         * buildbot/process/step_twisted.py (RunUnitTests): parameterize
6577         the ['twisted.test'] default test case to make it easier to change
6578         in subclasses
6580         * buildbot/clients/base.py: switch to pb.Cacheable-style Events
6581         * buildbot/clients/gtkPanes.py: ditto
6583         * buildbot/process/step_twisted.py (RunUnitTests): use randomly=
6584         arg to collapse RunUnitTestsRandomly into RunUnitTests
6585         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
6586         use RunUnitTests(randomly=1) instead of RunUnitTestsRandomly
6588         * buildbot/status/html.py (StatusResource): shuffle Resources
6589         around to fix a bug: both 'http://foo:8080' and 'http://foo:8080/'
6590         would serve the waterfall display, but the internal links were
6591         only valid on the trailing-slash version. The correct behavior is
6592         for the non-slashed one to serve a Redirect to the slashed one.
6593         This only shows up when the buildbot page is hanging off another
6594         server, like a Twisted-Web distributed server.
6596         * buildbot/status/event.py (Event, RemoteEvent): make Events
6597         pb.Cacheable, with RemoteEvent as the cached version. This removes
6598         a lot of explicit send-an-update code.
6599         * buildbot/status/builder.py (Builder): remove send-update code
6600         * buildbot/status/client.py (ClientBuilder): remove send-update
6601         code, and log errors that occur during callRemote (mostly to catch
6602         InsecureJelly exceptions)
6604         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
6605         run Lore with the same python used in the rest of the build
6607         * buildbot/process/step_twisted2.py (RunUnitTestsJelly): moved
6609         * buildbot/process/step_twisted.py (HLint): accept 'python'
6610         argument. Catch rc!=0 and mark the step as failed. This marks the
6611         build orange ("has warnings").
6612         (RunUnitTestsJelly): move out to step_twisted2.py
6614         * buildbot/util.py (ignoreStaleRefs): add utility function
6616         * buildbot/master.py (DebugPerspective.perspective_setCurrentState):
6617         don't fake ETA object, it's too hard to get right
6619 2003-05-02  Brian Warner  <warner@lothar.com>
6621         * docs/examples/twisted_master.py (twisted_app): add FreeBSD builder
6623 2003-05-01  Brian Warner  <warner@lothar.com>
6625         * buildbot/status/html.py (StatusResource.body): oops, I was
6626         missing a <tr>, causing the waterfall page to be misrendered in
6627         everything except Galeon.
6629 2003-04-29  Brian Warner  <warner@lothar.com>
6631         * docs/examples/twisted_master.py: make debuild use python-2.2
6632         explicitly, now that Twisted stopped supporting 2.1
6634         * buildbot/process/step_twisted.py (BuildDebs.finishStatus): oops,
6635         handle tuple results too. I keep forgetting this, which suggests
6636         it needs to be rethought.
6638         * setup.py (setup): bump version to 0.3.1+ while between releases
6639         
6640 2003-04-29  Brian Warner  <warner@lothar.com>
6642         * setup.py: Releasing buildbot-0.3.1
6644 2003-04-29  Brian Warner  <warner@lothar.com>
6646         * README (SUPPORT): add plea to send questions to the mailing list
6648         * NEWS, MANIFEST.in: add description of recent changes
6650         * docs/examples/twisted_master.py: add the code used to create the
6651         Twisted buildmaster, with passwords and such removed out to a
6652         separate file.
6654         * buildbot/changes/changes.py, freshcvs.py, freshcvsmail.py: split
6655         out cvstoys-using bits from generic changes.py, to allow non-cvstoys
6656         buildmasters to not require CVSToys be installed.
6657         * README, docs/examples/glib_master: update to match the change
6659         * buildbot/clients/base.py, buildbot/bot.py,
6660         buildbot/changes/changes.py, buildbot/pbutil.py: copy
6661         ReconnectingPB from CVSToys distribution to remove CVSToys
6662         dependency for build slaves and status clients. Buildmasters which
6663         use FreshCVSSources still require cvstoys be installed, of course.
6665 2003-04-25  Brian Warner  <warner@lothar.com>
6667         * buildbot/process/process_twisted.py (FullTwistedBuildFactory): add
6668         runTestsRandomly arg to turn on trial -z
6670         * buildbot/process/step_twisted.py (TwistedJellyTestResults):
6671         experimental code to use trial's machine-parseable output to get
6672         more detailed test results. Still has some major issues.
6673         (RunUnitTestsRandomly): subclass to add "-z 0" option, runs tests
6674         in random sequence
6676         * buildbot/status/builder.py (Builder.setCurrentBuild):
6677         anticipating moving build history into statusbag, not used yet
6679         * buildbot/status/tests.py: code to centralize test results,
6680         doesn't work quite yet
6682         * buildbot/status/event.py (Event): use hasattr("setName") instead
6683         of isinstance for now.. need better long-term solution
6685         * buildbot/status/html.py: Remove old imports
6687 2003-04-24  Brian Warner  <warner@lothar.com>
6689         * buildbot/process/process_twisted.py (TwistedBuild.isFileImportant):
6690         ignore changes under doc/fun/ and sandbox/
6692         * buildbot/process/step_twisted.py: update pushEvent and friends.
6694         * buildbot/status/html.py (Box.td): replace event.buildername with
6695         event.parent.getSwappableName(). Needs more thought.
6697         * buildbot/status/builder.py (Builder): Replace pushEvent and
6698         getLastEvent with {set|update|addFileTo|finish}CurrentActivity.
6699         Tell events they are being pruned with event.delete().
6701         * buildbot/process/base.py (Build): Remove Builder status-handling
6702         methods. s/pushEvent/setCurrentActivity/.
6704         * buildbot/process/step.py (BuildStep): clean up status delivery.
6705         Gouse builder.statusbag methods instead of intermediate builder
6706         methods. s/updateLastEvent/updateCurrentActivity/.
6707         s/finalizeLastEvent/finishCurrentActivity/. Use
6708         addFileToCurrentActivity for summaryFunction.
6710         * buildbot/status/event.py (Logfile): put data in a Swappable when
6711         .finish is called.
6712         (Event): add more setter methods. Remove .buildername, use .parent
6713         and getSwappableName instead (needs more thought).
6715         * buildbot/util.py (Swappable):
6716         * test/test_swap.py: don't bother setting filename at __init__
6717         time, do it later. Change setFilename args to take parent first,
6718         since it provides the most significant part of the filename.
6720 2003-04-23  Brian Warner  <warner@lothar.com>
6722         * buildbot/status/event.py (Logfile.addEntry): append to previous
6723         entry, if possible
6725         * buildbot/process/step.py (BuildStep.finalizeLastEvent):
6726         anticipating Swappable
6727         (InternalShellCommand.remoteUpdate): split out various log-adding
6728         methods so subclasses can snarf stdout separately
6730         * buildbot/process/base.py (Builder.finalizeLastEvent): more code
6731         in anticipation of Swappable build logs
6732         (Builder.testsFinished): anticipating TestResults, still disabled
6734         * buildbot/status/builder.py (Builder.pruneEvents): only keep the
6735         last 100 events
6737         * buildbot/status/event.py (Logfile): add (disabled) support for
6738         Swappable, not ready for use yet
6740         * buildbot/util.py (Swappable): object which is swapped out to
6741         disk after some period of no use.
6742         * test/test_swap.py: test buildbot.utils.Swappable
6744 2003-04-14  Brian Warner  <warner@lothar.com>
6746         * buildbot/process/base.py (Builder.doPeriodicBuild): add simple
6747         periodic-build timer. Set the .periodicBuildTime on a builder
6748         instance to some number of seconds to activate it.
6750         * buildbot/master.py (BotMaster.forceBuild): change forceBuild API
6752         * buildbot/process/step.py (ShellCommand.finishStatus): use log.msg in
6753         a way that survives result tuples
6755 2003-04-12  Brian Warner  <warner@lothar.com>
6757         * buildbot/process/step.py (ShellCommand.finishStatusSummary):
6758         return a dict instead of a tuple: allow summarizers to provide
6759         multiple summaries if they want
6760         * buildbot/process/step_twisted.py (trialTextSummarizer): return dict
6761         (debuildSummarizer): summarize lintian warnings/errors
6763 2003-04-10  Brian Warner  <warner@lothar.com>
6765         * README (REQUIREMENTS): slave requires twisted-1.0.4a2
6767 2003-04-09  Brian Warner  <warner@lothar.com>
6769         * buildbot/process/step_twisted.py (trialTextSummarizer): Don't create
6770         empty summaries: happens when the tests fail so hard they don't emit
6771         a parseable summary line.
6773         * buildbot/process/step.py (ShellCommand.finishStatusSummary):
6774         Allow summaryFunction to return None to indicate no summary should
6775         be added.
6777         * buildbot/status/event.py (Logfile.removeHtmlWatcher): avoid
6778         writing to stale HTTP requests: notice when they disconnect and
6779         remove the request from the list. Also add CacheToFile from
6780         moshez, will be used later.
6782 2003-04-08  Brian Warner  <warner@lothar.com>
6784         * buildbot/process/step_twisted.py (ProcessDocs.finished): warnings
6785         should be an int, not a list of strings
6787         * buildbot/changes/changes.py (FreshCVSSource.stop): don't disconnect
6788         if we weren't actually connected
6790         * buildbot/process/step_twisted.py (trialTextSummarizer): function
6791         to show the tail end of the trial text output
6793         * buildbot/process/step.py (ShellCommand.finishStatusSummary): add
6794         hook to summarize the results of a ShellCommand
6796 2003-04-07  Brian Warner  <warner@lothar.com>
6798         * buildbot/process/step_twisted.py (RunUnitTests): consolidate all
6799         twisted test suite code into a single class.
6800         * buildbot/process/process_twisted.py: same
6802 2003-04-04  Brian Warner  <warner@lothar.com>
6804         * setup.py, MANIFEST.in: hack to make sure plugins.tml gets installed
6806         * README (SLAVE): document use of mktap to create slave .tap file
6807         (REQUIREMENTS): describe dependencies
6809         * buildbot/bb_tap.py, buildbot/plugins.tml:
6810         * buildbot/bot.py (updateApplication): Add mktap support for creating
6811         buildslave .tap files
6813 2003-03-28  Brian Warner  <warner@lothar.com>
6815         * buildbot/process/step.py (InternalShellCommand.finished): handle
6816         new tuple result values (fix embarrasing bug that appeared during
6817         PyCon demo)
6819 2003-03-27  Brian Warner  <warner@lothar.com>
6821         * docs/examples/glib_master.py, README: add sample buildmaster.tap
6822         -making program
6824 2003-03-25  Brian Warner  <warner@lothar.com>
6826         * buildbot/process/step.py (CVS, ShellCommand): add reason for failure
6827         to overall build status
6828         * buildbot/clients/base.py (Builder): improve event printing
6829         * buildbot/process/base.py (BasicBuildFactory): use specific steps
6830         instead of generic ShellCommand
6831         (Build): Add .stopBuild, use it when slave is detached
6833         * buildbot/process/step.py (Configure,Test): give the steps their
6834         own names and status strings
6836         * buildbot/status/html.py (StatusResource): add "show" argument,
6837         lets you limit the set of Builders being displayed.
6839 2003-03-20  Brian Warner  <warner@lothar.com>
6841         * buildbot/process/basic.py: removed
6843 2003-03-19  Brian Warner  <warner@lothar.com>
6845         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
6846         turn off process-docs by default
6848         * buildbot/process/base.py (Builder.getBuildNumbered): Don't blow up
6849         when displaying build information without anything in allBuilds[]
6851         * buildbot/bot.py (makeApp): really take password from sys.argv
6853 2003-03-18  Brian Warner  <warner@lothar.com>
6855         * buildbot/bot.py (buildApp): take password from sys.argv
6857         * README: replace with more useful text
6859         * setup.py: add a real one
6860         * MANIFEST.in, .cvsignore: more distutils packaging stuff
6861         
6862         * docs/PyCon-2003/: added sources for PyCon paper.
6864         * buildbot/process/base.py, step.py: revamp. BuildProcess is gone,
6865         now Build objects control the process and Builder only handles
6866         slave stuff and distribution of changes/status. A new BuildFactory
6867         class creates Build objects on demand.
6869         Created ConfigurableBuild which takes a list of steps to run. This
6870         makes it a lot easier to set up a new kind of build and moves us
6871         closer to being able to configure a build from a web page.
6873         * buildbot/process/step_twisted.py, process_twisted.py: move to
6874         new model. A lot of code went away.
6875         
6876         * buildbot/status/progress.py (BuildProgress.newProgress): Don't
6877         send lots of empty progress messages to the client.
6879         * buildbot/master.py (makeApp): enforce builder-name uniqueness
6881 2003-02-20  Brian Warner  <warner@lothar.com>
6883         * buildbot/process/step_twisted.py (BuildDebs): count lintian hits
6885         * buildbot/slavecommand.py (ShellCommand): back to usePTY=0. The
6886         Twisted bug that prevented non-pty processes from working just got
6887         fixed, and the bug that leaks ptys is still being investigated.
6889         * buildbot/process/step.py (CVS): send timeout arg to slave
6891         * buildbot/clients/gtkPanes.py: add connection-status row, handle
6892         builders coming and going
6893         * buildbot/clients/base.py: clean up protocol, move to ReconnectingPB
6894         from CVSToys, handle lost-buildmaster
6896         * buildbot/status/client.py (StatusClientService.removeBuilder):
6897         Clean up status client protocol: send builders (with references)
6898         as they are created, rather than sending a list and requiring the
6899         client to figure out which ones are new.
6900         * buildbot/master.py (BotMaster.forceBuild): Log debugclient
6901         attempts to force a build on an unknown builder
6903 2003-02-19  Brian Warner  <warner@lothar.com>
6905         * buildbot/slavecommand.py (CVSCommand): add timeout to sub-commands
6906         * buildbot/slavecommand.py (ShellCommand.start): stop using PTYs until
6907         Twisted stops leaking them.
6908         * buildbot/clients/gtkPanes.py (CompactBuilder): forget ETA when the
6909         builder goes to an idle state.
6911         * buildbot/slavecommand.py (ShellCommand.start): bring back PTYs until
6912         I figure out why CVS commands hang without them, and/or I fix the
6913         hung-command timeout
6915 2003-02-16  Brian Warner  <warner@lothar.com>
6917         * buildbot/process/step_twisted.py: bin/hlint went away, replace
6918         with 'bin/lore --output lint'. Use 'bin/trial -o' to remove
6919         ansi-color markup. Remove GenerateLore step. Count hlint warnings in
6920         GenerateDocs now that they are prefixed with WARNING:.
6922         * buildbot/status/html.py (StatusResource.body): Fix Builder link,
6923         use manual href target instead of request.childLink
6925         * buildbot/clients/gtkPanes.py: Fix progress countdown: update the
6926         display every second, but update the ETA every 5 seconds (or
6927         whenever) as remote_progress messages arrive.
6930 2003-02-12  Brian Warner  <warner@lothar.com>
6932         * *: import current sources from home CVS repository
6933         
6935 # Local Variables:
6936 # add-log-time-format: add-log-iso8601-time-string
6937 # End: