From warner at users.sourceforge.net Sat Dec 1 01:49:00 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sat, 01 Dec 2007 01:49:00 +0000 Subject: [Buildbot-commits] buildbot/buildbot/process base.py,1.75,1.76 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/process In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv493/buildbot/process Modified Files: base.py Log Message: [project @ small docs patches from Greg Ward] Original author: warner at lothar.com Date: 2007-12-01 01:44:42+00:00 Index: base.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/process/base.py,v retrieving revision 1.75 retrieving revision 1.76 diff -u -d -r1.75 -r1.76 --- base.py 12 Aug 2007 22:22:41 -0000 1.75 +++ base.py 1 Dec 2007 01:48:58 -0000 1.76 @@ -130,7 +130,7 @@ class Build: - """I represent a single build by a single bot. Specialized Builders can + """I represent a single build by a single slave. Specialized Builders can use subclasses of Build to hold status information unique to those build processes. @@ -147,7 +147,7 @@ I can be used by a factory by setting buildClass on L{buildbot.process.factory.BuildFactory} - @ivar request: the L{BuildRequest} that triggered me + @ivar requests: the list of L{BuildRequest}s that triggered me @ivar build_status: the L{buildbot.status.builder.BuildStatus} that collects our status """ From warner at users.sourceforge.net Sat Dec 1 01:49:00 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sat, 01 Dec 2007 01:49:00 +0000 Subject: [Buildbot-commits] buildbot/buildbot/status builder.py, 1.104, 1.105 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/status In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv493/buildbot/status Modified Files: builder.py Log Message: [project @ small docs patches from Greg Ward] Original author: warner at lothar.com Date: 2007-12-01 01:44:42+00:00 Index: builder.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/status/builder.py,v retrieving revision 1.104 retrieving revision 1.105 diff -u -d -r1.104 -r1.105 --- builder.py 10 Oct 2007 08:32:59 -0000 1.104 +++ builder.py 1 Dec 2007 01:48:58 -0000 1.105 @@ -1276,8 +1276,8 @@ I am responsible for maintaining the list of historic Events and Builds, pruning old ones, and loading them from / saving them to disk. - I live in the buildbot.process.base.Builder object, in the .statusbag - attribute. + I live in the buildbot.process.base.Builder object, in the + .builder_status attribute. @type category: string @ivar category: user-defined category this builder belongs to; can be From warner at users.sourceforge.net Sat Dec 1 01:49:00 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sat, 01 Dec 2007 01:49:00 +0000 Subject: [Buildbot-commits] buildbot ChangeLog,1.1003,1.1004 Message-ID: Update of /cvsroot/buildbot/buildbot In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv493 Modified Files: ChangeLog Log Message: [project @ small docs patches from Greg Ward] Original author: warner at lothar.com Date: 2007-12-01 01:44:42+00:00 Index: ChangeLog =================================================================== RCS file: /cvsroot/buildbot/buildbot/ChangeLog,v retrieving revision 1.1003 retrieving revision 1.1004 diff -u -d -r1.1003 -r1.1004 --- ChangeLog 29 Nov 2007 10:05:51 -0000 1.1003 +++ ChangeLog 1 Dec 2007 01:48:57 -0000 1.1004 @@ -1,3 +1,9 @@ +2007-11-30 Brian Warner + + * buildbot/status/builder.py (BuilderStatus): small docs patches + from Greg Ward.. thanks! + * buildbot/process/base.py (Build): same + 2007-11-29 Brian Warner * buildbot/slave/commands.py (Mercurial._maybeFallback): add an From warner at users.sourceforge.net Sat Dec 8 20:20:39 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sat, 08 Dec 2007 20:20:39 +0000 Subject: [Buildbot-commits] buildbot/buildbot/scripts startup.py,1.6,1.7 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/scripts In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv13569/buildbot/scripts Modified Files: startup.py Log Message: [project @ fix win32-vs-twisted-2.5.0 twistd.run behavior. Closes #53.] Original author: warner at lothar.com Date: 2007-12-08 20:19:22+00:00 Index: startup.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/scripts/startup.py,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- startup.py 29 Sep 2007 21:23:12 -0000 1.6 +++ startup.py 8 Dec 2007 20:20:37 -0000 1.7 @@ -105,8 +105,12 @@ argv.append("--reactor=win32") sys.argv = argv - # this is copied from bin/twistd. twisted-2.0.0 uses _twistw. - if platformType == "win32": + # this is copied from bin/twistd. twisted-2.0.0 through 2.4.0 use + # _twistw.run . Twisted-2.5.0 and later use twistd.run, even for + # windows. + from twisted import version + if (platformType == "win32" + and (version.major == 2 and version.minor < 5)): from twisted.scripts import _twistw run = _twistw.run else: From warner at users.sourceforge.net Sat Dec 8 20:20:39 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sat, 08 Dec 2007 20:20:39 +0000 Subject: [Buildbot-commits] buildbot ChangeLog,1.1004,1.1005 Message-ID: Update of /cvsroot/buildbot/buildbot In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv13569 Modified Files: ChangeLog Log Message: [project @ fix win32-vs-twisted-2.5.0 twistd.run behavior. Closes #53.] Original author: warner at lothar.com Date: 2007-12-08 20:19:22+00:00 Index: ChangeLog =================================================================== RCS file: /cvsroot/buildbot/buildbot/ChangeLog,v retrieving revision 1.1004 retrieving revision 1.1005 diff -u -d -r1.1004 -r1.1005 --- ChangeLog 1 Dec 2007 01:48:57 -0000 1.1004 +++ ChangeLog 8 Dec 2007 20:20:37 -0000 1.1005 @@ -1,3 +1,9 @@ +2007-12-08 Brian Warner + + * buildbot/scripts/startup.py (launch): twisted-2.5.0 and later + doesn't need twisted.scripts._twistw.run; instead, it uses + twisted.scripts.twistd.run on all platforms. Closes #53. + 2007-11-30 Brian Warner * buildbot/status/builder.py (BuilderStatus): small docs patches From warner at users.sourceforge.net Sat Dec 8 20:25:13 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sat, 08 Dec 2007 20:25:13 +0000 Subject: [Buildbot-commits] buildbot ChangeLog,1.1005,1.1006 Message-ID: Update of /cvsroot/buildbot/buildbot In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv15481 Modified Files: ChangeLog Log Message: [project @ document the fact that our Git support is only for Git-1.2.0 or later] Original author: warner at lothar.com Date: 2007-12-08 20:24:34+00:00 Index: ChangeLog =================================================================== RCS file: /cvsroot/buildbot/buildbot/ChangeLog,v retrieving revision 1.1005 retrieving revision 1.1006 diff -u -d -r1.1005 -r1.1006 --- ChangeLog 8 Dec 2007 20:20:37 -0000 1.1005 +++ ChangeLog 8 Dec 2007 20:25:11 -0000 1.1006 @@ -1,5 +1,8 @@ 2007-12-08 Brian Warner + * docs/buildbot.texinfo (Git): document the fact that we require + Git 1.2.0 or later, and that the one shipped in dapper is too old. + * buildbot/scripts/startup.py (launch): twisted-2.5.0 and later doesn't need twisted.scripts._twistw.run; instead, it uses twisted.scripts.twistd.run on all platforms. Closes #53. From warner at users.sourceforge.net Sat Dec 8 20:25:13 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sat, 08 Dec 2007 20:25:13 +0000 Subject: [Buildbot-commits] buildbot/docs buildbot.texinfo,1.128,1.129 Message-ID: Update of /cvsroot/buildbot/buildbot/docs In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv15481/docs Modified Files: buildbot.texinfo Log Message: [project @ document the fact that our Git support is only for Git-1.2.0 or later] Original author: warner at lothar.com Date: 2007-12-08 20:24:34+00:00 Index: buildbot.texinfo =================================================================== RCS file: /cvsroot/buildbot/buildbot/docs/buildbot.texinfo,v retrieving revision 1.128 retrieving revision 1.129 diff -u -d -r1.128 -r1.129 --- buildbot.texinfo 22 Nov 2007 01:04:34 -0000 1.128 +++ buildbot.texinfo 8 Dec 2007 20:25:11 -0000 1.129 @@ -4205,15 +4205,18 @@ builder name. The default is "buildbot_%(slave)s_%(build)s". @end table + @node Git, , P4, Source Checkout @subsubsection Git @cindex Git Checkout @bsindex buildbot.steps.source.Git - The @code{Git} build step clones or updates a @uref{http://git.or.cz/, -Git} repository and checks out the specified branch or revision. +Git} repository and checks out the specified branch or revision. Note +that the buildbot supports Git version 1.2.0 and later: earlier +versions (such as the one shipped in Ubuntu 'Dapper') do not support +the @command{git init} command that the buildbot uses. The Git step takes the following arguments: @@ -4228,6 +4231,7 @@ branch will be used. @end table + @node ShellCommand, Simple ShellCommand Subclasses, Source Checkout, Build Steps @subsection ShellCommand From warner at users.sourceforge.net Wed Dec 12 03:02:15 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Wed, 12 Dec 2007 03:02:15 +0000 Subject: [Buildbot-commits] buildbot ChangeLog,1.1006,1.1007 Message-ID: Update of /cvsroot/buildbot/buildbot In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv12981 Modified Files: ChangeLog Log Message: [project @ fix 'buildbot start' for twisted<2.4.0] Original author: warner at lothar.com Date: 2007-12-12 03:01:11+00:00 Index: ChangeLog =================================================================== RCS file: /cvsroot/buildbot/buildbot/ChangeLog,v retrieving revision 1.1006 retrieving revision 1.1007 diff -u -d -r1.1006 -r1.1007 --- ChangeLog 8 Dec 2007 20:25:11 -0000 1.1006 +++ ChangeLog 12 Dec 2007 03:02:13 -0000 1.1007 @@ -1,3 +1,9 @@ +2007-12-11 Brian Warner + + * buildbot/scripts/startup.py (launch): use twisted.__version__, + rather than twisted.version, since the latter didn't appear until + Twisted-2.4.0 . This unbreaks 'buildbot start' on older Twisteds. + 2007-12-08 Brian Warner * docs/buildbot.texinfo (Git): document the fact that we require From warner at users.sourceforge.net Wed Dec 12 03:02:15 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Wed, 12 Dec 2007 03:02:15 +0000 Subject: [Buildbot-commits] buildbot/buildbot/scripts startup.py,1.7,1.8 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/scripts In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv12981/buildbot/scripts Modified Files: startup.py Log Message: [project @ fix 'buildbot start' for twisted<2.4.0] Original author: warner at lothar.com Date: 2007-12-12 03:01:11+00:00 Index: startup.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/scripts/startup.py,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- startup.py 8 Dec 2007 20:20:37 -0000 1.7 +++ startup.py 12 Dec 2007 03:02:13 -0000 1.8 @@ -108,9 +108,11 @@ # this is copied from bin/twistd. twisted-2.0.0 through 2.4.0 use # _twistw.run . Twisted-2.5.0 and later use twistd.run, even for # windows. - from twisted import version - if (platformType == "win32" - and (version.major == 2 and version.minor < 5)): + from twisted import __version__ + major, minor, ignored = __version__.split(".", 2) + major = int(major) + minor = int(minor) + if (platformType == "win32" and (major == 2 and minor < 5)): from twisted.scripts import _twistw run = _twistw.run else: From warner at users.sourceforge.net Sat Dec 15 01:02:06 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sat, 15 Dec 2007 01:02:06 +0000 Subject: [Buildbot-commits] buildbot/buildbot/steps shell.py,1.6,1.7 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/steps In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv28273/buildbot/steps Modified Files: shell.py Log Message: [project @ ShellCommand: record RemoteShellCommand args to, to get 'workdir' and 'env' and 'timeout'. Ought to fix #150.] Original author: warner at lothar.com Date: 2007-12-15 00:58:16+00:00 Index: shell.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/steps/shell.py,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- shell.py 4 Jul 2007 05:09:41 -0000 1.6 +++ shell.py 15 Dec 2007 01:02:04 -0000 1.7 @@ -116,6 +116,8 @@ # everything left over goes to the RemoteShellCommand kwargs['workdir'] = workdir # including a copy of 'workdir' self.remote_kwargs = kwargs + # we need to stash the RemoteShellCommand's args too + self.addFactoryArguments(**kwargs) def setDefaultWorkdir(self, workdir): rkw = self.remote_kwargs From warner at users.sourceforge.net Sat Dec 15 01:02:06 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sat, 15 Dec 2007 01:02:06 +0000 Subject: [Buildbot-commits] buildbot/buildbot/test test_steps.py,1.44,1.45 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/test In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv28273/buildbot/test Modified Files: test_steps.py Log Message: [project @ ShellCommand: record RemoteShellCommand args to, to get 'workdir' and 'env' and 'timeout'. Ought to fix #150.] Original author: warner at lothar.com Date: 2007-12-15 00:58:16+00:00 Index: test_steps.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/test/test_steps.py,v retrieving revision 1.44 retrieving revision 1.45 diff -u -d -r1.44 -r1.45 --- test_steps.py 12 Aug 2007 22:22:41 -0000 1.44 +++ test_steps.py 15 Dec 2007 01:02:04 -0000 1.45 @@ -200,6 +200,36 @@ b = f.newBuild([req]) #for s in b.steps: print s.name + def failUnlessClones(self, s1, attrnames): + f1 = s1.getStepFactory() + f,args = f1 + s2 = f(**args) + for name in attrnames: + self.failUnlessEqual(getattr(s1, name), getattr(s2, name)) + + def clone(self, s1): + f1 = s1.getStepFactory() + f,args = f1 + s2 = f(**args) + return s2 + + def testClone(self): + s1 = shell.ShellCommand(command=["make", "test"], + timeout=1234, + workdir="here", + description="yo", + descriptionDone="yoyo", + env={'key': 'value'}, + want_stdout=False, + want_stderr=False, + logfiles={"name": "filename"}, + ) + shellparms = (buildstep.BuildStep.parms + + ("remote_kwargs description descriptionDone " + "command logfiles").split() ) + self.failUnlessClones(s1, shellparms) + + # test the various methods available to buildsteps def test_getProperty(self): From warner at users.sourceforge.net Sat Dec 15 01:02:04 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sat, 15 Dec 2007 01:02:04 +0000 Subject: [Buildbot-commits] buildbot ChangeLog,1.1007,1.1008 Message-ID: Update of /cvsroot/buildbot/buildbot In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv28273 Modified Files: ChangeLog Log Message: [project @ ShellCommand: record RemoteShellCommand args to, to get 'workdir' and 'env' and 'timeout'. Ought to fix #150.] Original author: warner at lothar.com Date: 2007-12-15 00:58:16+00:00 Index: ChangeLog =================================================================== RCS file: /cvsroot/buildbot/buildbot/ChangeLog,v retrieving revision 1.1007 retrieving revision 1.1008 diff -u -d -r1.1007 -r1.1008 --- ChangeLog 12 Dec 2007 03:02:13 -0000 1.1007 +++ ChangeLog 15 Dec 2007 01:02:01 -0000 1.1008 @@ -1,3 +1,10 @@ +2007-12-14 Brian Warner + + * buildbot/steps/shell.py (ShellCommand.__init__): stash the + RemoteShellCommands args too, so things like 'workdir' and 'env' + and 'timeout' are preserved. This ought to fix #150. + * buildbot/test/test_steps.py (Steps.testClone): test it + 2007-12-11 Brian Warner * buildbot/scripts/startup.py (launch): use twisted.__version__, From warner at users.sourceforge.net Sat Dec 22 06:28:07 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sat, 22 Dec 2007 06:28:07 +0000 Subject: [Buildbot-commits] buildbot/buildbot/scripts logwatcher.py, 1.2, 1.3 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/scripts In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv30070/buildbot/scripts Modified Files: logwatcher.py Log Message: [project @ logwatcher: use /usr/bin/tail instead of our hand-rolled version, to make it work on OS-X. Closes #141.] Original author: warner at lothar.com Date: 2007-12-22 06:26:04+00:00 Index: logwatcher.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/scripts/logwatcher.py,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- logwatcher.py 29 Sep 2007 21:23:12 -0000 1.2 +++ logwatcher.py 22 Dec 2007 06:28:05 -0000 1.3 @@ -1,7 +1,7 @@ import os from twisted.python.failure import Failure -from twisted.internet import task, defer, reactor +from twisted.internet import defer, reactor, protocol, error from twisted.protocols.basic import LineOnlyReceiver class FakeTransport: @@ -16,6 +16,13 @@ class BuildSlaveDetectedError(Exception): pass +class TailProcess(protocol.ProcessProtocol): + def outReceived(self, data): + self.lw.dataReceived(data) + def errReceived(self, data): + print "ERR: '%s'" % (data,) + + class LogWatcher(LineOnlyReceiver): POLL_INTERVAL = 0.1 TIMEOUT_DELAY = 10.0 @@ -25,8 +32,10 @@ self.logfile = logfile self.in_reconfig = False self.transport = FakeTransport() - self.f = None + self.pp = TailProcess() + self.pp.lw = self self.processtype = "buildmaster" + self.timer = None def start(self): # return a Deferred that fires when the reconfig process has @@ -34,29 +43,35 @@ # been seen within 10 seconds, and with ReconfigError if the error # line was seen. If the logfile could not be opened, it errbacks with # an IOError. + self.p = reactor.spawnProcess(self.pp, "/usr/bin/tail", + ("tail", "-F", "-n", "0", self.logfile), + env=os.environ, + ) self.running = True d = defer.maybeDeferred(self._start) return d def _start(self): self.d = defer.Deferred() - try: - self.f = open(self.logfile, "rb") - self.f.seek(0, 2) # start watching from the end - except IOError: - pass - reactor.callLater(self.TIMEOUT_DELAY, self.timeout) - self.poller = task.LoopingCall(self.poll) - self.poller.start(self.POLL_INTERVAL) + self.timer = reactor.callLater(self.TIMEOUT_DELAY, self.timeout) return self.d def timeout(self): + self.timer = None if self.processtype == "buildmaster": - self.d.errback(BuildmasterTimeoutError()) + e = BuildmasterTimeoutError() else: - self.d.errback(BuildslaveTimeoutError()) + e = BuildslaveTimeoutError() + self.finished(Failure(e)) def finished(self, results): + try: + self.p.signalProcess("KILL") + except error.ProcessExitedAlready: + pass + if self.timer: + self.timer.cancel() + self.timer = None self.running = False self.in_reconfig = False self.d.callback(results) @@ -80,16 +95,3 @@ return self.finished(Failure(ReconfigError())) if "configuration update complete" in line: return self.finished("buildmaster") - - def poll(self): - if not self.f: - try: - self.f = open(self.logfile, "rb") - except IOError: - return - while True: - data = self.f.read(1000) - if not data: - return - self.dataReceived(data) - From warner at users.sourceforge.net Sat Dec 22 06:28:07 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sat, 22 Dec 2007 06:28:07 +0000 Subject: [Buildbot-commits] buildbot ChangeLog,1.1008,1.1009 Message-ID: Update of /cvsroot/buildbot/buildbot In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv30070 Modified Files: ChangeLog Log Message: [project @ logwatcher: use /usr/bin/tail instead of our hand-rolled version, to make it work on OS-X. Closes #141.] Original author: warner at lothar.com Date: 2007-12-22 06:26:04+00:00 Index: ChangeLog =================================================================== RCS file: /cvsroot/buildbot/buildbot/ChangeLog,v retrieving revision 1.1008 retrieving revision 1.1009 diff -u -d -r1.1008 -r1.1009 --- ChangeLog 15 Dec 2007 01:02:01 -0000 1.1008 +++ ChangeLog 22 Dec 2007 06:28:05 -0000 1.1009 @@ -1,3 +1,13 @@ +2007-12-21 Brian Warner + + * buildbot/scripts/logwatcher.py (LogWatcher.start): rewrite to + spawn /usr/bin/tail to follow the target's twistd.log . It turns + out that OS-X file EOF semantics are different, and the naive + read-then-read-again approach I was using doesn't work (the first + EOF we hit is sticky). tail gets it right, so rely upon it instead + of reimplementing the wheel. This should make 'buildbot start' + correctly follow the logfile on OS-X, thus closing #141. + 2007-12-14 Brian Warner * buildbot/steps/shell.py (ShellCommand.__init__): stash the From warner at users.sourceforge.net Sat Dec 22 06:34:56 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sat, 22 Dec 2007 06:34:56 +0000 Subject: [Buildbot-commits] buildbot/buildbot/scripts startup.py,1.8,1.9 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/scripts In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv32424/buildbot/scripts Modified Files: startup.py Log Message: [project @ startup: check for buildbot.tac before starting, since the error message when you use the wrong directory is pretty weird] Original author: warner at lothar.com Date: 2007-12-22 06:34:28+00:00 Index: startup.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/scripts/startup.py,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- startup.py 12 Dec 2007 03:02:13 -0000 1.8 +++ startup.py 22 Dec 2007 06:34:54 -0000 1.9 @@ -64,6 +64,12 @@ def start(config): os.chdir(config['basedir']) + if (not os.path.exists("buildbot.tac") and + not os.path.exists("Makefile.buildbot")): + print "This doesn't look like a buildbot base directory:" + print "No buildbot.tac or Makefile.buildbot file." + print "Giving up!" + sys.exit(1) if config['quiet']: return launch(config) From warner at users.sourceforge.net Sat Dec 22 06:34:56 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sat, 22 Dec 2007 06:34:56 +0000 Subject: [Buildbot-commits] buildbot ChangeLog,1.1009,1.1010 Message-ID: Update of /cvsroot/buildbot/buildbot In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv32424 Modified Files: ChangeLog Log Message: [project @ startup: check for buildbot.tac before starting, since the error message when you use the wrong directory is pretty weird] Original author: warner at lothar.com Date: 2007-12-22 06:34:28+00:00 Index: ChangeLog =================================================================== RCS file: /cvsroot/buildbot/buildbot/ChangeLog,v retrieving revision 1.1009 retrieving revision 1.1010 diff -u -d -r1.1009 -r1.1010 --- ChangeLog 22 Dec 2007 06:28:05 -0000 1.1009 +++ ChangeLog 22 Dec 2007 06:34:54 -0000 1.1010 @@ -1,5 +1,9 @@ 2007-12-21 Brian Warner + * buildbot/scripts/startup.py (start): check to see if there's a + buildbot.tac before doing anything else. This improves the error + message when you do 'buildbot start' in the wrong directory. + * buildbot/scripts/logwatcher.py (LogWatcher.start): rewrite to spawn /usr/bin/tail to follow the target's twistd.log . It turns out that OS-X file EOF semantics are different, and the naive From warner at users.sourceforge.net Sat Dec 22 08:54:51 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sat, 22 Dec 2007 08:54:51 +0000 Subject: [Buildbot-commits] buildbot ChangeLog,1.1010,1.1011 Message-ID: Update of /cvsroot/buildbot/buildbot In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv21627 Modified Files: ChangeLog Log Message: [project @ commands: don't send more than 128kB per PB message, to avoid its hardwired string-size limit. Closes #129.] Original author: warner at lothar.com Date: 2007-12-22 08:53:57+00:00 Index: ChangeLog =================================================================== RCS file: /cvsroot/buildbot/buildbot/ChangeLog,v retrieving revision 1.1010 retrieving revision 1.1011 diff -u -d -r1.1010 -r1.1011 --- ChangeLog 22 Dec 2007 06:34:54 -0000 1.1010 +++ ChangeLog 22 Dec 2007 08:54:49 -0000 1.1011 @@ -1,3 +1,13 @@ +2007-12-22 Brian Warner + + * buildbot/slave/commands.py (ShellCommand._chunkForSend): don't + send more than 128kB of stdout/stderr/logfile text in a single PB + string, since PB has a hardwired limit of 640kB. This should fix + crashes that occur when the test process generates output very + very quickly. Patch by chops at demiurgestudios.com, thanks! I + haven't been able to reproduce this locally, but the potential bug + is clear. This should close #129. + 2007-12-21 Brian Warner * buildbot/scripts/startup.py (start): check to see if there's a From warner at users.sourceforge.net Sat Dec 22 08:54:51 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sat, 22 Dec 2007 08:54:51 +0000 Subject: [Buildbot-commits] buildbot/buildbot/slave commands.py,1.90,1.91 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/slave In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv21627/buildbot/slave Modified Files: commands.py Log Message: [project @ commands: don't send more than 128kB per PB message, to avoid its hardwired string-size limit. Closes #129.] Original author: warner at lothar.com Date: 2007-12-22 08:53:57+00:00 Index: commands.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/slave/commands.py,v retrieving revision 1.90 retrieving revision 1.91 diff -u -d -r1.90 -r1.91 --- commands.py 29 Nov 2007 10:05:51 -0000 1.90 +++ commands.py 22 Dec 2007 08:54:49 -0000 1.91 @@ -222,6 +222,7 @@ notreally = False BACKUP_TIMEOUT = 5 KILL = "KILL" + CHUNK_LIMIT = 128*1024 def __init__(self, builder, command, workdir, environ=None, @@ -413,9 +414,17 @@ w.start() + def _chunkForSend(self, data): + # limit the chunks that we send over PB to 128k, since it has a + # hardwired string-size limit of 640k. + LIMIT = self.CHUNK_LIMIT + for i in range(0, len(data), LIMIT): + yield data[i:i+LIMIT] + def addStdout(self, data): if self.sendStdout: - self.sendStatus({'stdout': data}) + for chunk in self._chunkForSend(data): + self.sendStatus({'stdout': chunk}) if self.keepStdout: self.stdout += data if self.timer: @@ -423,14 +432,16 @@ def addStderr(self, data): if self.sendStderr: - self.sendStatus({'stderr': data}) + for chunk in self._chunkForSend(data): + self.sendStatus({'stderr': chunk}) if self.keepStderr: self.stderr += data if self.timer: self.timer.reset(self.timeout) def addLogfile(self, name, data): - self.sendStatus({'log': (name, data)}) + for chunk in self._chunkForSend(data): + self.sendStatus({'log': (name, chunk)}) if self.timer: self.timer.reset(self.timeout) From warner at users.sourceforge.net Sun Dec 23 07:17:03 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sun, 23 Dec 2007 07:17:03 +0000 Subject: [Buildbot-commits] buildbot ChangeLog,1.1011,1.1012 Message-ID: Update of /cvsroot/buildbot/buildbot In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv4392 Modified Files: ChangeLog Log Message: [project @ make Compile and Test count warnings, by regexp. Closes #74.] Original author: warner at lothar.com Date: 2007-12-23 07:12:34+00:00 Index: ChangeLog =================================================================== RCS file: /cvsroot/buildbot/buildbot/ChangeLog,v retrieving revision 1.1011 retrieving revision 1.1012 diff -u -d -r1.1011 -r1.1012 --- ChangeLog 22 Dec 2007 08:54:49 -0000 1.1011 +++ ChangeLog 23 Dec 2007 07:16:59 -0000 1.1012 @@ -1,5 +1,17 @@ 2007-12-22 Brian Warner + * buildbot/steps/shell.py (WarningCountingShellCommand): utility + subclass which uses a regular expression to count warning messages + in the output. This also puts warning messages in a new 'warnings' + logfile, sets the 'warnings-count' build property with the total + count, and marks the step results as WARNINGS if there are any + warnings. Thanks to Roch Gadsdon (rochg) for the patch. Closes + #74. + (Compile): derive from WarningCountingShellCommand + (Test): same + * docs/buildbot.texinfo (Compile): document it + * buildbot/test/test_steps.py (Warnings): test it + * buildbot/slave/commands.py (ShellCommand._chunkForSend): don't send more than 128kB of stdout/stderr/logfile text in a single PB string, since PB has a hardwired limit of 640kB. This should fix From warner at users.sourceforge.net Sun Dec 23 07:17:03 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sun, 23 Dec 2007 07:17:03 +0000 Subject: [Buildbot-commits] buildbot/buildbot/test test_steps.py,1.45,1.46 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/test In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv4392/buildbot/test Modified Files: test_steps.py Log Message: [project @ make Compile and Test count warnings, by regexp. Closes #74.] Original author: warner at lothar.com Date: 2007-12-23 07:12:34+00:00 Index: test_steps.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/test/test_steps.py,v retrieving revision 1.45 retrieving revision 1.46 diff -u -d -r1.45 -r1.46 --- test_steps.py 15 Dec 2007 01:02:04 -0000 1.45 +++ test_steps.py 23 Dec 2007 07:17:01 -0000 1.46 @@ -24,7 +24,7 @@ from buildbot.buildslave import BuildSlave from buildbot.steps import shell, source, python from buildbot.status import builder -from buildbot.status.builder import SUCCESS, FAILURE +from buildbot.status.builder import SUCCESS, WARNINGS, FAILURE from buildbot.test.runutils import RunMixin, rmtree from buildbot.test.runutils import makeBuildStep, StepTester from buildbot.slave import commands, registry @@ -522,3 +522,100 @@ self.failUnless("import*=1" in desc) self.failIf("misc" in desc) + +class OrdinaryCompile(shell.Compile): + warningPattern = "ordinary line" + +class Warnings(StepTester, unittest.TestCase): + def testCompile1(self): + self.masterbase = "Warnings.testCompile1" + step = self.makeStep(shell.Compile) + output = \ +"""Compile started +normal line +warning: oh noes! +ordinary line +error (but we aren't looking for errors now, are we) +line 23: warning: we are now on line 23 +ending line +""" + log = step.addLog("stdio") + log.addStdout(output) + log.finish() + step.createSummary(log) + self.failUnlessEqual(step.getProperty("warnings-count"), 2) + logs = {} + for log in step.step_status.getLogs(): + logs[log.getName()] = log + self.failUnless("warnings" in logs) + lines = logs["warnings"].readlines() + self.failUnlessEqual(len(lines), 2) + self.failUnlessEqual(lines[0], "warning: oh noes!\n") + self.failUnlessEqual(lines[1], + "line 23: warning: we are now on line 23\n") + + cmd = buildstep.RemoteCommand(None, {}) + cmd.rc = 0 + results = step.evaluateCommand(cmd) + self.failUnlessEqual(results, WARNINGS) + + def testCompile2(self): + self.masterbase = "Warnings.testCompile2" + step = self.makeStep(shell.Compile, warningPattern="ordinary line") + output = \ +"""Compile started +normal line +warning: oh noes! +ordinary line +error (but we aren't looking for errors now, are we) +line 23: warning: we are now on line 23 +ending line +""" + log = step.addLog("stdio") + log.addStdout(output) + log.finish() + step.createSummary(log) + self.failUnlessEqual(step.getProperty("warnings-count"), 1) + logs = {} + for log in step.step_status.getLogs(): + logs[log.getName()] = log + self.failUnless("warnings" in logs) + lines = logs["warnings"].readlines() + self.failUnlessEqual(len(lines), 1) + self.failUnlessEqual(lines[0], "ordinary line\n") + + cmd = buildstep.RemoteCommand(None, {}) + cmd.rc = 0 + results = step.evaluateCommand(cmd) + self.failUnlessEqual(results, WARNINGS) + + def testCompile3(self): + self.masterbase = "Warnings.testCompile3" + step = self.makeStep(OrdinaryCompile) + output = \ +"""Compile started +normal line +warning: oh noes! +ordinary line +error (but we aren't looking for errors now, are we) +line 23: warning: we are now on line 23 +ending line +""" + step.setProperty("warnings-count", 10) + log = step.addLog("stdio") + log.addStdout(output) + log.finish() + step.createSummary(log) + self.failUnlessEqual(step.getProperty("warnings-count"), 11) + logs = {} + for log in step.step_status.getLogs(): + logs[log.getName()] = log + self.failUnless("warnings" in logs) + lines = logs["warnings"].readlines() + self.failUnlessEqual(len(lines), 1) + self.failUnlessEqual(lines[0], "ordinary line\n") + + cmd = buildstep.RemoteCommand(None, {}) + cmd.rc = 0 + results = step.evaluateCommand(cmd) + self.failUnlessEqual(results, WARNINGS) From warner at users.sourceforge.net Sun Dec 23 07:17:04 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sun, 23 Dec 2007 07:17:04 +0000 Subject: [Buildbot-commits] buildbot/docs buildbot.texinfo,1.129,1.130 Message-ID: Update of /cvsroot/buildbot/buildbot/docs In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv4392/docs Modified Files: buildbot.texinfo Log Message: [project @ make Compile and Test count warnings, by regexp. Closes #74.] Original author: warner at lothar.com Date: 2007-12-23 07:12:34+00:00 Index: buildbot.texinfo =================================================================== RCS file: /cvsroot/buildbot/buildbot/docs/buildbot.texinfo,v retrieving revision 1.129 retrieving revision 1.130 diff -u -d -r1.129 -r1.130 --- buildbot.texinfo 8 Dec 2007 20:25:11 -0000 1.129 +++ buildbot.texinfo 23 Dec 2007 07:17:01 -0000 1.130 @@ -4389,11 +4389,35 @@ @bsindex buildbot.steps.shell.Compile -This is meant to handle compiling or building a project written in C. The -default command is @code{make all}. When the compile is finished, the -log file is scanned for GCC error/warning messages and a summary log is -created with any problems that were seen (TODO: the summary is not yet -created). +This is meant to handle compiling or building a project written in C. +The default command is @code{make all}. When the compile is finished, +the log file is scanned for GCC warning messages, a summary log is +created with any problems that were seen, and the step is marked as +WARNINGS if any were discovered. The number of warnings is stored in a +Build Property named ``warnings-count'', which is accumulated over all +Compile steps (so if two warnings are found in one step, and three are +found in another step, the overall build will have a +``warnings-count'' property of 5. + +The default regular expression used to detect a warning is + at code{'.*warning[: ].*'} , which is fairly liberal and may cause +false-positives. To use a different regexp, provide a + at code{warningPattern=} argument, or use a subclass which sets the + at code{warningPattern} attribute: + + at example +f.addStep(Compile(command=["make", "test"], + warningPattern="^Warning: ")) + at end example + +The @code{warningPattern=} can also be a pre-compiled python regexp +object: this makes it possible to add flags like @code{re.I} (to use +case-insensitive matching). + +(TODO: this step needs to be extended to look for GCC error messages +as well, and collect them into a separate logfile, along with the +source code filenames involved). + @node Test, Build Properties, Compile, Simple ShellCommand Subclasses @subsubsection Test From warner at users.sourceforge.net Sun Dec 23 07:17:03 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sun, 23 Dec 2007 07:17:03 +0000 Subject: [Buildbot-commits] buildbot/buildbot/steps shell.py,1.7,1.8 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/steps In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv4392/buildbot/steps Modified Files: shell.py Log Message: [project @ make Compile and Test count warnings, by regexp. Closes #74.] Original author: warner at lothar.com Date: 2007-12-23 07:12:34+00:00 Index: shell.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/steps/shell.py,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- shell.py 15 Dec 2007 01:02:04 -0000 1.7 +++ shell.py 23 Dec 2007 07:17:01 -0000 1.8 @@ -262,7 +262,70 @@ descriptionDone = ["configure"] command = ["./configure"] -class Compile(ShellCommand): +class WarningCountingShellCommand(ShellCommand): + warnCount = 0 + warningPattern = '.*warning[: ].*' + + def __init__(self, **kwargs): + # See if we've been given a regular expression to use to match + # warnings. If not, use a default that assumes any line with "warning" + # present is a warning. This may lead to false positives in some cases. + wp = None + if kwargs.has_key('warningPattern'): + wp = kwargs['warningPattern'] + del kwargs['warningPattern'] + self.warningPattern = wp + + # And upcall to let the base class do its work + ShellCommand.__init__(self, **kwargs) + + if wp: + self.addFactoryArguments(warningPattern=wp) + + def createSummary(self, log): + self.warnCount = 0 + + # Now compile a regular expression from whichever warning pattern we're + # using + if not self.warningPattern: + return + + wre = self.warningPattern + if isinstance(wre, str): + wre = re.compile(wre) + + # Check if each line in the output from this command matched our + # warnings regular expressions. If did, bump the warnings count and + # add the line to the collection of lines with warnings + warnings = [] + # TODO: use log.readlines(), except we need to decide about stdout vs + # stderr + for line in log.getText().split("\n"): + if wre.match(line): + warnings.append(line) + self.warnCount += 1 + + # If there were any warnings, make the log if lines with warnings + # available + if self.warnCount: + self.addCompleteLog("warnings", "\n".join(warnings) + "\n") + + try: + old_count = self.getProperty("warnings-count") + except KeyError: + old_count = 0 + self.setProperty("warnings-count", old_count + self.warnCount) + + + def evaluateCommand(self, cmd): + if cmd.rc != 0: + return FAILURE + if self.warnCount: + return WARNINGS + return SUCCESS + + +class Compile(WarningCountingShellCommand): name = "compile" haltOnFailure = 1 @@ -275,11 +338,12 @@ # traversed (assuming 'make' is being used) def createSummary(self, cmd): - # TODO: grep for the characteristic GCC warning/error lines and + # TODO: grep for the characteristic GCC error lines and # assemble them into a pair of buffers + WarningCountingShellCommand.createSummary(self, cmd) pass -class Test(ShellCommand): +class Test(WarningCountingShellCommand): name = "test" warnOnFailure = 1 From warner at users.sourceforge.net Sun Dec 23 08:35:34 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sun, 23 Dec 2007 08:35:34 +0000 Subject: [Buildbot-commits] buildbot/docs buildbot.texinfo,1.130,1.131 Message-ID: Update of /cvsroot/buildbot/buildbot/docs In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv2652/docs Modified Files: buildbot.texinfo Log Message: [project @ make TreeSize actually work. Closes #47.] Original author: warner at lothar.com Date: 2007-12-23 08:34:26+00:00 Index: buildbot.texinfo =================================================================== RCS file: /cvsroot/buildbot/buildbot/docs/buildbot.texinfo,v retrieving revision 1.130 retrieving revision 1.131 diff -u -d -r1.130 -r1.131 --- buildbot.texinfo 23 Dec 2007 07:17:01 -0000 1.130 +++ buildbot.texinfo 23 Dec 2007 08:35:32 -0000 1.131 @@ -203,6 +203,7 @@ * Configure:: * Compile:: * Test:: +* TreeSize:: * Build Properties:: Python BuildSteps @@ -4371,6 +4372,7 @@ * Configure:: * Compile:: * Test:: +* TreeSize:: * Build Properties:: @end menu @@ -4419,7 +4421,7 @@ source code filenames involved). - at node Test, Build Properties, Compile, Simple ShellCommand Subclasses + at node Test, TreeSize, Compile, Simple ShellCommand Subclasses @subsubsection Test @bsindex buildbot.steps.shell.Test @@ -4427,9 +4429,18 @@ This is meant to handle unit tests. The default command is @code{make test}, and the @code{warnOnFailure} flag is set. + at node TreeSize, Build Properties, Test, Simple ShellCommand Subclasses + at subsubsection TreeSize + at bsindex buildbot.steps.shell.TreeSize - at node Build Properties, , Test, Simple ShellCommand Subclasses +This is a simple command that uses the 'du' tool to measure the size +of the code tree. It puts the size (as a count of 1024-byte blocks, +aka 'KiB' or 'kibibytes') on the step's status text, and sets a build +property named 'tree-size-KiB' with the same value. + + + at node Build Properties, , TreeSize, Simple ShellCommand Subclasses @subsubsection Build Properties @cindex build properties From warner at users.sourceforge.net Sun Dec 23 08:35:33 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sun, 23 Dec 2007 08:35:33 +0000 Subject: [Buildbot-commits] buildbot/buildbot/steps shell.py,1.8,1.9 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/steps In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv2652/buildbot/steps Modified Files: shell.py Log Message: [project @ make TreeSize actually work. Closes #47.] Original author: warner at lothar.com Date: 2007-12-23 08:34:26+00:00 Index: shell.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/steps/shell.py,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- shell.py 23 Dec 2007 07:17:01 -0000 1.8 +++ shell.py 23 Dec 2007 08:35:31 -0000 1.9 @@ -233,25 +233,26 @@ class TreeSize(ShellCommand): name = "treesize" - command = ["du", "-s", "."] - kb = None + command = ["du", "-s", "-k", "."] + kib = None def commandComplete(self, cmd): - out = cmd.log.getText() + out = cmd.logs['stdio'].getText() m = re.search(r'^(\d+)', out) if m: - self.kb = int(m.group(1)) + self.kib = int(m.group(1)) + self.setProperty("tree-size-KiB", self.kib) def evaluateCommand(self, cmd): if cmd.rc != 0: return FAILURE - if self.kb is None: + if self.kib is None: return WARNINGS # not sure how 'du' could fail, but whatever return SUCCESS def getText(self, cmd, results): - if self.kb is not None: - return ["treesize", "%d kb" % self.kb] + if self.kib is not None: + return ["treesize", "%d KiB" % self.kib] return ["treesize", "unknown"] class Configure(ShellCommand): From warner at users.sourceforge.net Sun Dec 23 08:35:34 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sun, 23 Dec 2007 08:35:34 +0000 Subject: [Buildbot-commits] buildbot/buildbot/test test_steps.py,1.46,1.47 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/test In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv2652/buildbot/test Modified Files: test_steps.py Log Message: [project @ make TreeSize actually work. Closes #47.] Original author: warner at lothar.com Date: 2007-12-23 08:34:26+00:00 Index: test_steps.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/test/test_steps.py,v retrieving revision 1.46 retrieving revision 1.47 diff -u -d -r1.46 -r1.47 --- test_steps.py 23 Dec 2007 07:17:01 -0000 1.46 +++ test_steps.py 23 Dec 2007 08:35:31 -0000 1.47 @@ -619,3 +619,23 @@ cmd.rc = 0 results = step.evaluateCommand(cmd) self.failUnlessEqual(results, WARNINGS) + + +class TreeSize(StepTester, unittest.TestCase): + def testTreeSize(self): + self.slavebase = "TreeSize.testTreeSize.slave" + self.masterbase = "TreeSize.testTreeSize.master" + + sb = self.makeSlaveBuilder() + step = self.makeStep(shell.TreeSize) + d = self.runStep(step) + def _check(results): + self.failUnlessEqual(results, SUCCESS) + kib = step.getProperty("tree-size-KiB") + self.failUnless(isinstance(kib, int)) + self.failUnless(kib < 100) # should be empty, I get '4' + s = step.step_status + self.failUnlessEqual(" ".join(s.getText()), + "treesize %d KiB" % kib) + d.addCallback(_check) + return d From warner at users.sourceforge.net Sun Dec 23 08:35:33 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sun, 23 Dec 2007 08:35:33 +0000 Subject: [Buildbot-commits] buildbot ChangeLog,1.1012,1.1013 Message-ID: Update of /cvsroot/buildbot/buildbot In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv2652 Modified Files: ChangeLog Log Message: [project @ make TreeSize actually work. Closes #47.] Original author: warner at lothar.com Date: 2007-12-23 08:34:26+00:00 Index: ChangeLog =================================================================== RCS file: /cvsroot/buildbot/buildbot/ChangeLog,v retrieving revision 1.1012 retrieving revision 1.1013 diff -u -d -r1.1012 -r1.1013 --- ChangeLog 23 Dec 2007 07:16:59 -0000 1.1012 +++ ChangeLog 23 Dec 2007 08:35:31 -0000 1.1013 @@ -1,5 +1,13 @@ 2007-12-22 Brian Warner + * buildbot/steps/shell.py (TreeSize): This never worked properly. + Fix it. Also, stash the tree size in a build property named + 'tree-size-kb'. Note that this records size in KiB (1024 bytes), + not KB (1000 bytes), because that's what du will give us. This + closes #47. + * docs/buildbot.texinfo (TreeSize): document it + * buildbot/test/test_steps.py (TreeSize.testTreeSize): test it + * buildbot/steps/shell.py (WarningCountingShellCommand): utility subclass which uses a regular expression to count warning messages in the output. This also puts warning messages in a new 'warnings'