MailNotifier: assert that 'mode' is one of the supported values
[buildbot.git] / ChangeLog
blob403576f5f129710877da2c48c48e6a8dc3351673
1 2007-02-05  Brian Warner  <warner@lothar.com>
3         * buildbot/status/mail.py (MailNotifier.__init__): assert that 'mode'
4         is one of the three known values, otherwise we emit some confusing
5         messages later on. Thanks to Grig Gheorghiu for the catch.
7 2007-01-30  Brian Warner  <warner@lothar.com>
9         * buildbot/changes/bonsaipoller.py (BonsaiParser.__init__): Ben
10         Hearsum contributed a patch to let BonsaiPoller work with results
11         that contain non-ascii characters. Closes SF#1632641.
13 2007-01-27  Brian Warner  <warner@lothar.com>
15         * Makefile (release): produce both .tar.gz and .zip source bundles.
16         Closes SF#1222216.
18 2007-01-23  Brian Warner  <warner@lothar.com>
20         * buildbot/changes/freshcvsmail.py: hush a pyflakes warning
21         * buildbot/changes/monotone.py: same
23         * buildbot/changes/maildir.py: combine several files into one,
24         clean up maildir.py to use Services properly.
25         * buildbot/changes/maildirtwisted.py: remove
26         * buildbot/changes/maildirgtk.py: remove, it wasn't used by
27         buildbot anyways.
28         * buildbot/changes/mail.py: match the change
29         * buildbot/scheduler.py: same, since Try_Jobdir uses a maildir
30         * buildbot/test/test_maildir.py: remove use of reactor.iterate()
32         * buildbot/slave/commands.py (command_version): bump to "2.3" to
33         indicate that the buildslave knows about the 'bzr' command
35 2007-01-22  Brian Warner  <warner@lothar.com>
37         * buildbot/process/builder.py (Builder.fireTestEvent): don't use
38         'with', it will become a reserved work in python2.6 .
40         * contrib/bb_applet.py: add a simple gnome-panel applet, to
41         display a terse summary of buildbot status.
42         * docs/hexnut32.png, docs/hexnut48.png, docs/hexnut64.png: add
43         some icons, small versions of the Blender object that lives in
44         docs/images/icon.blend
46         * buildbot/steps/source.py (Bzr): add Bazaar-ng support
47         * buildbot/slave/commands.py (Bzr): same
48         * buildbot/scripts/tryclient.py (BzrExtractor): same
49         (SourceStampExtractor.dovc): modify this to allow non-zero exit
50         status, since 'bzr diff' does that
51         * buildbot/test/test_vc.py (Bzr): same
52         * docs/buildbot.texinfo (How Different VC Systems Specify Sources):
53         add notes on bzr
54         (Bzr): document it
56 2007-01-20  Brian Warner  <warner@lothar.com>
58         * contrib/darcs_buildbot.py: tidy up the progress messages
60 2007-01-17  Brian Warner  <warner@lothar.com>
62         * contrib/darcs_buildbot.py: enhance to handle multiple patches
63         being pushed at a time. This keeps state in the repository in a
64         small file named .darcs_buildbot-lastchange, but that shouldn't
65         interfere with normal repository operations. Fixes SF#1534049.
66         * buildbot/clients/sendchange.py (Sender): make a single Sender
67         capable of sending Changes with different usernames.
69 2006-12-11  Brian Warner  <warner@lothar.com>
71         * buildbot/changes/freshcvsmail.py: mark this file as deprecated,
72         scheduled for removal in 0.7.7 . The FCMaildirSource was moved to
73         buildbot.changes.mail a long time ago, but I forgot to add the
74         DeprecationWarning until now.
76         * buildbot/process/maxq.py: remove this, the functionality now
77         lives in buildbot.steps.maxq
79         * buildbot/clients/debug.py: remove an unnecessary gnome.ui import
80         * buildbot/clients/gtkPanes.py: remove unused import
82         * buildbot/slave/trial.py: remove an unused/incomplete/buggy file,
83         that was meant to provide a special Reporter to run inside trial
84         and give the buildslave lots of machine-readable status. We never
85         finished this project.
87         * buildbot/changes/bonsaipoller.py: remove unused imports
88         * buildbot/changes/svnpoller.py: same
89         * buildbot/process/builder.py: same
90         * buildbot/process/buildstep.py: same
91         * buildbot/slave/bot.py: hush pyflakes warning
92         * buildbot/status/tests.py: remove unused imports
93         * buildbot/status/tinderbox.py: same
94         * buildbot/steps/python_twisted.py: same
96         * buildbot/process/step.py: remove this file, these names were
97         deprecated in 0.7.5 and are now being removed.
98         * buildbot/process/step_twisted.py: same
99         * buildbot/test/test_steps.py (ReorgCompatibility): remove test
101         * buildbot/twcompat.py: remove the empty file, yay it is gone
103         * buildbot/twcompat.py (waitForDeferred): remove the monkeypatch,
104         tw-2.0.0 and newer have the method we need.
105         (getProcessOutputAndValue): same
106         (which): remove this method, tw-2.0.0 t.p.procutils has it
108         * buildbot/twcompat.py (implements): remove this method
109         * buildbot/*: import implements() from zope.interface directly
111         * buildbot/status/mail.py: stop falling back to importing
112         twisted.protocols.smtp.sendmail, now that we don't need tw-1.3.0
113         support
115         * buildbot/twcompat.py (Interface): remove this import
116         * buildbot/*: import Interface from zope.interface directly
118         * buildbot/twcompat.py (providedBy): remove this method
119         * buildbot/*: turn all uses of providedBy(obj, iface) into
120         iface.providedBy(obj)
122         * buildbot/twcompat.py (maybeWait): remove this method, now that
123         we no longer maintain compatibility with Twisted<=1.3.0 .
124         Twisted-2.0.0 and later allow trial methods to return Deferreds
125         directly.
126         * buildbot/test/*: remove all uses of maybeWait
128         * buildbot/__init__.py (version): bump to 0.7.5+ while between
129         releases
130         * docs/buildbot.texinfo: same
132 2006-12-10  Brian Warner  <warner@lothar.com>
134         * buildbot/__init__.py (version): Releasing buildbot-0.7.5
135         * docs/buildbot.texinfo: set version to match
137 2006-12-10  Brian Warner  <warner@lothar.com>
139         * README (REQUIREMENTS): update for release
140         * NEWS: update for release
141         * buildbot/slave/commands.py (command_version): mention that this
142         version (2.2) was released with buildbot-0.7.5
144         * buildbot/test/test_config.py (StartService.testStartService):
145         inhibit the usual read-config-on-startup behavior, since otherwise
146         the log.err that gets recorded causes the test to fail
148         * buildbot/status/builder.py (LogFile.finish): forget about all
149         subscribers once the log has finished, since after that point
150         we're never going to use them again. This might help free up some
151         memory somewhere.
153         * buildbot/clients/debug.py: update to use gtk.main_quit() rather
154         than the old/deprecated gtk.mainquit()
156 2006-12-09  Brian Warner  <warner@lothar.com>
158         * buildbot/steps/transfer.py (_FileWriter.__del__): handle errors
159         better when we can't open the masterdst file
161         * buildbot/scripts/startup.py (Follower._failure): add missing
162         import statement for BuildSlaveDetectedError
164         * buildbot/steps/transfer.py (FileUpload): cleanup
165         (FileDownload): same. Add tests for slave version, add mode=.
166         * buildbot/slave/commands.py (SlaveFileUploadCommand): same
167         (SlaveFileDownloadCommand): same
168         * buildbot/test/test_transfer.py: enhance tests
169         * buildbot/test/runutils.py (makeBuildStep): create a fake form of
170         step.slaveVersion
172 2006-12-08  Brian Warner  <warner@lothar.com>
174         * buildbot/scripts/runner.py (sendchange): halt the reactor on
175         both success *and* failure. Without this, the 'buildbot
176         sendchange' command would hang if it could not contact the
177         buildmaster or deliver the Change, which would generally cause the
178         user's commit/record/checkin command to hang too. Thanks to
179         Christian Unger for the catch.
181 2006-12-06  Brian Warner  <warner@lothar.com>
183         * NEWS: update with items for the next release
185         * docs/buildbot.texinfo (Adding LogObservers): add a somewhat
186         whimsical example pulled from a punch-drunk email I sent out late
187         one night.
188         (Transferring Files): document some of the other parameters
189         (Adding LogObservers): update to 0.7.5 buildbot.steps.*
190         (SVNPoller): rename svnpoller.SvnSource to SVNPoller
191         * buildbot/test/test_svnpoller.py: same
192         * buildbot/changes/svnpoller.py (SVNPoller): same
194 2006-11-26  Brian Warner  <warner@lothar.com>
196         * docs/buildbot.texinfo (Build Properties): remind users that
197         WithProperties must appear in a command= list, not as a top-level
198         instance.
199         * buildbot/steps/shell.py (ShellCommand.start): and assert that
200         we're sending a list or a single string to the RemoteShellCommand
202         * buildbot/scheduler.py (Nightly): Improve docs slightly.
204         * buildbot/scripts/startup.py (start): skip the whole
205         watch-the-logfile thing under windows, since it needs os.fork()
207         * buildbot/scripts/runner.py (restart): remove the old message
208         that got printed after the buildbot was restarted.. it most cases
209         it didn't get printed at the right time anyways
211 2006-11-25  Brian Warner  <warner@lothar.com>
213         * buildbot/scripts/runner.py: enhance 'start' and 'restart' to
214         follow twistd.log and print lines until the process has started
215         started properly. For the buildmaster, this means until the config
216         file has been parsed and accepted. For the buildslave, this means
217         until we've connected to the master. We give up after 5 seconds in
218         any case. Helpful error messages and troubleshooting suggestions
219         are printed when we don't see a successful startup. This closes the
220         remainder of SF#1517975.
221         * buildbot/scripts/startup.py: moved app startup code to here
222         * buildbot/scripts/logwatcher.py: utility class to follow log
223         * buildbot/scripts/reconfig.py: rewrite to use LogWatcher
224         * buildbot/slave/bot.py: announce our BuildSlaveness to the log
225         so the LogWatcher can tell the difference between a buildmaster
226         and a buildslave
228 2006-11-24  Brian Warner  <warner@lothar.com>
230         * docs/examples/twisted_master.cfg: update to match the version
231         in use on twistedmatrix.com
232         (IRC): re-enable IRC bot. The 'irc.us.freenode.net' hostname I
233         was using before stopped working, but 'irc.freenode.net' works
234         just fine.
236         * buildbot/scripts/runner.py (run): oops, forgot to enable the new
237         'reconfig' command
239         * buildbot/clients/base.py (TextClient.not_connected): upon
240         UnauthorizedLogin failures, remind the user to connect to the
241         PBListener port instead of the slaveport.
242         (TextClient.disconnected): shut down more quietly
243         * docs/buildbot.texinfo (statuslog): add another reminder
245         * buildbot/scripts/runner.py (Options.subCommands): rename
246         'buildbot sighup DIR' to 'buildbot reconfig DIR', but keep
247         'sighup' as an alias.
248         * buildbot/scripts/reconfig.py (Reconfigurator): enhance the
249         reconfig command to follow twistd.log and print all of the lines
250         from the start of the config-file reload to its completion. This
251         should make it a lot easier to discover bugs in the config file.
252         Use --quiet to disable this behavior. This addresses half of
253         SF#1517975, the other half will be to add this same utility to
254         'buildbot start' and 'buildbot restart'.
255         * docs/buildbot.texinfo (Loading the Config File): same
256         (Shutdown): same
258         * buildbot/interfaces.py (IBuilderControl.forceBuild): remove this
259         method, it has been deprecated for a long time. Use
260         IBuilderControl.requestBuild instead.
261         * buildbot/process/builder.py (BuilderControl.forceBuild): remove
262         * buildbot/master.py (BotPerspective.perspective_forceBuild): same
263         * buildbot/slave/bot.py (Bot.debug_forceBuild): same
264         * buildbot/test/test_control.py (Force.testForce): same
265         * buildbot/test/test_run.py: use requestBuild instead
267         * buildbot/clients/debug.py: replace 'Force Build' button with
268         'Request Build' (which just adds one to the queue), add Ping
269         Builder, add branch/revision fields to Request Build.
270         * buildbot/clients/debug.glade: same
271         * buildbot/master.py: update interface to match. This creates an
272         incompatibility between new debugclients and old buildmasters.
274         * buildbot/process/builder.py (Builder._attached): delay the call
275         to maybeStartBuild for a reactor turn, to avoid starting a build
276         in the middle of a reconfig (say, if the new Builder uses a new
277         slave which is already connected).
279 2006-11-23  Brian Warner  <warner@lothar.com>
281         * buildbot/test/test_transfer.py: appease pyflakes
282         * buildbot/test/test_steps.py: same
284         * buildbot/test/test_bonsaipoller.py: remove the 'import *' that
285         keeps pyflakes from finding undefined names
287         * buildbot/master.py (BuildMaster.loadConfig_Builders): changing a
288         Builder no longer induces a disconnect/reconnect cycle. This means
289         that any builds currently in progress will not be interrupted, and
290         any builds which are queued in the Builder will not be lost. This
291         is implemented by having the new Builder extract the state (i.e.
292         all pending Builds and any desired SlaveBuilders) from the old
293         Builder.
294         (BotPerspective): refactor. The BotPerspective no longer keeps
295         track of all the Builders that want to use this slave; instead, it
296         asks the BotMaster each time it needs this list. This removes
297         addBuilder and removeBuilder. Clean up attached() to acquire all
298         the slave's information in a more atomic fashion. updateSlave() is
299         now the way to make sure the slave is using the right set of
300         Builders: just call it after everything else has been
301         reconfigured.
302         (BotMaster): refactor, removing addBuilder/removeBuilder and
303         replacing them with an all-at-once setBuilders() call.
305         * buildbot/test/test_slaves.py (Reconfig): new test case to
306         exercise this functionality
307         * buildbot/steps/dummy.py (Wait): new dummy BuildStep for the test
308         * buildbot/slave/commands.py (WaitCommand): same
310         * docs/buildbot.texinfo (Loading the Config File): document the
311         changes
313         * buildbot/process/builder.py (SlaveBuilder): refactor. Allow the
314         SlaveBuilder to have its parent Builder changed.
315         (SlaveBuilder.isAvailable): new method to give access to state,
316         which is now a private attribute
317         (SlaveBuilder.buildStarted,buildFinished): new methods to inform
318         the SlaveBuilder about how it is being used. These methods update
319         its internal state. buildFinished() is now the place that invokes
320         maybeStartBuild() on its parent Builder.
321         (Builder.consumeTheSoulOfYourPredecessor): new method to allow a
322         new Builder to take over for an old one, transferring state from
323         the old one.
324         (Buider): refactor the way that SlaveBuilders are used to match,
325         giving them a bit more autonomy.
326         (Builder.buildFinished): this no longer calls maybeStartBuild():
327         instead the SlaveBuilder calls it on whoever its parent Builder is
328         at the time. This way, when an old Builder is replaced by a new
329         one, and there was a build in progress during the transition, when
330         that build finishes, it will be the new Builder that is told about
331         the newly available slave so it can start a new build.
333         * buildbot/process/base.py (Build.startBuild._release_slave): when
334         the Build finishes, tell the SlaveBuilder that they've been
335         released.
337         * buildbot/status/builder.py (SlaveStatus): add some new setter
338         methods for use by BotPerspective, to keep some attributes more
339         private
341         * buildbot/slave/bot.py (Bot.remote_getDirs): this is no longer
342         called by the buildmaster.
343         (Bot.setBuilderList): instead, we locally announce any leftover
344         directories based upon which Builders we were told about. The
345         master doesn't really care; it's the local admin who may or may not
346         wish to delete them.
349         * contrib/svn_buildbot.py: use /usr/bin/python, not /usr/bin/env,
350         to allow use of python2.4 or whatever. This tool still requires
351         python2.3 or newer.
353 2006-11-19  Brian Warner  <warner@lothar.com>
355         * NEWS (IStatusLog.readlines): more news items
357 2006-11-18  Brian Warner  <warner@lothar.com>
359         * NEWS: start collecting items for the next release.
361 2006-11-04  Brian Warner  <warner@lothar.com>
363         * buildbot/changes/bonsaipoller.py: apply updates from Ben
364         Hearsum. Closes SF#1590310.
365         * buildbot/test/test_bonsaipoller.py: and tests
367         * buildbot/status/tinderbox.py
368         (TinderboxMailNotifier.buildMessage): send out a "testfailed"
369         status when the build results in WARNINGS. Patch from Dave
370         Liebreich. Closes SF#1587352.
372         * buildbot/slave/commands.py (LogFileWatcher.poll): overcome a
373         linux-vs-osx behavior difference w.r.t. reading from files that
374         have reached EOF. This should fix LogFileWatcher on OS-X. Thanks
375         to Mark Rowe for the patch.
377 2006-10-15  Brian Warner  <warner@lothar.com>
379         * buildbot/interfaces.py (IStatus.getURLForThing): oops, the
380         method name was misspelled in the interface definition. Thanks to
381         Roy Rapoport for the catch.
383 2006-10-13  Brian Warner  <warner@lothar.com>
385         * docs/buildbot.texinfo (Adding LogObservers): update sample code
386         to match the great Steps renaming
388         * buildbot/steps/transfer.py (FileUpload.start): Fix stupid error.
389         Maybe I should run my own unit tests before recording a big
390         change. Good thing I've got a buildbot to remind me.
392 2006-10-12  Brian Warner  <warner@lothar.com>
394         * buildbot/steps/transfer.py: rework __init__ and args setup
395         * buildbot/slave/commands.py (SlaveFileDownloadCommand): minor
396         docs improvements
397         * buildbot/slave/commands.py (SlaveFileDownloadCommand.setup):
398         when opening the target file, only catch IOError (to report via
399         stderr/rc!=0), let the others be reported as normal exceptions
401 2006-10-08  Brian Warner  <warner@lothar.com>
403         * contrib/svn_watcher.py: fix security holes by using proper argv
404         arrays and subprocess.Popen() rather than commands.getoutput().
405         Thanks to Nick Mathewson for the patch. Note that svn_watcher.py
406         is deprecated in favor of buildbot/changes/svnpoller.py, and will
407         probably be removed by the next release.
408         * CREDITS: add Nick
410 2006-10-04  Brian Warner  <warner@lothar.com>
412         * buildbot/steps/python.py (PyFlakes.createSummary): skip any
413         initial lines that weren't emitted by pyflakes. When the pyflakes
414         command is run under a Makefile, 'make' will echo the command it
415         runs to stdio, and that was getting logged as a "misc" warning.
416         * buildbot/test/test_steps.py (Python.testPyFlakes2): test it
417         * buildbot/test/test_steps.py (testPyFlakes3): another test
419 2006-10-01  Brian Warner  <warner@lothar.com>
421         * buildbot/status/html.py (HtmlResource.render): if we get a
422         unicode object from our content() method, encode it into utf-8
423         like we've been claiming to all along. This allows the comments
424         and author names from svnpoller.py to be delivered properly.
426         * buildbot/changes/svnpoller.py (SvnSource.create_changes):
427         de-unicodify filenames before creating the Change, because the
428         rest of buildbot is unlikely to handle them well. Leave the 'who'
429         field as a unicode object.. I don't think there's anything that
430         will break very soon, and it will probably nudge us towards
431         accepting unicode everywhere sooner or later. Stop using the
432         "date" field that comes out of SVN, since it is using the
433         repository's clock (and timezone) and what we care about is the
434         buildmaster's (otherwise Changes from the future show up later
435         than the builds they triggered).
436         * buildbot/test/test_svnpoller.py (Everything.test1): match the
437         change to .when
439         * buildbot/changes/svnpoller.py (SvnSource): added Niklaus Giger's
440         Suvbersion repository polling ChangeSource. I've hacked it up
441         considerably: any bugs are entirely my own fault. Thank you
442         Niklaus!
443         * buildbot/test/test_svnpoller.py: tests for it
444         * docs/buildbot.texinfo (SvnSource): document it
446 2006-09-30  Brian Warner  <warner@lothar.com>
448         * buildbot/scheduler.py (Periodic): submit a reason= to the
449         BuildSet to indicate which Scheduler triggered the build. Thanks
450         to Mateusz Loskot for the suggestion.
451         (Nightly): same
452         * buildbot/test/test_scheduler.py (Scheduling.testPeriodic1): test it
454         * buildbot/changes/p4poller.py (P4Source): some minor stylistic
455         changes: set self.loop in __init__, remove unused volatile=
457         * docs/buildbot.texinfo (.buildbot config directory): add more
458         docs on the .buildbot/options keys used by "buildbot try"
459         * buildbot/scripts/tryclient.py (Try.createJob): remove dead code
460         (Try.deliverJob): same
462         * buildbot/changes/bonsaipoller.py (BonsaiParser): more updates
463         from Robert Helmer
464         (BonsaiPoller): same
466         * buildbot/slave/commands.py (LogFileWatcher.stop): explicitly
467         close the filehandle when we stop watching the file. Before, the
468         filehandle was only closed when the LogFileWatcher was
469         garbage-collected, which could be quite a while in the future. If
470         it was still open by the time the next build started, windows will
471         refuse to let the new build delete the old build/ directory. Fixes
472         SF#1568415, thanks to <scmikes>, <FireMoth>, and <radix> on
473         #twisted for the catch.
475 2006-09-29  Brian Warner  <warner@lothar.com>
477         * buildbot/status/tinderbox.py (TinderboxMailNotifier): updates
478         from Robert Helmer
480 2006-09-25  Brian Warner  <warner@lothar.com>
482         * setup.py: the new buildbot.steps module wasn't being installed.
483         Thanks to Jose Dapena Paz for the catch, fixes SF#1560631.
484         (testmsgs): add the extra stuff from buildbot/test/* so you can
485         run unit tests on an installed copy of buildbot, not just from
486         the source tree.
488         * contrib/svn_buildbot.py (ChangeSender.getChanges): the first *4*
489         columns of 'svnlook changed' output contain status information, so
490         strip [:4] instead of [:6]. Depending upon what the status flags
491         were, this would sometimes lead to mangled filenames. Thanks to
492         Riccardo Magliocchetti for the patch. Closes SF#1545146.
494         * buildbot/steps/source.py (Monotone): initial Monotone support,
495         contributed by Nathaniel Smith. Still needs docs and tests, but
496         this code has been in use on the Monotone buildbot for a long
497         time now.
498         * buildbot/slave/commands.py (Monotone): slave-side support
499         * buildbot/changes/monotone.py (MonotoneSource): polling change
500         source
502         * buildbot/changes/bonsaipoller.py (BonsaiPoller): Ben also
503         contributed a Change Source that polls a Bonsai server (a
504         kind of web-based viewcvs CGI script).
506         * buildbot/status/tinderbox.py (TinderboxMailNotifier): Ben
507         Hearsum contributed a status plugin which sends email in the same
508         format that Tinderbox does: this allows a number of tinderbox
509         tools to be driven by Buildbot instead. Thanks Ben!
511 2006-09-24  Brian Warner  <warner@lothar.com>
513         * buildbot/changes/mail.py (parseBonsaiMail): fix the parser.
514         Thanks to Robert Helmer for the patch.
516         * buildbot/process/base.py (Build.setupSlaveBuilder): tell our
517         BuildStatus about the buildslave name at the *beginning* of the
518         build, rather than at the end. Thanks to Alexander Lorenz for the
519         patch.
520         * buildbot/status/html.py (StatusResourceBuild.body): always
521         include the slavename in the build page, not just when the build
522         has finished.
523         * buildbot/status/mail.py (MailNotifier.buildMessage): include the
524         slavename in the email message
526 2006-09-21  Brian Warner  <warner@lothar.com>
528         * buildbot/scripts/sample.cfg: update to use new BuildStep classes
529         from buildbot.steps
530         * docs/examples/glib_master.cfg: same
531         * docs/examples/hello.cfg: same
532         * docs/examples/twisted_master.cfg: same, update to current usage
534 2006-09-19  Brian Warner  <warner@lothar.com>
536         * buildbot/steps/python.py (PyFlakes): refactor, add summary logs
537         (PyFlakes.createSummary): make it compatible with python-2.2
539         * buildbot/test/test_steps.py (Python.testPyFlakes): add a test
540         for at least the output-parsing parts of PyFlakes
542 2006-09-18  Brian Warner  <warner@lothar.com>
544         * buildbot/steps/python.py: oops, fix import of StringIO
546 2006-09-17  Brian Warner  <warner@lothar.com>
548         * buildbot/test/test_vc.py (VCBase._do_vctest_update_retry_1): it
549         turns out that SVN-1.4.0 doesn't fail to update once you've
550         replaced a file with a directory, unlike older versions of SVN and
551         pretty much every other VC tool we support. Since what we really
552         care about is that the update succeeds anyway, stop checking that
553         the tree got clobbered and just assert that the build succeeded.
554         (VCBase.printLogs): add a utility function for debugging
556         * buildbot/process/step.py: oops, added extra imports by mistake
558         * buildbot/changes/p4poller.py (P4Source._process_describe): do an
559         rstrip() on the first line coming out of the 'p4 describe'
560         process, to remove the stray ^M that Wade Brainerd reports seeing
561         in the 'when' field. Fixes SF#1555985.
563         * buildbot/master.py (BuildMaster.loadConfig): improve the error
564         message logged when c['schedulers'] is not right
565         * buildbot/scheduler.py (Scheduler.__init__): improve error
566         message when a Scheduler() is created with the wrong arguments
567         * buildbot/test/test_config.py (ConfigTest.testSchedulerErrors):
568         verify that these error messages are emitted
570         * buildbot/process/buildstep.py: rename step.py to buildstep.py .
571         The idea is that all the base classes (like BuildStep and
572         RemoteCommand and LogObserver) live in b.p.buildstep, and b.p.step
573         will be a leftover backwards-compatibility file that only contains
574         aliases for the steps that were moved out to buildbot.steps.*
575         * lots: change imports to match
576         * buildbot/process/step.py: add a DeprecationWarning if it ever
577         gets imported
579 2006-09-12  Brian Warner  <warner@lothar.com>
581         * buildbot/scheduler.py (Scheduler.__init__): make sure that
582         builderNames= is actually a sequence, since if you happen to give
583         it a single builder-specification dictionary instead, it won't get
584         caught by the existing assert. Thanks to Brett Neely for the
585         catch.
587         * buildbot/steps/python.py (BuildEPYDoc, PyFlakes): add new steps. No
588         tests yet, alas.
589         * docs/buildbot.texinfo (Python BuildSteps): document them
590         (sendchange): include a link to PBChangeSource, since you need one
592         * buildbot/steps/shell.py: clean up test-case-name line, remove some
593         unnecessary imports
594         * buildbot/steps/dummy.py: same
596 2006-09-08  Brian Warner  <warner@lothar.com>
598         * buildbot/steps/transfer.py (FileUpload,FileDownload): new
599         BuildStep which lets you transfer files from the master to the
600         slave or vice versa. Thanks to Albert Hofkamp for the original
601         patch. Fixes SF#1504631.
602         * buildbot/slave/commands.py (SlaveFileUploadCommand): slave-side
603         support for it
604         (SlaveFileDownloadCommand): same
605         * docs/buildbot.texinfo (Transferring Files): document it
606         * buildbot/test/test_transfer.py: test it
607         * buildbot/test/runutils.py (StepTester): new utility class for
608         testing BuildSteps and RemoteCommands without Builds or Bots or PB
609         * buildbot/test/test_steps.py (CheckStepTester): validate that the
610         utility class works
612         * buildbot/interfaces.py (IStatusLog.readlines): make it easier to
613         walk through StatusLogs one line at a time, mostly for the benefit
614         of ShellCommand.createSummary methods. You can either walk through
615         STDOUT or STDERR, but the default is STDOUT.
617         * buildbot/status/builder.py (LogFile.readlines): implement it.
618         Note that this is not yet memory-efficient, it just pulls the
619         whole file into RAM and then splits it up with a StringIO.
620         Eventually this should be a generator that only pulls chunks from
621         disk as necessary.
622         * buildbot/test/test_status.py (Log.testReadlines): test it
624         * docs/buildbot.texinfo: update to match changes
625         * buildbot/process/factory.py: stop using old definitions
626         * buildbot/process/process_twisted.py: same
627         * buildbot/test/test_*.py: same
629         * buildbot/process/step_twisted.py: move definition to..
630         * buildbot/steps/python_twisted.py: .. here, unfortunately python's
631         relative-import mechanisms prevent this from being named 'twisted'
632         or 'python/twisted' as I would have preferred.
634         * buildbot/process/maxq.py: move definition to..
635         * buildbot/steps/maxq.py: .. here, leave a compatibility import
637         * buildbot/process/step.py: split the user-visible BuildSteps into
638         separate files, all under buildbot/steps/
639         * buildbot/steps/source.py: this holds VC-checkout steps like SVN
640         * buildbot/steps/shell.py: this holds ShellCommand and friends
641         * buildbot/steps/dummy.py: this holds the testing steps like Dummy
643 2006-09-05  Brian Warner  <warner@lothar.com>
645         * lots: run pyflakes, removed a lot of unused imports, changed the
646         form of some conditional imports to remove false pyflakes
647         warnings. There are still a number of warnings left, mostly from
648         imports that are done for their side-effects.
649         * buildbot/test/test_vc.py: import twisted.python.failure, since it
650         was missing
652 2006-08-26  Brian Warner  <warner@lothar.com>
654         * buildbot/test/test_locks.py (Unit.testLater): make the tests
655         compatible with twisted-1.3.0, for some reason I just can't seem
656         to let go of the past.
658 2006-08-25  Brian Warner  <warner@lothar.com>
660         * buildbot/status/mail.py (MailNotifier.__init__): fix typo in docs
662         * buildbot/process/step.py (LoggingBuildStep.startCommand): set up
663         all logfiles= in startCommand(), rather than in start() . This
664         makes it easier to have the 'stdio' log come before any secondary
665         logfiles, which I feel makes the waterfall display more
666         understandable.
667         (LoggingBuildStep.setupLogfiles): move the addLog/cmd.useLog code
668         from ShellCommand up into LoggingBuildStep
669         (LoggingBuildStep.__init__): move the handling of logfiles= from
670         ShellCommand up to LoggingBuildStep, because startCommand is
671         provided by LoggingBuildStep, whereas start() was specific to
672         subclasses like ShellCommand and Source. This removes code
673         duplication in those subclasses.
674         (ShellCommand.__init__): same
675         (ShellCommand.checkForOldSlaveAndLogfiles): split out the check
676         for a slave that's too old to understand logfiles= into a separate
677         method, so it can live in ShellCommand. The rest of
678         setupLogfiles() can live in LoggingBuildStep.
680 2006-08-24  Brian Warner  <warner@lothar.com>
682         * buildbot/locks.py (BaseLock): you can now configure Locks to
683         allow multiple simultaneous owners. They still default to
684         maxCount=1. Fixes SF#1434997. Thanks to James Knight (foom) for
685         the patch.
686         * docs/buildbot.texinfo (Interlocks): document the new options
687         * buildbot/test/test_locks.py: add a bunch of new unit tests
688         * buildbot/process/base.py (Build.acquireLocks): locks now offer
689         waitUntilMaybeAvailable, not waitUntilAvailable
690         * buildbot/process/step.py (BuildStep.acquireLocks): same
691         * buildbot/master.py (BotMaster.getLockByID): real locks now use
692         the whole lockid in their constructor, not just the name. Also,
693         keep track of which real locks we've handed out by the full
694         lockid, not just class+name, otherwise changing just the maxCount=
695         in the master.cfg file would not actually cause a behavioral
696         change
698 2006-08-23  Brian Warner  <warner@lothar.com>
700         * buildbot/__init__.py (version): bump to 0.7.4+ while between
701         releases
702         * docs/buildbot.texinfo: same
704 2006-08-23  Brian Warner  <warner@lothar.com>
706         * buildbot/__init__.py (version): Releasing buildbot-0.7.4
707         * docs/buildbot.texinfo: set version to match
708         * NEWS: update for 0.7.4
709         * buildbot/slave/commands.py (command_version): mention that this
710         version (2.1) was released with buildbot-0.7.4
712 2006-08-22  Brian Warner  <warner@lothar.com>
714         * README: update
716         * CREDITS: new file, list of people who have helped. Thanks!
717         * MANIFEST.in: ship it
719         * MANIFEST.in: stop shipping the old PyCon-2003 paper.. with the
720         new diagrams, the user's manual is more informative than it was.
721         Start shipping the .html user's manual (and generated .png
722         images).
723         * Makefile: update 'release' target to match
725         * buildbot/test/test_web.py (GetURL.testBrokenStuff): delete this
726         test.. I think the web-parts effort will render it pointless well
727         before it ever actually starts to work.
729 2006-08-20  Brian Warner  <warner@lothar.com>
731         * buildbot/changes/pb.py (PBChangeSource): fix and simplify
732         meaning of the prefix= argument. It is now just a string which is
733         stripped from the beginning of the filename. If prefix= is set but
734         not found on any given filename, that filename is ignored. If all
735         filenames in a Change are ignored, the Change is dropped. This is
736         much simpler than the previous sep= nonsense, and I should have
737         implemented it this way from the beginning. Effectively resolves
738         SF#1217699 and SF#1381867. Thanks to Gary Granger and Marius
739         Gedminas for the catch and suggested fixes.
740         (ChangePerspective.perspective_addChange): implement the actual
741         prefix comparison
742         * buildbot/test/test_changes.py (TestChangePerspective): test it
743         * docs/buildbot.texinfo (PBChangeSource): document it, explain
744         how to properly use prefix=
745         * docs/examples/twisted_master.cfg (source): update prefix= by
746         adding the trailing slash
749         * docs/examples/twisted_master.cfg: update to actual practice
751         * buildbot/test/test_web.py (WaterfallSteps.test_urls): oops,
752         update test case to match new link text.. the HREF has both a
753         class= setting and an enclosing [] pair that I didn't match in the
754         test.
756         * docs/buildbot.texinfo (ShellCommand.command=): explain why a
757         list of strings is preferred over a single string with embedded
758         spaces
759         (ShellCommand.description=): explain that either single strings or
760         a list of strings is acceptable, and why you might prefer one over
761         the other. Add an example. Fixes SF#1524659, thanks to Paul
762         Winkler for the catch.
763         (Build Steps): update to use f.addStep() rather than using s()
764         and the constructor list
766         * buildbot/process/step.py (ShellCommand): accept either a single
767         string or a list of strings in both description= and
768         descriptionDone=
769         * buildbot/test/test_steps.py (Steps.test_description): test it
770         * buildbot/test/runutils.py (makeBuildStep): support for that test
772         * contrib/CSS/*.css: add some contributed CSS stylesheets, to make
773         the Waterfall display a bit less ugly. Thanks to John O'Duinn for
774         collecting the files and creating the patch.
776         * docs/buildbot.texinfo (BuildStep URLs): document new feature:
777         per-step URLs that will be displayed on the waterfall display,
778         for things like the HTML output of code-coverage tools, when
779         the results are hosted elsewhere.
780         * buildbot/interfaces.py (IBuildStepStatus.getURLs): document the
781         way to retrieve these URLs
782         * buildbot/status/builder.py (BuildStepStatus.getURLs): implement
783         the method to retrieve these URLs. Also provide backwards
784         compatibility for saved BuildStepStatus instances that didn't have
785         the .urls attribute
786         * buildbot/process/step.py (BuildStep.addURL): method to set these
787         URLs from within a BuildStep
788         * buildbot/status/html.py (StepBox.getBox): emit links to the URLs
789         (StepBox.getBox): give these external links a distinct CSS class
790         named "BuildStep external" so a .css file can display them
791         differently
793         * buildbot/test/test_web.py (WaterfallSteps): test that we really
794         do emit those links
795         * buildbot/test/test_steps.py (Steps): test that we can all the
796         URLs. Also add a bunch of other tests on methods that can be
797         called from within BuildSteps
798         * buildbot/test/runutils.py (makeBuildStep): add utility function
800 2006-08-13  Brian Warner  <warner@lothar.com>
802         * docs/buildbot.texinfo (BuildStep LogFiles): document them
804 2006-08-10  Brian Warner  <warner@lothar.com>
806         * docs/buildbot.texinfo (Index of master.cfg keys): add another
807         index, this one of things like c['sources'] and c['schedulers']
808         (indices): it looks like my clever idea of putting the @fooindex
809         commands in between the @node and the @subsection (to make the
810         HREF anchor jump to slightly above the section title, which works
811         much better in html) confused texinfo horribly, so I'm moving the
812         index tags back to be just after the @subsection marker. I also
813         added extra lines between the @node/@section paragraph and the
814         index tags, since I think maybe texinfo wants to see these be
815         separate paragraphs.
817         * docs/Makefile (images): make sure images get built when
818         rendering the manual
819         * docs/images/Makefile: same
821         * buildbot/scripts/runner.py: rename 'buildbot master' to
822         'buildbot create-master', and 'buildbot slave' to 'buildbot
823         create-slave'
824         * docs/buildbot.texinfo: same
825         * README: same
827         * docs/buildbot.texinfo: reimplement the "useful classes" index
828         with actual texinfo indices. The .info rendering is a bit
829         weird-looking but it works well, and the HTML rendering is quite
830         nice. This also puts the index targets in the regular flow of the
831         text, which is easier to maintain.
833 2006-08-06  Brian Warner  <warner@lothar.com>
835         * buildbot/slave/commands.py (ShellCommand.__init__): patch from
836         Kevin Turner to prefer the environ= argument be a list rather than
837         a string. If it is a list, it will be joined with a platform-local
838         os.pathsep delimiter, and then prepended to any existing
839         $PYTHONPATH value. This works better in cross-platform (i.e.
840         windows buildslaves) environments when you need to push multiple
841         directories onto the front of the path.
842         (SlaveShellCommand): documented the new magic
843         * docs/buildbot.texinfo (ShellCommand): documented the new magic
844         in a user-visible form
846         * buildbot/test/test_vc.py (BaseHelper.dovc): patch from Kevin
847         Turner to prefer lists over strings when creating/running VC
848         commands during unit tests. This is clearly necessary to survive
849         vcexe containing spaces, like "C:\Program Files\darcs.exe". I
850         renamed the wq() function to qw() though, since that's how it's
851         spelled in perl. Eventually I'd prefer all commands to be
852         specified with lists.
854         * buildbot/slave/commands.py (LogFileWatcher): handle logfiles
855         which are deleted (or not yet created) correctly. Also add
856         failsafe code to not explode if the file-watching poller doesn't
857         get started. Thanks to JP Calderone for the catch and the poller
858         patch.
859         * buildbot/test/test_shell.py (SlaveSide._testLogFiles): add test
860         for that case
861         * buildbot/test/emitlogs.py: same
863         * NEWS: summarize recent changes
865         * docs/buildbot.texinfo (Debug options): suggest an .ssh/options
866         clause to avoid the "host key mismatch" warning
868         * buildbot/process/step_twisted.py (Trial.start): if the
869         buildslave is too old to understand logfiles=, fall back to
870         running 'cat _trial_temp/test.log' like before.
871         (Trial.commandComplete): same. this takes advantage of the
872         LoggingBuildStep refactoring to stall commandComplete long enough
873         to run a second RemoteShellCommand.
875         * buildbot/process/step.py (LoggingBuildStep.startCommand):
876         refactor command-completion handling, to allow methods like
877         commandComplete/createSummary/evaluateCommand to return Deferreds.
878         (LoggingBuildStep._commandComplete): delete the refactored method
879         (ShellCommand.setupLogfiles): if the buildslave is too old to
880         understand logfiles=, put a warning message both into twistd.log
881         and into the otherwise empty user-visible LogFiles.
883         * buildbot/process/step.py (LoggedRemoteCommand.useLog): allow
884         callers to provide the slave-side logfile name, rather than
885         forcing it to come from the local name of the LogFile.
886         (BuildStep.getSlaveName): new method
888         * buildbot/process/base.py (Build.getSlaveName): new method, so
889         steps can find out which buildslave they're running on
891         * buildbot/test/test_steps.py (Version.checkCompare): oops, update
892         to match the s/cvs_ver/command_version/ change
894 2006-08-05  Brian Warner  <warner@lothar.com>
896         * buildbot/slave/commands.py (command_version): replace the CVS
897         auto-updated cvs_ver keyword with a manually-updated variable,
898         since CVS is no longer the master repository. Add a description of
899         the remote API change starting in this version (2.1), specifically
900         the fact that SlaveShellCommand now accepts 'initial_stdin',
901         'keep_stdin_open', and 'logfiles'.
903 2006-07-31  Brian Warner  <warner@lothar.com>
905         * docs/buildbot.texinfo (System Architecture): Finally add lots of
906         diagrams to describe how the whole system fits together. The
907         images themselves are kept in SVG files, with ascii-art versions
908         in corresponding .txt files. Texinfo knows how to interpolate the
909         text version into .info files, reference the .png versions from
910         .html files, and include .eps versions in the .ps format.
911         * docs/images/Makefile: tools to create .png and .eps
912         * docs/images/*.svg: created pictures with Inkscape.
913         * .darcs-boring: ignore the generated .eps and .png files
915 2006-07-24  Brian Warner  <warner@lothar.com>
917         * buildbot/master.py (BuildMaster.loadConfig): check for duplicate
918         Scheduler names, since they cause setServiceParent to explode
919         later.
920         * buildbot/test/test_config.py (ConfigTest._testSchedulers_7): test it
922 2006-07-20  Brian Warner  <warner@lothar.com>
924         * buildbot/scripts/sample.cfg: simplify the sample BuildFactory,
925         which runs the buildbot unit tests
927         * docs/buildbot.texinfo (Index of Useful Classes): add a table of
928         classes that are useful in master.cfg
930 2006-07-15  Brian Warner  <warner@lothar.com>
932         * Makefile (some-apidocs): new target to build only some epydocs
934         * setup.py: minor comment.. does the classifiers= argument prevent
935         the setup.py script from working on python2.2/2.3?
937         * buildbot/scripts/sample.cfg: update manhole example, arrange into
938         major sections
940         * buildbot/twcompat.py: fix minor typo in comments
942         * buildbot/manhole.py: move all Manhole-related code out to this
943         module. Implement SSH-based manholes (with TwistedConch), and move
944         to conch's nifty line-editing syntax-coloring REPL shell instead
945         of the boring non-editing monochromatic (and deprecated) old
946         'telnet' protocol.
947         * buildbot/master.py: remove all Manhole-related code
948         (BuildMaster.loadConfig._add): make sure the old manhole is
949         removed before we add the new one
950         * docs/buildbot.texinfo (Debug options): document new Manhole options
952         * buildbot/twcompat.py (_which): fix some epydoc issues
953         * buildbot/status/html.py (Waterfall.__init__): same
955 2006-06-29  Brian Warner  <warner@lothar.com>
957         * buildbot/interfaces.py: get Interface from b.twcompat to hush
958         deprecation warnings under newer Twisteds (by using
959         zope.interface.Interface instead of old twisted.python.components
960         stuff)
961         * buildbot/slave/interfaces.py: same
963 2006-06-28  Brian Warner  <warner@lothar.com>
965         * buildbot/slave/commands.py (SVN): add --non-interactive to all
966         svn commands, so it will fail immediately instead of hanging while
967         it waits for a username/password to be typed in.
969         * buildbot/slave/bot.py (SlaveBuilder.commandComplete): add minor
970         log message if the step was shut down
972         * buildbot/scripts/runner.py (SlaveOptions.longdesc): remove
973         obsolete reference to mktap.
975 2006-06-20  Brian Warner  <warner@lothar.com>
977         * buildbot/test/test_steps.py (BuildStep.testShellCommand1): update
978         test to include new 'logfiles' argument sent from master to slave
980 2006-06-19  Brian Warner  <warner@lothar.com>
982         * buildbot/process/step_twisted.py (Trial): track Progress from
983         _trial_temp/test.log too
985         * buildbot/process/step.py (OutputProgressObserver): generalize
986         the earlier StdioProgressObserver into an OutputProgressObserver
987         that can track LogFiles other than stdio.
988         (LoggingBuildStep.__init__): same
990         * buildbot/process/step_twisted.py (Trial): use logfiles= to track
991         _trial_temp/test.log, not a separate 'cat' command. TODO: this
992         will fail under windows because of os.sep issues. It might have
993         worked before if 'cat' was doing cygwin path conversion.
995         * buildbot/slave/commands.py (LogFileWatcher.__init__): note the
996         creation of LogFileWatchers
997         (ShellCommand._startCommand): and record the files that were
998         watched in the 'headers' section of the ShellCommand output
1000         * buildbot/process/step.py (RemoteShellCommand.__init__): duh, you
1001         need to actually pass it to the slave if you want it to work.
1002         (ShellCommand): document it a bit
1004         * buildbot/test/test_shell.py: new test to validate LogFiles
1005         * buildbot/test/runutils.py (SlaveCommandTestBase): updates to
1006         test LogFiles
1007         * buildbot/test/emitlogs.py: enhance to wait for a line on stdin
1008         before printing the last batch of lines, to test that the polling
1009         logic is working properly
1011         * buildbot/process/step.py (LoggedRemoteCommand): improve LogFile
1012         handling, making it possible to track multiple logs for a single
1013         RemoteCommand. The previous single logfile is now known as the
1014         'stdio' log.
1015         (LoggedRemoteCommand.remoteUpdate): accept key='log' updates
1016         (RemoteShellCommand.__init__): accept logfiles=
1017         (LoggingBuildStep.startCommand): stdio_log is now one of many
1018         (ShellCommand): added logfiles= argument, as well as a class-level
1019         .logfiles attribute, which will be merged together to figure out
1020         which logfiles should be tracked. The latter maybe be useful for
1021         subclasses of ShellCommand which know they will aways produce
1022         secondary logfiles in the same location.
1024         * buildbot/slave/commands.py (ShellCommandPP): add writeStdin()
1025         and closeStdin() methods, preparing to make it possible to write
1026         to a ShellCommand's stdin at any time, not just at startup. These
1027         writes are buffered if the child process hasn't started yet.
1028         (LogFileWatcher): new helper class to watch arbitrary logfiles
1029         while a ShellCommand runs. This class polls the file every two
1030         seconds, and sends back 10k chunks to the buildmaster.
1031         (ShellCommand): rename stdin= to initialStdin=, and add
1032         keepStdinOpen= and logfiles= to arguments. Set up LogFileWatchers
1033         at startup.
1034         (ShellCommand.addLogfile): LogFile text is sent in updates with a
1035         key of "log" and a value of (logname, data).
1036         (SlaveShellCommand): add 'initial_stdin', 'keep_stdin_open', and
1037         'logfiles' to the master-visible args dictionary.
1038         (SourceBase.doPatch): match s/stdin/initialStdin/ change
1039         (CVS.start): same
1040         (P4.doVCFull): same
1041         * buildbot/test/test_vc.py (Patch.testPatch): same
1044         * buildbot/test/emit.py: write to a logfile in the current
1045         directory. We use this to figure out what was used as a basedir
1046         rather than looking to see which copy of emit.py gets run, so that
1047         we can run the commands from inside _trial_temp rather than inside
1048         buildbot/test
1049         * buildbot/test/subdir/emit.py: same
1050         * buildbot/test/runutils.py (FakeSlaveBuilder): take a 'basedir'
1051         argument rather than running from buildbot/test/
1052         (SlaveCommandTestBase.setUpBuilder): explicitly set up the Builder
1053         rather than using an implicit setUp()
1054         * buildbot/test/test_slavecommand.py (ShellBase.setUp): same
1055         (ShellBase.testShell1, etc): use explicit path to emit.py instead
1056         of assuming that we're running in buildbot/test/ (and that '.' is
1057         on our $PATH)
1059         * buildbot/slave/commands.py (Command.doStart): refactor Command
1060         startup/completion a bit: now the SlaveBuilder calls doStart(),
1061         which is not meant for overridding by subclasses, and doStart()
1062         calls start(), which is. Likewise the SlaveBuilder calls
1063         doInterrupt(), and subclasses override interrupt(). This also puts
1064         responsibility for maintaining .running in Command rather than in
1065         SlaveBuilder.
1066         (Command.doInterrupt): same
1067         (Command.commandComplete): same, this is called when the deferred
1068         returned by start() completes.
1069         * buildbot/slave/bot.py (SlaveBuilder.remote_startCommand): same
1070         (SlaveBuilder.remote_interruptCommand): same
1071         (SlaveBuilder.stopCommand): same
1073 2006-06-16  Brian Warner  <warner@lothar.com>
1075         * buildbot/test/test_shell.py: new test file to contain everything
1076         relating to ShellCommand
1077         (SlaveSide.testLogFiles): (todo) test for the upcoming "watch
1078         multiple logfiles in realtime" feature, not yet implemented
1079         * buildbot/test/emitlogs.py: support file for testLogFiles
1080         * docs/buildbot.texinfo (ShellCommand): document the feature
1082         * buildbot/test/test_steps.py (BuildStep.setUp): rmtree refactoring
1084         * buildbot/test/runutils.py (SlaveCommandTestBase): utility class
1085         for tests which exercise SlaveCommands in isolation.
1087         * buildbot/test/test_slavecommand.py: Move some utilities like
1088         SignalMixin and FakeSlaveBuilder from here ..
1089         * buildbot/test/runutils.py: .. to here, so they can be used by
1090         other test classes too
1091         * buildbot/test/test_vc.py: more SignalMixin refactoring
1092         * buildbot/test/test_control.py: same
1093         * buildbot/test/test_run.py: and some rmtree refactoring
1095 2006-06-15  Brian Warner  <warner@lothar.com>
1097         * buildbot/test/test_vc.py (P4.testCheckoutBranch): rename from
1098         'testBranch' to match other VC tests and have the tests run in
1099         roughly increasing order of dependency
1101         * buildbot/test/test_steps.py (LogObserver): new test to verify
1102         LogObservers can be created at various times and still get
1103         connected up properly
1105         * buildbot/test/runutils.py (setupBuildStepStatus): utility method
1106         to create BuildStepStatus instances that actually work.
1108         * buildbot/process/step.py (LogObserver): add outReceived and
1109         errReceived base methods, to be overridden
1111         * buildbot/status/builder.py (BuildStatus.addStepWithName): change
1112         API to take a name instead of a step, reducing the coupling
1113         somewhat. This returns the BuildStepStatus object so it can be
1114         passed to the new Step, instead of jamming it directly into the
1115         Step.
1116         * buildbot/process/step.py (BuildStep.setStepStatus): add a setter
1117         method
1118         * buildbot/process/base.py (Build.setupBuild): use both methods
1119         * buildbot/test/test_web.py (Logfile.setUp): rearrange the setup
1120         process a bit to match
1122 2006-06-14  Brian Warner  <warner@lothar.com>
1124         * docs/buildbot.texinfo (Adding LogObservers): add some limited
1125         docs on writing new LogObserver classes
1126         (Writing New Status Plugins): brief docs on how Status Plugins fit
1127         together
1129         * buildbot/process/step_twisted.py (TrialTestCaseCounter):
1130         implement a LogObserver that counts how many unit tests have been
1131         run so far
1132         (Trial.__init__): wire it in
1133         * buildbot/test/test_twisted.py (Counter): unit test for it
1135         * buildbot/process/step_twisted.py (HLint.commandComplete): update
1136         to new cmd.logs['stdio'] scheme
1137         (Trial.commandComplete): same
1138         (BuildDebs.commandComplete): same
1140         * buildbot/process/step.py (LoggedRemoteCommand): use a dict of
1141         LogFiles, instead of just a single one. The old single logfile is
1142         now called "stdio". LoggedRemoteCommand no longer creates a
1143         LogFile for you (the code to do that was broken anyway). If you
1144         don't create a "stdio" LogFile, then stdout/stderr will be
1145         discarded.
1146         (LogObserver): implement "LogObservers", which a BuildStep can add
1147         to parse the output of a command in real-time. The primary use is
1148         to provide more useful information to the Progress code, allowing
1149         better ETA estimates.
1150         (LogLineObserver): utility subclass which feeds complete lines to
1151         the parser instead of bytes.
1152         (BuildStep.progressMetrics): this is safer as a tuple
1153         (BuildStep.setProgress): utility method, meant to be called by
1154         LogObservers
1155         (BuildStep.addLogObserver): new method, to be called at any time
1156         during the BuildStep (even before any LogFiles have been created),
1157         to attach (or schedule for eventual attachment) a LogObserver to a
1158         LogFile.
1159         (StdioProgressObserver): new LogObserver which replaces the old
1160         "output" progress gatherer
1161         (LoggingBuildStep.__init__): same
1162         (LoggingBuildStep.startCommand): set up the "stdio" LogFile
1163         (LoggingBuildStep._commandComplete): must use logs['stdio']
1164         instead of the old single ".log" attribute.
1165         * buildbot/status/builder.py (LogFile): remove old logProgressTo
1166         functionality, now subsumed into StdioProgressObserver
1167         * buildbot/test/test_status.py (Subscription._testSlave_2): the
1168         log name changed from "output" to "stdio".
1171         * buildbot/interfaces.py (ILogFile): add the Interface used from
1172         the BuildStep towards the LogFile
1173         (ILogObserver): and the one provided by a LogObserver
1174         * buildbot/status/builder.py (LogFile): implement it
1176         * buildbot/interfaces.py (LOG_CHANNEL_*): move STDOUT / STDERR /
1177         HEADER constants here ..
1178         * buildbot/status/builder.py (STDOUT): .. from here
1180 2006-06-13  Brian Warner  <warner@lothar.com>
1182         * buildbot/test/test_p4poller.py (TestP4Poller.failUnlessIn): fix
1183         compatibility with python2.2, which doesn't have the 'substr in
1184         str' feature.
1185         (TestP4Poller.makeTime): utility function to construct the
1186         timestamp using the same strptime() approach as p4poller does. It
1187         turns out that time.mktime() behaves slightly differently under
1188         python2.2, probably something to do with the DST flag, and that
1189         causes the test to fail under python2.2. (changing the mktime()
1190         arguments to have dst=0 instead of -1 caused it to fail under
1191         python2.3. Go figure.)
1192         (TestP4Poller._testCheck3): use our makeTime() instead of mktime()
1194 2006-06-12  Brian Warner  <warner@lothar.com>
1196         * buildbot/process/step.py (P4): merge in patch SF#1473939, adding
1197         proper Perforce (P4) support. Many many thanks to Scott Lamb for
1198         contributing such an excellent patch, including docs and unit
1199         tests! This makes it *so* much easier to apply. I had to update
1200         test_vc.py to handle some recent refactorings, but everything else
1201         applied smoothly. The only remaining thing I'd like to fix would
1202         be to remove the hard-wired port 1666 used by p4d, and allow it to
1203         claim any unused port. This would allow two copies of the test
1204         suite to run on the same host at the same time, as well as
1205         allowing the test suite to run while a real (production) p4d was
1206         running on the same host. Oh, and maybe we should add a warning to
1207         step.P4 that gets emitted if the slave is too old to provide the
1208         'p4' SlaveCommand. Otherwise it looks great. (closes: SF#1473939).
1209         * buildbot/slave/commands.py (P4): same
1210         (P4Sync): same, some minor updates
1211         * buildbot/changes/p4poller.py: same
1212         * docs/buildbot.texinfo: same
1213         * buildbot/test/test_p4poller.py: same
1214         * buildbot/test/test_vc.py (P4): same
1216         * setup.py: add Trove classifiers for PyPI
1218 2006-06-08  Brian Warner  <warner@allmydata.com>
1220         * buildbot/status/client.py
1221         (RemoteBuilder.remote_getCurrentBuilds): oops, I screwed up when
1222         changing this from getCurrentBuild() to getCurrentBuilds(). Each
1223         build needs to be IRemote'd separately, rather than IRemote'ing
1224         the whole list at once. I can't wait until newpb's serialization
1225         adapters make this unnecessary.
1227 2006-06-06  Brian Warner  <warner@lothar.com>
1229         * buildbot/process/step.py (WithProperties): make this inherit
1230         from ComparableMixin, so that reloading an unchanged config file
1231         doesn't cause us to spuriously reload any Builders which use them.
1232         * buildbot/test/test_config.py (ConfigTest.testWithProperties):
1233         add a test for it
1235 2006-06-03  Brian Warner  <warner@lothar.com>
1237         * contrib/windows/{setup.py, buildbot_service.py}: add support for
1238         running py2exe on windows, contributed by Mark Hammond. Addresses
1239         SF#1401121, but I think we still need to include
1240         buildbot/scripts/sample.cfg
1241         * setup.py: include buildbot_service.py as a script under windows
1242         * buildbot/status/html.py: when sys.frozen (i.e. we're running in
1243         a py2exe application), get the icon/css datafiles from a different
1244         place than usual.
1246         * buildbot/status/mail.py (MailNotifier.buildMessage): don't
1247         double-escape the build URL. Thanks to Olivier Bonnet for the
1248         patch. Fixes SF#1452801.
1250 2006-06-02  Brian Warner  <warner@lothar.com>
1252         * contrib/svn_buildbot.py (ChangeSender.getChanges): ignore the
1253         first six columns of 'svnlook' output, not just the first column,
1254         since property changes appear in the other five. Thanks to Olivier
1255         Bonnet for the patch. Fixes SF#1398174.
1257 2006-06-01  Brian Warner  <warner@lothar.com>
1259         * buildbot/test/test_web.py (Logfile.setUp): set the .reason on
1260         the fake build, so that title= has something to be set to
1262         * buildbot/status/html.py (BuildBox.getBox): set the 'title='
1263         attribute of the "Build #NN" link in the yellow start-the-build
1264         box to the build's reason. This means that you get a little
1265         tooltip explaining why the build was done when you hover over the
1266         yellow box. Thanks to Zandr Milewski for the suggestion.
1268         * buildbot/clients/gtkPanes.py (Box.setColor): ignore color=None
1269         (Box.setETA): handle ETA=None (by stopping the timer)
1270         (Box.update): make the [soon] text less different than the usual
1271         text, so the rest of the text doesn't flop around so much. It
1272         would be awfully nice to figure out how to center this stuff.
1273         (ThreeRowBuilder.stepETAUpdate): more debugging printouts
1275         * buildbot/process/step.py (ShellCommand): set flunkOnFailure=True
1276         by default, so that any ShellCommand which fails marks the overall
1277         build as a failure. I should have done this from the beginning.
1278         Add flunkOnFailure=False to the arguments if you want to turn off
1279         this behavior.
1281 2006-05-30  Brian Warner  <warner@lothar.com>
1283         * buildbot/clients/gtkPanes.py: add a third row: now it shows
1284         last-build/current-build/current-step. Show what step is currently
1285         running. Show ETA for both the overall build and the current step.
1286         Update GTK calls to modern non-deprecated forms. There's still a
1287         lot of dead code and debug noise to remove.
1289         * buildbot/process/step_twisted.py (Trial): set the step name, so it
1290         shows up properly in status displays
1292 2006-05-28  Brian Warner  <warner@lothar.com>
1294         * buildbot/test/test_properties.py (Run.testInterpolate): on the
1295         build we use to verify that WithProperties works:
1297         ** set flunkOnFailure=True so that build failures get noticed
1298         ** set workdir='.' so that the build succeeds, otherwise it is trying
1299             to touch 'build/something', and 'build/' doesn't exist because
1300             usually that's created by a Source step
1301         ** set timeout=10, because Twisted-1.3.0 has a race condition that
1302             this test somehow triggers, in which the 'touch' process becomes
1303             a zombie and we wait for th etimeout before giving up on it.
1305         * buildbot/test/runutils.py (RunMixin.logBuildResults): utility method
1306         to log the Build results and step logs to the twisted log.
1307         (RunMixin.failUnlessBuildSucceeded): use logBuildResults to record
1308         what went wrong if a build was expected to succeed but didn't.
1310         * buildbot/process/step_twisted.py (Trial): set the default
1311         trialMode to '--reporter=bwverbose', which specifies verbose
1312         black-and-white text. Back in twisted-1.3/2.0 days we had to use
1313         '-to', but those are completely missing in modern Twisteds.
1315         * buildbot/scripts/sample.cfg: make the sample Manhole config use
1316         a localhost-only port, to encourage better security
1318         * docs/buildbot.texinfo (Change Sources): mention
1319         darcs_buildbot.py
1321         * .darcs-boring: add a Darcs boringfile
1323         * README (REQUIREMENTS): stop claiming compatibility with
1324         Twisted-1.3.0
1326         * contrib/darcs_buildbot.py: write a darcs-commit-hook change
1327         sender
1329 2006-05-27  Brian Warner  <warner@lothar.com>
1331         * buildbot/__init__.py: bump to 0.7.3+ while between releases
1332         * docs/buildbot.texinfo: same
1334 2006-05-23  Brian Warner  <warner@lothar.com>
1336         * buildbot/__init__.py (version): Releasing buildbot-0.7.3
1337         * docs/buildbot.texinfo: set version to match
1338         * NEWS: update for 0.7.3
1340         * docs/buildbot.texinfo (Change Sources): mention hg_buildbot.py,
1341         give a quick mapping from VC system to possible ChangeSources
1342         (Build Properties): add 'buildername'
1344         * buildbot/process/base.py (Build.setupStatus): oops, set
1345         'buildername' and 'buildnumber' properties
1346         * buildbot/test/test_properties.py (Interpolate.testBuildNumber):
1347         test them
1349 2006-05-22  Brian Warner  <warner@lothar.com>
1351         * docs/buildbot.texinfo (Build Properties): explain the syntax of
1352         property interpolation better
1354         * README (INSTALLATION): remove old '-v' argument from recommended
1355         trial command line
1357         * docs/buildbot.texinfo (ShellCommand): add docs for description=
1358         and descriptionDone= arguments. Thanks to Niklaus Giger for the
1359         patch. SF#1475494.
1361         * buildbot/slave/commands.py (SVN.parseGotRevision._parse): use
1362         'svnversion' instead of grepping the output of 'svn info', much
1363         simpler and avoids CR/LF problems on windows. Thanks to Olivier
1364         Bonnet for the suggestion.
1365         (SVN.parseGotRevision): oops, older verisons of 'svnversion'
1366         require the WC_PATH argument, so run 'svnversion .' instead.
1368         * buildbot/interfaces.py (IChangeSource): methods in Interfaces
1369         aren't supposed to have 'self' in their argument list
1371 2006-05-21  Brian Warner  <warner@lothar.com>
1373         * buildbot/process/step.py (ShellCommand.start): make
1374         testInterpolate pass. I was passing the uninterpolated command to
1375         the RemoteShellCommand constructor
1376         (ShellCommand._interpolateProperties): oops, handle non-list
1377         commands (i.e. strings with multiple words separated by spaces in
1378         them) properly, instead of forgetting about them.
1380         * buildbot/test/test_properties.py (Run.testInterpolate): new test
1381         to actually try to use build properties in a real build. This test
1382         fails.
1383         * buildbot/test/runutils.py (RunMixin.requestBuild): utility methods
1384         to start and evaluate builds
1386         * buildbot/test/test__versions.py: add a pseudo-test to record
1387         what version of Twisted/Python/Buildbot are running. This should
1388         show up at the beginning of _trial_tmp/test.log, and exists to help
1389         debug other problems.
1391         * buildbot/status/html.py (Waterfall): add 'robots_txt=' argument,
1392         a filename to be served as 'robots.txt' to discourage web spiders.
1393         Adapted from a patch by Tobi Vollebregt, thanks!
1394         * buildbot/test/test_web.py (Waterfall._test_waterfall_5): test it
1395         (Waterfall.test_waterfall): tweak the way that filenames are put
1396         into the config file, to accomodate windows pathnames better.
1398         * docs/buildbot.texinfo (HTML Waterfall): document it
1400         * buildbot/process/process_twisted.py
1401         (QuickTwistedBuildFactory.__init__): recent versions of Twisted
1402         changed the build process. The new setup.py no longer takes the
1403         'all' argument.
1404         (FullTwistedBuildFactory.__init__): same
1405         (TwistedReactorsBuildFactory.__init__): same
1407         * contrib/hg_buildbot.py: wrote a commit script for mercurial, to
1408         be placed in the [hooks] section of the central repository (the
1409         one that everybody pushes changes to).
1411 2006-05-20  Brian Warner  <warner@lothar.com>
1413         * buildbot/slave/commands.py (Darcs.doVCFull): when writing the
1414         .darcs-context file, use binary mode. I think this was causing a
1415         Darcs failure under windows.
1417 2006-05-19  Brian Warner  <warner@lothar.com>
1419         * buildbot/scripts/tryclient.py (CVSExtractor.getBaseRevision):
1420         use a timezone string of +0000 and gmtime, since this timestamp is
1421         sent to a buildmaster and %z is broken.
1423         * buildbot/test/test_vc.py (CVSHelper.getdate): use no timezone
1424         string and localtime, since this timestamp will only be consumed
1425         locally, and %z is broken.
1427         * buildbot/slave/commands.py (CVS.parseGotRevision): use +0000 and
1428         gmtime, since this timestamp is returned to the buildmaster, and
1429         %z is broken.
1431 2006-05-18  Brian Warner  <warner@lothar.com>
1433         * NEWS: update in preparation for next release
1435         * buildbot/test/test_vc.py (VCS_Helper): factor out all the
1436         setup-repository and do-we-have-the-vc-tools code into a separate
1437         "helper" class, which sticks around in a single module-level
1438         object. This seems more likely to continue to work in the future
1439         than having it hide in the TestCase and hope that TestCases stick
1440         around for a long time.
1442         * buildbot/test/test_vc.py (MercurialSupport.vc_create): 'hg
1443         addremove' has been deprecated in recent versions of mercurial, so
1444         use 'hg add' instead
1446 2006-05-07  Brian Warner  <warner@lothar.com>
1448         * buildbot/scheduler.py (Try_Jobdir.messageReceived): when
1449         operating under windows, move the file before opening it, since
1450         you can't rename a file that somebody has open.
1452         * buildbot/process/base.py (Build.setupBuild): if something goes
1453         wrong while creating a Step, log the name and arguments, since the
1454         error message when you get the number of arguments wrong is really
1455         opaque.
1457 2006-05-06  Brian Warner  <warner@lothar.com>
1459         * buildbot/process/step_twisted.py (Trial.setupEnvironment): more
1460         bugs in twisted-specific code not covered by my unit tests, this
1461         time use 'cmd' argument instead of self.cmd
1463         * buildbot/process/process_twisted.py (TwistedBuild.isFileImportant):
1464         fix stupid braino: either use startwith or find()==0, not both.
1465         (TwistedReactorsBuildFactory.__init__): another dumb typo
1467         * buildbot/test/test_slavecommand.py (ShellBase.testInterrupt1): 
1468         mark this test as TODO under windows, since process-killing seems
1469         dodgy there. We'll come back to this later and try to fix it
1470         properly.
1472         * buildbot/test/test_vc.py (CVSSupport.getdate): use localtime,
1473         and don't include a timezone
1474         (CVSSupport.vc_try_checkout): stop trying to strip the timezone.
1475         This should avoid the windows-with-verbose-timezone-name problem
1476         altogether.
1477         (Patch.testPatch): add a test which runs 'patch' with less
1478         overhead than the full VCBase.do_patch sequence, to try to isolate
1479         a windows test failure. This one uses slave.commands.ShellCommand
1480         and 'patch', but none of the VC code.
1482         * buildbot/slave/commands.py (getCommand): use which() to find the
1483         executables for 'cvs', 'svn', etc. This ought to help under
1484         windows.
1486         * buildbot/test/test_vc.py (VCBase.do_getpatch): Delete the
1487         working directory before starting. If an earlier test failed, the
1488         leftover directory would mistakenly flunk a later test.
1489         (ArchCommon.registerRepository): fix some tla-vs-baz problems.
1490         Make sure that we use the right commandlines if which("tla") picks
1491         up "tla.exe" (as it does under windows).
1492         (TlaSupport.do_get): factor out this tla-vs-baz difference
1493         (TlaSupport.vc_create): more tla-vs-baz differences
1495         * buildbot/test/test_slavecommand.py
1496         (ShellBase.testShellMissingCommand): stop trying to assert
1497         anything about the error message: different shells on different
1498         OSes with different languages makes it hard, and it really isn't
1499         that interesting of a thing to test anyway.
1501         * buildbot/test/test_vc.py (CVSSupport.capable): skip CVS tests if
1502         we detect cvs-1.10 (which is the version shipped with OS-X 10.3
1503         "Panther"), because it has a bug which flunks a couple tests in
1504         weird ways. I've checked that cvs-1.12.9 (as shipped with debian)
1505         is ok. OS-X 10.4 "Tiger" ships with cvs-1.11, but I haven't been
1506         able to test that yet.
1508 2006-04-30  Brian Warner  <warner@lothar.com>
1510         * buildbot/test/test_vc.py (VCBase.runCommand): set $LC_ALL="C" to
1511         make sure child commands emit messages in english, so our regexps
1512         will match. Thanks to Nikaus Giger for identifying the problems.
1513         (VCBase._do_vctest_export_1): mode="export" is not responsible
1514         for setting the "got_revision" property, since in many cases it is
1515         not convenient to determine.
1516         (SVNSupport.capable): when running 'svn --version' to check for
1517         ra_local, we want error messages in english
1518         * buildbot/test/test_slavecommand.py 
1519         (ShellBase.testShellMissingCommand): set $LC_ALL="C" to get bash
1520         to emit the error message in english
1522         * buildbot/slave/commands.py (SourceBase.setup): stash a copy of
1523         the environment with $LC_ALL="C" so that Commands which need to
1524         parse the output of their child processes can obtain it in
1525         english.
1526         (SVN.parseGotRevision): call "svn info" afterwards instead of
1527         watching the output of the "svn update" or "svn checkout".
1528         (Darcs.parseGotRevision): use $LC_ALL="C" when running the command
1529         (Arch.parseGotRevision): same
1530         (Bazaar.parseGotRevision): same
1531         (Mercurial.parseGotRevision): same
1533         * buildbot/scripts/tryclient.py (SourceStampExtractor.dovc): set
1534         $LC_ALL="C" when running commands under 'buildbot try', too
1536         * buildbot/test/__init__.py: remove the global os.environ()
1537         setting, instead we do it just for the tests that run commands and
1538         need to parse their output.
1540         * buildbot/test/test_scheduler.py (Scheduling.testTryJobdir):
1541         remove the overly-short .timeout on this test, because non-DNotify
1542         platforms must fall back to polling which happens at 10 second
1543         intervals, so a 5 second timeout would never succeed.
1545 2006-04-24  Brian Warner  <warner@lothar.com>
1547         * docs/buildbot.texinfo (Installing the code): update trial
1548         invocation, SF#1469116 by Niklaus Giger.
1549         (Attributes of Changes): updated branch-name examples to be
1550         a bit more realistic, SF#1475240 by Stephen Davis.
1552         * contrib/windows/buildbot2.bat: utility wrapper for windows
1553         developers, contributed by Nick Trout (after a year of neglect..
1554         sorry!). SF#1194231.
1556         * buildbot/test/test_vc.py (*.capable): store the actual VC
1557         binary's pathname in VCS[vcname], so it can be retrieved later
1558         (CVSSupport.vc_try_checkout): incorporate Niklaus Giger's patch to
1559         strip out non-numeric timezone information, specifically the funky
1560         German string that his system produced that confuses CVS.
1561         (DarcsSupport.vc_create): use dovc() instead of vc(), this should
1562         allow Darcs tests to work on windows
1563         * buildbot/scripts/tryclient.py (SourceStampExtractor): use
1564         procutils.which() everywhere, to allow tryclient to work under
1565         windows. Also from Niklaus Giger, SF#1463394.
1567         * buildbot/twcompat.py (which): move the replacement for a missing
1568         twisted.python.procutils.which from test_vc.py to here, so it can
1569         be used in other places too (specifically tryclient.py)
1571 2006-04-23  Brian Warner  <warner@lothar.com>
1573         * buildbot/status/html.py (StatusResourceBuild.body): replace the
1574         bare buildbotURL/projectName line with a proper DIV, along with a
1575         CSS class of "title", from Stefan Seefeld (SF#1461675).
1576         (WaterfallStatusResource.body0): remove the redundant 'table'
1577         class from the table
1578         (WaterfallStatusResource.body): same. Also add class="LastBuild"
1579         to the top-row TR, and class="Activity" to the second-row TR,
1580         rather than putting them in the individual TD nodes.
1582         * buildbot/test/test_vc.py (VCBase.checkGotRevision): test
1583         'got_revision' build property for all VC systems that implement
1584         accurate ones: SVN, Darcs, Arch, Bazaar, Mercurial.
1586         * buildbot/slave/commands.py (SourceBase._handleGotRevision): try
1587         to determine which revision we actually obtained
1588         (CVS.parseGotRevision): implement this for CVS, which just means
1589         to grab a timestamp. Not ideal, and it depends upon the buildslave
1590         having a clock that is reasonably well syncronized with the server,
1591         but it's better than nothing.
1592         (SVN.parseGotRevision): implement it for SVN, which is accurate
1593         (Darcs.parseGotRevision): same
1594         (Arch.parseGotRevision): same
1595         (Bazaar.parseGotRevision): same
1596         (Mercurial.parseGotRevision): same
1598         * buildbot/process/step.py (LoggedRemoteCommand.remoteUpdate):
1599         keep a record of all non-stdout/stderr/header/rc status updates,
1600         for the benefit of RemoteCommands that send other useful things,
1601         like got_revision
1602         (Source.commandComplete): put any 'got_revision' status values
1603         into a build property of the same name
1606         * buildbot/process/step_twisted.py (Trial): update to deal with
1607         new ShellCommand refactoring
1609         * docs/buildbot.texinfo (Build Properties): document new feature
1610         that allows BuildSteps to get/set Build-wide properties like which
1611         revision was requested and/or checked out.
1613         * buildbot/interfaces.py (IBuildStatus.getProperty): new method
1614         * buildbot/status/builder.py (BuildStatus.getProperty): implement
1615         it. Note that this bumps the persistenceVersion of the saved Build
1616         object, so add the necessary upgrade-old-version logic to include
1617         an empty properties dict.
1619         * buildbot/process/base.py (Build.setProperty): implement it
1620         (Build.getProperty): same
1621         (Build.startBuild): change build startup to set 'branch',
1622         'revision', and 'slavename' properties at the right time
1624         * buildbot/process/step.py (BuildStep.__init__): change setup to
1625         require 'build' argument in a better way
1626         (LoggingBuildStep): split ShellCommand into two pieces, for better
1627         subclassing elsewhere. LoggingBuildStep is a BuildStep which runs
1628         a single RemoteCommand that sends stdout/stderr status text. It
1629         also provides the usual commandComplete / createSummary /
1630         evaluateCommand / getText methods to be overridden...
1631         (ShellCommand): .. whereas ShellCommand is specifically for
1632         running RemoteShellCommands. Other shell-like BuildSteps (like
1633         Source) can inherit from LoggingBuildStep instead of ShellCommand
1634         (WithProperties): marker class to do build-property interpolation
1635         (Source): inherit from LoggingBuildStep instead of ShellCommand
1636         (RemoteDummy): same
1638         * buildbot/test/test_properties.py: test new functionality
1640 2006-04-21  Brian Warner  <warner@lothar.com>
1642         * buildbot/test/test_vc.py: rename testBranch to
1643         testCheckoutBranch to keep the tests in about the right
1644         alphabetical order
1646 2006-04-18  Brian Warner  <warner@lothar.com>
1648         * docs/buildbot.texinfo (PBListener): improve cross-references
1649         between PBListener and 'buildbot statusgui', thanks to John Pye
1650         for the suggestion.
1652 2006-04-17  Brian Warner  <warner@lothar.com>
1654         * buildbot/twcompat.py (maybeWait): handle SkipTest properly when
1655         running under Twisted-1.3.0, otherwise skipped tests are reported
1656         as errors.
1658         * all: use isinstance() instead of 'type(x) is foo', suggested by
1659         Neal Norwitz
1661         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
1662         oops, fix a brain-fade from the other week, when making the
1663         addStep changes. I changed all the __init__ upcalls to use the
1664         wrong superclass name.
1665         (FullTwistedBuildFactory.__init__): same
1666         (TwistedDebsBuildFactory.__init__): same
1667         (TwistedReactorsBuildFactory.__init__): same
1668         (TwistedBuild.isFileImportant): use .startswith for clarity,
1669         thanks to Neal Norwitz for the suggestions.
1671         * contrib/viewcvspoll.py: script to poll a viewcvs database for
1672         changes, then deliver them over PB to a remote buildmaster.
1674         * contrib/svnpoller.py: added script by John Pye to poll a remote
1675         SVN repository (by running 'svn log') from a cronjob, and run
1676         'buildbot sendchange' to deliver the changes to a remote
1677         buildmaster.
1678         * contrib/svn_watcher.py: added script by Niklaus Giger (a
1679         modification of svnpoller.py), same purpose, but this one loops
1680         internally (rather than expecting to run from a cronjob) and works
1681         under windows.
1682         * contrib/README.txt: same
1684 2006-04-11  Brian Warner  <warner@lothar.com>
1686         * all: fix a number of incorrect names and missing imports, thanks
1687         to Anthony Baxter for the patch.
1688         * buildbot/status/html.py (WaterfallStatusResource.statusToHTML): 
1689         remove unused buggy method.
1690         * buildbot/status/builder.py (BuildStatus.saveYourself): rmtree
1691         comes from shutil, not "shutils"
1692         * buildbot/process/step.py (TreeSize.evaluateCommand): fix bad name
1693         (Arch.checkSlaveVersion): same
1694         * buildbot/process/step_twisted.py (Trial.commandComplete): same, in
1695         some disabled code
1696         * buildbot/process/step_twisted2.py: add some missing imports
1697         * buildbot/twcompat.py (_deferGenerator): fix cut-and-paste error,
1698         this code used to live in twisted.internet.defer
1700 2006-04-10  Brian Warner  <warner@lothar.com>
1702         * buildbot/process/step.py (Mercurial): add Mercurial support
1703         * buildbot/slave/commands.py (Mercurial): same
1704         * buildbot/scripts/tryclient.py (MercurialExtractor): same
1705         * buildbot/test/test_vc.py (Mercurial): same, checkout over HTTP is
1706         not yet tested, but 'try' support *is* covered
1707         * docs/buildbot.texinfo (Mercurial): document it
1709         * buildbot/process/step.py (LoggedRemoteCommand.remoteUpdate): add
1710         some debugging messages (turned off)
1711         * buildbot/test/test_vc.py: improve debug messages
1713 2006-04-07  Brian Warner  <warner@lothar.com>
1715         * buildbot/test/test_vc.py (which): define our own which() in case
1716         we can't import twisted.python.procutils, because procutils doesn't
1717         exist in Twisted-1.3
1719         * docs/buildbot.texinfo (Interlocks): fix some typos, mention use
1720         of SlaveLocks for performance tests
1722         * docs/examples/twisted_master.cfg: update to match current usage
1724         * buildbot/changes/p4poller.py (P4Source): add new arguments:
1725         password, p4 binary, pollinterval, maximum history to check.
1726         Patch from an anonymous sf.net contributor, SF#1219384.
1727         * buildbot/process/step.py (P4Sync.__init__): add username,
1728         password, and client arguments.
1729         * buildbot/slave/commands.py (P4Sync): same
1731 2006-04-05  Brian Warner  <warner@lothar.com>
1733         * buildbot/process/factory.py (BuildFactory.addStep): new method
1734         to add steps to a BuildFactory. Use it instead of f.steps.append,
1735         and you can probably avoid using the s() convenience function.
1736         Patch from Neal Norwitz, sf.net #1412605.
1737         (other): update all factories to use addStep
1738         * buildbot/process/process_twisted.py: update all factories to use
1739         addStep.
1741 2006-04-03  Brian Warner  <warner@lothar.com>
1743         * buildbot/test/test_vc.py: modified find-the-VC-command logic to
1744         work under windows too. Adapted from a patch by Niklaus Giger,
1745         addresses SF#1463399.
1747         * buildbot/test/__init__.py: set $LANG to 'C', to insure that
1748         spawned commands emit parseable results in english and not some
1749         other language. Patch from Niklaus Giger, SF#1463395.
1751         * README (INSTALLATION): discourage users from running unit tests on
1752         a "network drive", patch from Niklaus Giger, SF#1463394.
1754 2006-03-22  Brian Warner  <warner@lothar.com>
1756         * contrib/svn_buildbot.py: rearrange, add an easy-to-change
1757         function to turn a repository-relative pathname into a (branch,
1758         branch-relative-filename) tuple. Change this function to handle
1759         the branch naming policy used by your Subversion repository.
1760         Thanks to AllMyData.com for sponsoring this work.
1762 2006-03-16  Brian Warner  <warner@lothar.com>
1764         * buildbot/scripts/sample.cfg: add python-mode declaration for
1765         vim. Thanks to John Pye for the patch.
1767         * docs/buildbot.texinfo (Launching the daemons): fix @reboot job
1768         command line, mention the importance of running 'crontab' as the
1769         buildmaster/buildslave user. Thanks to John Pye for the catch.
1771 2006-03-13  Brian Warner  <warner@lothar.com>
1773         * buildbot/status/words.py (IRC): add an optional password=
1774         argument, which will be sent to Nickserv in an IDENTIFY message at
1775         login, to claim the nickname. freenode requires this before the
1776         bot can sent (or reply to) private messages. Thanks to Clement
1777         Stenac for the patch.
1778         * docs/buildbot.texinfo (IRC Bot): document it
1780         * buildbot/status/builder.py (LogFile.merge): don't write chunks
1781         larger than chunkSize. Fixes SF#1349253.
1782         * buildbot/test/test_status.py (Log.testLargeSummary): test it
1783         (Log.testConsumer): update to match new internal chunking behavior
1785 2006-03-12  Brian Warner  <warner@lothar.com>
1787         * buildbot/test/test_vc.py: remove the last use of waitForDeferred
1789         * buildbot/test/test_maildir.py (MaildirTest): rename the
1790         'timeout' method, as it collides with trial's internals
1792         * buildbot/scripts/runner.py: add 'buildbot restart' command
1793         (stop): don't sys.exit() out of here, otherwise restart can't work
1794         * docs/buildbot.texinfo (Shutdown): document it
1796         * buildbot/buildset.py (BuildSet.__init__): clean up docstring
1797         * buildbot/status/html.py (Waterfall.__init__): same
1798         * buildbot/process/builder.py (Builder.startBuild): same
1799         * buildbot/process/base.py (BuildRequest): same
1800         * buildbot/sourcestamp.py (SourceStamp): same
1801         * buildbot/scheduler.py (Nightly): same
1803         * buildbot/__init__.py (version): bump to 0.7.2+ while between
1804         releases
1805         * docs/buildbot.texinfo: same
1807 2006-02-17  Brian Warner  <warner@lothar.com>
1809         * buildbot/__init__.py (version): Releasing buildbot-0.7.2
1810         * docs/buildbot.texinfo: set version number to match
1811         * NEWS: update for 0.7.2
1813 2006-02-16  Brian Warner  <warner@lothar.com>
1815         * docs/buildbot.texinfo (Build Dependencies): add cindex tag
1817 2006-02-09  Brian Warner  <warner@lothar.com>
1819         * docs/buildbot.texinfo (How Different VC Systems Specify Sources):
1820         add text to explain per-build branch parameters
1821         * NEWS: mention --umask
1823 2006-02-08  Brian Warner  <warner@lothar.com>
1825         * buildbot/scripts/runner.py (Maker.makeSlaveTAC): remove unused
1826         method
1827         (SlaveOptions.optParameters): add --umask, to make it possible to
1828         make buildslave-generated files (including build products) be
1829         world-readable
1830         (slaveTAC): same
1831         * buildbot/slave/bot.py (BuildSlave.startService): same
1833 2006-01-23  Brian Warner  <warner@lothar.com>
1835         * buildbot/status/builder.py: urllib.quote() all URLs that include
1836         Builder names, so that builders can include characters like '/'
1837         and ' ' without completely breaking the resulting HTML. Thanks to
1838         Kevin Turner for the patch.
1839         * buildbot/status/html.py: same
1840         * buildbot/test/test_web.py (GetURL.testBuild): match changes
1842         * NEWS: update in preparation for upcoming release
1844 2006-01-18  Brian Warner  <warner@lothar.com>
1846         * docs/examples/twisted_master.cfg: update to match the Twisted
1847         buildbot: remove python2.2, switch to exarkun's buildslaves,
1848         disable the .deb builder until we figure out how to build twisted
1849         .debs from SVN, add some ktrace debugging to the OS-X build
1850         process and remove the qt build, remove threadless builders,
1851         change freebsd builder to use landonf's buildslave.
1853 2006-01-12  Brian Warner  <warner@lothar.com>
1855         * buildbot/master.py (Manhole.__init__): let port= be a strports
1856         specification string, but handle a regular int for backwards
1857         compatibility. This allows "tcp:12345:interface=127.0.0.1" to be
1858         used in master.cfg to limit connections to just the local host.
1859         (BuildMaster.loadConfig): same for c['slavePortnum']
1860         * buildbot/scheduler.py (Try_Userpass.__init__): same
1861         * buildbot/status/client.py (PBListener.__init__): same
1862         * buildbot/status/html.py (Waterfall.__init__): same, for both
1863         http_port and distrib_port. Include backwards-compatibility checks
1864         so distrib_port can be a filename string and still mean unix:/foo
1865         * docs/buildbot.texinfo (Setting the slaveport): document it
1866         (Debug options): same
1867         (HTML Waterfall): same
1868         (PBListener): same
1869         (try): same
1870         * buildbot/test/test_config.py (ConfigTest): test it
1872         * buildbot/master.py (BuildMaster.loadConfig): wait for the
1873         slaveport's disownServiceParent deferred to fire before opening
1874         the new one. Fixes an annoying bug in the unit tests.
1876 2006-01-03  Brian Warner  <warner@lothar.com>
1878         * buildbot/master.py (BuildMaster): remove the .schedulers
1879         attribute, replacing it with an allSchedulers() method that looks
1880         for all IService children that implement IScheduler. Having only
1881         one parent/child relationship means fewer opportunities for bugs.
1882         (BuildMaster.allSchedulers): new method
1883         (BuildMaster.loadConfig_Schedulers): update to use allSchedulers,
1884         also fix ugly bug that caused any config-file reload to
1885         half-forget about the earlier Schedulers, causing an exception
1886         when a Change arrived and was handed to a half-connected
1887         Scheduler. The exception was in scheduler.py line 54ish:
1888           self.parent.submitBuildSet(bs)
1889           exceptions.AttributeError: 'NoneType' object has no attribute
1890           'submitBuildSet'
1891         (BuildMaster.addChange): update to use allSchedulers()
1893         * buildbot/scheduler.py (BaseScheduler.__implements__): fix this
1894         to work properly with twisted-1.3.0, where you must explicitly
1895         include the __implements__ from parent classes
1896         (BaseScheduler.__repr__): make it easier to distinguish distinct
1897         instances
1898         (BaseUpstreamScheduler.__implements__): same
1900         * buildbot/status/builder.py (Status.getSchedulers): update to
1901         use allSchedulers()
1902         * buildbot/test/test_run.py (Run.testMaster): same
1903         * buildbot/test/test_dependencies.py (Dependencies.findScheduler): same
1904         * buildbot/test/test_config.py (ConfigTest.testSchedulers): same,
1905         make sure Scheduler instances are left alone when an identical
1906         config file is reloaded
1907         (ConfigElements.testSchedulers): make sure Schedulers are properly
1908         comparable
1910         * Makefile (TRIALARGS): my local default Twisted version is now
1911         2.1.0, update the trial arguments accordingly
1913 2005-12-22  Brian Warner  <warner@lothar.com>
1915         * docs/examples/twisted_master.cfg: merge changes from pyr: add
1916         new win32 builders
1918         * buildbot/scheduler.py (BaseScheduler.addChange): include a dummy
1919         addChange in the parent class, although I suspect this should be
1920         fixed better in the future.
1922 2005-11-26  Brian Warner  <warner@lothar.com>
1924         * buildbot/scheduler.py (AnyBranchScheduler.addChange): don't
1925         explode when branch==None, thanks to Kevin Turner for the catch
1926         * buildbot/test/test_scheduler.py (Scheduling.testAnyBranch): test
1927         it
1929         * buildbot/__init__.py (version): bump to 0.7.1+ while between
1930         releases
1931         * docs/buildbot.texinfo: same
1933 2005-11-26  Brian Warner  <warner@lothar.com>
1935         * buildbot/__init__.py (version): Releasing buildbot-0.7.1
1936         * docs/buildbot.texinfo: set version number to match
1938 2005-11-26  Brian Warner  <warner@lothar.com>
1940         * NEWS: update for 0.7.1
1942         * buildbot/status/builder.py (BuildStepStatus.unsubscribe): make
1943         sure that unsubscribe works even if we never sent an ETA update.
1944         Also, don't explode on duplicate unsubscribe.
1945         (BuildStepStatus.addLog): make the convenience "return self"-added
1946         watcher automatically unsubscribe when the Step finishes.
1947         (BuildStatus.unsubscribe): same handle-duplicate-unsubscribe
1948         (BuildStatus.stepStarted): same auto-unsubscribe
1949         (BuilderStatus.buildStarted): same auto-unsubscribe
1951         * buildbot/interfaces.py (IStatusReceiver.buildStarted): document
1952         auto-unsubscribe
1953         (IStatusReceiver.stepStarted): same
1954         (IStatusReceiver.logStarted): same
1956         * buildbot/test/test_run.py (Status): move the Status test..
1957         * buildbot/test/test_status.py (Subscription): .. to here
1959 2005-11-25  Brian Warner  <warner@lothar.com>
1961         * NEWS: more updates
1963         * buildbot/locks.py: fix the problem in which loading a master.cfg
1964         file that changes some Builders (but not all of them) can result
1965         in having multiple copies of the same Lock. Now, the real Locks
1966         are kept in a table inside the BotMaster, and the Builders/Steps
1967         use "LockIDs", which are still instances of MasterLock and
1968         SlaveLock. The real Locks are instances of the new RealMasterLock
1969         and RealSlaveLock classes.
1970         * buildbot/master.py (BotMaster.getLockByID): new method to
1971         convert LockIDs into real Locks.
1972         * buildbot/process/base.py (Build.startBuild): convert LockIDs
1973         into real Locks before building
1974         * buildbot/process/step.py (BuildStep.startStep): same
1975         * buildbot/test/test_locks.py (Locks.testLock1a): add a test which
1976         exercises the problem
1979         * docs/buildbot.texinfo (Scheduler Types): give a few hints about
1980         what Schedulers are available
1982         * buildbot/scheduler.py (Nightly): add new Scheduler based upon
1983         work by Dobes Vandermeer and hacked mercilessly by me. This offers
1984         'cron'-style build scheduling at certain times of day, week,
1985         month, or year.
1986         * buildbot/test/test_scheduler.py (Scheduling.testNightly): test it
1988         * buildbot/scheduler.py (Scheduler): change fileIsImportant
1989         handling: treat self.fileIsImportant more as an attribute that
1990         contains a callable than as a method. If the attribute is None,
1991         don't call it and assume all filenames are important. It is still
1992         possible to provide a fileIsImportant method in a subclass,
1993         however.
1994         (AnyBranchScheduler): handle fileIsImportant=None, previously it
1995         was broken
1996         * buildbot/test/test_scheduler.py (Scheduling.testAnyBranch2):
1997         test using AnyBranchScheduler with fileIsImportant=None
1999 2005-11-24  Brian Warner  <warner@lothar.com>
2001         * buildbot/test/test_config.py (StartService): don't claim a fixed
2002         port number, instead set slavePort=0 on the first pass, figure out
2003         what port was allocated, then switch to a config file that uses
2004         the allocated port.
2006         * buildbot/master.py (BuildMaster.loadConfig): close the old
2007         slaveport before opening the new one, because unit tests might
2008         replace slavePort=0 with the same allocated portnumber, and if we
2009         don't wait for the old port to close first, we get a "port already
2010         in use" error. There is a tiny race condition here, but the only
2011         threat is from other programs that bind (statically) to the same
2012         port number we happened to be allocated, and only if those
2013         programs use SO_REUSEADDR, and only if they get control in between
2014         reactor turns.
2016         * Makefile (TRIALARGS): update to handle Twisted > 2.1.0
2018         * buildbot/master.py (BuildMaster.loadConfig_Sources): remove all
2019         deleted ChangeSources before adding any new ones
2020         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): fix
2021         compare_attrs, to make sure that a config-file reload does not
2022         unnecessarily replace an unmodified ChangeSource instance
2023         * buildbot/test/test_config.py (ConfigTest.testSources): update
2025         * buildbot/scheduler.py (AnyBranchScheduler): fix branches=[] to
2026         mean "don't build anything", and add a warning if it gets used
2027         because it isn't actually useful.
2029         * contrib/svn_buildbot.py: update example usage to match the port
2030         number that gets used by the PBChangeSource
2031         * buildbot/scripts/sample.cfg: add example of PBChangeSource
2033 2005-11-22  Brian Warner  <warner@lothar.com>
2035         * NEWS: start collecting items for next release
2037         * buildbot/process/step.py (SVN.computeSourceRevision): assume
2038         revisions are strings
2039         (P4Sync.computeSourceRevision): same
2041         * buildbot/status/html.py (StatusResourceBuild.body): add a link
2042         to the Buildbot's overall status page
2043         (StatusResourceBuilder.body): same
2045 2005-11-15  Brian Warner  <warner@lothar.com>
2047         * buildbot/master.py (BuildMaster.loadConfig): serialize the
2048         config-file loading, specifically to make sure old StatusTargets
2049         are finished shutting down before new ones start up (thus
2050         resolving a bug in which changing the Waterfall object would fail
2051         because both new and old instances were claiming the same
2052         listening port). Also load new Schedulers after all the new
2053         Builders are set up, in case they fire off a new build right away.
2054         * buildbot/test/test_config.py (StartService): test it
2056         * buildbot/status/mail.py (MailNotifier.buildMessage): oops, add
2057         the branch name to the mail body
2059         * buildbot/changes/pb.py (PBChangeSource.compare_attrs): add this.
2060         Without it, a config-file reload fails to update an existing
2061         PBChangeSource.
2062         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): add
2063         username/passwd to compare_attrs, for the same reason
2064         * buildbot/status/html.py (Waterfall): add favicon to
2065         compare_attrs, same reason
2067 2005-11-05  Brian Warner  <warner@lothar.com>
2069         * buildbot/scripts/tryclient.py (createJobfile): stringify the
2070         baserev before stuffing it in the jobfile. This resolves problems
2071         under SVN (and probably Arch) where revisions are expressed as
2072         numbers. I'm inclined to use string-based revisions everywhere in
2073         the future, but this fix should be safe for now. Thanks to Steven
2074         Walter for the patch.
2076         * buildbot/changes/changes.py (ChangeMaster.saveYourself): use
2077         binary mode when opening pickle files, to make windows work
2078         better. Thanks to Dobes Vandermeer for the catch.
2079         * buildbot/status/builder.py (BuildStatus.saveYourself): same
2080         (BuilderStatus.getBuildByNumber): same
2081         (Status.builderAdded): same
2082         * buildbot/master.py (BuildMaster.loadChanges): same
2084         * buildbot/util.py (Swappable): delete unused leftover code
2086         * buildbot/process/step.py (SVN): when building on a non-default
2087         branch, add the word "[branch]" to the VC step's description, so
2088         it is obvious that we're not building the usual stuff. Likewise,
2089         when we are building a specific revision, add the text "rNNN" to
2090         indicate what that revision number is. Thanks to Brad Hards and
2091         Nathaniel Smith for the suggestion.
2092         (Darcs.startVC): same
2093         (Arch.startVC): same
2094         (Bazaar.startVC): same
2096         * buildbot/process/factory.py (GNUAutoconf.__init__): fix a silly
2097         typo, caught by Mark Dillavou, closes SF#1216636.
2099         * buildbot/test/test_status.py (Log.TODO_testDuplicate): add notes
2100         about a test to add some day
2102         * docs/examples/twisted_master.cfg: update: bot1 can now handle
2103         the 'full-2.3' build, and the 'reactors' build is now run under
2104         python-2.4 because the buildslave no longer has gtk/etc bindings
2105         for earlier versions.
2107 2005-11-03  Brian Warner  <warner@lothar.com>
2109         * buildbot/interfaces.py (IBuilderControl.resubmitBuild): new
2110         method, takes an IBuildStatus and rebuilds it. It might make more
2111         sense to add this to IBuildControl instead, but that instance goes
2112         away completely once the build has finished, and resubmitting
2113         builds can take place weeks later.
2114         * buildbot/process/builder.py (BuilderControl.resubmitBuild): same
2115         * buildbot/status/html.py (StatusResourceBuild): also stash an
2116         IBuilderControl so we can use resubmitBuild.
2117         (StatusResourceBuild.body): render "resubmit" button if we can.
2118         Also add hrefs for each BuildStep
2119         (StatusResourceBuild.rebuild): add action for "resubmit" button
2120         (StatusResourceBuilder.getChild): give it an IBuilderControl
2122         * buildbot/status/builder.py (Status.getURLForThing): change the
2123         URL for BuildSteps to have a "step-" prefix, so the magic URLs
2124         that live as targets of buttons like "stop" and "rebuild" can't
2125         collide with them.
2126         * buildbot/status/builder.py (Status.getURLForThing): same
2127         * buildbot/status/html.py (StatusResourceBuild.getChild): same
2128         (StepBox.getBox): same
2129         * buildbot/test/test_web.py (GetURL): same
2130         (Logfile): same
2132         * buildbot/process/step.py (SVN.__init__): put svnurl/baseURL
2133         exclusivity checks after Source.__init__ upcall, so misspelled
2134         arguments will be reported more usefully
2135         (Darcs.__init__): same
2137 2005-10-29  Brian Warner  <warner@lothar.com>
2139         * docs/examples/twisted_master.cfg: don't double-fire the 'quick'
2140         builder. Move the Try scheduler off to a separate port.
2142 2005-10-27  Brian Warner  <warner@lothar.com>
2144         * buildbot/clients/gtkPanes.py
2145         (TwoRowClient.remote_builderRemoved): disappearing Builders used
2146         to cause the app to crash, now they don't.
2148         * buildbot/clients/debug.py: display the buildmaster's location
2149         in the window's title bar
2151 2005-10-26  Brian Warner  <warner@lothar.com>
2153         * buildbot/status/mail.py (MailNotifier): urllib.escape the URLs
2154         in case they have spaces or whatnot. Patch from Dobes Vandermeer.
2155         * buildbot/test/test_status.py (MyStatus.getURLForThing): fix it
2157         * buildbot/status/html.py (td): put a single non-breaking space
2158         inside otherwise empty <td> elements, as a workaround for buggy
2159         browsers which would optimize them away (along with any associated
2160         styles, like the kind that create the waterfall grid borders).
2161         Patch from Frerich Raabe.
2163         * buildbot/process/step_twisted.py (Trial): expose the trialMode=
2164         argv-list as an argument, defaulting to ["-to"], which is
2165         appropriate for the Trial that comes with Twisted-2.1.0 and
2166         earlier. The Trial in current Twisted SVN wants
2167         ["--reporter=bwverbose"] instead. Also expose trialArgs=, which
2168         defaults to an empty list.
2169         * buildbot/process/process_twisted.py (TwistedTrial.trialMode):
2170         match it, now that trialMode= is a list instead of a single string
2172         * buildbot/__init__.py (version): bump to 0.7.0+ while between
2173         releases
2174         * docs/buildbot.texinfo: same
2176 2005-10-24  Brian Warner  <warner@lothar.com>
2178         * buildbot/__init__.py (version): Releasing buildbot-0.7.0
2179         * docs/buildbot.texinfo: set version number to match
2181 2005-10-24  Brian Warner  <warner@lothar.com>
2183         * README: update for 0.7.0
2184         * NEWS: same
2185         * docs/buildbot.texinfo: move the freshcvs stuff out of the README
2187         * buildbot/clients/debug.glade: add 'branch' box to fake-commit
2188         * buildbot/clients/debug.py (DebugWidget.do_commit): same. Don't
2189         send the branch= argument unless the user really provided one, to
2190         retain compatibility with older buildmasters that don't accept
2191         that argument.
2192         * buildbot/master.py (DebugPerspective.perspective_fakeChange):
2193         same
2195         * docs/buildbot.texinfo: update lots of stuff
2197         * buildbot/scripts/runner.py (sendchange): add a --branch argument
2198         to the 'buildbot sendchange' command
2199         * buildbot/clients/sendchange.py (Sender.send): same
2200         * buildbot/changes/pb.py (ChangePerspective): same
2201         * buildbot/test/test_changes.py (Sender.testSender): test it
2203         * buildbot/process/step.py (SVN.__init__): change 'base_url' and
2204         'default_branch' argument names to 'baseURL' and 'defaultBranch',
2205         for consistency with other BuildStep arguments that use camelCase.
2206         Well, at least more of them use camelCase (like flunkOnWarnings)
2207         than don't.. I wish I'd picked one style and stuck with it
2208         earlier. Annoying, but it's best done before the release, since
2209         these arguments didn't exist at all in 0.6.6 .
2210         (Darcs): same
2211         * buildbot/test/test_vc.py (SVN.testCheckout): same
2212         (Darcs.testPatch): same
2213         * docs/buildbot.texinfo (SVN): document the change
2214         (Darcs): same, add some build-on-branch docs
2215         * docs/examples/twisted_master.cfg: match change
2217         * buildbot/process/step.py (BuildStep): rename
2218         slaveVersionNewEnough to slaveVersionIsOlderThan, because that's
2219         how it is normally used.
2220         * buildbot/test/test_steps.py (Version.checkCompare): same
2222         * buildbot/process/step.py (CVS.startVC): refuse to build
2223         update/copy -style builds on a non-default branch with an old
2224         buildslave (<=0.6.6) that doesn't know how to do it properly. The
2225         concern is that it will do a VC 'update' in an existing tree when
2226         it is supposed to be switching branches (and therefore clobbering
2227         the tree to do a full checkout), thus building the wrong source.
2228         This used to be a warning, but I think the confusion it is likely
2229         to cause warrants making it an error.
2230         (SVN.startVC): same, also make mode=export on old slaves an error
2231         (Darcs.startVC): same
2232         (Git.startVC): improve error message for non-Git-enabled slaves
2233         (Arch.checkSlaveVersion): same. continue to emit a warning when a
2234         specific revision is built on a slave that doesn't pay attention
2235         to args['revision'], because for slowly-changing trees it will
2236         probably do the right thing, and because we have no way to tell
2237         whether we're asking it to build the most recent version or not.
2238         * buildbot/interfaces.py (BuildSlaveTooOldError): new exception
2240         * buildbot/scripts/runner.py (SlaveOptions.postOptions): assert
2241         that 'master' is in host:portnum format, to catch errors sooner
2243 2005-10-23  Brian Warner  <warner@lothar.com>
2245         * buildbot/process/step_twisted.py (ProcessDocs.createSummary):
2246         when creating the list of warning messages, include the line
2247         immediately after each WARNING: line, since that's usually where
2248         the file and line number wind up.
2250         * docs/examples/twisted_master.cfg: OS-X slave now does QT, add a
2251         TryScheduler
2253         * NEWS: update
2255 2005-10-22  Brian Warner  <warner@lothar.com>
2257         * buildbot/status/html.py (HtmlResource): incorporate valid-HTML
2258         patch from Brad Hards
2259         * buildbot/status/classic.css: same
2260         * buildbot/test/test_web.py (Waterfall): match changes
2262         * buildbot/test/test_steps.py (BuildStep.setUp): set
2263         nextBuildNumber so the test passes
2264         * buildbot/test/test_status.py (MyBuilder): same
2266         * buildbot/status/html.py (StatusResourceBuild.body): revision
2267         might be numeric, so stringify it before html-escapifying it
2268         (CurrentBox.getBox): add a "waiting" state, and show a countdown
2269         timer for the upcoming build
2270         * buildbot/status/classic.css: add background-color attributes for
2271         offline/waiting/building classes
2273         * buildbot/status/builder.py (BuildStatus): derive from
2274         styles.Versioned, fix upgrade of .sourceStamp attribute. Also set
2275         the default (i.e. unknown) .slavename to "???" instead of None,
2276         since even unknown slavenames need to be printed eventually.
2277         (BuilderStatus): also derive from styles.Versioned . More
2278         importantly, determine .nextBuildNumber at creation/unpickling
2279         time by scanning the directory of saved BuildStatus instances and
2280         choosing one larger than the highest-numbered one found. This
2281         should fix the problem where random errors during upgrades cause
2282         the buildbot to forget about earlier builds. .nextBuildNumber is
2283         no longer stored in the pickle.
2284         (Status.builderAdded): if we can't unpickle the BuilderStatus,
2285         at least log the error. Also call Builder.determineNextBuildNumber
2286         once the basedir is set.
2288         * buildbot/master.py (BuildMaster.loadChanges): do
2289         styles.doUpgrade afterwards, in case I decide to make Changes
2290         derived from styles.Versioned some day and forget to make this
2291         change later.
2294         * buildbot/test/test_runner.py (Options.testForceOptions): skip
2295         when running under older pythons (<2.3) in which the shlex module
2296         doesn't have a 'split' function.
2298         * buildbot/process/step.py (ShellCommand.start): make
2299         errorMessages= be a list of strings to stuff in the log before the
2300         command actually starts. This makes it easier to flag multiple
2301         warning messages, e.g. when the Source steps have to deal with an
2302         old buildslave.
2303         (CVS.startVC): handle slaves that don't handle multiple branches
2304         by switching into 'clobber' mode
2305         (SVN.startVC): same. Also reject branches without base_url
2306         (Darcs.startVC): same. Also reject revision= in older slaves
2307         (Arch.checkSlaveVersion): same (just the multiple-branches stuff)
2308         (Bazaar.startVC): same, and test for baz separately than for arch
2310         * buildbot/slave/commands.py (cvs_ver): document new features
2312         * buildbot/process/step.py (BuildStep.slaveVersion): document it
2313         (BuildStep.slaveVersionNewEnough): more useful utility method
2314         * buildbot/test/test_steps.py (Version): start testing it
2316         * buildbot/status/words.py (IrcStatusBot.command_FORCE): note that
2317         the 'force' command requires python2.3, for the shlex.split method
2319         * docs/examples/twisted_master.cfg: remove old freshcvs stuff,
2320         since we don't use it anymore. The Twisted buildbot uses a
2321         PBChangeSource now.
2323 2005-10-21  Brian Warner  <warner@lothar.com>
2325         * buildbot/process/process_twisted.py: rework all BuildFactory
2326         classes to take a 'source' step as an argument, instead of
2327         building up the SVN instance in the factory.
2328         * docs/examples/twisted_master.cfg: enable build-on-branch by
2329         providing a base_url and default_branch
2331         * buildbot/status/words.py (IrcStatusBot.command_FORCE): add
2332         control over --branch and --revision, not that they are always
2333         legal to provide
2334         * buildbot/status/html.py (StatusResourceBuilder.force): same
2335         (StatusResourceBuild.body): display SourceStamp components
2337         * buildbot/scripts/runner.py (ForceOptions): option parser for the
2338         IRC 'force' command, so it can be shared with an eventual
2339         command-line-tool 'buildbot force' mode.
2340         * buildbot/test/test_runner.py (Options.testForceOptions): test it
2342 2005-10-20  Brian Warner  <warner@lothar.com>
2344         * buildbot/status/mail.py (MailNotifier.buildMessage): reformat
2346         * docs/examples/twisted_master.cfg: update to use Schedulers
2348         * buildbot/scripts/sample.cfg: update with Schedulers
2350         * buildbot/interfaces.py (IBuilderControl.requestBuildSoon): new
2351         method specifically for use by HTML "force build" button and the
2352         IRC "force" command. Raises an immediate error if there are no
2353         slaves available.
2354         (IBuilderControl.requestBuild): make this just submit a build, not
2355         try to check for existing slaves or set up any when-finished
2356         Deferreds or anything.
2357         * buildbot/process/builder.py (BuilderControl): same
2358         * buildbot/status/html.py (StatusResourceBuilder.force): same
2359         * buildbot/status/words.py (IrcStatusBot.command_FORCE): same
2360         * buildbot/test/test_slaves.py: same
2361         * buildbot/test/test_web.py: same
2363 2005-10-19  Brian Warner  <warner@lothar.com>
2365         * docs/examples/twisted_master.cfg: re-sync with reality: bring
2366         back python2.2 tests, turn off OS-X threadedselect-reactor tests
2368 2005-10-18  Brian Warner  <warner@lothar.com>
2370         * buildbot/status/html.py: provide 'status' argument to most
2371         StatusResourceFOO objects
2372         (StatusResourceBuild.body): href-ify the Builder name, add "Steps
2373         and Logfiles" section to make the Build page into a more-or-less
2374         comprehensive source of status information about the build
2376         * buildbot/status/mail.py (MailNotifier): include the Build's URL
2377         * buildbot/status/words.py (IrcStatusBot.buildFinished): same
2379 2005-10-17  Brian Warner  <warner@lothar.com>
2381         * buildbot/process/process_twisted.py (TwistedTrial): update Trial
2382         arguments to accomodate Twisted >=2.1.0 . I will have to figure
2383         out what to do about other projects: the correct options for
2384         recent Twisteds will not work for older ones.
2386 2005-10-15  Brian Warner  <warner@lothar.com>
2388         * buildbot/status/builder.py (Status.getURLForThing): add method
2389         to provide a URL for arbitrary IStatusFoo objects. The idea is to
2390         use this in email/IRC status clients to make them more useful, by
2391         providing the end user with hints on where to learn more about the
2392         object being reported on.
2393         * buildbot/test/test_web.py (GetURL): tests for it
2395 2005-10-14  Brian Warner  <warner@lothar.com>
2397         * buildbot/test/test_config.py (ConfigTest._testSources_1): oops,
2398         fix bug resulting from deferredResult changes
2400 2005-10-13  Brian Warner  <warner@lothar.com>
2402         * buildbot/test/test_changes.py: remove use of deferredResult
2403         * buildbot/test/test_config.py: same
2404         * buildbot/test/test_control.py: same
2405         * buildbot/test/test_status.py: same
2406         * buildbot/test/test_vc.py: this is the only remaining use, since
2407         it gets used at module level. This needs to be replaced by some
2408         sort of class-level run-once routine.
2410         * buildbot/status/words.py (IrcStatusBot.command_WATCH): fix typo
2412         * lots: implement multiple slaves per Builder, which means multiple
2413         current builds per Builder. Some highlights:
2414         * buildbot/interfaces.py (IBuilderStatus.getState): return a tuple
2415         of (state,currentBuilds) instead of (state,currentBuild)
2416         (IBuilderStatus.getCurrentBuilds): replace getCurrentBuild()
2417         (IBuildStatus.getSlavename): new method, so you can tell which
2418         slave got used. This only gets set when the build completes.
2419         (IBuildRequestStatus.getBuilds): new method
2421         * buildbot/process/builder.py (SlaveBuilder): add a .state
2422         attribute to track things like ATTACHING and IDLE and BUILDING,
2423         instead of..
2424         (Builder): .. the .slaves attribute here, which has been turned
2425         into a simple list of available slaves. Added a separate
2426         attaching_slaves list to track ones that are not yet ready for
2427         builds.
2428         (Builder.fireTestEvent): put off the test-event callback for a
2429         reactor turn, to make tests a bit more consistent.
2430         (Ping): cleaned up the slaveping a bit, now it disconnects if the
2431         ping fails due to an exception. This needs work, I'm worried that
2432         a code error could lead to a constantly re-connecting slave.
2433         Especially since I'm trying to move to a distinct remote_ping
2434         method, separate from the remote_print that we currently use.
2435         (BuilderControl.requestBuild): return a convenience Deferred that
2436         provides an IBuildStatus when the build finishes.
2437         (BuilderControl.ping): ping all connected slaves, only return True
2438         if they all respond.
2440         * buildbot/slave/bot.py (BuildSlave.stopService): stop trying to
2441         reconnect when we shut down.
2443         * buildbot/status/builder.py: implement new methods, convert
2444         one-build-at-a-time methods to handle multiple builds
2445         * buildbot/status/*.py: do the same in all default status targets
2446         * buildbot/status/html.py: report the build's slavename in the
2447         per-Build page, report all buildslaves on the per-Builder page
2449         * buildbot/test/test_run.py: update/create tests
2450         * buildbot/test/test_slaves.py: same
2451         * buildbot/test/test_scheduler.py: remove stale test
2453         * docs/buildbot.texinfo: document the new builder-specification
2454         'slavenames' parameter
2456 2005-10-12  Brian Warner  <warner@lothar.com>
2458         * buildbot/buildset.py (BuildSet): fix bug where BuildSet did not
2459         report failure correctly, causing Dependent builds to run when
2460         they shouldn't have.
2461         * buildbot/status/builder.py (BuildSetStatus): same
2462         * buildbot/test/test_buildreq.py (Set.testBuildSet): verify it
2463         (Set.testSuccess): test the both-pass case too
2464         * buildbot/test/test_dependencies.py (Dependencies.testRun_Fail):
2465         fix this test: it was ending too early, masking the failure before
2466         (Logger): specialized StatusReceiver to make sure the dependent
2467         builds aren't even started, much less completed.
2469 2005-10-07  Brian Warner  <warner@lothar.com>
2471         * buildbot/slave/bot.py (SlaveBuilder.activity): survive
2472         bot.SlaveBuilder being disowned in the middle of a build
2474         * buildbot/status/base.py (StatusReceiverMultiService): oops, make
2475         this inherit from StatusReceiver. Also upcall in __init__. This
2476         fixes the embarrasing crash when the new buildSetSubmitted method
2477         is invoked and Waterfall/etc don't implement their own.
2478         * buildbot/test/test_run.py: add a TODO note about a test to catch
2479         just this sort of thing.
2481         * buildbot/process/builder.py (Builder.attached): remove the
2482         already-attached warning, this situation is normal. Add some
2483         comments explaining it.
2485 2005-10-02  Brian Warner  <warner@lothar.com>
2487         * buildbot/changes/maildir.py (Maildir.start): Tolerate
2488         OverflowError when setting up dnotify, because some 64-bit systems
2489         have problems with signed-vs-unsigned constants and trip up on the
2490         DN_MULTISHOT flag. Patch from Brad Hards.
2492 2005-09-06  Fred Drake  <fdrake@users.sourceforge.net>
2494         * buildbot/process/step.py (BuildStep, ShellCommand): Add
2495         progressMetrics, description, descriptionDone to the 'parms' list,
2496         and make use the 'parms' list from the implementation class
2497         instead of only BuildStep to initialize the parameters.  This
2498         allows buildbot.process.factory.s() to initialize all the parms,
2499         not just those defined in directly by BuildStep.
2501 2005-09-03  Brian Warner  <warner@lothar.com>
2503         * NEWS: start adding items for the next release
2505         * docs/examples/twisted_master.cfg: (sync with reality) turn off
2506         python2.2 tests, change 'Quick' builder to only use python2.3
2508 2005-09-02  Fred Drake  <fdrake@users.sourceforge.net>
2510         * buildbot/status/html.py (StatusResourceBuilder.body): only show
2511         the "Ping Builder" button if the build control is available; the
2512         user sees an exception otherwise
2514         * docs/buildbot.texinfo (PBChangeSource): fix a typo
2516 2005-09-01  Brian Warner  <warner@lothar.com>
2518         * buildbot/interfaces.py (IBuilderStatus.getState): update
2519         signature, point out that 'build' can be None
2520         (IBuildStatus.getETA): point out ETA can be none
2522         * buildbot/status/html.py (CurrentBox.getBox): tolerate build/ETA
2523         being None
2524         * buildbot/status/words.py (IrcStatusBot.emit_status): same
2526 2005-08-31  Brian Warner  <warner@lothar.com>
2528         * buildbot/status/base.py (StatusReceiver.builderChangedState):
2529         update to match correct signature: removed 'eta' argument
2530         * buildbot/status/mail.py (MailNotifier.builderChangedState): same
2532 2005-08-30  Brian Warner  <warner@lothar.com>
2534         * buildbot/status/builder.py (LogFile): remove the assertion that
2535         blows up when you try to overwrite an existing logfile, instead
2536         just emit a warning. This case gets hit when the buildmaster is
2537         killed and doesn't get a chance to write out the serialized
2538         BuilderStatus object, so the .nextBuildNumber attribute gets out
2539         of date.
2541         * buildbot/scripts/runner.py (sendchange): add --revision_file to
2542         the 'buildbot sendchange' arguments, for the Darcs context file
2543         * docs/buildbot.texinfo (sendchange): document it
2545         * buildbot/status/html.py: add pending/upcoming builds to CurrentBox
2546         * buildbot/interfaces.py (IScheduler.getPendingBuildTimes): new method
2547         (IStatus.getSchedulers): new method
2548         * buildbot/status/builder.py (BuilderStatus): track pendingBuilds
2549         (Status.getSchedulers): implement
2550         * buildbot/process/builder.py (Builder): maintain
2551         BuilderStatus.pendingBuilds
2552         * buildbot/scheduler.py (Scheduler.getPendingBuildTimes): new method
2553         (TryBase.addChange): Try schedulers should ignore Changes
2555         * buildbot/scripts/tryclient.py (getTopdir): implement getTopdir
2556         for 'try' on CVS/SVN
2557         * buildbot/test/test_runner.py (Try.testGetTopdir): test case
2559         * buildbot/scripts/tryclient.py (Try): make jobdir-style 'try'
2560         report status properly.
2561         (Try.createJob): implement unique buildset IDs
2563         * buildbot/status/client.py (StatusClientPerspective): add a
2564         perspective_getBuildSets method for the benefit of jobdir-style
2565         'try'.
2566         * docs/buildbot.texinfo (try): more docs
2567         * buildbot/test/test_scheduler.py (Scheduling.testGetBuildSets):
2568         new test case
2570 2005-08-18  Brian Warner  <warner@lothar.com>
2572         * buildbot/scripts/tryclient.py (Try): make 'try' status reporting
2573         actually work. It's functional but still kind of clunky. Also, it
2574         only works with the pb-style.. needs to be made to work with the
2575         jobdir-style too.
2577         * buildbot/status/client.py (RemoteBuildSet): new class
2578         (RemoteBuildRequest): same
2579         (RemoteBuild.remote_waitUntilFinished): return the RemoteBuild
2580         object, not the internal BuildStatus object.
2581         (RemoteBuild.remote_subscribe): new method to subscribe to builds
2582         outside of the usual buildStarted() return value.
2583         (BuildSubscriber): support class for RemoteBuild.remote_subscribe
2585         * buildbot/scheduler.py (Try_Jobdir): convey buildsetID properly
2586         (Try_Userpass_Perspective.perspective_try): return a remotely
2587         usable BuildSetStatus object
2589         * buildbot/interfaces.py (IBuildStatus): remove obsolete
2590         isStarted()/waitUntilStarted()
2592 2005-08-16  Brian Warner  <warner@lothar.com>
2594         * buildbot/status/builder.py: implement IBuildSetStatus and
2595         IBuildRequestStatus, wire them into place.
2596         * buildbot/buildset.py: same. Add ID, move wait-until-finished
2597         methods into the BuildSetStatus object.
2598         * buildbot/interfaces.py: same
2599         (IStatus.getBuildSets): new method to get pending BuildSets
2600         (IStatusReceiver.buildsetSubmitted): new method which hears about
2601         new BuildSets
2602         * buildbot/master.py (BuildMaster.submitBuildSet): same
2603         * buildbot/process/base.py (BuildRequest): same, replace
2604         waitUntilStarted with subscribe/unsubscribe
2605         * buildbot/process/builder.py (BuilderControl.forceBuild): use
2606         subscribe instead of waitUntilStarted
2607         * buildbot/status/base.py (StatusReceiver.buildsetSubmitted): stub
2608         for new method
2609         * buildbot/status/client.py (StatusClientPerspective.builderRemoved): 
2610         same
2611         * buildbot/test/test_buildreq.py: update for new code
2612         * buildbot/test/test_control.py (Force.testRequest): same
2615         * buildbot/slave/commands.py (Darcs.doVCFull): fix get-revision
2616         for Darcs to not use the tempfile module, so it works under
2617         python-2.2 too. We really didn't need the full cleverness of that
2618         module, since the slave has exclusive control of its own builddir.
2620 2005-08-15  Brian Warner  <warner@lothar.com>
2622         * buildbot/scripts/tryclient.py (CVSExtractor): implement 'try'
2623         for CVS trees. It doesn't work for non-trunk branches,
2624         unfortunately.
2625         * buildbot/test/test_vc.py (CVS.testTry): test it, but skip the
2626         branch test
2628         * Makefile: make it easier to test against python2.2
2630         * buildbot/test/test_vc.py (VCBase.tearDown): provide for
2631         tearDown2, so things like Arch can unregister archives as they're
2632         shutting down. The previous subclass-override-tearDown technique
2633         resulted in a nested maybeWait() and test failures under
2634         Twisted-1.3.0
2636         * buildbot/scripts/tryclient.py (getSourceStamp): extract branches
2637         where we can (Arch), add a branch= argument to set the branch used
2638         when we can't
2639         (BazExtractor): extract the branch too
2640         (TlaExtractor): same
2641         * buildbot/scripts/runner.py (TryOptions): add --branch
2642         * docs/buildbot.texinfo (try): document --branch/try_branch
2644         * buildbot/slave/commands.py (Darcs): implement get-revision for
2645         Darcs, so that 'try' will work. This requires the tempfile module
2646         from python-2.3 .
2648         * buildbot/test/test_vc.py: rewrite tests, getting better coverage
2649         of revisions, branches, and 'try' in the process.
2651 2005-08-11  Brian Warner  <warner@lothar.com>
2653         * buildbot/master.py (DebugPerspective.perspective_pokeIRC): fix
2654         this, it got broken at some point in the last few releases
2655         * buildbot/status/words.py (IrcBuildRequest): reply was broken
2656         (IrcStatusBot.emit_status): handle new IBuilderStatus.getState,
2657         specifically the removal of ETA information from the tuple
2659         * buildbot/locks.py: use %d for id() instead of %x, avoid a silly
2660         warning message
2662         * docs/buildbot.texinfo (try): document both --builder and
2663         'try_builders' in .buildbot/options
2664         * buildbot/scripts/runner.py (TryOptions): add --builder,
2665         accumulate the values into opts['builders']
2666         * buildbot/scripts/tryclient.py (Try.__init__): set builders
2667         * buildbot/test/test_runner.py (Try): add some quick tests to make
2668         sure 'buildbot try --options' and .buildbot/options get parsed
2669         * buildbot/test/test_scheduler.py (Scheduling.testTryUserpass):
2670         use --builder control
2672         * docs/buildbot.texinfo (try): add --port argument to PB style
2674         * buildbot/scripts/tryclient.py (SourceStampExtractor): return an
2675         actual SourceStamp. Still need to extract a branch name, somehow.
2676         (Try): finish implementing the try client side, still need a UI
2677         for specifying which builders to use
2678         (Try.getopt): factor our options/config-file reading
2679         * buildbot/test/test_scheduler.py (Scheduling.testTryUserpass):
2680         test it
2681         * buildbot/test/test_vc.py: match SourceStampExtractor change
2683         * buildbot/scripts/runner.py (Options.opt_verbose): --verbose
2684         causes the twisted log to be sent to stderr
2686         * buildbot/scheduler.py (Try_Userpass): implement the PB style
2688 2005-08-10  Brian Warner  <warner@lothar.com>
2690         * buildbot/scripts/runner.py: Add 'buildbot try' command, jobdir
2691         style is 90% done, still missing status reporting or waiting for
2692         the buildsets to finish, and it is completely untested.
2694         * buildbot/trybuild.py: delete file, move contents to ..
2695         * buildbot/scripts/tryclient.py (getSourceStamp): .. here
2696         * buildbot/test/test_vc.py: match the move
2698         * buildbot/scheduler.py (Try_Jobdir): implement the jobdir style
2699         of the TryScheduler, no buildsetID or status-tracking support yet
2700         * buildbot/test/test_scheduler.py (Scheduling.testTryJobdir): test it
2702         * buildbot/changes/maildir.py (Maildir.setBasedir): make it
2703         possible to set the basedir after __init__ time, so it is easier
2704         to use as a Service-child of the BuildMaster instance
2706         * buildbot/changes/maildirtwisted.py (MaildirService): make a form
2707         that delivers messages to its Service parent instead of requiring
2708         a subclass to be useful. This turns out to be much easier to build
2709         unit tests around.
2711         * buildbot/scripts/tryclient.py (createJob): utility code to
2712         create jobfiles, will eventually be used by 'buildbot try'
2714 2005-08-08  Brian Warner  <warner@lothar.com>
2716         * docs/buildbot.texinfo (try): add docs on the
2717         as-yet-unimplemented Try scheduler
2719         * buildbot/test/test_buildreq.py: move Scheduling tests out to ..
2720         * buildbot/test/test_scheduler.py: .. here
2721         (Scheduling.testTryJobdir): add placeholder test for 'try'
2723         * buildbot/test/test_status.py (Log.testMerge3): update to match new
2724         addEntry merging (>=chunkSize) behavior
2725         (Log.testConsumer): update to handle new callLater(0) behavior
2727         * buildbot/test/test_web.py: rearrange tests a bit, add test for
2728         both the MAX_LENGTH bugfix and the resumeProducing hang.
2730         * buildbot/status/builder.py (LogFileProducer.resumeProducing):
2731         put off the actual resumeProducing for a moment with
2732         reactor.callLater(0). This works around a twisted-1.3.0 bug which
2733         causes large logfiles to hang midway through.
2735         * buildbot/process/step.py (BuildStep.addCompleteLog): break the
2736         logfile up into chunks, both to avoid NetstringReceiver.MAX_LENGTH
2737         and to improve memory usage when streaming the file out to a web
2738         browser.
2739         * buildbot/status/builder.py (LogFile.addEntry): change > to >= to
2740         make this work cleanly
2742 2005-08-03  Brian Warner  <warner@lothar.com>
2744         * buildbot/trybuild.py: new file for 'try' utilities
2745         (getSourceStamp): run in a tree, find out the baserev+patch
2746         * buildbot/test/test_vc.py (VCBase.do_getpatch): test it,
2747         implemented for SVN and Darcs, still working on Arch. I don't know
2748         how to make CVS work yet.
2750         * docs/buildbot.texinfo: document the 'buildbot' command-line
2751         tool, including the not-yet-implemented 'try' feature, and the
2752         in-flux .buildbot/ options directory.
2754 2005-07-20  Brian Warner  <warner@lothar.com>
2756         * buildbot/locks.py: added temporary id() numbers to Lock
2757         descriptions, to track down a not-really-sharing-the-Lock bug
2759         * buildbot/test/runutils.py: must import errno, cut-and-paste bug
2761         * buildbot/test/test_slavecommand.py (ShellBase.failUnlessIn):
2762         needed for python2.2 compatibility
2763         * buildbot/test/test_vc.py: python2.2 compatibility: generators
2764         are from the __future__
2766 2005-07-19  Brian Warner  <warner@lothar.com>
2768         * buildbot/master.py (BuildMaster.loadConfig): give a better error
2769         message when schedulers use unknown builders
2771         * buildbot/process/builder.py (Builder.compareToSetup): make sure
2772         SlaveLock('name') and MasterLock('name') are distinct
2774         * buildbot/master.py (BuildMaster.loadConfig): oops, sanity-check
2775         c['schedulers'] in such a way that we can actually accept
2776         Dependent instances
2777         * buildbot/test/test_config.py: check it
2779         * buildbot/scheduler.py (Dependent.listBuilderNames): oops, add
2780         utility method to *all* the Schedulers
2781         (Periodic.listBuilderNames): same
2783         * docs/buildbot.texinfo (Interlocks): update chapter to match
2784         reality
2786         * buildbot/master.py (BuildMaster.loadConfig): Add sanity checks
2787         to make sure that c['sources'], c['schedulers'], and c['status']
2788         are all lists of the appropriate objects, and that the Schedulers
2789         all point to real Builders
2790         * buildbot/interfaces.py (IScheduler, IUpstreamScheduler): add
2791         'listBuilderNames' utility method to support this
2792         * buildbot/scheduler.py: implement the utility method
2793         * buildbot/test/test_config.py (ConfigTest.testSchedulers): test it
2795         * docs/buildbot.texinfo: add some @cindex entries
2797         * buildbot/test/test_vc.py (Arch.createRepository): set the tla ID
2798         if it wasn't already set: most tla commands will fail unless one
2799         has been set.
2800         (Arch.createRepository): and disable bazaar's revision cache, since
2801         they cause test failures (the multiple repositories we create all
2802         interfere with each other through the cache)
2804         * buildbot/test/test_web.py (WebTest): remove use of deferredResult,
2805         bring it properly up to date with twisted-2.0 test guidelines
2807         * buildbot/master.py (BuildMaster): remove references to old
2808         'interlock' module, this caused a bunch of post-merge test
2809         failures
2810         * buildbot/test/test_config.py: same
2811         * buildbot/process/base.py (Build): same
2813         * buildbot/test/test_slaves.py: stubs for new test case
2815         * buildbot/scheduler.py: add test-case-name tag
2816         * buildbot/test/test_buildreq.py: same
2818         * buildbot/slave/bot.py (SlaveBuilder.__init__): remove some
2819         unnecessary init code
2820         (Bot.remote_setBuilderList): match it
2822         * docs/buildbot.texinfo (@settitle): don't claim version 1.0
2824         * buildbot/changes/mail.py (parseSyncmail): update comment
2826         * buildbot/test/test_slavecommand.py: disable Shell tests on
2827         platforms that don't suport IReactorProcess
2829         * buildbot/status/builder.py (LogFile): remove the 't' mode from
2830         all places where we open logfiles. It causes OS-X to open the file
2831         in some weird mode that that prevents us from mixing reads and
2832         writes to the same filehandle, which we depend upon to implement
2833         _generateChunks properly. This change doesn't appear to break
2834         win32, on which "b" and "t" are treated differently but a missing
2835         flag seems to be interpreted as "t".
2837 2005-07-18  Brian Warner  <warner@lothar.com>
2839         * buildbot/slave/commands.py (ShellCommand): overhaul
2840         error-handling code, to try and make timeout/interrupt work
2841         properly, and make win32 happier
2842         * buildbot/test/test_slavecommand.py: clean up, stop using
2843         reactor.iterate, add tests for timeout and interrupt
2844         * buildbot/test/sleep.py: utility for a new timeout test
2846         * buildbot/twcompat.py: copy over twisted 1.3/2.0 compatibility
2847         code from the local-usebranches branch
2849 2005-07-17  Brian Warner  <warner@lothar.com>
2851         * buildbot/process/process_twisted.py
2852         (TwistedReactorsBuildFactory): change the treeStableTimer to 5
2853         minutes, to match the other twisted BuildFactories, and don't
2854         excuse failures in c/qt/win32 reactors any more.
2856         * docs/examples/twisted_master.cfg: turn off the 'threadless' and
2857         'freebsd' builders, since the buildslaves have been unavailable
2858         for quite a while
2860 2005-07-13  Brian Warner  <warner@lothar.com>
2862         * buildbot/test/test_vc.py (VCBase.do_branch): test the new
2863         build-on-branch feature
2865         * buildbot/process/step.py (Darcs.__init__): add base_url and
2866         default_branch arguments, just like SVN
2867         (Arch.__init__): note that the version= argument is really the
2868         default branch name
2870         * buildbot/slave/commands.py (SourceBase): keep track of the
2871         repository+branch that was used for the last checkout in
2872         SRCDIR/.buildbot-sourcedata . If the contents of this file do not
2873         match, we clobber the directory and perform a fresh checkout
2874         rather than trying to do an in-place update. This should protect
2875         us against trying to get to branch B by doing an update in a tree
2876         obtained from branch A.
2877         (CVS.setup): add CVS-specific sourcedata: root, module, and branch
2878         (SVN.setup): same, just the svnurl
2879         (Darcs.setup): same, just the repourl
2880         (Arch.setup): same, arch coordinates (url), version, and
2881         buildconfig. Also pull the buildconfig from the args dictionary,
2882         which we weren't doing before, so the build-config was effectively
2883         disabled.
2884         (Arch.sourcedirIsUpdateable): don't try to update when we're
2885         moving to a specific revision: arch can't go backwards, so it is
2886         safer to just clobber the tree and checkout a new one at the
2887         desired revision.
2888         (Bazaar.setup): same sourcedata as Arch
2890         * buildbot/test/test_dependencies.py (Dependencies.testRun_Fail):
2891         use maybeWait, to work with twisted-1.3.0 and twcompat
2892         (Dependencies.testRun_Pass): same
2894         * buildbot/test/test_vc.py: rearrange, cleanup
2896         * buildbot/twcompat.py: add defer.waitForDeferred and
2897         utils.getProcessOutputAndValue, so test_vc.py (which uses them)
2898         can work under twisted-1.3.0 .
2900         * buildbot/test/test_vc.py: rewrite. The sample repositories are
2901         now created at setUp time. This increases the runtime of the test
2902         suite considerably (from 91 seconds to 151), but it removes the
2903         need for an offline tarball, which should solve a problem I've
2904         seen where the test host has a different version of svn than the
2905         tarball build host. The new code also validates that mode=update
2906         really picks up recent commits. This approach will also make it
2907         easier to test out branches, because the code which creates the VC
2908         branches is next to the code which uses them. It will also make it
2909         possible to test some change-notification hooks, by actually
2910         performing a VC commit and watching to see the ChangeSource get
2911         notified.
2913 2005-07-12  Brian Warner  <warner@lothar.com>
2915         * docs/buildbot.texinfo (SVN): add branches example
2916         * docs/Makefile (buildbot.ps): add target for postscript manual
2918         * buildbot/test/test_dependencies.py: s/test_interlocks/test_locks/ 
2919         * buildbot/test/test_locks.py: same
2921         * buildbot/process/step.py (Darcs): comment about default branches
2923         * buildbot/master.py (BuildMaster.loadConfig): don't look for
2924         c['interlocks'] in the config file, complain if it is present.
2925         Scan all locks in c['builders'] to make sure the Locks they use
2926         are uniquely named.
2927         * buildbot/test/test_config.py: remove old c['interlocks'] test,
2928         add some tests to check for non-uniquely-named Locks
2929         * buildbot/test/test_vc.py (Patch.doPatch): fix factory.steps,
2930         since the unique-Lock validation code requires it now
2932         * buildbot/locks.py: fix test-case-name
2934         * buildbot/interlock.py: remove old file
2936 2005-07-11  Brian Warner  <warner@lothar.com>
2938         * buildbot/test/test_interlock.py: rename to..
2939         * buildbot/test/test_locks.py: .. something shorter
2941         * buildbot/slave/bot.py (BuildSlave.stopService): newer Twisted
2942         versions (after 2.0.1) changed internet.TCPClient to shut down the
2943         connection in stopService. Change the code to handle this
2944         gracefully.
2946         * buildbot/process/base.py (Build): handle whole-Build locks
2947         * buildbot/process/builder.py (Builder.compareToSetup): same
2948         * buildbot/test/test_interlock.py: make tests work
2950         * buildbot/process/step.py (BuildStep.startStep): complain if a
2951         Step tries to claim a lock that's owned by its own Build
2952         (BuildStep.releaseLocks): typo
2954         * buildbot/locks.py (MasterLock): use ComparableMixin so config
2955         file reloads don't replace unchanged Builders
2956         (SlaveLock): same
2957         * buildbot/test/test_config.py (ConfigTest.testInterlocks):
2958         rewrite to cover new Locks instead of old c['interlocks']
2959         * buildbot/test/runutils.py (RunMixin.connectSlaves): remember
2960         slave2 too
2963         * buildbot/test/test_dependencies.py (Dependencies.setUp): always
2964         start the master and connect the buildslave
2966         * buildbot/process/step.py (FailingDummy.done): finish with a
2967         FAILURE status rather than raising an exception
2969         * buildbot/process/base.py (BuildRequest.mergeReasons): don't try to
2970         stringify a BuildRequest.reason that is None
2972         * buildbot/scheduler.py (BaseUpstreamScheduler.buildSetFinished):
2973         minor fix
2974         * buildbot/status/builder.py (BuildSetStatus): implement enough to
2975         allow scheduler.Dependent to work
2976         * buildbot/buildset.py (BuildSet): set .reason and .results
2978         * buildbot/test/test_interlock.py (Locks.setUp): connect both
2979         slaves, to make the test stop hanging. It still fails, of course,
2980         because I haven't even started to implement Locks.
2982         * buildbot/test/runutils.py (RunMixin.connectSlaves): new utility
2984         * docs/buildbot.texinfo (Build-Dependencies): redesign the feature
2985         * buildbot/interfaces.py (IUpstreamScheduler): new Interface
2986         * buildbot/scheduler.py (BaseScheduler): factor out common stuff
2987         (Dependent): new class for downstream build dependencies
2988         * buildbot/test/test_dependencies.py: tests (still failing)
2990         * buildbot/buildset.py (BuildSet.waitUntilSuccess): minor notes
2992 2005-07-07  Brian Warner  <warner@lothar.com>
2994         * buildbot/test/runutils.py (RunMixin): factored this class out..
2995         * buildbot/test/test_run.py: .. from here
2996         * buildbot/test/test_interlock.py: removed old c['interlock'] tests,
2997         added new buildbot.locks tests (which all hang right now)
2998         * buildbot/locks.py (SlaveLock, MasterLock): implement Locks
2999         * buildbot/process/step.py: claim/release per-BuildStep locks
3001         * docs/Makefile: add 'buildbot.html' target
3003         * buildbot/process/step.py (CVS.__init__): allow branch=None to be
3004         interpreted as "HEAD", so that all VC steps can accept branch=None
3005         and have it mean the "default branch".
3007         * docs/buildbot.texinfo: add Schedulers, Dependencies, and Locks
3009 2005-07-07  Brian Warner  <warner@lothar.com>
3011         * docs/examples/twisted_master.cfg: update to match current usage
3013         * docs/buildbot.texinfo (System Architecture): comment out the
3014         image, it doesn't exist yet and just screws up the HTML manual.
3016 2005-07-05  Brian Warner  <warner@lothar.com>
3018         * debian/.cvsignore: oops, missed one. Removing leftover file.
3020 2005-06-17  Brian Warner  <warner@lothar.com>
3022         * buildbot/test/test_vc.py (VCSupport.__init__): svn --version
3023         changed its output in 1.2.0, don't mistakenly think that the
3024         subversion we find isn't capable of supporting our tests.
3026         * debian/*: remove the debian/ directory and its contents, to make
3027         life easier for the proper Debian maintainer
3028         * MANIFEST.in: same
3029         * Makefile (release): same
3031 2005-06-07  Brian Warner  <warner@lothar.com>
3033         * everything: create a distinct SourceStamp class to replace the
3034         ungainly 4-tuple, let it handle merging instead of BuildRequest.
3035         Changed the signature of Source.startVC to include the revision
3036         information (instead of passing it through self.args). Implement
3037         branches for SVN (now only Darcs/Git is missing support). Add more
3038         Scheduler tests.
3040 2005-06-06  Brian Warner  <warner@lothar.com>
3042         * everything: rearrange build scheduling. Create a new Scheduler
3043         object (configured in c['schedulers'], which submit BuildSets to a
3044         set of Builders. Builders can now use multiple slaves. Builds can
3045         be run on alternate branches, either requested manually or driven
3046         by changes. This changed some of the Status classes. Interlocks
3047         are out of service until they've been properly split into Locks
3048         and Dependencies. treeStableTimer, isFileImportant, and
3049         periodicBuild have all been moved from the Builder to the
3050         Scheduler.
3051         (BuilderStatus.currentBigState): removed the 'waiting' and
3052         'interlocked' states, removed the 'ETA' argument.
3054 2005-05-24  Brian Warner  <warner@lothar.com>
3056         * buildbot/pbutil.py (ReconnectingPBClientFactory): Twisted-1.3
3057         erroneously abandons the connection (in clientConnectionFailed)
3058         for non-UserErrors, which means that if we lose the connection due
3059         to a network problem or a timeout, we'll never try to reconnect.
3060         Fix this by not upcalling to the buggy parent method. Note:
3061         twisted-2.0 fixes this, but the function only has 3 lines so it
3062         makes more sense to copy it than to try and detect the buggyness
3063         of the parent class. Fixes SF#1207588.
3065         * buildbot/changes/changes.py (Change.branch): doh! Add a
3066         class-level attribute to accomodate old Change instances that were
3067         pickled before 0.6.5 (where .branch was added for new Changes).
3068         This fixes the exception that occurs when you try to look at an
3069         old Change (through asHTML).
3071         * buildbot/__init__.py (version): bump to 0.6.6+ while between
3072         releases
3074 2005-05-23  Brian Warner  <warner@lothar.com>
3076         * buildbot/__init__.py (version): release 0.6.6
3078 2005-05-23  Brian Warner  <warner@lothar.com>
3080         * NEWS: update for 0.6.6 release
3081         * debian/changelog: same
3083         * buildbot/scripts/runner.py (start): put the basedir in sys.path
3084         before starting: this was done by twistd back when we spawned it,
3085         now that we're importing the pieces and running them in the
3086         current process, we have to do it ourselves. This allows
3087         master.cfg to import files from the same directory without
3088         explicitly manipulating PYTHONPATH. Thanks to Thomas Vander
3089         Stichele for the catch.
3090         (Options.opt_version): Add a --version command (actually, just make
3091         the existing --version command emit Buildbot's version too)
3093         * buildbot/status/builder.py (HTMLLogFile.upgrade): oops! second
3094         fix to make this behave like other LogFiles, this time to handle
3095         existing LogFiles on disk. (add the missing .upgrade method)
3096         * buildbot/test/test_status.py (Log.testHTMLUpgrade): test it
3098 2005-05-21  Brian Warner  <warner@lothar.com>
3100         * buildbot/test/test_runner.py (Create.testMaster): match the
3101         rawstring change in runner.py:masterTAC
3103         * buildbot/test/test_config.py (ConfigTest.testIRC): skip unless
3104         TwistedWords is installed
3105         * buildbot/test/test_status.py: same, with TwistedMail
3107         * buildbot/master.py: remove old IRC/Waterfall imports (used by
3108         some old, deprecated, and removed config keys). This should enable
3109         you to use the base buildbot functionality with Twisted-2.0.0 when
3110         you don't also have TwistedWeb and TwistedWords installed
3112 2005-05-20  Brian Warner  <warner@lothar.com>
3114         * buildbot/scripts/runner.py (run): call sendchange(), not
3115         do_sendchange(): thus 'buildbot sendchange' was broken in 0.6.5
3116         (run): call stop("HUP"), not "-HUP", 'buildbot stop' was broken.
3117         (stop): don't wait for process to die when sending SIGHUP
3118         (masterTAC): use a rawstring for basedir=, otherwise '\' in the
3119         directory name gets interpreted, which you don't want
3120         (slaveTAC): same
3122         * buildbot/__init__.py (version): bump to 0.6.5+ while between
3123         releases
3125 2005-05-18  Brian Warner  <warner@lothar.com>
3127         * buildbot/__init__.py (version): Releasing buildbot-0.6.5
3129 2005-05-18  Brian Warner  <warner@lothar.com>
3131         * README: update for 0.6.5
3132         * debian/changelog: same
3134         * buildbot/changes/changes.py: rename tag= to branch=, since
3135         that's how we're using it, and my design for the upcoming "build a
3136         specific branch" feature wants it. also, tag= was too CVS-centric
3137         * buildbot/changes/mail.py (parseSyncmail): same
3138         * buildbot/process/base.py (Build.isBranchImportant): same
3139         * buildbot/test/test_mailparse.py (Test3.testMsgS4): same
3140         * docs/buildbot.texinfo (Attributes of Changes): same
3142         * NEWS: update tag=, update for upcoming release
3144 2005-05-17  Brian Warner  <warner@lothar.com>
3146         * buildbot/scripts/runner.py (stop): actually poll once per
3147         second, instead of re-killing the poor daemon once per second.
3148         Sleep briefly (0.1s) before the first poll, since there's a good
3149         chance we can avoid waiting the full second if the daemon shuts
3150         down quickly. Also remove the sys.exit() at the end.
3151         (start): remove the unneighborly sys.exit()
3153         * Makefile: improve permission-setting to not kick Arch so badly
3155         * buildbot/scripts/runner.py (SlaveOptions.optParameters): set a
3156         default --keepalive=600, since it doesn't hurt very much, and it's
3157         a hassle to discover that you need it.
3158         * buildbot/test/test_runner.py (Create.testSlave): test it
3160         * buildbot/status/words.py (IrcStatusBot.buildFinished): Teach the
3161         IRC bot about EXCEPTION
3163         * buildbot/status/client.py (PBListener): upcall more correctly
3165         * buildbot/process/base.py (Build.allStepsDone): if a step caused
3166         an exception mark the overall build with EXCEPTION, not SUCCESS
3168         * buildbot/scripts/runner.py (makefile_sample): remove the leading
3169         newline
3170         * buildbot/status/mail.py (MailNotifier): oops, forgot to upcall
3171         * Makefile: update some release-related stuff
3173         * buildbot/slave/commands.py (ShellCommand.kill): if somehow this
3174         gets called when there isn't actually an active process, just end
3175         the Command instead of blowing up. I don't know how it gets into
3176         this state, but the twisted win32 buildslave will sometimes hang,
3177         and when it shakes its head and comes back, it thinks it's still
3178         running a Command. The next build causes this command to be
3179         interrupted, but the lack of self.process.pid breaks the interrupt
3180         attempt.
3182         * NEWS: document changes since the last release
3184         * buildbot/scripts/runner.py (start): change 'buildbot start' to
3185         look for Makefile.buildbot instead of a bare Makefile . The
3186         'buildbot start' does not install this file, so you have to
3187         manually copy it if you want to customize startup behavior.
3188         (createMaster): change 'buildbot master' command to create
3189         Makefile.sample instead of Makefile, to create master.cfg.sample
3190         instead of master.cfg (requiring you to copy it before the
3191         buildmaster can be started). Both sample files are kept up to
3192         date, i.e. they are overwritten if they have been changed. The
3193         'buildbot.tac' file is *not* overwritten, but if the new contents
3194         don't match the old, a 'buildbot.tac.new' file is created and the
3195         user is warned. This seems to be a much more sane way to handle
3196         startup files. Also, don't sys.exit(0) when done, so we can run
3197         unit tests against it.
3198         (createSlave): same. Don't overwrite the sample info/ files.
3199         * buildbot/scripts/sample.mk: remove. the contents were pulled
3200         into runner.py, since they need to match the behavior of start()
3201         * setup.py: same
3202         * MANIFEST.in: same
3204         * docs/buildbot.texinfo (Launching the daemons): document it
3205         * buildbot/test/test_runner.py (Create): test it
3207         * buildbot/test/test_vc.py (SetupMixin.failUnlessIn): Add a
3208         version that can handle string-in-string tests, because otherwise
3209         python-2.2 fails the tests. It'd be tremendous if Trial's test
3210         took two strings under 2.2 too.
3212         * everything: fixed all deprecation warnings when running against
3213         Twisted-2.0 . (at least all the ones in buildbot code, there are a
3214         few that come from Twisted itself). This involved putting most of
3215         the Twisted-version specific code in the new buildbot.twcompat
3216         module, and creating some abstract base classes in
3217         buildbot.changes.base and buildbot.status.base (which might be
3218         useful anyway). __implements__ is a nuisance and requires an ugly
3219         'if' clause everywhere.
3221         * buildbot/test/test_status.py (Mail.testMail): add a 0.1 second
3222         delay before finishing the test: it seems that smtp.sendmail
3223         doesn't hang up on the server, so we must wait a moment so it can
3224         hang up on us. This removes the trial warning about an unclean
3225         reactor.
3227 2005-05-16  Brian Warner  <warner@lothar.com>
3229         * buildbot/process/step.py (Source): add 'retry' argument. It is a
3230         tuple of (delay, repeats).
3231         * buildbot/test/test_vc.py (Retry): test it
3232         * docs/buildbot.texinfo (Source Checkout): document it
3233         * buildbot/slave/commands.py (SourceBase): add 'retry' parameter.
3234         (SourceBase.maybeDoVCRetry): If 'retry' is set, failures in
3235         doVCFull() are handled by re-trying the checkout (after a delay)
3236         some number of times.
3237         (ShellCommand._startCommand): make header lines easier to read
3239         * buildbot/test/test_web.py (WebTest.tearDown): factor out master
3240         shutdown
3241         (WebTest.test_logfile): make sure master gets shut down, silences
3242         some "unclean reactor" test errors
3244         * buildbot/test/test_changes.py (Sender.tearDown): spin the
3245         reactor once after shutdown, something in certain versions of
3246         Twisted trigger a test failure. 1.3.0 is ok, 2.0.0 fails, 2.0.1pre
3247         fails, svn-trunk is ok.
3249         * buildbot/test/test_slavecommand.py (Shell.testShellZ): add a
3250         second win32 error message
3252         * buildbot/test/test_run.py (Status.testSlave): be smarter about
3253         validating the ETA, so the tests don't fail on slow systems
3255 2005-05-15  Brian Warner  <warner@lothar.com>
3257         * buildbot/status/builder.py (HTMLLogFile): make this behave like
3258         the new LogFile class, so upgrading works properly
3259         (LogFileProducer.resumeProducing): survive resumeProducing after
3260         we've exhausted the chunkGenerator
3262         * buildbot/test/test_web.py (WebTest.test_logfile): validate HTML
3263         logs too
3264         * buildbot/test/test_status.py (Log.testAdd): validate hasContents
3265         (Log.testUpgrade): same
3267         * docs/buildbot.texinfo (Maintenance): describe how to delete old
3268         Builds and logs with a cron job.
3270         * buildbot/status/builder.py (LogFile): revamp LogFiles. Got rid
3271         of the old non-offline LogFile, added code to upgrade these to
3272         new-style contents-live-on-disk instances at load time (in a way
3273         that doesn't invalidate the old Build pickles, so upgrading to
3274         0.6.5 is not a one-way operation). Got rid of everything related
3275         to 'stub' builds.
3276         (LogFile.__init__): create LogFiles with the parent step status,
3277         the log's name, and a builder-relative filename where it can keep
3278         the contents on disk.
3279         (LogFile.hasContents): new method, clients are advised to call it
3280         before getText or getChunks and friends. If it returns False, the
3281         log's contents have been deleted and getText() will raise an
3282         error.
3283         (LogFile.getChunks): made it a generator
3284         (LogFile.subscribeConsumer): new method, takes a Twisted-style
3285         Consumer (except one that takes chunks instead of strings). This
3286         enables streaming of very large logfiles without storing the whole
3287         thing in memory.
3288         (BuildStatus.generateLogfileName): create names like
3289         12-log-compile-output, with a _0 suffix if required to be unique
3290         (BuildStatus.upgradeLogfiles): transform any old-style (from 0.6.4
3291         or earlier) logfiles into new-style ones
3292         (BuilderStatus): remove everything related to 'stub' builds. There
3293         is now only one build cache, and we don't strip logs from old
3294         builds anymore.
3295         (BuilderStatus.getBuildByNumber): check self.currentBuild too,
3296         since we no longer fight to keep it in the cache
3298         * buildbot/status/html.py (TextLog.render_GET): use a
3299         ChunkConsumer to stream the log entries efficiently.
3300         (ChunkConsumer): wrapper which consumes chunks and writes
3301         formatted HTML.
3303         * buildbot/test/test_twisted.py (Parse.testParse): use a
3304         LogFile-like object instead of a real one
3306         * buildbot/test/test_status.py (MyLog): handle new LogFile code
3307         (Log.testMerge3): validate more merge behavior
3308         (Log.testChunks): validate LogFile.getChunks
3309         (Log.testUpgrade): validate old-style LogFile upgrading
3310         (Log.testSubscribe): validate LogFile.subscribe
3311         (Log.testConsumer): validate LogFile.subscribeConsumer
3313         * buildbot/interfaces.py (IStatusLogStub): remove
3314         (IStatusLog.subscribeConsumer): new method
3315         (IStatusLog.hasContents): new method
3316         (IStatusLogConsumer): describes things passed to subscribeConsumer
3318         * buildbot/status/html.py (StepBox.getBox): Don't offer an href to
3319         the log contents if it does not have any contents.
3320         (StatusResourceBuildStep.body): same
3321         (StatusResourceBuildStep.getChild): give a 404 for empty logs
3323 2005-05-14  Brian Warner  <warner@lothar.com>
3325         * buildbot/test/test_web.py (WebTest.test_logfile): add 5-second
3326         timeouts to try and make the windows metabuildslave not hang
3328 2005-05-13  Mike Taylor  <bear@code-bear.com>
3330         * buildbot/slave/commands.py (rmdirRecursive): added a check
3331         to ensure the path passed into rmdirRecursive actually exists.
3332         On win32 a non-existant path would generate an exception.
3334 2005-05-13  Brian Warner  <warner@lothar.com>
3336         * buildbot/slave/commands.py (rmdirRecursive): replacement for
3337         shutil.rmtree which behaves correctly on windows in the face of
3338         files that you have to chmod before deleting. Thanks to Bear at
3339         the OSAF for the routine.
3340         (SourceBase.doClobber): use rmdirRecursive
3342 2005-05-12  Brian Warner  <warner@lothar.com>
3344         * buildbot/status/builder.py (OfflineLogFile.getChunks): have this
3345         method generate chunks instead of returning a big list. This
3346         allows the same method to be used for both old LogFile and new
3347         OfflineLogFile.
3348         (OfflineLogFile.getText): use the generator
3349         (OfflineLogFile.subscribe): same
3350         * buildbot/status/html.py (TextLog.resumeProducing): same
3351         * buildbot/interfaces.py (IStatusLog.getChunks): document it
3353         * buildbot/test/test_web.py (WebTest.test_logfile): Add a test to
3354         point out that OfflineLogFile does not currently work with
3355         html.Waterfall . Fixing this is high-priority.
3357         * buildbot/scripts/runner.py (start): add --logfile=twistd.log, since
3358         apparently windows defaults to using stdout
3360         * buildbot/test/test_slavecommand.py (Shell.testShellZ): log a
3361         better message on failure so I can figure out the win32 problem
3363         * buildbot/slave/commands.py (ShellCommand._startCommand): update
3364         log messages to include more useful copies of the command being
3365         run, the argv array, and the child command's environment.
3366         (Git.doVCFull): update cg-close usage, patch from Brandon Philips.
3368 2005-05-11  Brian Warner  <warner@lothar.com>
3370         * setup.py: oops, install debug.glade so 'buildbot debugclient'
3371         will actually work
3372         * Makefile: update the deb-snapshot version
3374         * docs/buildbot.texinfo: move all .xhtml docs into a new
3375         .texinfo-format document, adding a lot of material in the process.
3376         This is starting to look like a real user's manual. Removed all
3377         the Lore-related files: *.xhtml, *.css, template.tpl .
3378         * docs/Makefile: simple makefile to run 'makeinfo'
3379         * buildbot/scripts/sample.cfg: rearrange slightly
3380         * MANIFEST.in: include .info and .textinfo, don't include *.xhtml
3382 2005-05-10  Brian Warner  <warner@lothar.com>
3384         * buildbot/scripts/runner.py (start): Twisted-1.3.0 used a
3385         different name for the internal twistw module, handle it.
3387         * MANIFEST.in: we deleted plugins.tml, so stop shipping it
3388         * setup.py: .. and stop trying to install it
3390         * buildbot/process/step.py (Git): added support for 'cogito' (aka
3391         'git'), the new linux kernel VC system (http://kernel.org/git/).
3392         Thanks to Brandon Philips for the patch.
3393         * buildbot/slave/commands.py (Git): same
3395 2005-05-06  Brian Warner  <warner@lothar.com>
3397         * buildbot/status/builder.py (OfflineLogFile): replace the default
3398         LogFile with a form that appends its new contents to a disk file
3399         as they arrive. The complete log data is never kept in RAM. This
3400         is the first step towards handling very large (100MB+) logfiles
3401         without choking quite so badly. (The other half is
3402         producer/consumer on the HTML pages).
3403         (BuildStepStatus.addLog): use OfflineLogFile by default
3404         (BuildStatus.getLogfileName): helper code to give the
3405         OfflineLogFile a filename to work with
3407         * buildbot/test/test_status.py (Results.testAddResults): update
3408         tests to handle new asserts
3409         * buildbot/test/test_vc.py (Patch.doPatch): same
3410         * buildbot/test/test_steps.py (BuildStep.setUp): same
3412 2005-05-05  Brian Warner  <warner@lothar.com>
3414         * buildbot/scripts/runner.py (start): if there is no Makefile,
3415         launch the app by importing twistd's internals and calling run(),
3416         rather than spawning a new twistd process. This stands a much
3417         better chance of working under windows.
3418         (stop): kill the process with os.kill instead of spawning
3419         /bin/kill, again to reduce the number of external programs which
3420         windows might not have in the PATH. Also wait up to 5 seconds for
3421         the process to go away, allowing things like 'buildbot stop;
3422         buildbot start' to be reliable in the face of slow shutdowns.
3424         * buildbot/master.py (Dispatcher.__getstate__): remove old
3425         .tap-related methods
3426         (BuildMaster.__getstate__): same
3427         (makeService): same
3428         * buildbot/slave/bot.py (makeService): same
3429         (Options.longdesc): same
3430         * buildbot/scripts/runner.py: copy over some old mktap option text
3432         * buildbot/scripts/runner.py (masterTAC): stop using mktap.
3433         'buildbot master' now creates a buildbot.tac file, so there is no
3434         longer a create-instance/save/reload sequence. mktap is dead, long
3435         live twistd -y.
3436         * buildbot/scripts/sample.mk: use twistd -y, not -f
3437         * buildbot/test/test_config.py: remove mktap-based test
3438         * buildbot/bb_tap.py, buildbot/plugins.tml: delete old files
3439         * README: don't reference mktap
3441         * docs/source.xhtml: document some of the attributes that Changes
3442         might have
3444         * docs/steps.xhtml (Bazaar): document the Bazaar checkout step
3446         * general: merge in Change(tag=) patch from Thomas Vander Stichele.
3447         [org.apestaart@thomas--buildbot/buildbot--cvstag--0-dev--patch-2]
3448         * buildbot/changes/changes.py (Change)
3449         * buildbot/changes/mail.py (parseSyncmail)
3450         * buildbot/test/test_mailparse.py (Test3.getNoPrefix)
3451         (Test3.testMsgS5)
3452         * buildbot/process/base.py (Build.isTagImportant)
3453         (Build.addChange)
3456 2005-05-04  Brian Warner  <warner@lothar.com>
3458         * buildbot/clients/sendchange.py (Sender.send): tear down the PB
3459         connection after sending the change, so that unit tests don't
3460         complain about sockets being left around
3462         * buildbot/status/html.py (WaterfallStatusResource.body): fix
3463         exception in phase=0 rendering
3464         * buildbot/test/test_web.py (WebTest.test_waterfall): test it
3466         * buildbot/changes/dnotify.py (DNotify.__init__): remove debug msg
3468         * buildbot/master.py (BuildMaster.loadConfig): finally remove
3469         deprecated config keys: webPortnum, webPathname, irc, manholePort,
3470         and configuring builders with tuples.
3471         * buildbot/test/test_config.py: stop testing compatibility with
3472         deprecated config keys
3473         * buildbot/test/test_run.py: same
3475 2005-05-03  Brian Warner  <warner@lothar.com>
3477         * contrib/arch_buildbot.py: survive if there are no logfiles
3478         (username): just use a string, os.getlogin isn't reliable
3480         * buildbot/scripts/runner.py (sendchange): oops, fix the command
3481         so 'buildbot sendchange' actually works. The earlier test only
3482         covered the internal (non-reactor-running) form.
3484         * contrib/arch_buildbot.py: utility that can run as an Arch hook
3485         script to notify the buildmaster about changes
3487         * buildbot/scripts/runner.py (sendchange): new command to send a
3488         change to a buildbot.changes.pb.PBChangeSource receiver.
3489         * buildbot/test/test_changes.py (Sender): test it
3491         * buildbot/master.py (BuildMaster.startService): mark .readConfig
3492         after any reading of the config file, not just when we do it in
3493         startService. This makes some tests a bit cleaner.
3495         * buildbot/changes/pb.py: add some log messages
3497         * buildbot/process/base.py (Build.startBuild): fix a bug that
3498         caused an exception when the build terminated in the very first
3499         step.
3500         (Build.stepDone): let steps return a status of EXCEPTION. This
3501         terminates the build right away, and sets the build's overall
3502         status to EXCEPTION too.
3503         * buildbot/process/step.py (BuildStep.failed): return a status of
3504         EXCEPTION when that is what has happened.
3506         * buildbot/process/step.py (Arch.computeSourceRevision): finally
3507         implement this, allowing Arch-based projects to get precise
3508         checkouts instead of always using the latest code
3509         (Bazaar): create variant of Arch to let folks use baz instead of
3510         tla. Requires a new buildslave too.
3511         * buildbot/slave/commands.py (Arch): add 'revision' argument
3512         (Bazaar): create variant of Arch that uses baz instead of tla.
3513         Remove the code that extracts the archive name from the
3514         register-archive output, since baz doesn't provide it, and require
3515         the user provide both the archive name and its location.
3516         * buildbot/test/test_vc.py (VC.testBazaar): added tests
3518 2005-05-02  Brian Warner  <warner@lothar.com>
3520         * buildbot/scripts/sample.cfg: improve docs for c['buildbotURL'],
3521         thanks to Nick Trout.
3523         * buildbot/scripts/runner.py (Maker.makefile): chmod before edit,
3524         deals better with source Makefile coming from a read-only CVS
3525         checkout. Thanks to Nick Trout for the catch.
3527         * buildbot/__init__.py (version): bump to 0.6.4+ while between
3528         releases
3530 2005-04-28  Brian Warner  <warner@lothar.com>
3532         * buildbot/__init__.py (version): Releasing buildbot-0.6.4
3534         * debian/changelog: update for 0.6.4
3536 2005-04-28  Brian Warner  <warner@lothar.com>
3538         * README.w32: add a checklist of steps for getting buildbot
3539         running on windows.
3540         * MANIFEST.in: include it in the tarball
3542         * NEWS: update
3544         * buildbot/master.py (BuildMaster.upgradeToVersion3): deal with
3545         broken .tap files from 0.6.3 by getting rid of .services,
3546         .namedServices, and .change_svc at load time.
3548 2005-04-27  Brian Warner  <warner@lothar.com>
3550         * NEWS: update in preparation for new release
3552         * buildbot/test/test_config.py (Save.testSave): don't pull in
3553         twisted.scripts.twistd, we don't need it and it isn't for windows
3554         anyway.
3556         * buildbot/changes/changes.py (ChangeMaster.saveYourself):
3557         accomodate win32 which can't do atomic-rename
3559 2005-04-27  Brian Warner  <warner@lothar.com>
3561         * buildbot/test/test_run.py (Disconnect.testBuild2): crank up some
3562         timeouts to help the slow metabuildbot not flunk them so much
3563         (Disconnect.testBuild3): same
3564         (Disconnect.testBuild4): same
3565         (Disconnect.testInterrupt): same
3567         * buildbot/master.py (BuildMaster.loadChanges): fix change_svc
3568         setup, it was completely broken for new buildmasters (those which
3569         did not have a 'change.pck' already saved. Thanks to Paul Warren
3570         for catching this (embarrassing!) bug.
3571         (Dispatcher.__getstate__): don't save our registered avatar
3572         factories, since they'll be re-populated when the config file is
3573         re-read.
3574         (BuildMaster.__init__): add a dummy ChangeMaster, used only by
3575         tests (since the real mktap-generated BuildMaster doesn't save
3576         this attribute).
3577         (BuildMaster.__getstate__): don't save any service children,
3578         they'll all be re-populated when the config file is re-read.
3579         * buildbot/test/test_config.py (Save.testSave): test for this
3581 2005-04-26  Brian Warner  <warner@lothar.com>
3583         * buildbot/buildbot.png: use a new, smaller (16x16) icon image,
3584         rendered with Blender.. looks a bit nicer.
3585         * buildbot/docs/images/icon.blend: add the Blender file for it
3587         * buildbot/slave/commands.py (ShellCommand._startCommand): prepend
3588         'cmd.exe' (or rather os.environ['COMSPEC']) to the argv list when
3589         running under windows. This appears to be the best way to allow
3590         BuildSteps to do something normal like 'trial -v buildbot.test' or
3591         'make foo' and still expect it to work. The idea is to make the
3592         BuildSteps look as much like what a developer would type when
3593         compiling or testing the tree by hand. This approach probably has
3594         problems when there are spaces in the arguments, so if you've got
3595         windows buildslaves, you'll need to pay close attention to your
3596         commands.
3598         * buildbot/status/html.py (WaterfallStatusResource.body): add the
3599         timezone to the timestamp column.
3600         * buildbot/test/test_web.py (WebTest.test_waterfall): test it
3602         * buildbot/scripts/runner.py (loadOptions): do something sane for
3603         windows, I think. We use %APPDATA%/buildbot instead of
3604         ~/.buildbot, but we still search everywhere from the current
3605         directory up to the root for a .buildbot/ subdir. The "is it under
3606         $HOME" security test was replaced with "is it owned by the current
3607         user", which is only performed under posix.
3608         * buildbot/test/test_runner.py (Options.testFindOptions): update
3609         tests to match. The "is it owned by the current user" check is
3610         untested. The test has been re-enabled for windows.
3612         * buildbot/test/test_slavecommand.py (Shell.checkOutput): replace
3613         any "\n" in the expected output with the platform-specific line
3614         separator. Make this separator "\r\n" on PTYs under unix, they
3615         seem to do that and I don't know why
3617         * buildbot/test/test_runner.py (Options.optionsFile): disable on
3618         windows for now, I don't know what ~/.buildbot/ should mean there.
3620         * buildbot/test/test_run.py (BuilderNames.testGetBuilderNames):
3621         win32 compatibility, don't use "/tmp"
3622         (Basedir.testChangeBuilddir): remove more unixisms
3624 2005-04-26  Brian Warner  <warner@lothar.com>
3626         * buildbot/test/test_control.py (Force.rmtree): python2.2
3627         compatibility, apparently its shutil.rmtree ignore_errors=
3628         argument is ignored.
3629         * buildbot/test/test_run.py (Run.rmtree): same
3630         (RunMixin.setUp): same
3632         * buildbot/test/test_runner.py (make): python2.2 has os.sep but
3633         not os.path.sep
3635         * buildbot/test/test_twisted.py (Parse.failUnlessIn): 2.2 has no
3636         'substring in string' operator, must use string.find(substr)!=-1
3637         * buildbot/test/test_vc.py (Patch.failUnlessIn): same
3638         * buildbot/test/test_web.py (WebTest.failUnlessIn): same
3640         * buildbot/scripts/runner.py (loadOptions): add code to search for
3641         ~/.buildbot/, a directory with things like 'options', containing
3642         defaults for various 'buildbot' subcommands. .buildbot/ can be in
3643         the current directory, your $HOME directory, or anywhere
3644         inbetween, as long as you're somewhere inside your home directory.
3645         (debugclient): look in ~/.buildbot/options for master and passwd
3646         (statuslog): look in ~/.buildbot/options for 'masterstatus'
3647         * buildbot/test/test_runner.py (Options.testFindOptions): test it
3649         * buildbot/status/client.py (makeRemote): new approach to making
3650         IRemote(None) be None, which works under Twisted-2.0
3651         * buildbot/test/test_status.py (Client.testAdaptation): test it
3653         * buildbot/status/builder.py (Status.builderAdded): when loading a
3654         pickled BuilderStatus in from disk, set its name after loading.
3655         The config file might have changed its name (but not its
3656         directory) while it wasn't looking.
3657         
3658         * buildbot/process/builder.py (Builder.attached): always return a
3659         Deferred, even if the builder was already attached
3660         * buildbot/test/test_run.py (Basedir.testChangeBuilddir): test it
3662 2005-04-25  Brian Warner  <warner@lothar.com>
3664         * buildbot/status/words.py (IrcStatusBot.buildFinished): fix a
3665         category-related exception when announcing a build has finished
3667         * buildbot/status/html.py (StatusResourceChanges.body): oops, don't
3668         reference no-longer-existent changemaster.sources
3669         * buildbot/test/test_web.py (WebTest.test_waterfall): test for it
3671         * buildbot/__init__.py (version): bump to 0.6.3+ while between
3672         releases
3674 2005-04-25  Brian Warner  <warner@lothar.com>
3676         * buildbot/__init__.py (version): Releasing buildbot-0.6.3
3678         * debian/changelog: update for 0.6.3
3680 2005-04-25  Brian Warner  <warner@lothar.com>
3682         * MANIFEST.in: make sure debug.glade is in the tarball
3684         * README (REQUIREMENTS): list necessary Twisted-2.0 packages
3686         * NEWS: update for the imminent 0.6.3 release
3688         * buildbot/status/html.py (HtmlResource.content): make the
3689         stylesheet <link> always point at "buildbot.css".
3690         (StatusResource.getChild): map "buildbot.css" to a static.File
3691         containing whatever css= argument was provided to Waterfall()
3692         (Waterfall): provide the "classic" css as the default.
3693         * docs/waterfall.classic.css: move default CSS from here ..
3694         * buildbot/status/classic.css: .. to here
3696         * MANIFEST.in: make sure classic.css is included in the tarball
3697         * setup.py: and that it is installed too, under buildbot/status/
3699         * buildbot/master.py (BuildMaster): oops, set .change_svc=None at
3700         the module level, because buildbot.tap files from 0.6.2 don't have
3701         it in their attribute dictionary.
3703         * buildbot/slave/bot.py (Bot.startService): make sure the basedir
3704         really exists at startup, might save some confusion somewhere.
3706 2005-04-24  Thomas Vander Stichele  <thomas at apestaart dot org>
3708         * docs/waterfall.classic.css:
3709           add a stylesheet that's almost the same as the "classic"
3710           buildbot style
3712         * buildbot/status/builder.py:
3713           add EXCEPTION as a result - this is a problem for the bot
3714           maintainer, not a build problem for the changers
3715         * buildbot/process/step.py:
3716           use EXCEPTION instead of FAILURE for exceptions
3717         * buildbot/status/html.py:
3718           add build_get_class to get a class out of a build/buildstep
3719           finish naming the classes
3720           split out sourceNames to changeNames and builderNames so we
3721           can style them separately
3722         * docs/config.xhtml:
3723           finish documenting classes as they are right now
3725         * buildbot/status/html.py:
3726           name the classes as we agreed on IRC
3727         * docs/config.xhtml:
3728           and document them
3730         * buildbot/status/html.py:
3731           same for cssclass->class_
3733         * buildbot/status/html.py:
3734           as decided on IRC, use class_ for the "class" attribute to not
3735           conflict with the class keyword, and clean up the messy **{} stuff.
3737         * buildbot/status/mail.py:
3738           put back "builders" argument, and fix docstring, because the
3739           code *ignores* builders listed in this argument
3741         * buildbot/process/builder.py:
3742           remove FIXME notes - category is now indeed a cvar of BuilderStatus
3744         * docs/config.xhtml:
3745           describe the category argument for builders
3747         * buildbot/status/builder.py:
3748           Fix a silly bug due to merging
3750         * buildbot/process/builder.py:
3751           remove category from the process Builder ...
3752         * buildbot/status/builder.py:
3753           ... and add it to BuilderStatus instead.
3754           Set category on unpickled builder statuses, they might not have it.
3755         * buildbot/master.py:
3756           include category when doing builderAdded
3757         * buildbot/status/mail.py:
3758           return None instead of self for builders we are not interested in.
3759         * buildbot/test/test_run.py:
3760           fix a bug due to only doing deferredResult on "dummy" waiting
3761         * buildbot/test/test_status.py:
3762           add checks for the Mail IStatusReceiver returning None or self
3764         * buildbot/status/html.py:
3765           fix testsuite by prefixing page title with BuildBot
3767         * buildbot/status/builder.py:
3768           have .category in builder status ...
3769         * buildbot/process/builder.py:
3770           ... and set it from Builder
3771         * buildbot/status/html.py:
3772           make .css a class variable 
3773         * buildbot/test/test_status.py:
3774           write more tests to cover our categories stuff ...
3775         * buildbot/status/mail.py:
3776           ... and fix the bug that this uncovered
3778         * buildbot/changes/mail.py:
3779         * buildbot/changes/pb.py:
3780         * buildbot/master.py:
3781         * buildbot/process/base.py:
3782         * buildbot/process/factory.py:
3783         * buildbot/process/interlock.py:
3784         * buildbot/process/step.py:
3785         * buildbot/process/step_twisted.py:
3786         * buildbot/slave/commands.py:
3787         * buildbot/status/builder.py:
3788         * buildbot/status/client.py:
3789         * buildbot/status/html.py:
3790         * buildbot/status/mail.py:
3791         * buildbot/status/progress.py:
3792         * buildbot/test/test_changes.py:
3793         * buildbot/test/test_config.py:
3794         * buildbot/test/test_control.py:
3795         * buildbot/test/test_interlock.py:
3796         * buildbot/test/test_maildir.py:
3797         * buildbot/test/test_mailparse.py:
3798         * buildbot/test/test_run.py:
3799         * buildbot/test/test_slavecommand.py:
3800         * buildbot/test/test_status.py:
3801         * buildbot/test/test_steps.py:
3802         * buildbot/test/test_twisted.py:
3803         * buildbot/test/test_util.py:
3804         * buildbot/test/test_vc.py:
3805         * buildbot/test/test_web.py:
3806         * buildbot/util.py:
3807           add test-case-name at the top of a whole set of files
3809         * buildbot/status/builder.py:
3810           keep order of addition when getting builder names
3811         * buildbot/status/words.py:
3812         * buildbot/test/test_run.py:
3813           add test for getBuilderNames
3815         * buildbot/process/base.py:
3816         * buildbot/process/step.py:
3817         * buildbot/status/builder.py:
3818         * buildbot/status/html.py:
3819           make buildbot css-able
3820           replace the color code for purple with purple, don't understand
3821           why it wasn't purple to start with
3823         * buildbot/status/words.py:
3824           ok, so it doesn't look like BuilderStatus.remote is still valid.
3825           Use what waterfall uses instead.
3827         * buildbot/interfaces.py:
3828         * buildbot/status/builder.py:
3829         * buildbot/status/html.py:
3830         * buildbot/status/mail.py:
3831         * buildbot/status/words.py:
3832         * buildbot/test/test_run.py:
3833           use categories everywhere and make it be a list.  More sensible
3834           for the future.  Also make words actually respect this in
3835           buildFinished.
3837         * buildbot/interfaces.py:
3838           add category argument to getBuilderNames
3839         * buildbot/process/builder.py:
3840         * buildbot/status/builder.py:
3841         * buildbot/status/html.py:
3842         * buildbot/status/mail.py:
3843         * buildbot/status/words.py:
3844         * buildbot/test/test_run.py:
3845           move from specifying builders by name to specifying the category
3847         * buildbot/status/html.py:
3848         * buildbot/status/words.py:
3849           add "builders=" to __init__ of status clients so they can
3850           limit themselves to the given list of builders to report on
3852         * buildbot/status/html.py: set the title to the product name
3854 2005-04-23  Thomas Vander Stichele  <thomas at apestaart dot org>
3856         * buildbot/interfaces.py:
3857         * buildbot/status/builder.py:
3858           more documentation.  Hm, not sure if ChangeLog entries make sense
3859           here...
3861 2005-04-23  Brian Warner  <warner@lothar.com>
3863         * buildbot/test/test_vc.py (SetupMixin.do_vc): increase timeouts
3865         * buildbot/test/test_slavecommand.py (Shell): increase timeouts
3867         * buildbot/scripts/runner.py: make 'statuslog' and 'statusgui' be
3868         the sub-commands that log buildmaster status to stdout and to a
3869         GUI window, respectively.
3871         * buildbot/clients/gtkPanes.py: overhaul. basic two-row
3872         functionality is working again, but all the step-status and ETA
3873         stuff is missing. Commented out a lot of code pending more
3874         overhaul work.
3876         * buildbot/status/client.py: make sure that IRemote(None) is None
3878         * buildbot/changes/changes.py: import defer, oops
3879         (ChangeMaster): remove the .sources list, rely upon the fact that
3880         MultiServices can be treated as sequences of their children. This
3881         cleans up the add/remove ChangeSource routines a lot, as we keep
3882         exactly one list of the current sources instead of three.
3884         * buildbot/master.py (BuildMaster.__init__): remove .sources, set
3885         up an empty ChangeMaster at init time.
3886         (BuildMaster.loadChanges): if there are changes to be had from
3887         disk, replace self.change_svc with the new ones. If not, keep
3888         using the empty ChangeMaster set up in __init__.
3889         (BuildMaster.loadConfig_Sources): use list(self.change_svc)
3890         instead of a separate list, makes the code a bit cleaner.
3891         * buildbot/test/test_config.py (ConfigTest.testSimple): match it
3892         (ConfigTest.testSources): same, also wait for loadConfig to finish.
3893         Extend the test to make sure we can get rid of the sources when
3894         we're done.
3896 2005-04-22  Brian Warner  <warner@lothar.com>
3898         * buildbot/scripts/runner.py (Maker.mkinfo): create the info/admin
3899         and info/host files when making the slave directory
3901         * buildbot/test/test_run.py (RunMixin.shutdownSlave): remove the
3902         whendone= argument, just return the Deferred and let the caller do
3903         what they want with it.
3904         (Disconnect.testBuild1): wait for shutdownSlave
3905         (Basedir.testChangeBuilddir): new test to make sure changes to the
3906         builddir actually get propagated to the slave
3908         * buildbot/slave/bot.py (SlaveBuilder.setBuilddir): use an
3909         explicit method, rather than passing the builddir in __init__ .
3910         Make sure to update self.basedir too, this was broken before.
3911         (Bot.remote_setBuilderList): use b.setBuilddir for both new
3912         builders and for ones that have just had their builddir changed.
3913         (BotFactory): add a class-level .perspective attribute, so
3914         BuildSlave.waitUntilDisconnected won't get upset when the
3915         connection hasn't yet been established
3916         (BuildSlave.__init__): keep track of the bot.Bot instance, so
3917         tests can reach through it to inspect the SlaveBuilders
3919         * buildbot/process/base.py (Build.buildException): explain the
3920         log.err with a log.msg
3921         * buildbot/process/builder.py (Builder.startBuild): same
3922         (Builder._startBuildFailed): improve error message
3924         * buildbot/pbutil.py (RBCP.failedToGetPerspective): if the failure
3925         occurred because we lost the brand-new connection, retry instead
3926         of giving up. If not, it's probably an authorization failure, and
3927         it makes sense to stop trying. Make sure we log.msg the reason
3928         that we're log.err'ing the failure, otherwise test failures are
3929         really hard to figure out.
3931         * buildbot/master.py: change loadConfig() to return a Deferred
3932         that doesn't fire until the change has been fully implemented.
3933         This means any connected slaves have been updated with the new
3934         builddir. This change makes it easier to test the code which
3935         actually implements this builddir-updating.
3936         (BotPerspective.addBuilder): return Deferred
3937         (BotPerspective.removeBuilder): same
3938         (BotPerspective.attached): same
3939         (BotPerspective._attached): same. finish with remote_print before
3940         starting the getSlaveInfo, instead of doing them in parallel
3941         (BotPerspective.list_done): same
3942         (BotMaster.removeSlave): same. Fix the typo that meant we weren't
3943         actually calling slave.disconnect()
3944         (BotMaster.addBuilder): same
3945         (BotMaster.removeBuilder): same
3946         (BuildMaster.loadConfig): same
3947         (BuildMaster.loadConfig_Slaves): same
3948         (BuildMaster.loadConfig_Sources): same
3949         (BuildMaster.loadConfig_Builders): same
3950         (BuildMaster.loadConfig_status): same
3952         * buildbot/changes/changes.py (ChangeMaster.removeSource): return
3953         a Deferred that fires when the source is finally removed
3955         * buildbot/slave/commands.py (SourceBase.doClobber): when removing
3956         the previous tree on win32, where we have to do it synchronously,
3957         make sure we return a Deferred anyway.
3958         (SourceBase.doCopy): same
3960         * buildbot/scripts/runner.py (statusgui): use the text client for
3961         now, while I rewrite the Gtk one
3962         * buildbot/clients/base.py: strip out old code, leaving just the
3963         basic print-message-on-event functionality. I also remove the
3964         ReconnectingPBClientFactory, but it does at least quit when it
3965         loses the connection instead of going silent
3967 2005-04-21  Brian Warner  <warner@lothar.com>
3969         * Makefile: minor tweaks
3971         * NEWS: point out deprecation warnings, new features for
3972         /usr/bin/buildbot
3974         * buildbot/master.py (BuildMaster.loadConfig): emit
3975         DeprecationWarnings for Builders defined with tuples. Rearrange
3976         code to facility removal of deprecated configuration keys in the
3977         next release.
3979         * buildbot/scripts/runner.py (createMaster,createSlave): rewrite
3980         'buildbot' command to put a little Makefile in the target that
3981         helps you re-create the buildbot.tap file, start or stop the
3982         master/slave, and reconfigure (i.e. SIGHUP) the master. Also chmod
3983         all the files 0600, since they contain passwords.
3984         (start): if there is a Makefile, and /usr/bin/make exists, use
3985         'make start' in preference to a raw twistd command. This lets
3986         slave admins put things like PYTHONPATH variables in their
3987         Makefiles and have them still work when the slave is started with
3988         'buildbot start ~/slave/foo'. The test is a bit clunky, it would
3989         be nice to first try the 'make' command and only fall back to
3990         twistd if it fails. TODO: the Makefile's "start" command does not
3991         add the --reactor=win32 argument when running under windows.
3992         (Options.debugclient, Options.statusgui): add sub-commands to launch
3993         the debug client (formerly in contrib/debugclient.py) and the
3994         Gtk status application (currently broken)
3995         * buildbot/clients/debug.py: move from contrib/debugclient.py
3996         * buildbot/clients/debug.glade: same
3998         * buildbot/test/test_trial.py: remove it. This requires some
3999         functionality out of Twisted that isn't there yet, and until then
4000         having it around just confuses things.
4002         * buildbot/test/test_slavecommand.py (Shell): test both with and
4003         without PTYs, and make sure that command output is properly
4004         interleaved in the with-PTY case. I think the without-PTY test
4005         should pass on windows, where we never use PTYs anyway.
4007 2005-04-20  Brian Warner  <warner@lothar.com>
4009         * README (REQUIREMENTS): mention Twisted-2.0.0 compatibility
4011         * MANIFEST.in: add epyrun, gen-reference, buildbot.png
4013         * NEWS: start creating entries for the next release
4015         * buildbot/slave/commands.py (ShellCommand.__init__): use os.pathsep
4017         * buildbot/test/test_web.py (WebTest.test_webPortnum): add timeout
4018         (WebTest.test_webPathname): same
4019         (WebTest.test_webPathname_port): same
4020         (WebTest.test_waterfall): use the default favicon rather than
4021         rooting around the filesystem for it. Open the expected-icon file
4022         in binary mode, to make win32 tests happier (thanks to Nick Trout
4023         for the catch)
4024         * buildbot/status/html.py (buildbot_icon): win32 portability
4026         * buildbot/test/test_slavecommand.py (SlaveCommandTestCase.testShellZ):
4027         win32-compatibility fixes from Nick Trout, the "file not found" message
4028         is different under windows
4029         (FakeSlaveBuilder.__init__): clean up setup a bit
4030         * buildbot/test/test_vc.py (VCSupport.__init__): win32: use os.pathsep
4032 2005-04-19  Brian Warner  <warner@lothar.com>
4034         * buildbot/test/test_vc.py (SetupMixin.setUpClass): fix the
4035         skip-if-repositories-are-unavailable test to not kill the trial
4036         that comes with Twisted-1.3.0
4038         * setup.py: install buildbot.png icon file when installing code
4040         * buildbot/slave/commands.py (ShellCommand._startCommand): log the
4041         environment used by the command, at least on the child side.
4043         * buildbot/status/html.py (TextLog.pauseProducing): add a note,
4044         this method needs to be added and implemented because it gets
4045         called under heavy load. I don't quite understand the
4046         producer/consumer API enough to write it.
4047         (StatusResource.getChild): add a resource for /favicon.ico
4048         (Waterfall.__init__): add favicon= argument
4049         * buildbot/test/test_web.py (WebTest.test_waterfall): test it
4050         (WebTest.test_webPortnum): stop using deprecated 'webPortnum'
4051         (WebTest.test_webPathname): same
4052         (WebTest.test_webPathname_port): same
4053         * docs/config.xhtml: mention favicon=
4054         * buildbot/buildbot.png: add a default icon, dorky as it is
4056 2005-04-18  Thomas Vander Stichele  <thomas at apestaart dot org>
4058         * buildbot/master.py:
4059         * buildbot/process/base.py:
4060         * buildbot/process/builder.py:
4061         * buildbot/process/interlock.py:
4062         * buildbot/status/builder.py:
4063         * buildbot/status/html.py:
4064         * buildbot/status/mail.py:
4065         * buildbot/status/words.py:
4066           new documentation while digging through the code
4068 2005-04-17  Brian Warner  <warner@lothar.com>
4070         * general: try to fix file modes on all .py files: a+r, a-x,
4071         but let buildbot/clients/*.py be +x since they're tools
4073         * docs/epyrun (addMod): when an import fails, say why
4075         * Makefile: Add a 'docs' target, hack on the PYTHONPATH stuff
4077 2005-04-17  Thomas Vander Stichele  <thomas at apestaart dot org>
4079         * buildbot/process/base.py:
4080         * buildbot/process/builder.py:
4081         * buildbot/status/builder.py:
4082           new documentation while digging through the code
4084 2005-04-17  Thomas Vander Stichele  <thomas at apestaart dot org>
4086         * buildbot/changes/changes.py:
4087         * buildbot/changes/p4poller.py:
4088         * buildbot/interfaces.py:
4089         * buildbot/process/base.py:
4090         * buildbot/process/builder.py:
4091         * buildbot/process/step.py:
4092         * buildbot/process/step_twisted.py:
4093         * buildbot/slave/bot.py:
4094         * buildbot/slave/commands.py:
4095         * buildbot/status/builder.py:
4096           fix all docstrings to make epydoc happy.  In the process of fixing
4097           some, I also moved pieces of docs, and removed some deprecated
4098           documentation
4100 2005-04-17  Thomas Vander Stichele  <thomas at apestaart dot org>
4102         * buildbot/process/builder.py:
4103         * buildbot/process/interlock.py:
4104         * buildbot/process/process_twisted.py:
4105         * buildbot/process/step.py:
4106           BuildProcess -> Build, as it looks like that's what happened
4107         * buildbot/process/base.py:
4108         * buildbot/process/factory.py:
4109           update epydoc stuff
4111 2005-04-17  Brian Warner  <warner@lothar.com>
4113         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
4114         update compile command to accomodate the Twisted split.. now
4115         instead of './setup.py build_ext -i', you do './setup.py all
4116         build_ext -i', to run build_ext over all sub-projects.
4117         (FullTwistedBuildFactory): same
4118         (TwistedReactorsBuildFactory): same
4120         * buildbot/status/html.py (TextLog.finished): null out self.req
4121         when we're done, otherwise the reference cycle of TextLog to .req
4122         to .notifications to a Deferred to TextLog.stop keeps them from
4123         being collected, and consumes a huge (610MB on pyramid at last
4124         check) amount of memory.
4126 2005-04-11  Brian Warner  <warner@lothar.com>
4128         * buildbot/test/test_vc.py (VCSupport.__init__): use abspath() to
4129         normalize the VC-repository location.. makes SVN happier with
4130         certain test environments.
4132         * buildbot/process/step.py (RemoteShellCommand.__init__): let each
4133         RemoteShellCommand gets its own .env dictionary, so that code in
4134         start() doesn't mutate the original. I think this should fix the
4135         step_twisted.Trial problem where multiple identical components
4136         kept getting added to PYTHONPATH= over and over again.
4138         * general: merge org.apestaart@thomas/buildbot--doc--0--patch-3,
4139         adding epydoc-format docstrings to many classes. Thanks to Thomas
4140         Vander Stichele for the patches.
4141         * docs/epyrun, docs/gen-reference: add epydoc-generating tools
4142         * buildbot/status/mail.py, buildbot/process/step_twisted.py: same
4143         * buildbot/slave/bot.py, commands.py, registry.py: same
4145 2005-04-05  Brian Warner  <warner@lothar.com>
4147         * buildbot/slave/commands.py (SourceBase.doCopy): use cp -p to
4148         preserve timestamps, helps incremental builds of large trees.
4149         Patch from Rene Rivera.
4151         * buildbot/slave/bot.py (SlaveBuilder.commandComplete): oops, log
4152         'failure' and not the non-existent 'why'. Thanks to Rene Rivera
4153         for the catch.
4155 2005-04-03  Brian Warner  <warner@lothar.com>
4157         * buildbot/master.py (BuildMaster.loadConfig): only call exec()
4158         with one dict, apparently exec has some scoping bugs when used
4159         with both global/local dicts. Thanks to Nathaniel Smith for the
4160         catch.
4162 2005-04-02  Brian Warner  <warner@lothar.com>
4164         * buildbot/process/step_twisted.py (countFailedTests): the new
4165         trial in Twisted-2.0 emits a slightly different status line than
4166         old trial ("PASSED.." instead of "OK.."). Handle it so we don't
4167         mistakenly think the test count is unparseable.
4168         (Trial.start): note that for some reason each build causes another
4169         copy of self.testpath to be prepended to PYTHONPATH. This needs to
4170         be fixed but I'm not sure quite where the problem is.
4172 2005-04-01  Brian Warner  <warner@lothar.com>
4174         * buildbot/test/test_run.py (Run.testMaster): change some uses of
4175         deferredResult to avoid hangs/warnings under twisted-2.0
4176         (RunMixin.tearDown): same
4177         (RunMixin.shutdownSlave): same
4178         (Disconnect.testIdle1): same
4179         (Disconnect.testBuild2): same: wait one second after the build
4180         finishes for test to really be done.. this should be cleaned up to
4181         avoid wasting that second. Builder.detach uses a callLater(0),
4182         either that should be done in-line (something else needed that
4183         behavior), or it should return a Deferred that fires when the
4184         builder is really offline.
4185         (Disconnect.testBuild3): same
4186         (Disconnect.testDisappear): same
4188         * buildbot/test/test_web.py: rearrange server-setup and teardown
4189         code to remove unclean-reactor warnings from twisted-2.0
4191         * buildbot/test/test_vc.py: rearrange probe-for-VC-program routine
4192         so the tests don't hang under twisted-2.0
4194 2005-03-31  Brian Warner  <warner@lothar.com>
4196         * buildbot/slave/bot.py (Bot.remote_setBuilderList): fix typo that
4197         caused a warning each time the master changed our set of builders
4199         * buildbot/status/builder.py (BuildStatus.saveYourself): under
4200         w32, don't unlink the file unless it already exists. Thanks to
4201         Baptiste Lepilleur for the catch.
4202         (BuilderStatus.saveYourself): same
4204 2005-02-01  Brian Warner  <warner@lothar.com>
4206         * buildbot/status/html.py (TextLog.getChild): use a /text child
4207         URL, such as http://foo.com/svn-hello/builds/1/test/0/text instead
4208         of http://foo.com/svn-hello/builds/1/test/0 , to retrieve the
4209         logfile as text/plain (no markup, no headers). This replaces the
4210         previous scheme (which used an ?text=1 argument), and gets us back
4211         to a relative link (which works better when the buildbot lives
4212         behind another web server, such as Apache configured as a reverse
4213         proxy). Thanks to Gerald Combs for spotting the problem.
4215         * buildbot/__init__.py (version): bump to 0.6.2+ while between
4216         releases
4218 2004-12-13  Brian Warner  <warner@lothar.com>
4220         * buildbot/__init__.py (version): Releasing buildbot-0.6.2
4222         * debian/changelog: update for 0.6.2
4223         * NEWS: finalize for 0.6.2
4225 2004-12-11  Brian Warner  <warner@lothar.com>
4227         * NEWS: bring it up to date
4229         * buildbot/slave/bot.py (BotFactory): revamp keepalive/lost-master
4230         detection code. Require some sign of life from the buildmaster
4231         every BotFactory.keepaliveInterval seconds. Provoke this
4232         indication at BotFactory.keepaliveTimeout seconds before the
4233         deadline by sending a keepalive request. We don't actually care if
4234         that request is answered in a timely fashion, what we care about
4235         is that .activity() is called before the deadline. .activity() is
4236         triggered by any PB message from the master (including an ack to
4237         one of the slave's status-update messages). With this new scheme,
4238         large status messages over slow pipes are OK, as long as any given
4239         message can be sent (and thus acked) within .keepaliveTimeout
4240         seconds (which defaults to 30).
4241         (SlaveBuilder.remote_startCommand): record activity
4242         (SlaveBuilder.ackUpdate): same
4243         (SlaveBuilder.ackComplete): same
4244         (BotFactory.gotPerspective): same
4245         * buildbot/test/test_run.py (Disconnect.testSlaveTimeout): test it
4247 2004-12-09  Brian Warner  <warner@lothar.com>
4249         * buildbot/status/html.py (StatusResourceBuilder.getChild): remove
4250         debug message
4252         * buildbot/process/step_twisted.py (Trial._commandComplete):
4253         update self.cmd when we start the 'cat test.log' transfer. Without
4254         this, we cannot interrupt the correct RemoteCommand when we lose
4255         the connection.
4257         * buildbot/process/step.py (RemoteCommand.interrupt): don't bother
4258         trying to tell the slave to stop the command if we're already
4259         inactive, or if we no longer have a .remote
4261         * buildbot/process/builder.py (Builder._detached): don't let an
4262         exception in currentBuild.stopBuild() prevent the builder from
4263         being marked offline
4265 2004-12-07  Brian Warner  <warner@lothar.com>
4267         * buildbot/status/words.py (IrcStatusBot.getBuilder): catch the
4268         KeyError that happens when you ask for a non-existent Builder, and
4269         translate it into a UsageError.
4271         * buildbot/test/test_run.py (Disconnect.testBuild4): validate that
4272         losing the slave in the middle of a remote step is handled too
4274         * buildbot/process/step.py (ShellCommand.interrupt): 'reason' can
4275         be a Failure, so be sure to stringify it before using it as the
4276         contents of the 'interrupt' logfile
4277         (RemoteCommand.interrupt): use stringified 'why' in
4278         remote_interruptCommand too, just in case
4280 2004-12-06  Brian Warner  <warner@lothar.com>
4282         * buildbot/slave/commands.py (Arch.doVCUpdate): use 'tla replay'
4283         instead of 'tla update', which is more efficient in case we've
4284         missed a couple of patches since the last update.
4286         * debian/changelog: update for previous (0.6.1) release. Obviously
4287         this needs to be handled better.
4289 2004-12-05  Brian Warner  <warner@lothar.com>
4291         * NEWS: update for stuff since last release
4293         * buildbot/master.py (DebugPerspective.attached): return 'self', to
4294         match the maybeDeferred change in Dispatcher.requestAvatar
4295         * buildbot/changes/pb.py (ChangePerspective.attached): same
4296         * buildbot/status/client.py (StatusClientPerspective.attached): same
4297         * buildbot/process/builder.py (Builder._attached3): same
4298         * buildbot/pbutil.py (NewCredPerspective.attached): same
4300         * buildbot/status/html.py (WaterfallStatusResource.phase2): Add
4301         the date to the top-most box, if it is not the same as today's
4302         date.
4304         * docs/slave.xhtml: provide a buildslave setup checklist
4306         * docs/source.xhtml (Arch): correct terminology
4308 2004-12-04  Brian Warner  <warner@lothar.com>
4310         * buildbot/test/test_slavecommand.py: use sys.executable instead
4311         of hard-coding 'python' for child commands, might help portability
4313         * docs/examples/twisted_master.cfg: update to current usage
4315         * buildbot/status/words.py (IrcStatusBot.command_STOP): add a
4316         'stop build' command to the IRC bot
4318         * buildbot/master.py (Dispatcher.requestAvatar): remove debug
4319         message that broke PBChangeSource
4321         * buildbot/slave/bot.py: clean up shutdown/lose-master code
4322         (SlaveBuilder): make some attributes class-level, remove the old
4323         "update queue" which existed to support resuming a build after the
4324         master connection was lost. Try to reimplement that feature later.
4325         (SlaveBuilder.stopCommand): clear self.command when the
4326         SlaveCommand finishes, so that we don't try to kill a leftover one
4327         at shutdown time.
4328         (SlaveBuilder.commandComplete): same, merge with commandFailed and
4329         .finishCommand
4331         * buildbot/slave/commands.py (SourceBase): set self.command for
4332         all VC commands, so they can be interrupted.
4334 2004-12-03  Brian Warner  <warner@lothar.com>
4336         * buildbot/master.py: clean up slave-handling code, to handle
4337         slave-disconnect and multiple-connect better
4338         (BotPerspective): make these long-lasting, exactly one per bot
4339         listed in the config file.
4340         (BotPerspective.attached): if a slave connects while an existing
4341         one appears to still be connected, disconnect the old one first.
4342         (BotPerspective.disconnect): new method to forcibly disconnect a
4343         buildslave. Use some hacks to empty the transmit buffer quickly to
4344         avoid the long (20-min?) TCP timeout that could occur if the old
4345         slave has dropped off the net.
4346         (BotMaster): Keep persistent BotPerspectives in .slaves, let them
4347         own their own SlaveStatus objects. Remove .attached/.detached, add
4348         .addSlave/.removeSlave, treat slaves like Builders (config file
4349         parsing sends deltas to the BotMaster). Inform the slave
4350         instances, i.e. the BotPerspective, about addBuilder and
4351         removeBuilder.
4352         (BotMaster.getPerspective): turns into a single dict lookup
4353         (Dispatcher.requestAvatar): allow .attached to return a Deferred,
4354         which gives BotPerspective.attached a chance to disconnect the old
4355         slave first.
4356         (BuildMaster.loadConfig): add code (disabled) to validate that all
4357         builders use known slaves (listed in c['bots']). The check won't
4358         work with tuple-specified builders, which are deprecated but not
4359         yet invalid, so the check is disabled for now.
4360         (BuildMaster.loadConfig_Slaves): move slave-config into a separate
4361         routine, do the add/changed/removed dance with them like we do
4362         with builders.
4363         (BuildMaster.loadConfig_Sources): move source-config into a
4364         separate routine too
4366         * buildbot/status/builder.py (Status.getSlave): get the
4367         SlaveStatus object from the BotPerspective, not the BotMaster.
4369         * buildbot/test/test_run.py: bunch of new tests for losing the
4370         buildslave at various points in the build, handling a slave that
4371         connects multiple times, and making sure we can interrupt a
4372         running build
4374         * buildbot/slave/bot.py (BuildSlave): make it possible to use
4375         something other than 'Bot' for the Bot object, to make certain
4376         test cases easier to write.
4377         (BuildSlave.waitUntilDisconnected): utility method for testing
4379 2004-11-30  Brian Warner  <warner@lothar.com>
4381         * buildbot/test/test_run.py (RunMixin): refactor, remove debug msg
4383         * buildbot/interfaces.py (IBuilderControl.ping): add timeout=
4384         argument, return a Deferred that always fires with True or False.
4385         I don't use an errback to indicate 'ping failed' so that callers
4386         are free to ignore the deferred without causing spurious errors in
4387         the logs.
4388         * buildbot/process/builder.py (BuilderControl.ping): implement it
4390         * buildbot/test/test_run.py (Status.testDisappear): test ping
4391         (Status.disappearSlave): fix it
4393 2004-11-30  Brian Warner  <warner@lothar.com>
4395         * buildbot/interfaces.py (IBuildControl): add .stopBuild
4396         (IBuilderControl): add .getBuild(num), only works for the current
4397         build, of course, although it might be interesting to offer
4398         something for builds in the .waiting or .interlocked state.
4400         * buildbot/process/base.py (Build): have .stopBuild just do the
4401         interrupt, then let the build die by itself.
4402         (BuildControl): add .stopBuild, and add a point-event named
4403         'interrupt' just after the build so status viewers can tell that
4404         someone killed it.
4405         (BuilderControl): add .getBuild
4407         * buildbot/process/step.py (Dummy): use haltOnFailure so it really
4408         stops when you kill it, good for testing
4409         (ShellCommand.interrupt): add a logfile named 'interrupt' which
4410         contains the 'reason' text.
4412         * buildbot/status/html.py: Add Stop Build button, if the build can
4413         still be stopped. Send a Redirect (to the top page) one second
4414         later, hopefully long enough for the interrupt to have an effect.
4415         Move make_row() up to top-level to share it between Stop Build and
4416         Force Build.
4418         * buildbot/slave/commands.py: only kill the child process once
4420         * buildbot/test/test_run.py: add testInterrupt
4422 2004-11-29  Brian Warner  <warner@lothar.com>
4424         * buildbot/process/base.py: Refactor command interruption. The
4425         Build is now responsible for noticing that the slave has gone
4426         away: Build.lostRemote() interrupts the current step and makes
4427         sure that no further ones will be started.
4428         
4429         * buildbot/process/builder.py: When the initial remote_startBuild
4430         message fails, log it: this usually indicates that the slave has
4431         gone away, but we don't really start paying attention until they
4432         fail to respond to the first step's command.
4434         * buildbot/process/step.py (RemoteCommand): Does *not* watch for
4435         slave disconnect. Now sports a new interrupt() method. Error
4436         handling was simplified a lot by chaining deferreds, so
4437         remoteFailed/remoteComplete were merged into a single
4438         remoteComplete method (which can now get a Failure object).
4439         Likewise failed/finished were merged into just _finished.
4440         (BuildStep): Add interrupt(why) method, and if why is a
4441         ConnectionLost Failure then the step is failed with some useful
4442         error text.
4444         * buildbot/slave/bot.py: stop the current command when the remote
4445         Step reference is lost, and when the slave is shut down.
4446         (Bot): make it a MultiService, so it can have children. Use
4447         stopService to tell when the slave is shutting down.
4448         (SlaveBuilder): make it a Service, and a child of the Bot. Add
4449         remote_interruptCommand (which asks the current SlaveCommand to
4450         stop but allows it to keep emitting status messages), and
4451         stopCommand (which tells it to shut up and die).
4453         * buildbot/slave/commands.py: make commands interruptible
4454         (ShellCommand.kill): factor out os.kill logic
4455         (Command): factor out setup()
4456         (Command.sendStatus): don't send status if .running is false, this
4457         happens when the command has been halted.
4458         (Command.interrupt): new method, used to tell the command to die
4459         (SlaveShellCommand): implement .interrupt
4460         (DummyCommand): implement .interrupt
4461         (SourceBase, etc): factor out setup(), don't continue substeps if
4462         .interrupted is set
4464         * buildbot/status/builder.py: fix all waitUntilFinished() methods
4465         so they can be called after finishing
4467         * buildbot/test/test_run.py: new tests for disconnect behavior,
4468         refactor slave-shutdown routines, add different kinds of
4469         slave-shutdown
4471 2004-11-27  Brian Warner  <warner@lothar.com>
4473         * buildbot/status/words.py (IrcStatusBot.convertTime): utility
4474         method to express ETA time like "2m45s" instead of "165 seconds"
4476 2004-11-24  Brian Warner  <warner@lothar.com>
4478         * buildbot/test/test_vc.py (VC.testArch): unregister the test
4479         archive after the test completes, to avoid cluttering the user's
4480         'tla archives' listing with a bogus entry. Arch doesn't happen to
4481         provide any way to override the use of ~/.arch-params/, so there
4482         isn't a convenient way to avoid touching the setup of the user who
4483         runs the test.
4484         (VC_HTTP.testArchHTTP): same
4486 2004-11-23  Brian Warner  <warner@lothar.com>
4488         * buildbot/status/html.py (TextLog): split render() up into
4489         render_HEAD and render_GET. Use a Producer when sending log
4490         chunks, to reduce memory requirements and avoid sending huge
4491         non-Banana-able strings over web.distrib connections. Requires
4492         peeking under the covers of IStatusLog.
4493         (TextLog.resumeProducing): fix the "as text" link, handle client
4494         disconnects that occur while we're still sending old chunks.
4496         * buildbot/status/builder.py (HTMLLogFile.waitUntilFinished): oops,
4497         use defer.succeed, not the non-existent defer.success
4498         (LogFile.waitUntilFinished): same
4499         (LogFile.subscribe): don't add watchers to a finished logfile
4501         * buildbot/__init__.py (version): bump to 0.6.1+ while between
4502         releases
4504 2004-11-23  Brian Warner  <warner@lothar.com>
4506         * buildbot/__init__.py (version): Releasing buildbot-0.6.1
4508 2004-11-23  Brian Warner  <warner@lothar.com>
4510         * NEWS: update for the 0.6.1 release
4511         * MANIFEST.in: add new files
4513         * README (INSTALLATION): explain how to enable the extra VC tests
4515         * buildbot/status/builder.py (LogFile): add .runEntries at the class
4516         level to, so old pickled builds can be displayed ok
4518 2004-11-22  Brian Warner  <warner@lothar.com>
4520         * NEWS: summarize updates since last release
4522         * README (SLAVE): fix usage of 'buildbot slave' command. Thanks to
4523         Yoz Grahame. Closes SF#1050138.
4525         * docs/changes.xhtml (FreshCVSSourceNewcred): fix typo. Closes
4526         SF#1042563.
4528         * buildbot/process/step_twisted.py (Trial): update docs a bit
4530         * docs/factories.xhtml: fix Trial factory docs to match reality.
4531         Closes: SF#1049758.
4533         * buildbot/process/factory.py (Trial.__init__): add args for
4534         randomly= and recurse=, making them available to instantiators
4535         instead of only to subclassers. Closes: SF#1049759.
4537 2004-11-15  Brian Warner  <warner@lothar.com>
4539         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
4540         try to teach the Quick factory to use multiple versions of python
4542 2004-11-12  Brian Warner  <warner@lothar.com>
4544         * buildbot/status/builder.py (BuilderStatus.saveYourself): use a
4545         safer w32-compatible approach, and only use it on windows
4546         (BuildStatus.saveYourself): same
4548 2004-11-11  Brian Warner  <warner@lothar.com>
4550         * buildbot/status/builder.py (LogFile.addEntry): smarter way to do
4551         it: one string merge per chunk. There are now separate .entries
4552         and .runEntries lists: when enumerating over all chunks, make sure
4553         to look at both.
4554         * buildbot/test/test_status.py (Log): more tests
4556         * buildbot/status/builder.py (LogFile.addEntry): Merge string
4557         chunks together, up to 10kb per chunk. This ought to cut down on
4558         the CPU-burning overhead of large log files. Thanks to Alexander
4559         Staubo for spotting the problem.
4560         * buildbot/test/test_status.py (Log): tests for same
4562 2004-11-10  Brian Warner  <warner@lothar.com>
4564         * buildbot/status/mail.py (MailNotifier.buildMessage): add a Date
4565         header to outbound mail
4566         * buildbot/test/test_status.py (Mail.testBuild1): test for same
4568 2004-11-08  Brian Warner  <warner@lothar.com>
4570         * buildbot/status/builder.py (BuilderStatus.saveYourself): w32
4571         can't do os.rename() onto an existing file, so catch the exception
4572         and unlink the target file first. This introduces a slight window
4573         where the existing file could be lost, but the main failure case
4574         (disk full) should still be handled safely.
4575         (BuildStatus.saveYourself): same
4577         * buildbot/changes/pb.py (ChangePerspective): use a configurable
4578         separator character instead of os.sep, because the filenames being
4579         split here are coming from the VC system, which can have a
4580         different pathname convention than the local host. This should
4581         help a buildmaster running on windows that uses a CVS repository
4582         which runs under unix.
4583         * buildbot/changes/mail.py (MaildirSource): same, for all parsers
4585         * buildbot/process/step_twisted.py (Trial.createSummary): survive
4586         when there are no test failures to be parsed
4588         * buildbot/scripts/runner.py (createMaster): use shutil.copy()
4589         instead of the unix-specific os.system("cp"), thanks to Elliot
4590         Murphy for this and the other buildbot-vs-windows catches.
4591         * buildbot/test/test_maildir.py (MaildirTest.deliverMail): same
4593         * contrib/windows/buildbot.bat: prefix a '@', apparently to not
4594         echo the command as it is run
4596         * setup.py: install sample.mk too, not just sample.cfg
4597         (scripts): install contrib/windows/buildbot.bat on windows
4599 2004-11-07  Brian Warner  <warner@lothar.com>
4601         * buildbot/process/builder.py (Builder._detached): clear the
4602         self.currentBuild reference, otherwise the next build will be
4603         skipped because we think the Builder is already in use.
4605         * docs/examples/twisted_master.cfg: update to match current usage
4606         on the Twisted buildbot
4608 2004-10-29  Brian Warner  <warner@lothar.com>
4610         * buildbot/status/mail.py (MailNotifier): fix typo in docs
4612 2004-10-28  Brian Warner  <warner@lothar.com>
4614         * buildbot/slave/commands.py (SourceBase): refactor subclasses to
4615         have separate doVCUpdate/doVCFull methods. Catch an update failure
4616         and respond by clobbering the source directory and re-trying. This
4617         will handle local changes (like replacing a file with a directory)
4618         that will cause CVS and SVN updates to fail.
4619         * buildbot/test/test_vc.py (SetupMixin.do_vc): test the same
4621         * buildbot/process/step.py (LoggedRemoteCommand.__repr__): avoid a
4622         python-2.4 warning
4624 2004-10-19  Brian Warner  <warner@lothar.com>
4626         * buildbot/process/step_twisted.py (Trial.createSummary): bugfixes
4628         * buildbot/status/html.py (StatusResourceTestResults): display any
4629         TestResults that the Build might have
4630         (StatusResourceTestResult): and the logs for each TestResult
4631         (StatusResourceBuild): add link from the per-build page
4633 2004-10-15  Brian Warner  <warner@lothar.com>
4635         * buildbot/process/step_twisted.py (Trial.createSummary): parse
4636         the 'problems' portion of stdout, add TestResults to our build
4637         * buildbot/test/test_twisted.py (Parse.testParse): test it
4639         * buildbot/interfaces.py (IBuildStatus.getTestResults): new method
4640         to retrieve a dict of accumulated test results
4641         (ITestResult): define what a single test result can do
4642         * buildbot/status/builder.py (TestResult): implement ITestResult
4643         (BuildStatus.getTestResults): retrieve dict of TestResults
4644         (BuildStatus.addTestResult): add TestResults
4645         * buildbot/test/test_status.py (Results.testAddResults): test it
4647 2004-10-14  Brian Warner  <warner@lothar.com>
4649         * buildbot/test/test_maildir.py (MaildirTest): use shutil.rmtree
4650         instead of os.system("rm -rf") for win32 portability
4652         * buildbot/test/test_slavecommand.py (SlaveCommandTestCase): use
4653         SignalMixin instead of starting/stopping the reactor, which is
4654         likely to cause problems with other tests
4656         * buildbot/slave/commands.py (SourceBase.doCopy): remove leftover
4657         self.copyComplete() call. Yoz Grahame makes the catch.
4659         * contrib/windows/buildbot.bat: helper script to deal with path
4660         issues. Thanks to Yoz Grahame.
4662         * buildbot/master.py (BuildMaster.startService): don't register a
4663         SIGHUP handler if the signal module has no SIGHUP attribute.
4664         Apparently win32 does this.
4666         * buildbot/scripts/runner.py (start): add --reactor=win32 on win32
4668         * buildbot/test/test_web.py (WebTest.test_webPathname): skip the
4669         test if the reactor can't offer UNIX sockets
4671         * buildbot/status/html.py (StatusResourceBuild.body): fix syntax
4672         error introduced in the last commit. We really need that
4673         metabuildbot :).
4675 2004-10-12  Brian Warner  <warner@lothar.com>
4677         * buildbot/changes/mail.py (MaildirSource.describe): fix exception
4678         when describing a maildir source. Thanks to Stephen Davis.
4680         * buildbot/status/words.py (IrcStatusBot.command_WATCH): round off
4681         ETA seconds
4683         * buildbot/scripts/runner.py (createMaster): install Makefile too
4684         (start): add --no_save to 'start' command
4685         * buildbot/scripts/sample.mk: simple convenience Makefile with 
4686         start/stop/reload targets
4688         * buildbot/__init__.py (version): bump to 0.6.0+ while between
4689         releases
4691 2004-09-30  Brian Warner  <warner@lothar.com>
4693         * setup.py: Releasing buildbot-0.6.0
4695 2004-09-30  Brian Warner  <warner@lothar.com>
4697         * MANIFEST.in: add debian/*, sample.cfg, more docs files. Remove
4698         test_trial.py from the source tarball until support is complete.
4700         * NEWS: update for 0.6.0 release
4701         * buildbot/__init__.py (version): same
4702         * README: same
4704         * buildbot/status/words.py (IrcStatusBot.command_SOURCE): add
4705         'source' command to tell users where to get the Buildbot source
4707         * docs/examples/*.cfg: update to modern standards
4709         * NEWS: update for release
4711         * buildbot/scripts/runner.py (createMaster): remove the
4712         -shutdown.tap stuff now that it isn't necessary
4713         (createSlave): same
4714         (start): launch buildbot.tap, not buildbot-shutdown.tap
4717         * buildbot/status/mail.py (Domain): shorten class name
4718         (MailNotifier): if lookup= is a string, pass it to Domain()
4719         * buildbot/test/test_status.py (Mail.testBuild1): new class name
4720         (Mail.testBuild2): test the string-to-Domain shortcut
4721         (Mail.testMail): fix test
4724         * buildbot/scripts/sample.cfg: improve the build-the-buildbot
4725         example config file
4727         * buildbot/status/builder.py (BuildStatus.__setstate__): re-set
4728         more attributes on load
4729         (BuilderStatus.stubBuildCacheSize): bump to 30, this was too low
4730         to accomodate the whole waterfall page at once, and the thrashing
4731         results in a lot of unnecessary loads
4732         (BuildStatus.saveYourself): use binary pickles, not fluffy text
4733         (BuilderStatus.saveYourself): same
4734         (BuilderStatus.eventGenerator): stop generating on the first missing
4735         build. We assume that saved builds are deleted oldest-first.
4736         (BuildStepStatus.__getstate__): .progress might not exist
4738         * buildbot/changes/changes.py (ChangeMaster): make it
4739         serializable, in $masterdir/changes.pck
4740         (ChangeMaster.stopService): save on shutdown
4741         * buildbot/master.py (BuildMaster.loadChanges): load at startup
4742         * buildbot/test/test_config.py: load Changes before config file
4745         * buildbot/slave/commands.py (ShellCommand.doTimeout): put the
4746         "Oh my god, you killed the command" header on a separate line
4748         * buildbot/status/builder.py (BuilderStatus.getStubBuildByNumber):
4749         skip over corrupted build pickles
4750         (BuilderStatus.getFullBuildByNumber): same
4751         (BuilderStatus.eventGenerator): skip over unavailable builds
4752         (BuildStatus.saveYourself): save builds to a .tmp file first, then
4753         do an atomic rename. This prevents a corrupted pickle when some
4754         internal serialization error occurs.
4755         (BuilderStatus.saveYourself): same
4757         * buildbot/slave/commands.py (SlaveShellCommand): oops, restore
4758         the timeout for shell commands, it got lost somehow
4760         * buildbot/status/builder.py (BuilderStatus.eventGenerator): if we
4761         run out of build steps, return the rest of the builder events
4763         * buildbot/interfaces.py (IBuilderControl.ping): add method
4765         * buildbot/process/builder.py (BuilderControl.ping): move
4766         slave-ping to BuilderControl, and fix the failure case in the
4767         process (Event.finish() is the verb, Event.finished is the noun).
4769         * buildbot/status/html.py (StatusResourceBuilder.ping): ping
4770         through the BuilderControl instead of the BuilderStatus
4771         (EventBox): add adapter for builder.Event, allowing builder events to
4772         be displayed in the waterfall display
4774         * buildbot/master.py (BotMaster.stopService): add a 'master
4775         shutdown' event to the builder's log
4776         (BuildMaster.startService): and a 'master started' on startup
4778         * buildbot/status/builder.py (BuilderStatus.eventGenerator): merge
4779         builder events into the BuildStep event stream
4780         (Status.builderAdded): add a 'builder created' event
4783         * buildbot/status/words.py (IrcStatusBot.command_WATCH): new
4784         command to announce the completion of a running build
4785         (IrcStatusBot.command_FORCE): announce when the build finishes
4787         * buildbot/status/builder.py (BuilderStatus.addFullBuildToCache):
4788         don't evict unfinished builds from the cache: they must stay in
4789         the full-cache until their logfiles have stopped changing. Make
4790         sure the eviction loop terminates if an unfinished build was hit.
4791         (HTMLLogFile.getTextWithHeaders): return HTML as if it were text.
4792         This lets exceptions be dumped in an email status message. Really
4793         we need LogFiles which contain both text and HTML, instead of two
4794         separate classes.
4795         (BuildStatus.__getstate__): handle self.finished=False
4796         (Status.builderAdded): if the pickle is corrupted, abandon the
4797         history and create a new BuilderStatus object.
4799         * buildbot/process/base.py (Build.stopBuild): tolerate lack of a
4800         self.progress attribute, helped one test which doesn't fully set
4801         up the Build object.
4803         * buildbot/interfaces.py (IStatusLogStub): split out some of the
4804         IStatusLog methods into an Interface that is implemented by "stub"
4805         logs, for which all the actual text chunks are on disk (in the
4806         pickled Build instance). To show the log contents, you must first
4807         adapt the stub log to a full IStatusLog object.
4809         * buildbot/status/builder.py (LogFileStub): create separate stub
4810         log objects, which can be upgraded to a real one if necessary.
4811         (LogFile): make them persistable, and let them stubify themselves
4812         (HTMLLogFile): same
4813         (BuildStepStatus): same
4814         (BuildStatus): same
4815         (BuildStatus.saveYourself): save the whole build out to disk
4816         (BuilderStatus): make it persistable
4817         (BuilderStatus.saveYourself): save the builder to disk
4818         (BuilderStatus.addFullBuildToCache): implement two caches which
4819         hold Build objects: a small one which holds full Builds, and a
4820         larger one which holds "stubbed" Builds (ones with their LogFiles
4821         turned into LogFileStubs). This reduces memory usage by the
4822         buildmaster by not keeping more than a few (default is 2) whole
4823         build logs in RAM all the time.
4824         (BuilderStatus.getBuild): rewrite to pull from disk (through the
4825         cache)
4826         (BuilderStatus.eventGenerator): rewrite since .builds went away
4827         (BuilderStatus.buildStarted): remove the .builds array. Add the
4828         build to the "full" cache when it starts.
4829         (BuilderStatus._buildFinished): save the build to disk when it
4830         finishes
4831         (Status): give it a basedir (same as the BuildMaster's basedir)
4832         where the builder pickles can be saved
4833         (Status.builderAdded): create the BuilderStatus ourselves, by
4834         loading a pickle from disk (or creating a new instance if there
4835         was none on disk). Return the BuilderStatus so the master can glue
4836         it into the new Builder object.
4838         * buildbot/master.py (BotMaster.stopService): on shutdown, tell
4839         all BuilderStatuses to save themselves out to disk. This is in
4840         lieu of saving anything important in the main Application pickle
4841          (the -shutdown.tap file).
4842         (BuildMaster.__init__): give Status() a basedir for its files
4843         (BuildMaster.loadConfig_Builders): do status.builderAdded first,
4844         to get the BuilderStatus, then give it to the Builder (instead of
4845         doing it the other way around). It's ok if the status announces
4846         the new Builder before it's really ready, as the outside world can
4847         only see the BuilderStatus object anyway (and it is ready before
4848         builderAdded returns). Use the builder's "builddir" (which
4849         normally specifies where the slave will run the builder) as the
4850         master's basedir (for saving serialized builds).
4852         * buildbot/status/html.py (StatusResourceBuildStep.getChild):
4853         coerce the logfile to IStatusLog before trying to get the text
4854         chunks out of it. This will pull the full (non-stubified) Build in
4855         from disk if necessary.
4856         (TextLog): fix the adapter registration
4858         * buildbot/test/test_control.py (Force.setUp): create the basedir
4859         * buildbot/test/test_web.py: same
4860         * buildbot/test/test_vc.py (SetupMixin.setUp): same
4861         * buildbot/test/test_status.py (Mail.makeBuild): match new setup
4862         * buildbot/test/test_run.py (Run.testMaster): same
4863         (Status.setUp): same
4865 2004-09-29  Fred L. Drake, Jr.  <fdrake@acm.org>
4867         * buildbot/status/html.py (Waterfall.__init__): store actual
4868         allowForce flag passed in rather than using True for everyone;
4869         make sure setting it to False doesn't cause a NameError
4870         (Waterfall.setup).
4871         (StatusResourceBuilder.__init__) add the builder name to the page
4872         title.
4873         (StatusResourceBuilder.body) move HTML generation for a name/value
4874         row into a helper method (StatusResourceBuilder.make_row); only
4875         generate the "Force Build" form if allowForce was True and the
4876         slave is connected.  Use class attributes in the generated HTML to
4877         spread a little CSS-joy.
4879 2004-09-28  Brian Warner  <warner@lothar.com>
4881         * buildbot/process/step_twisted.py (Trial.createSummary): fix
4882         warning-scanner to not ignore things like
4883         'ComponentsDeprecationWarning' and 'exceptions.RuntimeWarning'
4885         * buildbot/status/html.py (StatusResource.control): add some
4886         class-level values for .control in an attempt to make upgrading
4887         smoother
4889         * buildbot/util.py (ComparableMixin): survive missing attributes,
4890         such as when a class is modified and we're comparing old instances
4891         against new ones
4893         * buildbot/status/words.py (IrcStatusBot.privmsg): clean up
4894         failure handling, remove a redundant try/except block. Don't
4895         return the full traceback to the IRC channel.
4896         (IrcStatusBot.command_FORCE): catch new exceptions, return useful
4897         error messages. Get ETA properly.
4899         * buildbot/status/html.py (StatusResourceBuild.body): html.escape
4900         the reason, since (at least) IRC message will have <> in them.
4901         (StatusResourceBuilder.__init__): take an IBuilderControl
4902         (StatusResourceBuilder.force): use the IBuilderControl we get in
4903         the constructor instead of trying to make our own. Catch the
4904         new exceptions and ignore them for now (until we make an
4905         intermediate web page where we could show the error message)
4906         (StatusResource): create with an IControl, use it to give an
4907         IBuilderControl to all children
4908         (Waterfall): take an allowForce= option, pass an IControl object
4909         to StatusResource if it is True
4911         * buildbot/test/test_web.py (ConfiguredMaster): handle IControl
4913         * buildbot/master.py (BotPerspective.perspective_forceBuild):
4914         catch new exceptions and return string forms
4916         * buildbot/interfaces.py: add NoSlaveError, BuilderInUseError
4917         * buildbot/process/builder.py (Builder.forceBuild): raise them
4918         * buildbot/test/test_control.py (Force.testNoSlave): new test
4919         (Force.testBuilderInUse): same
4922         * buildbot/status/words.py (IrcStatusBot): enable build-forcing
4924         * buildbot/test/test_run.py: use IControl
4925         * buildbot/test/test_vc.py: same
4927         * buildbot/status/html.py (StatusResourceBuilder.force): rewrite
4928         to use IControl. Still offline.
4929         * buildbot/status/words.py (IrcStatusBot.command_FORCE): same
4931         * buildbot/process/builder.py (Builder.doPeriodicBuild): set
4932         who=None so periodic builds don't send out status mail
4933         (Builder.forceBuild): include reason in the log message
4934         (BuilderControl.forceBuild): rename 'name' to 'who'
4936         * buildbot/master.py (BotPerspective.perspective_forceBuild): add
4937         'who' parameter, but make it None by default so builds forced by
4938         slave admins don't cause status mail to be sent to anybody
4939         (BotMaster.forceBuild): same. this method is deprecated.
4940         (DebugPerspective.perspective_forceBuild): same, use IControl.
4941         (DebugPerspective.perspective_fakeChange): use IControl..
4942         (Dispatcher.requestAvatar): .. so don't set .changemaster
4944         * buildbot/interfaces.py (IBuilderControl.forceBuild): rename 'who'
4945         parameter to avoid confusion with the name of the builder
4948         * buildbot/status/mail.py: refine comment about needing 2.3
4950         * buildbot/status/html.py: move all imports to the top
4952         * buildbot/test/test_control.py: test new interfaces
4953         * buildbot/test/test_run.py (Status): handle new interfaces
4954         * buildbot/test/test_vc.py (SetupMixin.doBuild): same
4956         * buildbot/process/base.py (BuildControl): implement IBuildControl
4957         and its lonely getStatus() method
4959         * buildbot/process/builder.py (BuilderControl): implement
4960         IBuilderControl, obtained by adapting the Builder instance
4961         (Builder.startBuild): return a BuilderControl instead of a
4962         Deferred. The caller can use bc.getStatus().waitUntilFinished() to
4963         accomplish the same thing.
4965         * buildbot/master.py: move all import statements to the top
4966         (Control): implement IControl, obtained by adapting the
4967         BuildMaster instance.
4969         * buildbot/interfaces.py: add IControl, IBuilderControl, and
4970         IBuildControl. These are used to force builds. Eventually they
4971         will provide ways to reconfigure the Builders, pause or abandon a
4972         Build, and perhaps control the BuildMaster itself.
4974 2004-09-26  Brian Warner  <warner@lothar.com>
4976         * buildbot/util.py (ComparableMixin): survive twisted>1.3.0 which
4977         ends up comparing us against something without a .__class__
4979 2004-09-24  Brian Warner  <warner@lothar.com>
4981         * buildbot/scripts/runner.py: rearrange option parsing a lot, to get
4982         usage text right.
4984         * Makefile: add 'deb-snapshot' target, to create a timestamped
4985         .deb package
4987         * debian/rules (binary-indep): skip CVS/ files in dh_installexamples
4989 2004-09-23  Brian Warner  <warner@lothar.com>
4991         * buildbot/__init__.py (version): move version string here
4992         * setup.py: get version string from buildbot.version
4993         * buildbot/status/html.py (WaterfallStatusResource.body): add
4994         buildbot version to the page footer
4995         * buildbot/status/words.py (IrcStatusBot.command_VERSION): provide
4996         version when asked
4998         * buildbot/master.py (BotMaster.getPerspective): detect duplicate
4999         slaves, let the second know where the first one is coming from
5000         (BuildMaster.__init__): turn on .unsafeTracebacks so the slave can
5001         see our exceptions. It would be nice if there were a way to just
5002         send them the exception type and value, not the full traceback.
5005         * buildbot/status/mail.py (MailNotifier): add a new argument
5006         sendToInterestedUsers=, which can be set to False to disable the
5007         usual send-to-blamelist behavior.
5008         (top): handle python-2.2 which has no email.MIMEMultipart
5009         (MailNotifier.buildMessage): don't send logs without MIMEMultipart
5010         (MailNotifier.disownServiceParent): unsubscribe on removal
5012         * buildbot/test/test_status.py (Mail.testBuild2): test it
5015         * buildbot/status/progress.py (Expectations.wavg): tolerate
5016         current=None, which happens when steps start failing badly
5017         * buildbot/test/test_status.py (Progress.testWavg): test for it
5019         * buildbot/process/step.py (SVN.startVC): when the (old) slave
5020         doesn't understand args['revision'], emit a warning instead of
5021         bailing completely. Updating to -rHEAD is probably close enough.
5023         * buildbot/process/step_twisted.py (Trial.start): fix sanity-check
5025         * buildbot/test/test_status.py: at least import bb.status.client
5026         even if we don't have any test coverage for it yet
5028         * contrib/svn_buildbot.py: don't require python2.3
5029         (main): wait, do require it (for sets.py), but explain how to
5030         make it work under python2.2
5032 2004-09-23  Brian Warner  <warner@lothar.com>
5034         * contrib/svn_buildbot.py: include the revision number in the Change
5036         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): use when=,
5037         using util.now() because FreshCVS is a realtime service
5039         * buildbot/status/event.py: delete dead code
5040         * buildbot/process/step.py: don't import dead Event class
5041         * buildbot/process/step_twisted.py: same
5042         * buildbot/status/builder.py: same
5043         * buildbot/status/client.py: same
5045         * buildbot/test/test_process.py: kill buggy out-of-date disabled test
5047         * buildbot/changes/changes.py (Change): set .when from an __init__
5048         argument (which defaults to now()), rather than having
5049         ChangeMaster.addChange set it later.
5050         (ChangeMaster.addChange): same
5052         * buildbot/changes/mail.py (parseFreshCVSMail): pass in when=
5053         (parseSyncmail): same. Just use util.now() for now.
5054         (parseBonsaiMail): parse the timestamp field for when=
5056         * buildbot/test/test_vc.py (SourceStamp.addChange): page in when=
5057         instead of setting .when after the fact
5059 2004-09-22  slyphon
5061         * buildbot/slave/trial.py: new SlaveCommand to machine-parse test
5062         results when the target project uses retrial. Still under
5063         development.
5064         * buildbot/test/test_trial.py: same
5066 2004-09-21  Brian Warner  <warner@lothar.com>
5068         * buildbot/status/mail.py (MailNotifier.__init__): include
5069         success/warnings/failure in the Subject line
5070         (MailNotifier.buildMessage): add the buildbot's URL to the body,
5071         use step.logname for the addLogs=True attachment filenames
5072         * buildbot/test/test_status.py (Mail): test Subject lines
5073         (Mail.testLogs): test attachment filenames
5075         * buildbot/master.py (DebugPerspective.perspective_fakeChange):
5076         accept a 'who' argument from the debug tool
5077         * contrib/debugclient.py (DebugWidget.do_commit): send 'who'
5078         * contrib/debug.glade: add text box to set 'who'
5080         * buildbot/interfaces.py (IBuildStatus.getBuilder): replace
5081         .getBuilderName with .getBuilder().getName(), more flexible
5082         (IStatusLog.getName): logs have short names, but you can prefix
5083         them with log.getStep().getName() to make them more useful
5084         * buildbot/status/builder.py: same
5085         * buildbot/status/client.py: same
5086         * buildbot/status/html.py: same
5087         * buildbot/test/test_run.py (Status.testSlave): same
5088         * buildbot/process/step.py: tweak logfile names
5090         * buildbot/status/mail.py (MailNotifier): add lookup, change
5091         argument to extraRecipients. The notifier is now aimed at sending
5092         mail to the people involved in a particular build, with additional
5093         constant recipients as a secondary function.
5095         * buildbot/test/test_status.py: add coverage for IEmailLookup,
5096         including slow-lookup and failing-lookup. Make sure the blamelist
5097         members are included.
5099         * buildbot/interfaces.py: new interfaces IEmailSender+IEmailLookup
5100         (IBuildStatus.getResponsibleUsers): rename from getBlamelist
5101         (IBuildStatus.getInterestedUsers): new method
5102         * buildbot/status/builder.py (BuildStatus.getResponsibleUsers): same
5103         * buildbot/status/client.py (remote_getResponsibleUsers): same
5104         * buildbot/status/html.py (StatusResourceBuild.body): same
5105         * buildbot/test/test_run.py (Status.testSlave): same
5107 2004-09-20  Brian Warner  <warner@lothar.com>
5109         * docs/users.xhtml: update concepts
5111         * Makefile: add a convenience makefile, for things like 'make
5112         test'. It is not included in the source tarball.
5114 2004-09-16  Brian Warner  <warner@lothar.com>
5116         * NEWS: mention /usr/bin/buildbot, debian/*
5118         * debian/*: add preliminary debian packaging. Many thanks to
5119         Kirill Lapshin (and Kevin Turner) for the hard work. I've mangled
5120         it considerably since it left their hands, I am responsible for
5121         all breakage that's resulted.
5123         * bin/buildbot: create a top-level 'buildbot' command, to be
5124         installed in /usr/bin/buildbot . For now it's just a simple
5125         frontend to mktap/twistd/kill, but eventually it will be the entry
5126         point to the 'try' command and also a status client. It is also
5127         intended to support the upcoming debian-packaging init.d scripts.
5128         * buildbot/scripts/runner.py: the real work is done here
5129         * buildbot/scripts/__init__.py: need this too
5130         * buildbot/scripts/sample.cfg: this is installed in new
5131         buildmaster directories
5132         * setup.py: install new stuff
5134 2004-09-15  Brian Warner  <warner@lothar.com>
5136         * buildbot/test/test_vc.py: skip SVN tests if svn can't handle the
5137         'file:' schema (the version shipped with OS-X was built without the
5138         ra_local plugin).
5139         (SetupMixin.tearDown): stop the goofy twisted.web timer which
5140         updates the log-timestamp, to make sure it isn't still running after
5141         the test finishes
5143         * docs/config.xhtml: Add projectName, projectURL, buildbotURL
5144         values to the config file.
5145         * docs/examples/hello.cfg: add examples
5146         * buildbot/interfaces.py (IStatus.getBuildbotURL): define accessors
5147         * buildbot/status/builder.py (Status.getProjectURL): implement them
5148         * buildbot/master.py (BuildMaster.loadConfig): set them from config
5149         * buildbot/test/test_config.py (ConfigTest.testSimple): test them
5150         * buildbot/status/html.py (WaterfallStatusResource): display them
5153         * buildbot/test/test_vc.py (FakeBuilder.name): add attribute so
5154         certain error cases don't suffer a secondary exception.
5155         (top): Skip tests if the corresponding VC tool is not installed.
5157         * buildbot/process/factory.py (Trial): introduce separate
5158         'buildpython' and 'trialpython' lists, since trialpython=[] is
5159         what you want to invoke /usr/bin/python, whereas ./setup.py is
5160         less likely to be executable. Add env= parameter to pass options
5161         to test cases (which is how I usually write tests, I don't know if
5162         anyone else does it this way).
5164         * buildbot/process/step_twisted.py (Trial): handle python=None.
5165         Require 'testpath' be a string, not a list. Fix tests= typo.
5166         (Trial.start): sanity-check any PYTHONPATH value for stringness.
5168         * buildbot/process/step.py (RemoteCommand._remoteFailed): goofy
5169         way to deal with the possibility of removing the disconnect notify
5170         twice.
5171         (CVS): add a 'login' parameter to give a password to 'cvs login',
5172         commonly used with pserver methods (where pw="" or pw="guest")
5174         * buildbot/slave/commands.py (SourceBase): move common args
5175         extraction and setup() to __init__, so everything is ready by the
5176         time setup() is called
5177         (CVS.start): call 'cvs login' if a password was supplied
5178         (ShellCommand): special-case PYTHONPATH: prepend the master's
5179         value to any existing slave-local value.
5181         * buildbot/process/builder.py (Builder.updateBigStatus): if we
5182         don't have a remote, mark the builder as Offline. This whole
5183         function should probably go away and be replaced by individual
5184         deltas.
5185         (Builder.buildFinished): return the results to the build-finished
5186         deferred callback, helps with testing
5188 2004-09-14  Brian Warner  <warner@lothar.com>
5190         * buildbot/test/test_vc.py: put all the repositories needed to run
5191         the complete tests into a single small (1.3MB) tarball, so I can
5192         make that tarball available on the buildbot web site. Test HTTP
5193         access (for Arch and Darcs) by spawning a temporary web server
5194         while the test runs.
5196         * docs/users.xhtml: new document, describe Buildbot's limited
5197         understanding of different human users
5199         * buildbot/test/test_vc.py: rearrange test cases a bit
5201         * buildbot/process/step_twisted.py (Trial): handle testpath=
5202         * buildbot/process/factory.py (Trial): update to use step.Trial
5204         * buildbot/slave/commands.py (ShellCommandPP): fix fatal typo
5206         * buildbot/status/builder.py (BuildStatus.getText): add text2 to
5207         the overall build text (which gives you 'failed 2 tests' rather
5208         than just 'failed')
5209         (BuildStepStatus.text2): default to [], not None
5211         * buildbot/process/step_twisted.py (Trial.commandComplete): text2
5212         must be a list
5214 2004-09-12  Brian Warner  <warner@lothar.com>
5216         * buildbot/master.py (BotPerspective._commandsUnavailable): don't
5217         log the whole exception if it's just an AttributeError (old slave)
5219         * buildbot/process/step.py (ShellCommand.__init__): stash .workdir
5220         so (e.g.) sub-commands can be run in the right directory.
5221         (ShellCommand.start): accept an optional errorMessage= argument
5222         to make life easier for SVN.start
5223         (SVN.startVC): put the "can't do mode=export" warning in the LogFile
5224         headers
5225         (ShellCommand.start): move ['dir'] compatibility hack..
5226         (RemoteShellCommand.start): .. to here so everyone can use it
5228         * buildbot/process/step_twisted.py (Trial): use .workdir
5230         * buildbot/process/step_twisted.py (BuildDebs.getText): fix the
5231         text displayed when debuild fails completely
5232         (Trial): snarf _trial_temp/test.log from the slave and display it
5234 2004-09-11  Brian Warner  <warner@lothar.com>
5236         * buildbot/process/step_twisted.py (ProcessDocs.getText): typo
5238         * buildbot/process/process_twisted.py (TwistedTrial.tests): oops,
5239         set to 'twisted', so --recurse can find twisted/web/test/*, etc
5241         * buildbot/process/step.py (ShellCommand): call .createSummary
5242         before .evaluateCommand instead of the other way around. This
5243         makes it slightly easier to count warnings and then use that to
5244         set results=WARNINGS
5245         * buildbot/process/step_twisted.py: cosmetic, swap the methods
5247         * buildbot/process/base.py (Build.buildFinished): update status
5248         before doing progress. It's embarrassing for the build to be stuck
5249         in the "building" state when an exceptions occurs elsewhere..
5251         * buildbot/status/progress.py (Expectations.expectedBuildTime):
5252         python2.2 doesn't have 'sum'
5254         * buildbot/status/builder.py (Status.getBuilderNames): return a copy,
5255         to prevent clients from accidentally sorting it
5257         * buildbot/master.py (Manhole): add username/password
5258         (BuildMaster.loadConfig): use c['manhole']=Manhole() rather than
5259         c['manholePort'], deprecate old usage
5260         * docs/config.xhtml: document c['manhole']
5261         * docs/examples/hello.cfg: show example of using a Manhole
5264         * buildbot/test/test_steps.py (FakeBuilder.getSlaveCommandVersion):
5265         pretend the slave is up to date
5267         * buildbot/status/builder.py (BuildStepStatus.stepFinished): 'log',
5268         the module, overlaps with 'log', the local variable
5270         * buildbot/status/html.py: oops, 2.2 needs __future__ for generators
5272         * buildbot/process/builder.py (Builder.getSlaveCommandVersion):
5273         new method to let Steps find out the version of their
5274         corresponding SlaveCommand.
5275         * buildbot/process/step.py (BuildStep.slaveVersion): utility method
5276         (ShellCommand.start): add 'dir' argument for <=0.5.0 slaves
5277         (CVS.startVC): backwards compatibility for <=0.5.0 slaves
5278         (SVN.startVC): same
5279         (Darcs.startVC): detect old slaves (missing the 'darcs' command)
5280         (Arch.startVC): same
5281         (P4Sync.startVC): same
5283         * buildbot/process/step.py (LoggedRemoteCommand.start): return the
5284         Deferred so we can catch errors in remote_startCommand
5285         (RemoteShellCommand.start): same
5287         * docs/examples/twisted_master.cfg: update sample config file
5289         * buildbot/slave/commands.py (ShellCommandPP): write to stdin
5290         after connectionMade() is called, not before. Close stdin at that
5291         point too.
5293         * buildbot/process/process_twisted.py: update to use Trial, clean
5294         up argument passing (move to argv arrays instead of string
5295         commands)
5297         * buildbot/process/step_twisted.py (Trial): new step to replace
5298         RunUnitTests, usable by any trial-using project (not just
5299         Twisted). Arguments have changed, see the docstring for details.
5301         * buildbot/process/base.py (Build.startBuild): this now returns a
5302         Deferred. Exceptions that occur during setupBuild are now
5303         caught better and lead to fewer build_status weirdnesses, like
5304         finishing a build that was never started.
5305         (Build.buildFinished): fire the Deferred instead of calling
5306         builder.buildFinished directly. The callback argument is this
5307         Build, everything else can be extracted from it, including the
5308         new build.results attribute.
5309         * buildbot/process/builder.py (Builder.startBuild): same
5310         (Builder.buildFinished): same, extract results from build
5312         * buildbot/process/step.py (ShellCommands): remove dead code
5314 2004-09-08  Brian Warner  <warner@lothar.com>
5316         * buildbot/test/test_vc.py (VC.doPatch): verify that a new build
5317         doesn't try to use the leftover patched workdir
5318         (SourceStamp): test source-stamp computation for CVS and SVN
5320         * buildbot/slave/commands.py (SourceBase.doPatch): mark the
5321         patched workdir ('touch .buildbot-patched') so we don't try to
5322         update it later
5323         (SourceBase.start): add ['revision'] for all Source steps
5324         (CVS): change args: use ['branch'] for -r, remove ['files']
5325         (CVS.buildVC): fix revision/branch stuff
5326         (SVN): add revision stuff
5328         * buildbot/process/step.py (BuildStep.__init__): reject unknown
5329         kwargs (except 'workdir') to avoid silent spelling errors
5330         (ShellCommand.__init__): same
5331         (Source): new base class for CVS/SVN/etc. Factor out everything
5332         common, add revision computation (perform the checkout with a -D
5333         DATE or -r REVISION that gets exactly the sources described by the
5334         last Change), overridable with step.alwaysUseLatest. Add patch
5335         handling (build.getSourceStamp can trigger the use of a base
5336         revision and a patch).
5337         (CVS, SVN, Darcs, Arch, P4Sync): refactor, remove leftover arguments
5338         * docs/steps.xhtml: update docs
5339         * docs/source.xhtml: mention .checkoutDelay
5340         * docs/examples/hello.cfg: show use of checkoutDelay, alwaysUseLatest
5342         * buildbot/process/base.py (Build.setSourceStamp): add a
5343         .sourceStamp attribute to each Build. If set, this indicates that
5344         the build should be done with something other than the most
5345         recent source tree. This will be used to implement "try" builds.
5346         (Build.allChanges): new support method
5347         (Build.lastChangeTime): remove, functionality moved to Source steps
5348         (Build.setupBuild): copy the Step args before adding ['workdir'],
5349         to avoid modifying the BuildFactory (and thus triggering spurious
5350         config changes)
5353         * buildbot/status/html.py: rename s/commits/changes/
5354         (StatusResourceChanges): same
5355         (CommitBox.getBox): same, update URL
5356         (WaterfallStatusResource): same
5357         (StatusResource.getChild): same
5359         * contrib/debugclient.py (DebugWidget.do_commit): send .revision
5360         * contrib/debug.glade: add optional 'revision' to the fakeChange
5362         * buildbot/changes/changes.py (html_tmpl): display .revision
5363         (ChangeMaster.addChange): note .revision in log
5364         * buildbot/changes/pb.py (ChangePerspective.perspective_addChange):
5365         accept a ['revision'] attribute
5367         * buildbot/process/factory.py (BuildFactory): use ComparableMixin
5369         * buildbot/master.py (BotMaster.getPerspective): update the
5370         .connected flag in SlaveStatus when it connects
5371         (BotMaster.detach): and when it disconnects
5372         (DebugPerspective.perspective_fakeChange): take a 'revision' attr
5373         (BuildMaster.loadConfig_Builders): walk old list correctly
5375         * buildbot/test/test_config.py: fix prefix= usage
5377 2004-09-06  Brian Warner  <warner@lothar.com>
5379         * NEWS: mention P4
5381         * buildbot/changes/p4poller.py (P4Source): New ChangeSource to
5382         poll a P4 depot looking for recent changes. Thanks to Dave
5383         Peticolas for the contribution. Probably needs some testing after
5384         I mangled it.
5386         * buildbot/process/step.py (P4Sync): simple P4 source-updater,
5387         requires manual client setup for each buildslave. Rather
5388         experimental. Thanks again to Dave Peticolas.
5389         * buildbot/slave/commands.py (P4Sync): slave-side source-updater
5391         * buildbot/changes/changes.py (Change): add a .revision attribute,
5392         which will eventually be used to generate source-stamp values.
5394         * buildbot/process/step.py (RemoteCommand.start): use
5395         notifyOnDisconnect to notice when we lose the slave, then treat it
5396         like an exception. This allows LogFiles to be closed and the build
5397         to be wrapped up normally. Be sure to remove the disconnect
5398         notification when the step completes so we don't accumulate a
5399         bazillion such notifications which will fire weeks later (when the
5400         slave finally disconnects normally). Fixes SF#915807, thanks to
5401         spiv (Andrew Bennetts) for the report.
5402         (LoggedRemoteCommand): move __init__ code to RemoteCommand, since it
5403         really isn't Logged- specific
5404         (LoggedRemoteCommand.remoteFailed): Add an extra newline to the
5405         header, since it's almost always going to be appended to an
5406         incomplete line
5407         * buildbot/test/test_steps.py (BuildStep.testShellCommand1):
5408         update test to handle use of notifyOnDisconnect
5410         * buildbot/status/builder.py (BuilderStatus.currentlyOffline):
5411         don't clear .ETA and .currentBuild when going offline, let the
5412         current build clean up after itself
5414         * buildbot/process/builder.py (Builder.detached): wait a moment
5415         before doing things like stopping the current build, because the
5416         current step will probably notice the disconnect and cleanup the
5417         build by itself
5418         * buildbot/test/test_run.py (Status.tearDown): update test to
5419         handle asynchronous build-detachment
5421         * buildbot/process/base.py (Build.stopBuild): minor shuffles
5423         * buildbot/status/html.py (WaterfallStatusResource.buildGrid):
5424         hush a debug message
5426 2004-09-05  Brian Warner  <warner@lothar.com>
5428         * buildbot/changes/maildir.py (Maildir.start): catch an IOError
5429         when the dnotify fcntl() fails and fall back to polling. Linux 2.2
5430         kernels do this: the fcntl module has the F_NOTIFY constant, but
5431         the kernel itself doesn't support the operation. Thanks to Olly
5432         Betts for spotting the problem.
5434         * buildbot/process/step.py (Darcs): new source-checkout command
5435         (Arch): new source-checkout command
5436         (todo_P4): fix constructor syntax, still just a placeholder
5437         * buildbot/test/test_vc.py (VC.testDarcs): test it
5438         (VC.testDarcsHTTP): same, via localhost HTTP
5439         (VC.testArch): same
5440         (VC.testArchHTTP): same
5441         * NEWS: mention new features
5443         * buildbot/slave/commands.py (ShellCommand): add .keepStdout,
5444         which tells the step to stash stdout text locally (in .stdout).
5445         Slave-side Commands can use this to make decisions based upon the
5446         output of the the ShellCommand (not just the exit code).
5447         (Darcs): New source-checkout command
5448         (Arch): New source-checkout command, uses .keepStdout in one place
5449         where it needs to discover the archive's default name.
5451         * docs/steps.xhtml: Document options taken by Darcs and Arch.
5452         * docs/source.xhtml: add brief descriptions of Darcs and Arch
5453         * docs/examples/hello.cfg: add examples of Darcs and Arch checkout
5455         * buildbot/process/step.py (ShellCommand.describe): add an
5456         alternate .descriptionDone attribute which provides descriptive
5457         text when the step is complete. .description can be ["compiling"],
5458         for use while the step is running, then .descriptionDone can be
5459         ["compile"], used alone when the step succeeds or with "failed" when
5460         it does not. Updated other steps to use the new text.
5461         * buildbot/process/step_twisted.py: same
5462         * buildbot/test/test_run.py: update tests to match
5464 2004-08-30  Brian Warner  <warner@lothar.com>
5466         * buildbot/process/step.py (ShellCommand.createSummary): fix docs
5467         (CVS.__init__): send 'patch' argument to slave
5468         (CVS.start): don't create the LoggedRemoteCommand until start(),
5469         so we can catch a .patch added after __init__
5470         (SVN.__init__): add 'patch' to SVN too
5471         (SVN.start): same
5473         * buildbot/slave/commands.py (ShellCommand): add a 'stdin'
5474         argument, to let commands push data into the process' stdin pipe.
5475         Move usePTY to a per-instance attribute, and clear it if 'stdin'
5476         is in use, since closing a PTY doesn't really affect the process
5477         in the right way (in particular, I couldn't run /usr/bin/patch
5478         under a pty).
5479         (SourceBase.doPatch): handle 'patch' argument
5481         * buildbot/test/test_vc.py (VC.doPatch): test 'patch' argument for
5482         both CVS and SVN
5484         * buildbot/slave/commands.py (cvs_ver): fix version-parsing goo
5485         * buildbot/slave/bot.py (Bot.remote_getCommands): send command
5486         versions to master
5487         * buildbot/master.py (BotPerspective.got_commands): get command
5488         versions from slave, give to each builder
5489         * buildbot/process/builder.py (Builder.attached): stash slave
5490         command versions in .remoteCommands
5492         * docs/steps.xhtml: bring docs in-line with reality
5494         * buildbot/process/step.py (CVS.__init__): more brutal
5495         compatibility code removal
5496         (SVN.__init__): same
5498         * buildbot/slave/commands.py (SlaveShellCommand): update docs
5499         (SlaveShellCommand.start): require ['workdir'] argument, remove
5500         the ['dir'] fallback (compatibility will come later)
5501         (SourceBase): update docs
5502         (SourceBase.start): remove ['directory'] fallback
5503         (CVS): update docs
5504         (SVN): update docs
5505         * buildbot/test/test_config.py (ConfigTest.testBuilders): update test
5506         * buildbot/test/test_steps.py (BuildStep.testShellCommand1): same
5507         * buildbot/test/test_slavecommand.py (SlaveCommandTestCase): same
5509         * buildbot/process/step.py (RemoteShellCommand.__init__): add
5510         want_stdout/want_stderr. remove old 'dir' keyword (to simplify the
5511         code.. I will figure out 0.5.0-compatibility hooks later)
5513 2004-08-30  Brian Warner  <warner@lothar.com>
5515         * buildbot/process/process_twisted.py: rewrite in terms of new
5516         BuildFactory base class. It got significantly shorter. Yay
5517         negative code days.
5519         * buildbot/process/step_twisted.py (HLint.start): fix to make it
5520         work with the new "self.build isn't nailed down until we call
5521         step.start()" scheme: specifically, __init__ is called before the
5522         build has decided on which Changes are going in, so we don't scan
5523         build.allFiles() for .xhtml files until start()
5524         (HLint.commandComplete): use getText(), not getStdout()
5525         (RunUnitTests.start): same: don't use .build until start()
5526         (RunUnitTests.describe): oops, don't report (None) when using
5527         the default reactor
5528         (RunUnitTests.commandComplete): use getText()
5529         (RunUnitTests.createSummary): same
5530         (BuildDebs.commandComplete): same
5532         * buildbot/process/step.py (RemoteShellCommand.__init__): don't
5533         set args['command'] until start(), since our BuildStep is allowed
5534         to change their mind up until that point
5535         (TreeSize.commandComplete): use getText(), not getStdout()
5537         * docs/examples/twisted_master.cfg: update to current standards
5539         * docs/factories.xhtml: update
5540         * buildbot/process/factory.py: implement all the common factories
5541         described in the docs. The Trial factory doesn't work yet, and
5542         I've probably broken all the process_twisted.py factories in the
5543         process. There are compatibility classes left in for things like
5544         the old BasicBuildFactory, but subclasses of them are unlikely to
5545         work.
5546         * docs/examples/glib_master.cfg: use new BuildFactories
5547         * docs/examples/hello.cfg: same
5549         * buildbot/test/test_config.py (ConfigTest.testBuilders): remove
5550         explicit 'workdir' args
5552         * buildbot/process/base.py (BuildFactory): move factories to ..
5553         * buildbot/process/factory.py (BuildFactory): .. here
5554         * buildbot/process/process_twisted.py: handle move
5555         * buildbot/test/test_config.py: same
5556         * buildbot/test/test_run.py: same
5557         * buildbot/test/test_steps.py: same
5558         * buildbot/test/test_vc.py: same
5559         * docs/factories.xhtml: same
5561         * NEWS: mention config changes that require updating master.cfg
5563         * buildbot/process/base.py (Build.setupBuild): add a 'workdir'
5564         argument to all steps that weren't given one already, pointing at
5565         the "build/" directory.
5567         * docs/examples/hello.cfg: remove explicit 'workdir' args
5569         * docs/factories.xhtml: document standard BuildFactory clases,
5570         including a bunch which are have not yet been written
5572 2004-08-29  Brian Warner  <warner@lothar.com>
5574         * buildbot/interfaces.py (IBuildStepStatus.getResults): move
5575         result constants (SUCCESS, WARNINGS, FAILURE, SKIPPED) to
5576         buildbot.status.builder so they aren't quite so internal
5577         * buildbot/process/base.py, buildbot/process/builder.py: same
5578         * buildbot/process/maxq.py, buildbot/process/step.py: same
5579         * buildbot/process/step_twisted.py, buildbot/status/builder.py: same
5580         * buildbot/status/mail.py, buildbot/test/test_run.py: same
5581         * buildbot/test/test_status.py, buildbot/test/test_vc.py: same
5583         * buildbot/status/html.py (StatusResourceBuildStep): oops, update
5584         to handle new getLogs()-returns-list behavior
5585         (StatusResourceBuildStep.getChild): same
5586         (StepBox.getBox): same
5587         (WaterfallStatusResource.phase0): same
5589         * docs/source.xhtml: document how Buildbot uses version-control
5590         systems (output side: how we get source trees)
5591         * docs/changes.xhtml: rename from sources.xhtml, documents VC
5592         systems (input side: how we learn about Changes)
5594         * buildbot/master.py (Manhole): use ComparableMixin
5595         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred): same
5596         * buildbot/changes/mail.py (MaildirSource): same
5597         * buildbot/status/client.py (PBListener): same
5598         * buildbot/status/html.py (Waterfall): same
5599         * buildbot/status/words.py (IRC): same
5601         * NEWS: start describing new features
5603         * buildbot/status/mail.py (MailNotifier): finish implementation.
5604         The message body is still a bit sparse.
5605         * buildbot/test/test_status.py (Mail): test it
5607         * buildbot/util.py (ComparableMixin): class to provide the __cmp__
5608         and __hash__ methods I wind up adding everywhere. Specifically
5609         intended to support the buildbot config-file update scheme where
5610         we compare, say, the old list of IStatusTargets against the new
5611         one and don't touch something which shows up on both lists.
5612         * buildbot/test/test_util.py (Compare): test case for it
5614         * buildbot/interfaces.py (IBuildStatus): change .getLogs() to
5615         return a list instead of a dict
5616         (IBuildStepStatus.getLogs): same. The idea is that steps create
5617         logs with vaguely unique names (although their uniqueness is not
5618         guaranteed). Thus a compilation step should create its sole
5619         logfile with the name 'compile', and contribute it to the
5620         BuildStatus. If a step has two logfiles, try to create them with
5621         different names (like 'test.log' and 'test.summary'), and only
5622         contribute the important ones to the overall BuildStatus.
5623         * buildbot/status/builder.py (Event.getLogs): same
5624         (BuildStepStatus): fix default .text and .results
5625         (BuildStepStatus.addLog): switch to list-like .getLogs()
5626         (BuildStepStatus.stepFinished): same
5627         (BuildStatus.text): fix default .text
5628         (BuildStatus.getLogs): temporary hack to return all logs (from all
5629         child BuildStepStatus objects). Needs to be fixed to only report
5630         the significant ones (as contributed by the steps themselves)
5631         * buildbot/test/test_run.py: handle list-like .getLogs()
5632         * buildbot/test/test_steps.py (BuildStep.testShellCommand1): same
5634 2004-08-28  Brian Warner  <warner@lothar.com>
5636         * buildbot/process/builder.py (Builder.attached): serialize the
5637         attachment process, so the attach-watcher isn't called until the
5638         slave is really available. Add detached watchers too, which makes
5639         testing easier.
5641         * buildbot/test/test_vc.py: test VC modes (clobber/update/etc)
5643         * buildbot/test/test_swap.py: remove dead code
5645         * buildbot/slave/commands.py (ShellCommandPP): add debug messages
5646         (ShellCommand.start): treat errors in _startCommand/spawnProcess
5647         sort of as if the command being run exited with a -1. There may
5648         still be some holes in this scheme.
5649         (CVSCommand): add 'revision' tag to the VC commands, make sure the
5650         -r option appears before the module list
5651         * buildbot/process/step.py (CVS): add 'revision' argument
5653         * buildbot/slave/bot.py (SlaveBuilder._ackFailed): catch failures
5654         when sending updates or stepComplete messages to the master, since
5655         we don't currently care whether they arrive or not. When we revamp
5656         the master/slave protocol to really resume interrupted builds,
5657         this will need revisiting.
5658         (lostRemote): remove spurious print
5660         * buildbot/master.py (BotPerspective.attached): serialize the
5661         new-builder interrogation process, to make testing easier
5662         (BotMaster.waitUntilBuilderDetached): convenience function
5664         * buildbot/status/builder.py (BuilderStatus): prune old builds
5665         (BuildStatus.pruneSteps): .. and steps
5666         (BuildStepStatus.pruneLogs): .. and logs
5667         (BuilderStatus.getBuild): handle missing builds
5668         * buildbot/status/html.py (StatusResourceBuild.body): display build
5669         status in the per-build page
5670         (BuildBox.getBox): color finished builds in the per-build box
5672 2004-08-27  Brian Warner  <warner@lothar.com>
5674         * buildbot/status/mail.py (MailNotifier): new notification class,
5675         not yet finished
5677         * buildbot/slave/commands.py (SourceBase): refactor SVN and CVS into
5678         variants of a common base class which handles all the mode= logic
5680         * buildbot/interfaces.py (IBuildStatus.getPreviousBuild): add
5681         convenience method
5682         * buildbot/status/builder.py (BuildStatus.getPreviousBuild): same
5684 2004-08-26  Brian Warner  <warner@lothar.com>
5686         * buildbot/test/test_slavecommand.py: accomodate new slavecommand
5687         interfaces
5689         * buildbot/test/test_run.py: update to new Logfile interface, new
5690         buildbot.slave modules
5691         * buildbot/test/test_steps.py: same, remove Swappable, add timeouts
5693         * MANIFEST.in: new sample config file
5694         * docs/examples/hello.cfg: same
5696         * buildbot/process/step_twisted.py: remove dead import
5698         * buildbot/process/step.py (RemoteCommand.run): catch errors
5699         during .start
5700         (RemoteCommand.remote_update): ignore updates that arrive after
5701         we've shut down
5702         (RemoteCommand.remote_complete): ignore duplicate complete msgs
5703         (RemoteCommand._remoteComplete): cleanup failure handling, reduce
5704         the responsibilities of the subclass's methods
5705         (BuildStep.failed): catch errors during failure processing
5706         (BuildStep.addHTMLLog): provide all-HTML logfiles (from Failures)
5707         (CVS): move to a mode= argument (described in docstring), rather
5708         than the ungainly clobber=/export=/copydir= combination.
5709         (SVN): add mode= functionality to SVN too
5710         (todo_Darcs, todo_Arch, todo_P4): placeholders for future work
5712         * buildbot/process/base.py (Build.startNextStep): catch errors
5713         during s.startStep()
5715         * buildbot/clients/base.py: update to new PB client interface.
5716         gtkPanes is still broken
5718         * buildbot/bot.py, buildbot/slavecommand.py: move to..
5719         * buildbot/slave/bot.py, buildbot/slave/commands.py: .. new directory
5720         * setup.py: add buildbot.slave module
5721         * buildbot/bb_tap.py: handle move
5722         * buildbot/slave/registry.py: place to register commands, w/versions
5723         * buildbot/slave/bot.py: major simplifications
5724         (SlaveBuilder.remote_startCommand): use registry for slave commands,
5725         instead of a fixed table. Eventually this will make the slave more
5726         extensible. Use 'start' method on the command, not .startCommand.
5727         Fix unsafeTracebacks handling (I think).
5728         * buildbot/slave/commands.py: major cleanup. ShellCommand is now a
5729         helper class with a .start method that returns a Deferred.
5730         SlaveShellCommand is the form reached by the buildmaster. Commands
5731         which use multiple ShellCommands can just chain them as Deferreds,
5732         with some helper methods in Command (_abandonOnFailure and
5733         _checkAbandoned) to bail on rc!=0.
5734         (CVSCommand): prefer new mode= argument
5735         (SVNFetch): add mode= argument
5737         * buildbot/master.py (DebugPerspective.perspective_forceBuild):
5738         put a useful reason string on the build
5740         * buildbot/status/builder.py (LogFile): do LogFile right: move the
5741         core functionality into an IStatusLog object
5742         (BuildStatus.sendETAUpdate): don't send empty build-eta messages
5743         * buildbot/status/html.py (TextLog): HTML-rendering goes here
5744         (StatusResourceBuild.body): use proper accessor methods
5745         * buildbot/status/client.py (RemoteLog): PB-access goes here
5746         (StatusClientPerspective.perspective_subscribe): add "full" mode,
5747         which delivers log contents too
5748         (PBListener.__cmp__): make PBListeners comparable, thus removeable
5749         * buildbot/status/event.py: remove old Logfile completely
5751         * buildbot/interfaces.py (IStatusLog.subscribe): make the
5752         subscription interface for IStatusLog subscriptions just like all
5753         other the status subscriptions
5754         (IStatusReceiver.logChunk): method called on subscribers
5756 2004-08-24  Brian Warner  <warner@lothar.com>
5758         * buildbot/process/builder.py (Builder._pong): oops, ping response
5759         includes a result (the implicit None returned by remote_print).
5760         Accept it so the _pong method handles the response correctly.
5762 2004-08-06  Brian Warner  <warner@lothar.com>
5764         * buildbot/test/test_config.py: update IRC, PBListener tests
5766         * buildbot/status/client.py (StatusClientPerspective): total
5767         rewrite to match new IStatus interfaces. New subscription scheme.
5768         There are still a few optimizations to make (sending down extra
5769         information with event messages so the client doesn't have to do a
5770         round trip). The logfile-retrieval code is probably still broken.
5771         Moved the PB service into its own port, you can no longer share a
5772         TCP socket between a PBListener and, say, the slaveport (this
5773         should be fixed eventually).
5774         * buildbot/clients/base.py (Client): revamp to match. still needs
5775         a lot of work, but basic event reporting works fine. gtkPanes is
5776         completely broken.
5778         * buildbot/status/words.py (IRC): move to c['status']. Each IRC
5779         instance talks to a single irc server. Threw out all the old
5780         multi-server handling code. Still need to add back in
5781         builder-control (i.e. "force build")
5783         * buildbot/status/html.py (StatusResourceBuildStep.body): add some
5784         more random text to the as-yet-unreachable per-step page
5786         * buildbot/status/builder.py (BuildStepStatus.sendETAUpdate):
5787         rename to stepETAUpdate
5788         (BuildStatus.subscribe): add build-wide ETA updates
5789         (BuilderStatus.getState): remove more cruft
5790         (BuilderStatus.getCurrentBuild): remove more cruft
5791         (BuilderStatus.buildStarted): really handle tuple-subscription
5792         * buildbot/test/test_run.py (Status.testSlave): handle the
5793         stepETAUpdate rename
5795         * buildbot/master.py (BuildMaster): don't add a default
5796         StatusClientService. Don't add a default IrcStatusFactory. Both
5797         are now added through c['status'] in the config file. c['irc'] is
5798         accepted for backwards compatibility, the only quirk is you cannot
5799         use c['irc'] to specify IRC servers on ports other than 6667.
5801         * buildbot/interfaces.py (IBuildStatus.getCurrentStep): add method
5802         (IStatusReceiver.buildStarted): allow update-interval on subscribe
5803         (IStatusReceiver.buildETAUpdate): send build-wide ETA updates
5804         (IStatusReceiver.stepETAUpdate): rename since it's step-specific
5807         * buildbot/master.py (BuildMaster.startService): SIGHUP now causes
5808         the buildmaster to re-read its config file
5811         * buildbot/test/test_web.py (test_webPortnum): need a new hack to
5812         find out the port our server is running on
5813         (WebTest.test_webPathname_port): same
5815         * buildbot/test/test_config.py (testWebPortnum): test it
5816         (testWebPathname): ditto
5818         * docs/config.xhtml: document new c['status'] configuration option
5820         * buildbot/status/html.py (Waterfall): new top-level class which
5821         can be added to c['status']. This creates the Site as well as the
5822         necessary TCPServer/UNIXServer. It goes through the BuildMaster,
5823         reachable as .parent, for everything.
5825         * buildbot/master.py (Manhole): make it a normal service Child
5826         (BuildMaster.loadConfig_status): c['status'] replaces webPortnum and
5827         webPathname. It will eventually replace c['irc'] and the implicit
5828         PB listener as well. c['webPortnum'] and c['webPathname'] are left
5829         in as (deprecated) backward compatibility hooks for now.
5832         * buildbot/process/builder.py (Builder.buildFinished): don't
5833         inform out builder_status about a finished build, as it finds out
5834         through its child BuildStatus object
5836         * buildbot/status/html.py: extensive revamp. Use adapters to make
5837         Boxes out of BuildStepStatus and friends. Acknowledge that Steps
5838         have both starting and finishing times and adjust the waterfall
5839         display accordingly, using spacers if necessary. Use SlaveStatus
5840         to get buildslave info.
5841         (StatusResourceBuildStep): new just-one-step resource, used to get
5842         logfiles. No actual href to it yet.
5844         * buildbot/status/event.py (Logfile.doSwap): disable Swappable for
5845         the time being, until I get the file-naming scheme right
5847         * buildbot/status/builder.py (Event): clean started/finished names
5848         (BuildStatus.isFinished): .finished is not None is the right test
5849         (BuildStatus.buildStarted): track started/finished times ourselves
5850         (BuilderStatus.getSlave): provide access to SlaveStatus object
5851         (BuilderStatus.getLastFinishedBuild): all builds are now in
5852         .builds, even the currently-running one. Accomodate this change.
5853         (BuilderStatus.eventGenerator): new per-builder event generator.
5854         Returns BuildStepStatus and BuildStatus objects, since they can
5855         both be adapted as necessary.
5856         (BuilderStatus.addEvent): clean up started/finished attributes
5857         (BuilderStatus.startBuild,finishBuild): remove dead code
5858         (SlaveStatus): new object to provide ISlaveStatus
5860         * buildbot/process/step.py (ShellCommand.getColor): actually
5861         return the color instead of setting it ourselves
5862         (CVS.__init__): pull .timeout and .workdir options out of
5863         **kwargs, since BuildStep will ignore them. Without this neither
5864         will be sent to the slave correctly.
5865         (SVN.__init__): same
5867         * buildbot/process/builder.py (Builder): move flags to class-level
5868         attributes
5869         (Builder.attached): remove .remoteInfo, let the BotPerspective and
5870         SlaveStatus handle that
5872         * buildbot/process/base.py (Build.firstEvent): remove dead code
5873         (Build.stopBuild): bugfix
5875         * buildbot/changes/pb.py (PBChangeSource.describe): add method
5877         * buildbot/changes/changes.py (Change): add IStatusEvent methods
5878         (ChangeMaster.eventGenerator): yield Changes, since there are now
5879         Adapters to turn them into HTML boxes
5881         * buildbot/master.py (BotMaster): track SlaveStatus from BotMaster
5882         (BotPerspective.attached): feed a SlaveStatus object
5883         (BuildMaster.loadConfig): add a manhole port (debug over telnet)
5884         (BuildMaster.loadConfig_Builders): give BuilderStatus a parent
5886         * buildbot/interfaces.py: API additions
5887         (ISlaveStatus): place to get slave status
5889 2004-08-04  Brian Warner  <warner@lothar.com>
5891         * buildbot/slavecommand.py (DummyCommand.finished): send rc=0 when
5892         the delay finishes, so the step is marked as SUCCESS
5894         * buildbot/test/test_run.py (Status.testSlave): cover more of
5895         IBuildStatus and IBuildStepStatus
5897         * buildbot/status/progress.py (StepProgress): move some flags to
5898         class-level attributes
5899         (StepProgress.remaining): if there are no other progress metrics
5900         to go by, fall back to elapsed time
5901         (StepProgress.setExpectations): take a dict of metrics instead of
5902         a list
5903         (BuildProgress.setExpectationsFrom): pull expectations from the
5904         Expectations, instead of having it push them to the BuildProgress
5905         (Expectations): move some flags to class-level attributes
5906         (Expectations.__init__): copy per-step times from the
5907         BuildProgress too
5908         (Expectations.expectedBuildTime): new method for per-build ETA
5910         * buildbot/status/event.py (Logfile): move some flags to
5911         class-level attributes
5912         (Logfile.logProgressTo): better method name, let step set the
5913         progress axis name (instead of always being "output")
5915         * buildbot/status/builder.py (BuildStepStatus.getTimes): track the
5916         times directly, rather than depending upon the (possibly missing)
5917         .progress object. Use 'None' to indicate "not started/finished
5918         yet"
5919         (BuildStepStatus.getExpectations): oops, return the full list of
5920         expectations
5921         (BuilderStatus._buildFinished): append finished builds to .builds
5923         * buildbot/process/step.py (BuildStep): add separate .useProgress
5924         flag, since empty .progressMetrics[] still implies that time is a
5925         useful predictor
5926         (CVS): set up the cmd in __init__, instead of waiting for start()
5928         * buildbot/process/base.py (Build.startBuild): disable the 'when'
5929         calculation, this will eventually turn into a proper sourceStamp
5930         (Build.setupBuild): tell the Progress to load from the Expectations,
5931         instead of having the Expectations stuff things into the Progress
5932         (Build.buildException): add a build-level errback to make sure the
5933         build's Deferred fires even in case of exceptions
5935         * buildbot/master.py (BotMaster.forceBuild): convey the reason into
5936         the forced build
5937         * buildbot/process/builder.py (Builder.forceBuild): convey the
5938         reason instead of creating a fake Change
5940         * docs/examples/twisted_master.cfg: update to match reality
5942         * buildbot/test/test_config.py, buildbot/test/test_process.py:
5943         * buildbot/test/test_run.py, buildbot/test/test_steps.py:
5944         fix or remove broken/breaking tests
5946         * buildbot/status/event.py (Logfile.__len__): remove evil method
5948         * buildbot/status/builder.py (BuildStepStatus.stepStarted): tolerate
5949         missing .build, for test convenience
5951         * buildbot/process/step_twisted.py: import fixes
5953         * buildbot/process/step.py (BuildStep.failed): exception is FAILURE
5955         * buildbot/master.py (BuildMaster.loadConfig_Builders): leftover
5956         .statusbag reference
5958         * buildbot/bot.py (BuildSlave.stopService): tear down the TCP
5959         connection at shutdown, and stop it from reconnecting
5961         * buildbot/test/test_run.py (Run.testSlave): use a RemoteDummy to
5962         chase down remote-execution bugs
5964         * buildbot/process/step.py: more fixes, remove
5965         BuildStep.setStatus()
5966         * buildbot/status/builder.py: move setStatus() functionality into
5967         BuildStatus.addStep
5968         * buildbot/status/event.py: minor fixes
5970 2004-08-03  Brian Warner  <warner@lothar.com>
5972         * buildbot/process/base.py, buildbot/process/builder.py
5973         * buildbot/process/step.py, buildbot/status/builder.py
5974         * buildbot/status/event.py, buildbot/test/test_run.py:
5975         fix status delivery, get a basic test case working
5976         * buildbot/master.py: finish implementing basic status delivery,
5977         temporarily disable HTML/IRC/PB status sources
5979         * buildbot/bot.py (Bot.remote_setBuilderList): remove debug noise
5981         * buildbot/status/progress.py (BuildProgress): remove dead code
5983         * buildbot/interfaces.py
5984         * buildbot/process/base.py, buildbot/process/builder.py
5985         * buildbot/process/step.py, buildbot/process/step_twisted.py
5986         * buildbot/status/builder.py: Complete overhaul of the all
5987         status-delivery code, unifying all types of status clients (HTML,
5988         IRC, PB). See interfaces.IBuildStatus for an idea of what it will
5989         look like. This commit is a checkpointing of the work-in-progress:
5990         the input side is mostly done (Builders/Builds sending status
5991         to the BuilderStatus/BuildStatus objects), but the output side has
5992         not yet been started (HTML resources querying BuilderStatus
5993         objects). Things are probably very broken right now and may remain
5994         so for several weeks, I apologize for the disruption.
5996         * buildbot/status/event.py: add a setHTML method to use pre-rendered
5997         HTML as the log's contents. Currently used for exception tracebacks.
5998         * buildbot/status/progress.py: minor spelling changes
6000 2004-08-02  Brian Warner  <warner@lothar.com>
6002         * docs/config.xhtml: XHTML fixes, makes raw .xhtml files viewable
6003         in mozilla. Also added stylesheets copied from Twisted's docs.
6004         Remember that these files are meant to be run through Lore first.
6005         Thanks to Philipp Frauenfelder for the fixes.
6006         * docs/factories.xhtml, docs/sources.xhtml, docs/steps.xhtml: same
6007         * docs/stylesheet-unprocessed.css, docs/stylesheet.css: same
6008         * docs/template.tpl: added a Lore template
6010 2004-07-29  Brian Warner  <warner@lothar.com>
6012         * buildbot/interfaces.py: revamp status delivery. This is the
6013         preview: these are the Interfaces that will be provided by new
6014         Builder code, and to which the current HTML/IRC/PB status
6015         displayers will be adapted.
6017         * buildbot/slavecommand.py (ShellCommand.start): look for .usePTY
6018         on the SlaveBuilder, not the Bot.
6019         * buildbot/bot.py (Bot.remote_setBuilderList): copy Bot.usePTY to
6020         SlaveBuilder.usePTY
6021         * buildbot/test/test_slavecommand.py (FakeSlaveBuilder.usePTY):
6022         set .usePTY on the FakeSlaveBuilder
6024 2004-07-25  Brian Warner  <warner@lothar.com>
6026         * buildbot/changes/freshcvs.py: add some debug log messages
6027         (FreshCVSConnectionFactory.gotPerspective): pre-emptively fix the
6028         disabled 'setFilter' syntax
6029         (FreshCVSSourceNewcred.__init__): warn about prefix= values that
6030         don't end with a slash
6032         * buildbot/process/base.py (Builder._pong_failed): add TODO note
6034         * setup.py: bump to 0.5.0+ while between releases
6036 2004-07-23  Brian Warner  <warner@lothar.com>
6038         * setup.py (version): Releasing buildbot-0.5.0
6040 2004-07-23  Brian Warner  <warner@lothar.com>
6042         * README: update for 0.5.0 release
6044         * NEWS: update for 0.5.0 release
6046 2004-07-22  Brian Warner  <warner@lothar.com>
6048         * buildbot/slavecommand.py (ShellCommand): make usePTY a
6049         mktap-time configuration flag (--usepty=1, --usepty=0)
6050         * buildbot/bot.py: same
6052         * buildbot/master.py (BotPerspective.got_dirs): don't complain about
6053         an 'info' directory being unwanted
6055         * buildbot/changes/freshcvs.py (FreshCVSSource): flip the
6056         newcred/oldcred switch. Newcred (for CVSToys-1.0.10 and later) is now
6057         the default. To communicate with an oldcred daemond (CVSToys-1.0.9
6058         and earlier), use a FreshCVSSourceOldcred instead.
6059         (test): simple test routine: connect to server, print changes
6061         * buildbot/changes/changes.py (Change.getTime): make it possible
6062         to print un-timestamped changes
6064         * buildbot/master.py (makeApp): delete ancient dead code
6065         (BuildMaster.loadTheConfigFile): make "master.cfg" name configurable
6066         * buildbot/test/test_config.py (testFindConfigFile): test it
6068         * docs/examples/twisted_master.cfg (b22w32): use iocp reactor
6069         instead of win32 one
6072         * buildbot/master.py (BuildMaster.loadConfig_Builders): config file
6073         now takes a dictionary instead of a tuple. See docs/config.xhtml for
6074         details.
6076         * buildbot/process/base.py (Builder.__init__): change constructor
6077         to accept a dictionary of config data, rather than discrete
6078         name/slave/builddir/factory arguments
6080         * docs/examples/twisted_master.cfg: update to new syntax
6081         * docs/examples/glib_master.cfg: same
6082         * buildbot/test/test_config.py (ConfigTest.testBuilders): some
6083         rough tests of the new syntax
6085         
6086         * buildbot/master.py (BuildMaster.loadConfig): allow webPathname
6087         to be an int, which means "run a web.distrib sub-server on a TCP
6088         port". This lets you publish the buildbot status page to a remote
6089         twisted.web server (using distrib.ResourceSubscription). Also
6090         rename the local attributes used to hold these web things so
6091         they're more in touch with reality.
6092         * buildbot/test/test_web.py: test webPortnum and webPathname
6093         * docs/config.xhtml: document this new use of webPathname
6095         * docs/config.xhtml: new document, slightly ahead of reality
6096         
6097         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred.notify): fix
6098         'prefix' handling: treat it as a simple string to check with
6099         .startswith, instead of treating it as a directory. This allows
6100         sub-directories to be used. If you use prefix=, you should give it
6101         a string that starts just below the CVSROOT and ends with a slash.
6102         This prefix will be stripped from all filenames, and filenames
6103         which do not start with it will be ignored.
6105 2004-07-20  Cory Dodt  <corydodt@twistedmatrix.com>
6107         * contrib/svn_buildbot.py: Add --include (synonym for --filter)
6108         and --exclude (inverse of --include).  SVN post-commit hooks
6109         now have total control over which changes get sent to buildbot and which
6110         do not.
6112 2004-07-10  Brian Warner  <warner@lothar.com>
6114         * buildbot/test/test_twisted.py (Case1.testCountFailedTests): fix
6115         test case to match new API
6117         * buildbot/status/event.py (Logfile.getEntries): fix silly bug
6118         which crashed HTML display when self.entries=[] (needed to
6119         distinguish between [], which means "no entries yet", and None,
6120         which means "the entries have been swapped out to disk, go fetch
6121         them").
6123 2004-07-04  Brian Warner  <warner@lothar.com>
6125         * buildbot/process/step_twisted.py (countFailedTests): Count
6126         skips, expectedFailures, and unexpectedSuccesses. Start scanning
6127         10kb from the end because any import errors are wedged there and
6128         they would make us think the test log was unparseable.
6129         (RunUnitTests.finishStatus): add skip/todo counts to the event box
6131 2004-06-26  Brian Warner  <warner@lothar.com>
6133         * buildbot/process/step_twisted.py (RemovePYCs): turn the
6134         delete-*.pyc command into an actual BuildStep, so we can label it
6135         nicely
6136         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
6137         (FullTwistedBuildFactory): same
6139 2004-06-25  Cory Dodt  <corydodt@twistedmatrix.com>
6141         * contrib/fakechange.py: Add an errback when sending the fake 
6142         change, so we know it didn't work.
6144 2004-06-25  Christopher Armstrong  <radix@twistedmatrix.com>
6146         * buildbot/process/step_twisted.py: Delete *.pyc files before
6147         calling trial, so it doesn't catch any old .pyc files whose .py
6148         files have been moved or deleted.
6150         * buildbot/process/step_twisted.py (RunUnitTests): 1) Add a new
6151         parameter, 'recurse', that passes -R to trial. 2) have 'runAll'
6152         imply 'recurse'. 3) Make the default 'allTests' be ["twisted"]
6153         instead of ["twisted.test"], so that the end result is "trial -R
6154         twisted".
6156         * contrib/svn_buildbot.py: Add a --filter parameter that accepts a
6157         regular expression to match filenames that should be ignored when
6158         changed. Also add a --revision parameter that specifies the
6159         revision to examine, which is useful for debugging.
6161 2004-06-25  Brian Warner  <warner@lothar.com>
6163         * buildbot/process/step_twisted.py (trialTextSummarizer): create a
6164         summary of warnings (like DeprecationWarnings), next to the
6165         "summary" file
6167 2004-05-13  Brian Warner  <warner@lothar.com>
6169         * docs/examples/twisted_master.cfg: enable the win32 builder, as
6170         we now have a w32 build slave courtesy of Mike Taylor.
6172         * buildbot/process/base.py (Build.checkInterlocks): OMG this was
6173         so broken. Fixed a race condition that tripped up interlocked
6174         builds and caused the status to be stuck at "Interlocked" forever.
6175         The twisted buildbot's one interlocked build just so happened to
6176         never hit this case until recently (the feeding builds both pass
6177         before the interlocked build is attempted.. usually it has to wait
6178         a while).
6179         (Builder._pong_failed): fix method signature
6181         * setup.py: bump to 0.4.3+ while between releases
6183 2004-04-30  Brian Warner  <warner@lothar.com>
6185         * setup.py (version): Releasing buildbot-0.4.3
6187 2004-04-30  Brian Warner  <warner@lothar.com>
6189         * MANIFEST.in: add the doc fragments in  docs/*.xhtml
6191         * README: update for 0.4.3 release
6193         * NEWS: update for 0.4.3 release
6195         * buildbot/master.py (BuildMaster.__getstate__): make sure
6196         Versioned.__getstate__ is invoked, for upgrade from 0.4.2
6198         * buildbot/process/step_twisted.py (RunUnitTests.trial): add
6199         .trial as a class attribute, for upgrade from 0.4.2
6201         * buildbot/changes/changes.py (Change.links): add .links for
6202         upgrade from 0.4.2
6204         * buildbot/status/event.py (Logfile.__getstate__): get rid of both
6205         .textWatchers and .htmlWatchers at save time, since they are both
6206         volatile, should allow smooth 0.4.2 upgrade
6208         * buildbot/process/step.py (CVS.finishStatus): catch failed
6209         CVS/SVN commands so we can make the status box red
6211 2004-04-29  Brian Warner  <warner@lothar.com>
6213         * buildbot/changes/freshcvs.py
6214         (FreshCVSConnectionFactory.gotPerspective): add (commented-out)
6215         code to do setFilter(), which tells the freshcvs daemon to not
6216         send us stuff that we're not interested in. I will uncomment it
6217         when a new version of CVSToys is available in which setFilter()
6218         actually works, and I get a chance to test it better.
6220         * docs/examples/twisted_master.cfg: start using a PBChangeSource
6222         * buildbot/master.py (Dispatcher): use a registration scheme
6223         instead of hardwired service names
6224         (BuildMaster): keep track of the Dispatcher to support
6225         registration
6227         * buildbot/changes/changes.py (ChangeMaster): create a distinct
6228         PBChangeSource class instead of having it be an undocumented
6229         internal feature of the ChangeMaster. Split out the code into a
6230         new file.
6231         * buildbot/changes/pb.py (PBChangeSource): same
6232         * buildbot/test/test_changes.py: a few tests for PBChangeSource
6234         * docs/{factories|sources|steps}.xhtml: document some pieces
6236         * docs/examples/twisted_master.cfg: use SVN instead of CVS, stop
6237         using FCMaildirSource
6238         (f23osx): update OS-X builder to use python2.3, since the slave
6239         was updated to Panther (10.3.3)
6241 2004-03-21  Brian Warner  <warner@lothar.com>
6243         * buildbot/process/process_twisted.py: factor out doCheckout, change
6244         to use SVN instead of CVS
6246         * buildbot/process/base.py (BasicBuildFactory): refactor to make
6247         an SVN subclass easier
6248         (BasicSVN): subclass which uses Subversion instead of CVS
6250 2004-03-15  Christopher Armstrong  <radix@twistedmatrix.com>
6252         * buildbot/slavecommand.py (ShellCommand.start): use COMSPEC instead
6253         of /bin/sh on win32
6254         (CVSCommand.cvsComplete): don't assume chdir worked on win32
6256 2004-02-25  Brian Warner  <warner@lothar.com>
6258         * buildbot/slavecommand.py (ShellCommand): ['commands'] argument
6259         is now either a list (which is passed to spawnProcess directly) or
6260         a string (which gets passed to /bin/sh -c). This removes the useSH
6261         flag and the ArgslistCommand class. Also send status header at the
6262         start and end of each command, instead of having the master-side
6263         code do that.
6264         (CVSCommand): fix the doUpdate command, it failed to do the 'cp
6265         -r'. Update to use list-based arguments.
6266         (SVNFetch): use list-based arguments, use ['dir'] argument to
6267         simplify code.
6268         * buildbot/test/test_steps.py (Commands): match changes
6270         * buildbot/process/step.py (InternalShellCommand.words): handle
6271         command lists
6272         (SVN): inherit from CVS, cleanup
6274         * buildbot/status/event.py (Logfile.content): render in HTML, with
6275         stderr in red and headers (like the name of the command we're
6276         about to run) in blue. Add link to a second URL (url + "?text=1")
6277         to get just stdout/stderr in text/plain without markup. There is
6278         still a problem with .entries=None causing a crash, it seems to occur
6279         when the logfile is read before it is finished.
6281         * buildbot/bot.py (BotFactory.doKeepalive): add a 30-second
6282         timeout to the keepalives, and use it to explicitly do a
6283         loseConnection instead of waiting for TCP to notice the loss. This
6284         ought to clear up the silent-lossage problem.
6285         (unsafeTracebacks): pass exception tracebacks back to the master,
6286         makes it much easier to debug problems
6288 2004-02-23  Brian Warner  <warner@lothar.com>
6290         * buildbot/slavecommand.py (ShellCommand): add useSH flag to pass
6291         the whole command to /bin/sh instead of execve [Johan Dahlin]
6292         (CVSCommand): drop '-r BRANCH' if BRANCH==None instead of usiing
6293         '-r HEAD' [Johan Dahlin]
6294         (CVSCommand.start2): fix cvsdir calculation [Johan Dahlin]
6296         * buildbot/changes/changes.py (Change): add links= argument, add
6297         asHTML method [Johan Dahlin]. Modified to make a bit more
6298         XHTMLish. Still not sure how to best use links= .
6300         * buildbot/status/html.py (StatusResourceCommits.getChild): use 
6301         Change.asHTML to display the change, not asText
6303         * buildbot/status/html.py (StatusResourceBuilder): web button to
6304         ping slave
6306         * buildbot/test/test_run.py: test to actually start a buildmaster
6307         and poke at it
6309         * MANIFEST.in: bring back accidentally-dropped test helper files
6311         * buildbot/test/test_config.py (ConfigTest.testSources): skip tests
6312         that require cvstoys if it is not installed
6314         * buildbot/process/step_twisted.py (RunUnitTests): allow other
6315         values of "bin/trial" [Dave Peticolas]
6316         (RunUnitTests.finishStatus): say "no tests run" instead of "0
6317         tests passed" when we didn't happen to run any tests
6319         * buildbot/process/step.py (Compile): use haltOnFailure instead of
6320         flunkOnFailure [Johan Dahlin]
6322         * buildbot/process/base.py (ConfigurableBuild.setSteps): allow
6323         multiple instances of the same Step class by suffixing "_2", etc,
6324         to the name until it is unique. This name needs to be unique
6325         because it is used as a key in the dictionary that tracks build
6326         progress.
6327         * buildbot/test/test_steps.py (Steps.testMultipleStepInstances):
6328         add test for it
6330         * buildbot/process/base.py (Builder.ping): add "ping slave" command
6332 2004-01-14  Brian Warner  <warner@lothar.com>
6334         * buildbot/status/words.py (IrcStatusBot): when we leave or get
6335         kicked from a channel, log it
6337         * buildbot/master.py (Dispatcher): add "poke IRC" command to say
6338         something over whatever IRC channels the buildmaster is currently
6339         connected to. Added to try and track down a problem in which the
6340         master thinks it is still connected but the IRCd doesn't see it. I
6341         used a styles.Versioned this time, so hopefully users won't have
6342         to rebuild their .tap files this time.
6343         * contrib/debug.glade: add a "Poke IRC" button
6344         * contrib/debugclient.py: same
6346         * setup.py: bump to 0.4.2+ while between releases
6348 2004-01-08  Brian Warner  <warner@lothar.com>
6350         * setup.py (version): Releasing buildbot-0.4.2
6352 2004-01-08  Brian Warner  <warner@lothar.com>
6354         * NEWS: update for 0.4.2 release
6356         * README: document how to run the tests, now that they all pass
6358         * buildbot/changes/maildir.py (Maildir.poll): minor comment
6360         * buildbot/process/step.py (CVS): add a global_options= argument,
6361         which lets you set CVS global options for the command like "-r"
6362         for read-only checkout, or "-R" to avoid writing in the
6363         repository.
6364         * buildbot/slavecommand.py (CVSCommand): same
6366         * buildbot/status/event.py (Logfile): add a .doSwap switch to make
6367         testing easier (it is turned off when testing, to avoid the
6368         leftover timer)
6370         * buildbot/process/step.py (InternalBuildStep): shuffle code a bit
6371         to make it easier to test: break generateStepID() out to a
6372         separate function, only update statusbag if it exists.
6373         (ShellCommands): create useful text for dict-based commands too.
6375         * test/*, buildbot/test/*: move unit tests under the buildbot/
6376         directory
6377         * setup.py (packages): install buildbot.test too
6379         * buildbot/test/test_slavecommand.py: fix it, tests pass now
6380         * buildbot/test/test_steps.py: fix it, tests pass now
6382 2004-01-06  Brian Warner  <warner@lothar.com>
6384         * buildbot/changes/mail.py (parseFreshCVSMail): looks like new
6385         freshcvs mail uses a slightly different syntax for new
6386         directories. Update parser to handle either.
6387         * test/test_mailparse.py (Test1.testMsg9): test for same
6389 2003-12-21  Brian Warner  <warner@lothar.com>
6391         * buildbot/process/process_twisted.py (TwistedDebsBuildFactory): set
6392         'warnOnWarnings' so that lintian errors mark the build orange
6394 2003-12-17  Brian Warner  <warner@lothar.com>
6396         * buildbot/changes/mail.py (parseBonsaiMail): parser for commit
6397         messages emitted by Bonsai, contributed by Stephen Davis.
6399         * test/*: moved all tests to use trial instead of unittest. Some
6400         still fail (test_steps, test_slavecommand, and test_process).
6402         * setup.py (version): bump to 0.4.1+ while between releases
6404 2003-12-09  Brian Warner  <warner@lothar.com>
6406         * setup.py (version): Releasing buildbot-0.4.1
6408 2003-12-09  Brian Warner  <warner@lothar.com>
6410         * NEWS: update for 0.4.1 release
6412         * docs/examples/twisted_master.cfg: add netbsd builder, shuffle
6413         freebsd builder code a little bit
6415         * buildbot/changes/freshcvs.py (FreshCVSSourceNewcred.__cmp__):
6416         don't try to compare attributes of different classes
6417         * buildbot/changes/mail.py (MaildirSource.__cmp__): same
6418         (MaildirSource.messageReceived): fix Change delivery
6420         * buildbot/master.py (BuildMaster.loadConfig): insert 'basedir'
6421         into the config file's namespace before loading it, like the
6422         documentation claims it does
6423         * docs/examples/twisted_master.cfg: remove explicit 'basedir'
6424         (useFreshCVS): switch to using a maildir until Twisted's freshcvs
6425         daemon comes back online
6427 2003-12-08  Brian Warner  <warner@lothar.com>
6429         * docs/examples/twisted_master.cfg: provide an explicit 'basedir'
6430         so the example will work with online=0 as well
6432         * buildbot/changes/mail.py (FCMaildirSource, SyncmailMaildirSource):
6433         fix the __implements__ line
6435         * buildbot/changes/maildirtwisted.py (MaildirTwisted): make this
6436         class a twisted.application.service.Service, use startService to
6437         get it moving.
6439         * buildbot/changes/dnotify.py (DNotify): use os.open to get the
6440         directory fd instead of simple open(). I'm sure this used to work,
6441         but the current version of python refuses to open directories with
6442         open().
6444 2003-12-05  Brian Warner  <warner@lothar.com>
6446         * setup.py (version): bump to 0.4.0+ while between releases
6448 2003-12-05  Brian Warner  <warner@lothar.com>
6450         * setup.py (version): Releasing buildbot-0.4.0
6452 2003-12-05  Brian Warner  <warner@lothar.com>
6454         * docs/examples/glib_master.cfg: replace old sample scripts with
6455         new-style config files
6456         * MANIFEST.in: include .cfg files in distribution tarball
6458         * buildbot/changes/freshcvs.py (FreshCVSListener.remote_goodbye):
6459         implement a dummy method to avoid the exception that occurs when
6460         freshcvs sends this to us.
6462         * buildbot/pbutil.py (ReconnectingPBClientFactory.stopFactory):
6463         removed the method, as it broke reconnection. Apparently
6464         stopFactory is called each time the connection attempt fails. Must
6465         rethink this.
6466         (ReconnectingPBClientFactory.__getstate__): squash the _callID
6467         attribute before serialization, since without stopFactory the
6468         reconnect timer may still be active and they aren't serializable.
6470         * test/test_mailparse.py (ParseTest): test with 'self' argument
6472         * buildbot/changes/mail.py (parseFreshCVSMail): add (silly) 'self'
6473         argument, as these "functions" are invoked like methods from class
6474         attributes and therefore always get an instance as the first
6475         argument.
6477         * buildbot/changes/maildir.py (Maildir.start): fix error in error
6478         message: thanks to Stephen Davis for the catch
6480 2003-12-04  Brian Warner  <warner@lothar.com>
6482         * buildbot/pbutil.py: complete rewrite using PBClientFactory and
6483         twisted's standard ReconnectingClientFactory. Handles both oldcred
6484         and newcred connections. Also has a bug-workaround for
6485         ReconnectingClientFactory serializing its connector when it
6486         shouldn't.
6488         * buildbot/bot.py (BotFactory): rewrite connection layer with new
6489         pbutil. Replace makeApp stuff with proper newcred/mktap
6490         makeService(). Don't serialize Ephemerals on shutdown.
6492         * buildbot/changes/changes.py (ChangeMaster): make it a
6493         MultiService and add the sources as children, to get startService
6494         and stopService for free. This also gets rid of the .running flag.
6496         * buildbot/changes/freshcvs.py (FreshCVSSource): rewrite to use
6497         new pbutil, turn into a TCPClient at the same time (to get
6498         startService for free). Two variants exist: FreshCVSSourceOldcred
6499         and FreshCVSSourceNewcred (CVSToys doesn't actualy support newcred
6500         yet, but when it does, we'll be ready).
6501         (FreshCVSSource.notify): handle paths which are empty after the
6502         prefix is stripped. This only happens when the top-level (prefix)
6503         directory is added, at the very beginning of a Repository's life.
6505         * buildbot/clients/base.py: use new pbutil, clean up startup code.
6506         Now the only reconnecting code is in the factory where it belongs.
6507         (Builder.unsubscribe): unregister the disconnect callback when we
6508         delete the builder on command from the master (i.e. when the
6509         buildmaster is reconfigured and that builder goes away). This
6510         fixes a multiple-delete exception when the status client is shut
6511         down afterwards.
6512         * buildbot/clients/gtkPanes.py (GtkClient): cleanup, match the
6513         base Client. 
6515         * buildbot/status/words.py (IrcStatusBot): add some more sillyness
6516         (IrcStatusBot.getBuilderStatus): fix minor exception in error message
6518 2003-10-20  Christopher Armstrong  <radix@twistedmatrix.com>
6520         * contrib/run_maxq.py: Accept a testdir as an argument rather than
6521         a list of globs (ugh). The testdir will be searched for files
6522         named *.tests and run the tests in the order specified in each of
6523         those files. This allows for "dependancies" between tests to be
6524         codified.
6526         * buildbot/process/maxq.py (MaxQ.__init__): Accept a testdir
6527         argument to pass to run_maxq.py, instead of a glob.
6529 2003-10-17  Brian Warner  <warner@lothar.com>
6531         * buildbot/process/step_twisted.py (HLint.start): ignore .xhtml
6532         files that live in the sandbox
6534 2003-10-15  Brian Warner  <warner@lothar.com>
6536         * buildbot/process/step_twisted.py (ProcessDocs.finished): fix
6537         spelling error in "docs" count-warnings output
6538         (HLint.start): stupid thinko meant .xhtml files were ignored
6540         * docs/examples/twisted_master.cfg (reactors): disable cReactor
6541         tests now that cReactor is banished to the sandbox
6543 2003-10-10  Brian Warner  <warner@lothar.com>
6545         * buildbot/process/step_twisted.py (ProcessDocs, HLint): new Twisted
6546         scheme: now .xhtml are sources and .html are generated
6548 2003-10-08  Brian Warner  <warner@lothar.com>
6550         * buildbot/process/step_twisted.py (RunUnitTests.__init__): oops,
6551         we were ignoring the 'randomly' parameter.
6553 2003-10-01  Brian Warner  <warner@lothar.com>
6555         * buildbot/slavecommand.py (ShellCommand.start): set usePTY=1 on
6556         posix, to kill sub-children of aborted slavecommands.
6558         * buildbot/status/builder.py: rename Builder to BuilderStatus.
6559         Clean up initialization: lastBuildStatus remains None until the
6560         first build has been completed.
6562         * buildbot/status/html.py (WaterfallStatusResource.body): handle
6563         None as a lastBuildStatus
6564         * buildbot/clients/gtkPanes.py: same
6566         * buildbot/status/client.py (StatusClientService): keep
6567         BuilderStatus objects in self.statusbags . These objects now live
6568         here in the StatusClientService and are referenced by the Builder
6569         object, rather than the other way around.
6570         * buildbot/status/words.py (IrcStatusBot.getBuilderStatus): same
6571         * buildbot/process/base.py (Builder): same
6572         * test/test_config.py (ConfigTest.testBuilders): same
6574         * buildbot/master.py (BuildMaster.loadConfig_Builders): when modifying
6575         an existing builder, leave the statusbag alone. This will preserve the
6576         event history.
6578         * buildbot/pbutil.py (ReconnectingPB.connect): add initial newcred
6579         hook. This will probably go away in favor of a class in upcoming
6580         Twisted versions.
6582         * buildbot/changes/freshcvs.py (FreshCVSSource.start): Remove old
6583         serviceName from newcred FreshCVSNotifiee setup
6585 2003-09-29  Brian Warner  <warner@lothar.com>
6587         * buildbot/process/process_twisted.py: switch to new reactor
6588         abbreviations
6589         * docs/examples/twisted_master.cfg: same
6591         * README (REQUIREMENTS): mention twisted-1.0.8a3 requirement
6593         * buildbot/status/words.py (IrcStatusBot.getBuilder): use the
6594         botmaster reference instead of the oldapp service lookup
6596         * buildbot/master.py (BuildMaster.__init__): give the
6597         StatusClientService a reference to the botmaster to make it easier to
6598         force builds
6600 2003-09-24  Christopher Armstrong  <radix@twistedmatrix.com>
6602         * buildbot/status/html.py (Box.td): escape hreffy things so you
6603         can have spaces in things like builder names
6604         (StatusResourceBuilder.body)
6605         (WaterfallStatusResource.body)
6606         (WaterfallStatusResource.body0): same
6608 2003-09-25  Brian Warner  <warner@lothar.com>
6610         * buildbot/master.py (BuildMaster.loadConfig_Builders): don't
6611         rearrange the builder list when adding or removing builders: keep
6612         them in the order the user requested.
6613         * test/test_config.py (ConfigTest.testBuilders): verify it
6615         * contrib/debug.glade: give the debug window a name
6617         * buildbot/process/base.py (Builder.buildTimerFired): builders can
6618         now wait on multiple interlocks. Fix code relating to that.
6619         (Builder.checkInterlocks): same
6620         * buildbot/status/builder.py (Builder.currentlyInterlocked): same
6622         * buildbot/master.py (BuildMaster.loadConfig): move from
6623         deprecated pb.BrokerFactory to new pb.PBServerFactory
6624         * test/test_config.py (ConfigTest.testWebPathname): same
6626         * docs/examples/twisted_master.cfg: fix interlock declaration
6628         * buildbot/master.py (BotMaster.addInterlock): move code to attach
6629         Interlocks to their Builders into interlock.py .
6630         (BuildMaster.loadConfig_Interlocks): fix interlock handling
6632         * test/test_config.py (ConfigTest.testInterlocks): validate
6633         interlock handling
6635         * buildbot/process/base.py (Builder.__init__): better comments
6636         * buildbot/process/interlock.py (Interlock.__repr__): same
6637         (Interlock.deactivate): add .active flag, move the code that
6638         attaches/detaches builders into the Interlock
6640 2003-09-24  Christopher Armstrong  <radix@twistedmatrix.com>
6642         * buildbot/process/maxq.py (MaxQ): support for running a set of MaxQ
6643         tests using the new run_maxq.py script, and reporting failures by
6644         parsing its output.
6646         * contrib/run_maxq.py: Hacky little script for running a set of maxq
6647         tests, reporting their success or failure in a buildbot-friendly 
6648         manner.
6650 2003-09-24  Brian Warner  <warner@lothar.com>
6652         * docs/examples/twisted_master.cfg: example of a new-style config
6653         file. This lives in the buildmaster base directory as
6654         "master.cfg".
6656         * contrib/debugclient.py (DebugWidget.do_rebuild): add 'reload'
6657         button to make the master re-read its config file
6659         * buildbot/master.py (BuildMaster.loadConfig): new code to load
6660         buildmaster configuration from a file. This file can be re-read
6661         later, and the buildmaster will update itself to match the new
6662         desired configuration. Also use new Twisted Application class.
6663         * test/Makefile, test/test_config.py: unit tests for same
6665         * buildbot/changes/freshcvs.py (FreshCVSSource.__cmp__): make
6666         FreshCVSSources comparable, to support reload.
6667         * buildbot/changes/mail.py (MaildirSource.__cmp__): same
6669         * buildbot/process/base.py (Builder): make them comparable, make
6670         Interlocks easier to attach, to support reload. Handle
6671         re-attachment of remote slaves.
6672         * buildbot/process/interlock.py (Interlock): same
6674         * buildbot/bot.py, bb_tap.py, changes/changes.py: move to
6675         Twisted's new Application class. Requires Twisted >= 1.0.8 .
6676         buildmaster taps are now constructed with mktap.
6677         * buildbot/status/client.py (StatusClientService): same
6679         * buildbot/status/words.py: move to new Services, add support to
6680         connect to multiple networks, add reload support, allow nickname
6681         to be configured on a per-network basis
6683 2003-09-20  Brian Warner  <warner@lothar.com>
6685         * docs/examples/twisted_master.py (twisted_app): use python2.3 for
6686         the freebsd builder, now that the machine has been upgraded and no
6687         longer has python2.2
6689         * setup.py (version): bump to 0.3.5+ while between releases
6691 2003-09-19  Brian Warner  <warner@lothar.com>
6693         * setup.py (version): Releasing buildbot-0.3.5
6695 2003-09-19  Brian Warner  <warner@lothar.com>
6697         * NEWS: add post-0.3.4 notes
6699         * README (REQUIREMENTS): note twisted-1.0.7 requirement
6701         * MANIFEST.in: add contrib/*
6703         * docs/examples/twisted_master.py (twisted_app): all build slaves must
6704         use a remote root now: cvs.twistedmatrix.com
6706         * buildbot/changes/freshcvs.py (FreshCVSNotifiee.connect): update
6707         to newcred
6708         (FreshCVSNotifieeOldcred): but retain a class that uses oldcred for
6709         compatibility with old servers
6710         (FreshCVSSource.start): and provide a way to use it
6711         (FreshCVSNotifiee.disconnect): handle unconnected notifiee
6713         * docs/examples/twisted_master.py (twisted_app): update to new
6714         makeApp interface.
6715         (twisted_app): listen on new ~buildbot socket
6716         (twisted_app): Twisted CVS has moved to cvs.twistedmatrix.com
6718         * buildbot/process/process_twisted.py: Use 'copydir' on CVS steps
6719         to reduce cvs bandwidth (update instead of full checkout)
6721 2003-09-11  Brian Warner  <warner@lothar.com>
6723         * contrib/fakechange.py: demo how to connect to the changemaster
6724         port. You can use this technique to submit changes to the
6725         buildmaster from source control systems that offer a hook to run a
6726         script when changes are committed.
6728         * contrib/debugclient.py: tool to connect to the debug port. You
6729         can use it to force builds, submit fake changes, and wiggle the
6730         builder state
6732         * buildbot/master.py: the Big NewCred Reorganization. Use a single
6733         'Dispatcher' realm to handle all the different kinds of
6734         connections and Perspectives: buildslaves, the changemaster port,
6735         the debug port, and the status client port. NewCredPerspectives
6736         now have .attached/.detached methods called with the remote 'mind'
6737         reference, much like old perspectives did. All the pb.Services
6738         turned into ordinary app.ApplicationServices .
6739         (DebugService): went away, DebugPerspectives are now created
6740         directly by the Dispatcher.
6741         (makeApp): changed interface a little bit
6743         * buildbot/changes/changes.py: newcred
6744         * buildbot/status/client.py: newcred
6746         * buildbot/clients/base.py: newcred client side changes
6747         * buildbot/bot.py: ditto
6749         * docs/examples/glib_master.py: handle new makeApp() interface
6750         * docs/examples/twisted_master.py: ditto
6752         * buildbot/pbutil.py (NewCredPerspective): add a helper class to
6753         base newcred Perspectives on. This should go away once Twisted
6754         itself provides something sensible.
6757 2003-09-11  Christopher Armstrong  <radix@twistedmatrix.com>
6759         * contrib/svn_buildbot.py: A program that you can call from your
6760         SVNREPO/hooks/post-commit file that will notify a BuildBot master
6761         when a change in an SVN repository has happened. See the top of
6762         the file for some minimal usage info.
6764 2003-09-10  Christopher Armstrong  <radix@twistedmatrix.com>
6766         * buildbot/slavecommand.py (ArglistCommand): Add new
6767         ArglistCommand that takes an argument list rather than a string as
6768         a parameter. Using a st.split() for argv is very bad.
6770         * buildbot/slavecommand.py (SVNFetch): Now has the ability to
6771         update to a particular revision rather than always checking out
6772         (still not very smart about it, there may be cases where the
6773         checkout becomes inconsistent).
6775 2003-09-10  Christopher Armstrong  <radix@twistedmatrix.com>
6777         * buildbot/{bot.py,slavecommand.py,process/step.py}: Rudimentary
6778         SVN fetch support. It can checkout (not update!) a specified
6779         revision from a specified repository to a specified directory.
6781         * buildbot/status/progress.py (Expectations.update): Fix an
6782         obvious bug (apparently created by the change described in the
6783         previous ChangeLog message) by moving a check to *after* the
6784         variable it checks is defined.
6787 2003-09-08  Brian Warner  <warner@lothar.com>
6789         * buildbot/status/progress.py (Expectations.update): hack to catch
6790         an exception TTimo sees: sometimes the update() method seems to
6791         get called before the step has actually finished, so the .stopTime
6792         is not set, so no totalTime() is available and we average None
6793         with the previous value. Catch this and just don't update the
6794         metrics, and emit a log message.
6796 2003-08-24  Brian Warner  <warner@lothar.com>
6798         * buildbot/process/base.py (BasicBuildFactory): accept 'cvsCopy'
6799         parameter to set copydir='original' in CVS commands.
6801         * buildbot/process/step.py (CVS): accept 'copydir' parameter.
6803         * buildbot/slavecommand.py (CVSCommand): add 'copydir' parameter,
6804         which tells the command to maintain a separate original-source CVS
6805         workspace. For each build, this workspace will be updated, then
6806         the tree copied into a new workdir. This reduces CVS bandwidth
6807         (from a full checkout to a mere update) while doubling the local
6808         disk usage (to keep two copies of the tree).
6810 2003-08-21  Brian Warner  <warner@lothar.com>
6812         * buildbot/status/event.py (Logfile.addEntry): if the master web
6813         server dies while we're serving a page, request.write raises
6814         pb.DeadReferenceError . Catch this and treat it like a
6815         notifyFinish event by dropping the request.
6817 2003-08-18  Brian Warner  <warner@lothar.com>
6819         * buildbot/status/words.py (IrcStatusBot.command_FORCE): complain
6820         (instead of blowing up) if a force-build command is given without
6821         a reason field
6823         * buildbot/changes/changes.py (ChangeMaster.getChangeNumbered):
6824         don't blow up if there aren't yet any Changes in the list
6826 2003-08-02  Brian Warner  <warner@lothar.com>
6828         * buildbot/bot.py (updateApplication): don't set the .tap name,
6829         since we shouldn't assume we own the whole .tap file
6831         * buildbot/bb_tap.py (updateApplication): clean up code, detect
6832         'mktap buildbot' (without a subcommand) better
6834 2003-07-29  Brian Warner  <warner@lothar.com>
6836         * buildbot/status/words.py
6837         (IrcStatusFactory.clientConnectionLost): when we lose the
6838         connection to the IRC server, schedule a reconnection attempt.
6840         * buildbot/slavecommand.py (CVSCommand.doClobber): on non-posix,
6841         use shutil.rmtree instead of forking off an "rm -rf" command.
6842         rmtree may take a while and will block until it finishes, so we
6843         use "rm -rf" if available.
6845         * docs/examples/twisted_master.py: turn off kqreactor, it hangs
6846         freebsd buildslave badly
6848         * setup.py (version): bump to 0.3.4+ while between releases
6850 2003-07-28  Brian Warner  <warner@lothar.com>
6852         * setup.py (version): Releasing buildbot-0.3.4
6854 2003-07-28  Brian Warner  <warner@lothar.com>
6856         * NEWS: update in preparation for release
6858         * buildbot/slavecommand.py (ShellCommand.doTimeout): use
6859         process.signalProcess instead of os.kill, to improve w32
6860         portability
6862         * docs/examples/twisted_master.py (twisted_app): turn off
6863         win32eventreactor: the tests hang the buildslave badly
6865         * buildbot/process/base.py (Build.buildFinished): update ETA even on
6866         failed builds, since usually the failures are consistent
6868         * buildbot/process/process_twisted.py (TwistedReactorsBuildFactory):
6869         add compileOpts/compileOpts2 to reactors build
6871         * docs/examples/twisted_master.py (twisted_app): add "-c mingw32"
6872         (twisted_app): use both default and win32eventreactor on w32 build.
6873         Use both default and kqreactor on freebsd build.
6875         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
6876         add compileOpts2, which is put after the build_ext argument. w32
6877         needs "-c mingw32" here.
6879         * buildbot/status/html.py (StatusResourceBuilder.getChild): don't
6880         touch .acqpath, it goes away in recent Twisted releases
6882         * docs/examples/twisted_master.py (twisted_app): use "python" for
6883         the w32 buildslave, not "python2.2"
6885         * buildbot/bot.py (Bot.remote_getSlaveInfo): only look in info/ if
6886         the directory exists.. should hush an exception under w32
6888         * buildbot/slavecommand.py (ShellCommandPP.processEnded): use
6889         ProcessTerminated -provided values for signal and exitCode rather
6890         than parsing the unix status code directly. This should remove one
6891         more roadblock for a w32-hosted buildslave.
6893         * test/test_mailparse.py: add test cases for Syncmail parser
6895         * Buildbot/changes/freshcvsmail.py: remove leftover code, leave a
6896         temporary compatibility import. Note! Start importing
6897         FCMaildirSource from changes.mail instead of changes.freshcvsmail
6899         * buildbot/changes/mail.py (parseSyncmail): finish Syncmail parser
6901 2003-07-27  Brian Warner  <warner@lothar.com>
6903         * NEWS: started adding new features
6905         * buildbot/changes/mail.py: start work on Syncmail parser, move
6906         mail sources into their own file
6908         * buildbot/changes/freshcvs.py (FreshCVSNotifiee): mark the class
6909         as implementing IChangeSource
6910         * buildbot/changes/freshcvsmail.py (FCMaildirSource): ditto
6912         * buildbot/interfaces.py: define the IChangeSource interface
6914 2003-07-26  Brian Warner  <warner@lothar.com>
6916         * buildbot/master.py (makeApp): docstring (thanks to Kevin Turner)
6918 2003-06-25  Brian Warner  <warner@lothar.com>
6920         * buildbot/status/words.py (IrcStatusBot.emit_last): round off
6921         seconds display
6923 2003-06-17  Brian Warner  <warner@lothar.com>
6925         * buildbot/status/words.py: clean up method usage to avoid error
6926         in silly IRC command
6927         (IrcStatusBot.emit_status): round off seconds display
6929         * buildbot/process/base.py (Build): delete the timer when saving
6930         to the .tap file, and restore it (if it should still be running)
6931         upon restore. This should fix the "next build in -34 seconds"
6932         messages that result when the master is restarted while builds are
6933         sitting in the .waiting slot. If the time for the build has
6934         already passed, start it very soon (in 1 second).
6936         * buildbot/status/words.py: more silly commands
6938         * README (REQUIREMENTS): add URLs to all required software
6940         * buildbot/status/words.py ('last'): mention results of, and time
6941         since last build
6943 2003-05-28  Brian Warner  <warner@lothar.com>
6945         * buildbot/status/words.py: add 'last' command
6946         (IrcStatusBot.emit_status): add current-small text to 'status' output
6948         * docs/examples/twisted_master.py (twisted_app): turn on IRC bot
6949         (twisted_app): remove spaces from OS-X builder name
6951         * buildbot/master.py (makeApp): add knob to turn on IRC bot
6952         * buildbot/status/words.py: IRC bot should actually be useful now
6954 2003-05-23  Brian Warner  <warner@lothar.com>
6956         * buildbot/bot.py (Bot.remote_getSlaveInfo): add routines to get
6957         "slave information" from $(slavedir)/info/* . These files are
6958         maintained by the slave administrator, and describe the
6959         machine/environment that is hosting the slave. Information from
6960         them is put into the "Builder" HTML page. Still need to establish
6961         a set of well-known filenames and meanings for this data: at the
6962         moment, *all* info/* files are sent to the master, but only
6963         'admin' and 'host' are used on that end.
6964         * buildbot/status/html.py (StatusResourceBuilder.body): ditto
6965         * buildbot/process/base.py (Builder.setRemoteInfo):  ditto
6966         * buildbot/master.py (BotPerspective.got_info):  ditto
6968 2003-05-22  Brian Warner  <warner@lothar.com>
6970         * setup.py (version): bump version to 0.3.3+ while between releases
6972 2003-05-21  Brian Warner  <warner@lothar.com>
6974         * setup.py: Releasing buildbot-0.3.3
6976 2003-05-21  Brian Warner  <warner@lothar.com>
6978         * NEWS: 0.3.3 news items
6980         * README: describe --keepalive and life behind a NAT box
6982         * buildbot/bot.py (Bot.connected): implement application-level
6983         keepalives to deal with NAT timeouts, turn them on with
6984         --keepalive option or when SO_KEEPALIVE doesn't work.
6986         * buildbot/master.py (BotPerspective): accept keepalives silently
6988         * buildbot/process/base.py (Build.buildException): CopiedFailures
6989         don't carry as much information as local ones, so don't try to
6990         create a big HTMLized version of them.
6992         * buildbot/process/step.py (InternalShellCommand.stepFailed): close
6993         log file when step fails due to an exception, such as when the slave
6994         becomes unreachable
6996         * buildbot/process/step_twisted.py (RunUnitTests): use trial's new
6997         --testmodule argument instead of grepping for test-case-name tags
6998         ourselves. Remove FindUnitTests code.
6999         * buildbot/slavecommand.py, buildbot/bot.py: remove old code
7001         * MANIFEST.in: Add docs/examples, files under test/ . Oops!
7003 2003-05-16  Brian Warner  <warner@lothar.com>
7005         * buildbot/process/base.py (BasicBuildFactory): add 'configureEnv'
7006         argument to allow things like CFLAGS=-O0 to be passed without relying
7007         upon /bin/sh processing on the slave.
7009         * buildbot/process/step.py (InternalShellCommand.start): send
7010         'env' dict to slave
7011         * buildbot/slavecommand.py (ShellCommand.start): create argv with
7012         'split' instead of letting /bin/sh do it. This should also remove
7013         the need for /bin/sh on the buildslave, making it more likely to
7014         work with win32.
7016         * buildbot/status/html.py: html-escape text in blamelist.
7017         Add "force build" button to the Builder page.
7019         * buildbot/process/step_twisted.py (countFailedTests): look at
7020         last 1000 characters for status line, as import errors can put it
7021         before the -200 point.
7023 2003-05-15  Brian Warner  <warner@lothar.com>
7025         * docs/examples/twisted_master.py: use clobber=0 for remote builds
7027         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
7028         make 'clobber' a parameter, so it is possible to have builds which
7029         do full tests but do a cvs update instead of hammering the CVS
7030         server with a full checkout each build
7032         * buildbot/process/step.py (InternalShellCommand): bump default
7033         timeout to 20 minutes
7035         * buildbot/bot.py (Bot.debug_forceBuild): utility method to ask
7036         the master to trigger a build. Run it via manhole.
7038         * buildbot/master.py (BotPerspective.perspective_forceBuild):
7039         allow slaves to trigger any build that they host, to make life
7040         easier for slave admins who are testing out new build processes
7042         * buildbot/process/process_twisted.py (TwistedReactorsBuildFactory):
7043         don't flunk cReactor or qtreactor on failure, since they fail alot
7044         these days. Do warnOnFailure instead.
7046         * buildbot/process/base.py: change Builder.buildable from a list
7047         into a single slot. When we don't have a slave, new builds (once
7048         they make it past the timeout) are now merged into an existing
7049         buildable one instead of being queued. With this change, a slave
7050         which has been away for a while doesn't get pounded with all the
7051         builds it missed, but instead just does a single build.
7053 2003-05-07  Brian Warner  <warner@lothar.com>
7055         * setup.py (version): bump version to 0.3.2+ while between releases
7057 2003-05-07  Brian Warner  <warner@lothar.com>
7059         * setup.py: Releasing buildbot-0.3.2
7061 2003-05-07  Brian Warner  <warner@lothar.com>
7063         * setup.py: fix major packaging error: include subdirectories!
7064         
7065         * NEWS: add changes since last release
7067         * README (REQUIREMENTS): update twisted/python dependencies
7069         * buildbot/status/builder.py (Builder.startBuild): change
7070         BuildProcess API: now they should call startBuild/finishBuild
7071         instead of pushing firstEvent / setLastBuildStatus. Moving towards
7072         keeping a list of builds in the statusbag, to support other kinds of
7073         status delivery.
7074         (Builder.addClient): send current-activity-small to new clients
7075         * buildbot/process/base.py (Build.startBuild, .buildFinished): use
7076         new API
7078         * buildbot/status/client.py: drop RemoteReferences at shutdown
7080         * buildbot/status/event.py (Event.stoppedObserving): oops, add it
7082         * buildbot/status/progress.py (BuildProgress.remote_subscribe):
7083         more debug messages for remote status client
7085         * buildbot/process/step.py (InternalBuildStep.stepComplete)
7086         (.stepFailed): only fire the Deferred once, even if both
7087         stepComplete and stepFailed are called. I think this can happen if
7088         an exception occurs at a weird time.
7090         * buildbot/status/words.py: work-in-progress: IRC status delivery
7092 2003-05-05  Brian Warner  <warner@lothar.com>
7094         * docs/examples/twisted_master.py (twisted_app): hush internal
7095         python2.3 distutils deprecation warnings
7096         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
7097         add compileOpts= argument which inserts extra args before the
7098         "setup.py build_ext" command. This can be used to give -Wignore
7099         warnings, to hush some internal python-2.3 deprecation messages.
7101         * buildbot/process/step_twisted.py (RunUnitTests): parameterize
7102         the ['twisted.test'] default test case to make it easier to change
7103         in subclasses
7105         * buildbot/clients/base.py: switch to pb.Cacheable-style Events
7106         * buildbot/clients/gtkPanes.py: ditto
7108         * buildbot/process/step_twisted.py (RunUnitTests): use randomly=
7109         arg to collapse RunUnitTestsRandomly into RunUnitTests
7110         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
7111         use RunUnitTests(randomly=1) instead of RunUnitTestsRandomly
7113         * buildbot/status/html.py (StatusResource): shuffle Resources
7114         around to fix a bug: both 'http://foo:8080' and 'http://foo:8080/'
7115         would serve the waterfall display, but the internal links were
7116         only valid on the trailing-slash version. The correct behavior is
7117         for the non-slashed one to serve a Redirect to the slashed one.
7118         This only shows up when the buildbot page is hanging off another
7119         server, like a Twisted-Web distributed server.
7121         * buildbot/status/event.py (Event, RemoteEvent): make Events
7122         pb.Cacheable, with RemoteEvent as the cached version. This removes
7123         a lot of explicit send-an-update code.
7124         * buildbot/status/builder.py (Builder): remove send-update code
7125         * buildbot/status/client.py (ClientBuilder): remove send-update
7126         code, and log errors that occur during callRemote (mostly to catch
7127         InsecureJelly exceptions)
7129         * buildbot/process/process_twisted.py (QuickTwistedBuildFactory):
7130         run Lore with the same python used in the rest of the build
7132         * buildbot/process/step_twisted2.py (RunUnitTestsJelly): moved
7134         * buildbot/process/step_twisted.py (HLint): accept 'python'
7135         argument. Catch rc!=0 and mark the step as failed. This marks the
7136         build orange ("has warnings").
7137         (RunUnitTestsJelly): move out to step_twisted2.py
7139         * buildbot/util.py (ignoreStaleRefs): add utility function
7141         * buildbot/master.py (DebugPerspective.perspective_setCurrentState):
7142         don't fake ETA object, it's too hard to get right
7144 2003-05-02  Brian Warner  <warner@lothar.com>
7146         * docs/examples/twisted_master.py (twisted_app): add FreeBSD builder
7148 2003-05-01  Brian Warner  <warner@lothar.com>
7150         * buildbot/status/html.py (StatusResource.body): oops, I was
7151         missing a <tr>, causing the waterfall page to be misrendered in
7152         everything except Galeon.
7154 2003-04-29  Brian Warner  <warner@lothar.com>
7156         * docs/examples/twisted_master.py: make debuild use python-2.2
7157         explicitly, now that Twisted stopped supporting 2.1
7159         * buildbot/process/step_twisted.py (BuildDebs.finishStatus): oops,
7160         handle tuple results too. I keep forgetting this, which suggests
7161         it needs to be rethought.
7163         * setup.py (setup): bump version to 0.3.1+ while between releases
7164         
7165 2003-04-29  Brian Warner  <warner@lothar.com>
7167         * setup.py: Releasing buildbot-0.3.1
7169 2003-04-29  Brian Warner  <warner@lothar.com>
7171         * README (SUPPORT): add plea to send questions to the mailing list
7173         * NEWS, MANIFEST.in: add description of recent changes
7175         * docs/examples/twisted_master.py: add the code used to create the
7176         Twisted buildmaster, with passwords and such removed out to a
7177         separate file.
7179         * buildbot/changes/changes.py, freshcvs.py, freshcvsmail.py: split
7180         out cvstoys-using bits from generic changes.py, to allow non-cvstoys
7181         buildmasters to not require CVSToys be installed.
7182         * README, docs/examples/glib_master: update to match the change
7184         * buildbot/clients/base.py, buildbot/bot.py,
7185         buildbot/changes/changes.py, buildbot/pbutil.py: copy
7186         ReconnectingPB from CVSToys distribution to remove CVSToys
7187         dependency for build slaves and status clients. Buildmasters which
7188         use FreshCVSSources still require cvstoys be installed, of course.
7190 2003-04-25  Brian Warner  <warner@lothar.com>
7192         * buildbot/process/process_twisted.py (FullTwistedBuildFactory): add
7193         runTestsRandomly arg to turn on trial -z
7195         * buildbot/process/step_twisted.py (TwistedJellyTestResults):
7196         experimental code to use trial's machine-parseable output to get
7197         more detailed test results. Still has some major issues.
7198         (RunUnitTestsRandomly): subclass to add "-z 0" option, runs tests
7199         in random sequence
7201         * buildbot/status/builder.py (Builder.setCurrentBuild):
7202         anticipating moving build history into statusbag, not used yet
7204         * buildbot/status/tests.py: code to centralize test results,
7205         doesn't work quite yet
7207         * buildbot/status/event.py (Event): use hasattr("setName") instead
7208         of isinstance for now.. need better long-term solution
7210         * buildbot/status/html.py: Remove old imports
7212 2003-04-24  Brian Warner  <warner@lothar.com>
7214         * buildbot/process/process_twisted.py (TwistedBuild.isFileImportant):
7215         ignore changes under doc/fun/ and sandbox/
7217         * buildbot/process/step_twisted.py: update pushEvent and friends.
7219         * buildbot/status/html.py (Box.td): replace event.buildername with
7220         event.parent.getSwappableName(). Needs more thought.
7222         * buildbot/status/builder.py (Builder): Replace pushEvent and
7223         getLastEvent with {set|update|addFileTo|finish}CurrentActivity.
7224         Tell events they are being pruned with event.delete().
7226         * buildbot/process/base.py (Build): Remove Builder status-handling
7227         methods. s/pushEvent/setCurrentActivity/.
7229         * buildbot/process/step.py (BuildStep): clean up status delivery.
7230         Gouse builder.statusbag methods instead of intermediate builder
7231         methods. s/updateLastEvent/updateCurrentActivity/.
7232         s/finalizeLastEvent/finishCurrentActivity/. Use
7233         addFileToCurrentActivity for summaryFunction.
7235         * buildbot/status/event.py (Logfile): put data in a Swappable when
7236         .finish is called.
7237         (Event): add more setter methods. Remove .buildername, use .parent
7238         and getSwappableName instead (needs more thought).
7240         * buildbot/util.py (Swappable):
7241         * test/test_swap.py: don't bother setting filename at __init__
7242         time, do it later. Change setFilename args to take parent first,
7243         since it provides the most significant part of the filename.
7245 2003-04-23  Brian Warner  <warner@lothar.com>
7247         * buildbot/status/event.py (Logfile.addEntry): append to previous
7248         entry, if possible
7250         * buildbot/process/step.py (BuildStep.finalizeLastEvent):
7251         anticipating Swappable
7252         (InternalShellCommand.remoteUpdate): split out various log-adding
7253         methods so subclasses can snarf stdout separately
7255         * buildbot/process/base.py (Builder.finalizeLastEvent): more code
7256         in anticipation of Swappable build logs
7257         (Builder.testsFinished): anticipating TestResults, still disabled
7259         * buildbot/status/builder.py (Builder.pruneEvents): only keep the
7260         last 100 events
7262         * buildbot/status/event.py (Logfile): add (disabled) support for
7263         Swappable, not ready for use yet
7265         * buildbot/util.py (Swappable): object which is swapped out to
7266         disk after some period of no use.
7267         * test/test_swap.py: test buildbot.utils.Swappable
7269 2003-04-14  Brian Warner  <warner@lothar.com>
7271         * buildbot/process/base.py (Builder.doPeriodicBuild): add simple
7272         periodic-build timer. Set the .periodicBuildTime on a builder
7273         instance to some number of seconds to activate it.
7275         * buildbot/master.py (BotMaster.forceBuild): change forceBuild API
7277         * buildbot/process/step.py (ShellCommand.finishStatus): use log.msg in
7278         a way that survives result tuples
7280 2003-04-12  Brian Warner  <warner@lothar.com>
7282         * buildbot/process/step.py (ShellCommand.finishStatusSummary):
7283         return a dict instead of a tuple: allow summarizers to provide
7284         multiple summaries if they want
7285         * buildbot/process/step_twisted.py (trialTextSummarizer): return dict
7286         (debuildSummarizer): summarize lintian warnings/errors
7288 2003-04-10  Brian Warner  <warner@lothar.com>
7290         * README (REQUIREMENTS): slave requires twisted-1.0.4a2
7292 2003-04-09  Brian Warner  <warner@lothar.com>
7294         * buildbot/process/step_twisted.py (trialTextSummarizer): Don't create
7295         empty summaries: happens when the tests fail so hard they don't emit
7296         a parseable summary line.
7298         * buildbot/process/step.py (ShellCommand.finishStatusSummary):
7299         Allow summaryFunction to return None to indicate no summary should
7300         be added.
7302         * buildbot/status/event.py (Logfile.removeHtmlWatcher): avoid
7303         writing to stale HTTP requests: notice when they disconnect and
7304         remove the request from the list. Also add CacheToFile from
7305         moshez, will be used later.
7307 2003-04-08  Brian Warner  <warner@lothar.com>
7309         * buildbot/process/step_twisted.py (ProcessDocs.finished): warnings
7310         should be an int, not a list of strings
7312         * buildbot/changes/changes.py (FreshCVSSource.stop): don't disconnect
7313         if we weren't actually connected
7315         * buildbot/process/step_twisted.py (trialTextSummarizer): function
7316         to show the tail end of the trial text output
7318         * buildbot/process/step.py (ShellCommand.finishStatusSummary): add
7319         hook to summarize the results of a ShellCommand
7321 2003-04-07  Brian Warner  <warner@lothar.com>
7323         * buildbot/process/step_twisted.py (RunUnitTests): consolidate all
7324         twisted test suite code into a single class.
7325         * buildbot/process/process_twisted.py: same
7327 2003-04-04  Brian Warner  <warner@lothar.com>
7329         * setup.py, MANIFEST.in: hack to make sure plugins.tml gets installed
7331         * README (SLAVE): document use of mktap to create slave .tap file
7332         (REQUIREMENTS): describe dependencies
7334         * buildbot/bb_tap.py, buildbot/plugins.tml:
7335         * buildbot/bot.py (updateApplication): Add mktap support for creating
7336         buildslave .tap files
7338 2003-03-28  Brian Warner  <warner@lothar.com>
7340         * buildbot/process/step.py (InternalShellCommand.finished): handle
7341         new tuple result values (fix embarrasing bug that appeared during
7342         PyCon demo)
7344 2003-03-27  Brian Warner  <warner@lothar.com>
7346         * docs/examples/glib_master.py, README: add sample buildmaster.tap
7347         -making program
7349 2003-03-25  Brian Warner  <warner@lothar.com>
7351         * buildbot/process/step.py (CVS, ShellCommand): add reason for failure
7352         to overall build status
7353         * buildbot/clients/base.py (Builder): improve event printing
7354         * buildbot/process/base.py (BasicBuildFactory): use specific steps
7355         instead of generic ShellCommand
7356         (Build): Add .stopBuild, use it when slave is detached
7358         * buildbot/process/step.py (Configure,Test): give the steps their
7359         own names and status strings
7361         * buildbot/status/html.py (StatusResource): add "show" argument,
7362         lets you limit the set of Builders being displayed.
7364 2003-03-20  Brian Warner  <warner@lothar.com>
7366         * buildbot/process/basic.py: removed
7368 2003-03-19  Brian Warner  <warner@lothar.com>
7370         * buildbot/process/process_twisted.py (FullTwistedBuildFactory):
7371         turn off process-docs by default
7373         * buildbot/process/base.py (Builder.getBuildNumbered): Don't blow up
7374         when displaying build information without anything in allBuilds[]
7376         * buildbot/bot.py (makeApp): really take password from sys.argv
7378 2003-03-18  Brian Warner  <warner@lothar.com>
7380         * buildbot/bot.py (buildApp): take password from sys.argv
7382         * README: replace with more useful text
7384         * setup.py: add a real one
7385         * MANIFEST.in, .cvsignore: more distutils packaging stuff
7386         
7387         * docs/PyCon-2003/: added sources for PyCon paper.
7389         * buildbot/process/base.py, step.py: revamp. BuildProcess is gone,
7390         now Build objects control the process and Builder only handles
7391         slave stuff and distribution of changes/status. A new BuildFactory
7392         class creates Build objects on demand.
7394         Created ConfigurableBuild which takes a list of steps to run. This
7395         makes it a lot easier to set up a new kind of build and moves us
7396         closer to being able to configure a build from a web page.
7398         * buildbot/process/step_twisted.py, process_twisted.py: move to
7399         new model. A lot of code went away.
7400         
7401         * buildbot/status/progress.py (BuildProgress.newProgress): Don't
7402         send lots of empty progress messages to the client.
7404         * buildbot/master.py (makeApp): enforce builder-name uniqueness
7406 2003-02-20  Brian Warner  <warner@lothar.com>
7408         * buildbot/process/step_twisted.py (BuildDebs): count lintian hits
7410         * buildbot/slavecommand.py (ShellCommand): back to usePTY=0. The
7411         Twisted bug that prevented non-pty processes from working just got
7412         fixed, and the bug that leaks ptys is still being investigated.
7414         * buildbot/process/step.py (CVS): send timeout arg to slave
7416         * buildbot/clients/gtkPanes.py: add connection-status row, handle
7417         builders coming and going
7418         * buildbot/clients/base.py: clean up protocol, move to ReconnectingPB
7419         from CVSToys, handle lost-buildmaster
7421         * buildbot/status/client.py (StatusClientService.removeBuilder):
7422         Clean up status client protocol: send builders (with references)
7423         as they are created, rather than sending a list and requiring the
7424         client to figure out which ones are new.
7425         * buildbot/master.py (BotMaster.forceBuild): Log debugclient
7426         attempts to force a build on an unknown builder
7428 2003-02-19  Brian Warner  <warner@lothar.com>
7430         * buildbot/slavecommand.py (CVSCommand): add timeout to sub-commands
7431         * buildbot/slavecommand.py (ShellCommand.start): stop using PTYs until
7432         Twisted stops leaking them.
7433         * buildbot/clients/gtkPanes.py (CompactBuilder): forget ETA when the
7434         builder goes to an idle state.
7436         * buildbot/slavecommand.py (ShellCommand.start): bring back PTYs until
7437         I figure out why CVS commands hang without them, and/or I fix the
7438         hung-command timeout
7440 2003-02-16  Brian Warner  <warner@lothar.com>
7442         * buildbot/process/step_twisted.py: bin/hlint went away, replace
7443         with 'bin/lore --output lint'. Use 'bin/trial -o' to remove
7444         ansi-color markup. Remove GenerateLore step. Count hlint warnings in
7445         GenerateDocs now that they are prefixed with WARNING:.
7447         * buildbot/status/html.py (StatusResource.body): Fix Builder link,
7448         use manual href target instead of request.childLink
7450         * buildbot/clients/gtkPanes.py: Fix progress countdown: update the
7451         display every second, but update the ETA every 5 seconds (or
7452         whenever) as remote_progress messages arrive.
7455 2003-02-12  Brian Warner  <warner@lothar.com>
7457         * *: import current sources from home CVS repository
7458         
7460 # Local Variables:
7461 # add-log-time-format: add-log-iso8601-time-string
7462 # End: