From warner at users.sourceforge.net Mon Jul 2 09:23:12 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Mon, 02 Jul 2007 09:23:12 +0000 Subject: [Buildbot-commits] buildbot/contrib hg_buildbot.py,1.1,1.2 Message-ID: Update of /cvsroot/buildbot/buildbot/contrib In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv7972/contrib Modified Files: hg_buildbot.py Log Message: [project @ hg_buildbot.py: patch from Frederic Leroy to make it work better] Original author: warner at lothar.com Date: 2007-07-02 09:22:27+00:00 Index: hg_buildbot.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/contrib/hg_buildbot.py,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- hg_buildbot.py 21 May 2006 19:07:27 -0000 1.1 +++ hg_buildbot.py 2 Jul 2007 09:23:10 -0000 1.2 @@ -22,25 +22,14 @@ # TODO: consider doing 'import mercurial.hg' and extract this information # using the native python -out = commands.getoutput("hg -v log -r %s" % CHANGESET_ID) -# TODO: or maybe use --template instead of trying hard to parse everything -#out = commands.getoutput("hg --template SOMETHING log -r %s" % CHANGESET_ID) +out = commands.getoutput("hg log -r %s --template '{author}\n{files}\n{desc}'" % CHANGESET_ID) s = StringIO(out) -while True: - line = s.readline() - if not line: - break - if line.startswith("user:"): - user = line[line.find(":")+1:].strip() - elif line.startswith("files:"): - files = line[line.find(":")+1:].strip().split() - elif line.startswith("description:"): - comments = "".join(s.readlines()) - if comments[-1] == "\n": - # this removes the additional newline that hg emits - comments = comments[:-1] - break +user = s.readline().strip() +# NOTE: this fail when filenames contain spaces. I cannot find a way to get +# hg to use some other filename separator. +files = s.readline().strip().split() +comments = "".join(s.readlines()) change = { 'master': MASTER, @@ -53,5 +42,5 @@ 'files': files, } -runner.sendchange(c, True) +runner.sendchange(change, True) From warner at users.sourceforge.net Mon Jul 2 09:23:12 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Mon, 02 Jul 2007 09:23:12 +0000 Subject: [Buildbot-commits] buildbot ChangeLog,1.857,1.858 Message-ID: Update of /cvsroot/buildbot/buildbot In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv7972 Modified Files: ChangeLog Log Message: [project @ hg_buildbot.py: patch from Frederic Leroy to make it work better] Original author: warner at lothar.com Date: 2007-07-02 09:22:27+00:00 Index: ChangeLog =================================================================== RCS file: /cvsroot/buildbot/buildbot/ChangeLog,v retrieving revision 1.857 retrieving revision 1.858 diff -u -d -r1.857 -r1.858 --- ChangeLog 18 Jun 2007 03:58:22 -0000 1.857 +++ ChangeLog 2 Jul 2007 09:23:07 -0000 1.858 @@ -1,3 +1,8 @@ +2007-07-02 Brian Warner + + * contrib/hg_buildbot.py: patch from Frederic Leroy to make this + work better. + 2007-06-17 Brian Warner * buildbot/test/test_config.py (Factories.testAllSteps): make sure From warner at users.sourceforge.net Mon Jul 2 17:44:51 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Mon, 02 Jul 2007 17:44:51 +0000 Subject: [Buildbot-commits] buildbot/buildbot/slave bot.py,1.25,1.26 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/slave In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv26865/buildbot/slave Modified Files: bot.py Log Message: [project @ in the buildslave .tac file, rename 'host' to 'buildmaster_host'] Original author: warner at lothar.com Date: 2007-07-02 17:37:12+00:00 Index: bot.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/slave/bot.py,v retrieving revision 1.25 retrieving revision 1.26 diff -u -d -r1.25 -r1.26 --- bot.py 12 Dec 2006 03:24:03 -0000 1.25 +++ bot.py 2 Jul 2007 17:44:48 -0000 1.26 @@ -463,8 +463,9 @@ # debugOpts['failPingOnce'] can be set to True to make the slaveping fail # exactly once. - def __init__(self, host, port, name, passwd, basedir, keepalive, - usePTY, keepaliveTimeout=30, umask=None, debugOpts={}): + def __init__(self, buildmaster_host, port, name, passwd, basedir, + keepalive, usePTY, keepaliveTimeout=30, umask=None, + debugOpts={}): log.msg("Creating BuildSlave") service.MultiService.__init__(self) self.debugOpts = debugOpts.copy() @@ -476,7 +477,7 @@ self.umask = umask bf = self.bf = BotFactory(keepalive, keepaliveTimeout) bf.startLogin(credentials.UsernamePassword(name, passwd), client=bot) - self.connection = c = internet.TCPClient(host, port, bf) + self.connection = c = internet.TCPClient(buildmaster_host, port, bf) c.setServiceParent(self) def waitUntilDisconnected(self): From warner at users.sourceforge.net Mon Jul 2 17:44:52 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Mon, 02 Jul 2007 17:44:52 +0000 Subject: [Buildbot-commits] buildbot/buildbot/test test_runner.py, 1.13, 1.14 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/test In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv26865/buildbot/test Modified Files: test_runner.py Log Message: [project @ in the buildslave .tac file, rename 'host' to 'buildmaster_host'] Original author: warner at lothar.com Date: 2007-07-02 17:37:12+00:00 Index: test_runner.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/test/test_runner.py,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- test_runner.py 6 Sep 2006 00:41:55 -0000 1.13 +++ test_runner.py 2 Jul 2007 17:44:49 -0000 1.14 @@ -163,12 +163,13 @@ self.failUnless(os.path.exists(tac)) tacfile = open(tac,"rt").read() self.failUnlessIn("basedir", tacfile) - self.failUnlessIn("host = 'buildmaster'", tacfile) + self.failUnlessIn("buildmaster_host = 'buildmaster'", tacfile) self.failUnlessIn("port = 1234", tacfile) self.failUnlessIn("slavename = 'botname'", tacfile) self.failUnlessIn("passwd = 'passwd'", tacfile) self.failUnlessIn("keepalive = 600", tacfile) - self.failUnlessIn("BuildSlave(host, port, slavename", tacfile) + self.failUnlessIn("BuildSlave(buildmaster_host, port, slavename", + tacfile) makefile = os.path.join(basedir, "Makefile.sample") self.failUnlessExists(makefile) @@ -211,12 +212,13 @@ self.failUnlessExists(os.path.join(basedir, "buildbot.tac.new")) tacfile = open(os.path.join(basedir, "buildbot.tac.new"),"rt").read() self.failUnlessIn("basedir", tacfile) - self.failUnlessIn("host = 'buildmaster'", tacfile) + self.failUnlessIn("buildmaster_host = 'buildmaster'", tacfile) self.failUnlessIn("port = 9999", tacfile) self.failUnlessIn("slavename = 'newbotname'", tacfile) self.failUnlessIn("passwd = 'passwd'", tacfile) self.failUnlessIn("keepalive = 30", tacfile) - self.failUnlessIn("BuildSlave(host, port, slavename", tacfile) + self.failUnlessIn("BuildSlave(buildmaster_host, port, slavename", + tacfile) make = open(os.path.join(basedir, "Makefile.sample"), "rt").read() self.failUnlessEqual(make, oldmake, "*should* rewrite Makefile.sample") From warner at users.sourceforge.net Mon Jul 2 17:44:50 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Mon, 02 Jul 2007 17:44:50 +0000 Subject: [Buildbot-commits] buildbot/buildbot/scripts runner.py,1.51,1.52 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/scripts In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv26865/buildbot/scripts Modified Files: runner.py Log Message: [project @ in the buildslave .tac file, rename 'host' to 'buildmaster_host'] Original author: warner at lothar.com Date: 2007-07-02 17:37:12+00:00 Index: runner.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/scripts/runner.py,v retrieving revision 1.51 retrieving revision 1.52 diff -u -d -r1.51 -r1.52 --- runner.py 6 Feb 2007 20:36:09 -0000 1.51 +++ runner.py 2 Jul 2007 17:44:48 -0000 1.52 @@ -252,7 +252,7 @@ from buildbot.slave.bot import BuildSlave basedir = r'%(basedir)s' -host = '%(host)s' +buildmaster_host = '%(host)s' port = %(port)d slavename = '%(name)s' passwd = '%(passwd)s' @@ -261,8 +261,8 @@ umask = %(umask)s application = service.Application('buildslave') -s = BuildSlave(host, port, slavename, passwd, basedir, keepalive, usepty, - umask=umask) +s = BuildSlave(buildmaster_host, port, slavename, passwd, basedir, + keepalive, usepty, umask=umask) s.setServiceParent(application) """ From warner at users.sourceforge.net Mon Jul 2 17:44:50 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Mon, 02 Jul 2007 17:44:50 +0000 Subject: [Buildbot-commits] buildbot ChangeLog,1.858,1.859 Message-ID: Update of /cvsroot/buildbot/buildbot In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv26865 Modified Files: ChangeLog Log Message: [project @ in the buildslave .tac file, rename 'host' to 'buildmaster_host'] Original author: warner at lothar.com Date: 2007-07-02 17:37:12+00:00 Index: ChangeLog =================================================================== RCS file: /cvsroot/buildbot/buildbot/ChangeLog,v retrieving revision 1.858 retrieving revision 1.859 diff -u -d -r1.858 -r1.859 --- ChangeLog 2 Jul 2007 09:23:07 -0000 1.858 +++ ChangeLog 2 Jul 2007 17:44:47 -0000 1.859 @@ -1,5 +1,12 @@ 2007-07-02 Brian Warner + * buildbot/slave/bot.py (BuildSlave.__init__): rename the 'host' + argument to 'buildmaster_host', to make it more obvious that this + points to the buildmaster. Thanks to Bob Proulx for the + suggestion. + * buildbot/scripts/runner.py (slaveTAC): same + * buildbot/test/test_runner.py (Create.testSlave): match the change + * contrib/hg_buildbot.py: patch from Frederic Leroy to make this work better. From warner at users.sourceforge.net Mon Jul 2 17:50:19 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Mon, 02 Jul 2007 17:50:19 +0000 Subject: [Buildbot-commits] buildbot ChangeLog,1.859,1.860 Message-ID: Update of /cvsroot/buildbot/buildbot In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv29340 Modified Files: ChangeLog Log Message: [project @ choose slaves randomly rather than always picking the first one, closes #36] Original author: warner at lothar.com Date: 2007-07-02 17:49:12+00:00 Index: ChangeLog =================================================================== RCS file: /cvsroot/buildbot/buildbot/ChangeLog,v retrieving revision 1.859 retrieving revision 1.860 diff -u -d -r1.859 -r1.860 --- ChangeLog 2 Jul 2007 17:44:47 -0000 1.859 +++ ChangeLog 2 Jul 2007 17:50:16 -0000 1.860 @@ -1,5 +1,14 @@ 2007-07-02 Brian Warner + * buildbot/process/builder.py (Builder.maybeStartBuild): choose + the slave randomly rather than always taking the first one. Thanks + to Pike for the patch. Closes #36. + * buildbot/test/test_slaves.py: match the change. to avoid huge + changes to the tests, I added a CHOOSE_SLAVES_RANDOMLY flag which + enables/disables the round-robin-ness (enabled by default), and + some unit tests disable it. + * docs/buildbot.texinfo (Buildmaster Architecture): document it + * buildbot/slave/bot.py (BuildSlave.__init__): rename the 'host' argument to 'buildmaster_host', to make it more obvious that this points to the buildmaster. Thanks to Bob Proulx for the From warner at users.sourceforge.net Mon Jul 2 17:50:19 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Mon, 02 Jul 2007 17:50:19 +0000 Subject: [Buildbot-commits] buildbot/buildbot/process builder.py,1.43,1.44 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/process In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv29340/buildbot/process Modified Files: builder.py Log Message: [project @ choose slaves randomly rather than always picking the first one, closes #36] Original author: warner at lothar.com Date: 2007-07-02 17:49:12+00:00 Index: builder.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/process/builder.py,v retrieving revision 1.43 retrieving revision 1.44 diff -u -d -r1.43 -r1.44 --- builder.py 23 Jan 2007 08:01:45 -0000 1.43 +++ builder.py 2 Jul 2007 17:50:17 -0000 1.44 @@ -1,5 +1,5 @@ -#! /usr/bin/python +import random from zope.interface import implements from twisted.python import log, components from twisted.spread import pb @@ -224,6 +224,7 @@ expectations = None # this is created the first time we get a good build START_BUILD_TIMEOUT = 10 + CHOOSE_SLAVES_RANDOMLY = True # disabled for determinism during tests def __init__(self, setup, builder_status): """ @@ -502,15 +503,18 @@ if not self.buildable: self.updateBigStatus() return # nothing to do - # find the first idle slave - for sb in self.slaves: - if sb.isAvailable(): - break - else: + + # pick an idle slave + available_slaves = [sb for sb in self.slaves if sb.isAvailable()] + if not available_slaves: log.msg("%s: want to start build, but we don't have a remote" % self) self.updateBigStatus() return + if self.CHOOSE_SLAVES_RANDOMLY: + sb = random.choice(available_slaves) + else: + sb = available_slaves[0] # there is something to build, and there is a slave on which to build # it. Grab the oldest request, see if we can merge it with anything From warner at users.sourceforge.net Mon Jul 2 17:50:19 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Mon, 02 Jul 2007 17:50:19 +0000 Subject: [Buildbot-commits] buildbot/buildbot/test test_slaves.py,1.6,1.7 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/test In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv29340/buildbot/test Modified Files: test_slaves.py Log Message: [project @ choose slaves randomly rather than always picking the first one, closes #36] Original author: warner at lothar.com Date: 2007-07-02 17:49:12+00:00 Index: test_slaves.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/test/test_slaves.py,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- test_slaves.py 11 Dec 2006 08:23:29 -0000 1.6 +++ test_slaves.py 2 Jul 2007 17:50:17 -0000 1.7 @@ -68,6 +68,7 @@ # rotate or attempt any sort of load-balancing, two builds in # sequence should both use the first slave. This may change later if # we move to a more sophisticated scheme. + b.CHOOSE_SLAVES_RANDOMLY = False d = self.doBuild("b1") d.addCallback(self._testSequence_1) @@ -91,12 +92,16 @@ return d1 def _testSimultaneous_1(self, res, d2): self.failUnlessEqual(res.getResults(), SUCCESS) - self.failUnlessEqual(res.getSlavename(), "bot1") - d2.addCallback(self._testSimultaneous_2) + b1_slavename = res.getSlavename() + d2.addCallback(self._testSimultaneous_2, b1_slavename) return d2 - def _testSimultaneous_2(self, res): + def _testSimultaneous_2(self, res, b1_slavename): self.failUnlessEqual(res.getResults(), SUCCESS) - self.failUnlessEqual(res.getSlavename(), "bot2") + b2_slavename = res.getSlavename() + # make sure the two builds were run by different slaves + slavenames = [b1_slavename, b2_slavename] + slavenames.sort() + self.failUnlessEqual(slavenames, ["bot1", "bot2"]) def testFallback1(self): # detach the first slave, verify that a build is run using the second @@ -125,6 +130,8 @@ # reduce the ping time so we'll failover faster self.master.botmaster.builders["b1"].START_BUILD_TIMEOUT = 1 + assert self.master.botmaster.builders["b1"].CHOOSE_SLAVES_RANDOMLY + self.master.botmaster.builders["b1"].CHOOSE_SLAVES_RANDOMLY = False self.disappearSlave("bot1", "b1") d = self.doBuild("b1") d.addCallback(self._testFallback2_1) @@ -133,7 +140,9 @@ self.failUnlessEqual(res.getResults(), SUCCESS) self.failUnlessEqual(res.getSlavename(), "bot2") b1slaves = self.master.botmaster.builders["b1"].slaves - self.failUnlessEqual(len(b1slaves), 1) + # TODO: this check fails sometimes, sometimes len(b1slaves)==2, + # sometimes it is empty + self.failUnlessEqual(len(b1slaves), 1, b1slaves) self.failUnlessEqual(b1slaves[0].slave.slavename, "bot2") @@ -152,6 +161,7 @@ self.slaves['bot1'].debugOpts["stallPings"] = (10, timers) br = BuildRequest("forced", SourceStamp()) d1 = br.waitUntilFinished() + self.master.botmaster.builders["b1"].CHOOSE_SLAVES_RANDOMLY = False self.control.getBuilder("b1").requestBuild(br) s1 = br.status # this is a BuildRequestStatus # give it a chance to start pinging From warner at users.sourceforge.net Mon Jul 2 17:50:19 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Mon, 02 Jul 2007 17:50:19 +0000 Subject: [Buildbot-commits] buildbot/docs buildbot.texinfo,1.99,1.100 Message-ID: Update of /cvsroot/buildbot/buildbot/docs In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv29340/docs Modified Files: buildbot.texinfo Log Message: [project @ choose slaves randomly rather than always picking the first one, closes #36] Original author: warner at lothar.com Date: 2007-07-02 17:49:12+00:00 Index: buildbot.texinfo =================================================================== RCS file: /cvsroot/buildbot/buildbot/docs/buildbot.texinfo,v retrieving revision 1.99 retrieving revision 1.100 diff -u -d -r1.99 -r1.100 --- buildbot.texinfo 18 Jun 2007 02:52:49 -0000 1.99 +++ buildbot.texinfo 2 Jul 2007 17:50:17 -0000 1.100 @@ -478,8 +478,8 @@ may be multiple requests to build the current HEAD revision). These requests are merged into a single Build instance, which includes the SourceStamp that describes what exact version of the source code -should be used for the build. The Build is then assigned to a -SlaveBuilder and the build begins. +should be used for the build. The Build is then randomly assigned to a +free SlaveBuilder and the build begins. @node Status Delivery Architecture, , Buildmaster Architecture, System Architecture From warner at users.sourceforge.net Tue Jul 3 02:22:21 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Tue, 03 Jul 2007 02:22:21 +0000 Subject: [Buildbot-commits] buildbot/buildbot/test runutils.py, 1.19, 1.20 test_slaves.py, 1.7, 1.8 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/test In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv30105/buildbot/test Modified Files: runutils.py test_slaves.py Log Message: [project @ test_slaves.py: fix an intermittent failure, disappeared slaves were reconnecting] Original author: warner at lothar.com Date: 2007-07-03 02:21:43+00:00 Index: runutils.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/test/runutils.py,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- runutils.py 18 Jun 2007 02:52:49 -0000 1.19 +++ runutils.py 3 Jul 2007 02:22:19 -0000 1.20 @@ -206,6 +206,9 @@ broker = bot.builders[buildername].remote.broker broker.dataReceived = discard # seal its ears broker.transport.write = discard # and take away its voice + # also discourage it from reconnecting once the connection goes away + assert self.slaves[slavename].bf.continueTrying + self.slaves[slavename].bf.continueTrying = False def ghostSlave(self): # the slave thinks it has lost the connection, and initiated a Index: test_slaves.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/test/test_slaves.py,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- test_slaves.py 2 Jul 2007 17:50:17 -0000 1.7 +++ test_slaves.py 3 Jul 2007 02:22:19 -0000 1.8 @@ -128,10 +128,11 @@ # claimed for the build, and that the failing one is removed from the # list. + b1 = self.master.botmaster.builders["b1"] # reduce the ping time so we'll failover faster - self.master.botmaster.builders["b1"].START_BUILD_TIMEOUT = 1 - assert self.master.botmaster.builders["b1"].CHOOSE_SLAVES_RANDOMLY - self.master.botmaster.builders["b1"].CHOOSE_SLAVES_RANDOMLY = False + b1.START_BUILD_TIMEOUT = 1 + assert b1.CHOOSE_SLAVES_RANDOMLY + b1.CHOOSE_SLAVES_RANDOMLY = False self.disappearSlave("bot1", "b1") d = self.doBuild("b1") d.addCallback(self._testFallback2_1) @@ -140,9 +141,7 @@ self.failUnlessEqual(res.getResults(), SUCCESS) self.failUnlessEqual(res.getSlavename(), "bot2") b1slaves = self.master.botmaster.builders["b1"].slaves - # TODO: this check fails sometimes, sometimes len(b1slaves)==2, - # sometimes it is empty - self.failUnlessEqual(len(b1slaves), 1, b1slaves) + self.failUnlessEqual(len(b1slaves), 1, "whoops: %s" % (b1slaves,)) self.failUnlessEqual(b1slaves[0].slave.slavename, "bot2") From warner at users.sourceforge.net Tue Jul 3 02:22:21 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Tue, 03 Jul 2007 02:22:21 +0000 Subject: [Buildbot-commits] buildbot ChangeLog,1.860,1.861 Message-ID: Update of /cvsroot/buildbot/buildbot In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv30105 Modified Files: ChangeLog Log Message: [project @ test_slaves.py: fix an intermittent failure, disappeared slaves were reconnecting] Original author: warner at lothar.com Date: 2007-07-03 02:21:43+00:00 Index: ChangeLog =================================================================== RCS file: /cvsroot/buildbot/buildbot/ChangeLog,v retrieving revision 1.860 retrieving revision 1.861 diff -u -d -r1.860 -r1.861 --- ChangeLog 2 Jul 2007 17:50:16 -0000 1.860 +++ ChangeLog 3 Jul 2007 02:22:18 -0000 1.861 @@ -1,5 +1,16 @@ 2007-07-02 Brian Warner + * buildbot/test/runutils.py (RunMixin.disappearSlave): once a + slave has been disappeared, don't let it reconnect. This was + causing an intermittent failure in test_slaves.py, when the slave + that was supposed to be gone managed to come back by the end of + the test and affect the count. + * buildbot/test/test_slaves.py (Slave.testFallback2): minor + refactorings + * buildbot/process/builder.py (SlaveBuilder.__repr__): added some + diagnostic messages to track down this problem + (Builder.startBuild): same + * buildbot/process/builder.py (Builder.maybeStartBuild): choose the slave randomly rather than always taking the first one. Thanks to Pike for the patch. Closes #36. From warner at users.sourceforge.net Tue Jul 3 02:22:21 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Tue, 03 Jul 2007 02:22:21 +0000 Subject: [Buildbot-commits] buildbot/buildbot/process builder.py,1.44,1.45 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/process In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv30105/buildbot/process Modified Files: builder.py Log Message: [project @ test_slaves.py: fix an intermittent failure, disappeared slaves were reconnecting] Original author: warner at lothar.com Date: 2007-07-03 02:21:43+00:00 Index: builder.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/process/builder.py,v retrieving revision 1.44 retrieving revision 1.45 diff -u -d -r1.44 -r1.45 --- builder.py 2 Jul 2007 17:50:17 -0000 1.44 +++ builder.py 3 Jul 2007 02:22:19 -0000 1.45 @@ -26,6 +26,17 @@ self.ping_watchers = [] self.state = ATTACHING self.remote = None + self.slave = None + self.builder_name = None + + def __repr__(self): + r = " Update of /cvsroot/buildbot/buildbot/buildbot/test In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv11483/buildbot/test Modified Files: runutils.py test_run.py test_slaves.py Log Message: [project @ RunMixin.disappearSlave: allow callers to control the allowReconnect behavior] Original author: warner at lothar.com Date: 2007-07-03 17:24:36+00:00 Index: runutils.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/test/runutils.py,v retrieving revision 1.20 retrieving revision 1.21 diff -u -d -r1.20 -r1.21 --- runutils.py 3 Jul 2007 02:22:19 -0000 1.20 +++ runutils.py 3 Jul 2007 17:25:08 -0000 1.21 @@ -193,7 +193,8 @@ broker.transport.loseConnection() del self.slaves['bot1'] - def disappearSlave(self, slavename="bot1", buildername="dummy"): + def disappearSlave(self, slavename="bot1", buildername="dummy", + allowReconnect=False): # the slave's host has vanished off the net, leaving the connection # dangling. This will be detected quickly by app-level keepalives or # a ping, or slowly by TCP timeouts. @@ -206,9 +207,10 @@ broker = bot.builders[buildername].remote.broker broker.dataReceived = discard # seal its ears broker.transport.write = discard # and take away its voice - # also discourage it from reconnecting once the connection goes away - assert self.slaves[slavename].bf.continueTrying - self.slaves[slavename].bf.continueTrying = False + if not allowReconnect: + # also discourage it from reconnecting once the connection goes away + assert self.slaves[slavename].bf.continueTrying + self.slaves[slavename].bf.continueTrying = False def ghostSlave(self): # the slave thinks it has lost the connection, and initiated a Index: test_run.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/test/test_run.py,v retrieving revision 1.43 retrieving revision 1.44 diff -u -d -r1.43 -r1.44 --- test_run.py 11 Dec 2006 08:23:29 -0000 1.43 +++ test_run.py 3 Jul 2007 17:25:08 -0000 1.44 @@ -186,8 +186,7 @@ def testIdle2(self): # now suppose the slave goes missing - self.slaves['bot1'].bf.continueTrying = 0 - self.disappearSlave() + self.disappearSlave(allowReconnect=False) # forcing a build will work: the build detect that the slave is no # longer available and will be re-queued. Wait 5 seconds, then check @@ -356,8 +355,7 @@ self.failUnlessEqual(res, True) # now, before any build is run, make the slave disappear - self.slaves['bot1'].bf.continueTrying = 0 - self.disappearSlave() + self.disappearSlave(allowReconnect=False) # at this point, a ping to the slave should timeout d = bc.ping(1) @@ -375,8 +373,7 @@ self.failUnlessEqual(ss.getAdmin(), "one") # now, before any build is run, make the first slave disappear - self.slaves['bot1'].bf.continueTrying = 0 - self.disappearSlave() + self.disappearSlave(allowReconnect=False) d = self.master.botmaster.waitUntilBuilderDetached("dummy") # now let the new slave take over @@ -447,7 +444,7 @@ d = self.master.botmaster.waitUntilBuilderDetached("dummy") # whoops! how careless of me. - self.disappearSlave() + self.disappearSlave(allowReconnect=True) # the slave will realize the connection is lost within 2 seconds, and # reconnect. d.addCallback(self._testSlaveTimeout_2) Index: test_slaves.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/test/test_slaves.py,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- test_slaves.py 3 Jul 2007 02:22:19 -0000 1.8 +++ test_slaves.py 3 Jul 2007 17:25:08 -0000 1.9 @@ -133,7 +133,7 @@ b1.START_BUILD_TIMEOUT = 1 assert b1.CHOOSE_SLAVES_RANDOMLY b1.CHOOSE_SLAVES_RANDOMLY = False - self.disappearSlave("bot1", "b1") + self.disappearSlave("bot1", "b1", allowReconnect=False) d = self.doBuild("b1") d.addCallback(self._testFallback2_1) return d From warner at users.sourceforge.net Tue Jul 3 17:25:10 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Tue, 03 Jul 2007 17:25:10 +0000 Subject: [Buildbot-commits] buildbot ChangeLog,1.861,1.862 Message-ID: Update of /cvsroot/buildbot/buildbot In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv11483 Modified Files: ChangeLog Log Message: [project @ RunMixin.disappearSlave: allow callers to control the allowReconnect behavior] Original author: warner at lothar.com Date: 2007-07-03 17:24:36+00:00 Index: ChangeLog =================================================================== RCS file: /cvsroot/buildbot/buildbot/ChangeLog,v retrieving revision 1.861 retrieving revision 1.862 diff -u -d -r1.861 -r1.862 --- ChangeLog 3 Jul 2007 02:22:18 -0000 1.861 +++ ChangeLog 3 Jul 2007 17:25:07 -0000 1.862 @@ -1,3 +1,12 @@ +2007-07-03 Brian Warner + + * buildbot/test/runutils.py (RunMixin.disappearSlave): oops, add + an allowReconnect= argument to let callers control whether they + want this don't-let-it-reconnect behavior, since some tests care. + Factor out the .continueTrying=False lines from those callers. + * buildbot/test/test_slaves.py: same + * buildbot/test/test_run.py: same + 2007-07-02 Brian Warner * buildbot/test/runutils.py (RunMixin.disappearSlave): once a From warner at users.sourceforge.net Tue Jul 3 17:59:05 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Tue, 03 Jul 2007 17:59:05 +0000 Subject: [Buildbot-commits] buildbot/buildbot/slave commands.py,1.80,1.81 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/slave In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv24963/buildbot/slave Modified Files: commands.py Log Message: [project @ rmdirRecursive: chmod files to 0700 before deleting them. Closes #29.] Original author: warner at lothar.com Date: 2007-07-03 17:51:51+00:00 Index: commands.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/slave/commands.py,v retrieving revision 1.80 retrieving revision 1.81 diff -u -d -r1.80 -r1.81 --- commands.py 17 Apr 2007 06:38:50 -0000 1.80 +++ commands.py 3 Jul 2007 17:59:03 -0000 1.81 @@ -66,17 +66,24 @@ os.remove(dir) return + # Verify the directory is read/write/execute for the current user + os.chmod(dir, 0700) + for name in os.listdir(dir): full_name = os.path.join(dir, name) # on Windows, if we don't have write permission we can't remove # the file/directory either, so turn that on if os.name == 'nt': if not os.access(full_name, os.W_OK): + # I think this is now redundant, but I don't have an NT + # machine to test on, so I'm going to leave it in place + # -warner os.chmod(full_name, 0600) + if os.path.isdir(full_name): rmdirRecursive(full_name) else: - # print "removing file", full_name + os.chmod(full_name, 0700) os.remove(full_name) os.rmdir(dir) From warner at users.sourceforge.net Tue Jul 3 17:59:05 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Tue, 03 Jul 2007 17:59:05 +0000 Subject: [Buildbot-commits] buildbot ChangeLog,1.862,1.863 Message-ID: Update of /cvsroot/buildbot/buildbot In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv24963 Modified Files: ChangeLog Log Message: [project @ rmdirRecursive: chmod files to 0700 before deleting them. Closes #29.] Original author: warner at lothar.com Date: 2007-07-03 17:51:51+00:00 Index: ChangeLog =================================================================== RCS file: /cvsroot/buildbot/buildbot/ChangeLog,v retrieving revision 1.862 retrieving revision 1.863 diff -u -d -r1.862 -r1.863 --- ChangeLog 3 Jul 2007 17:25:07 -0000 1.862 +++ ChangeLog 3 Jul 2007 17:59:02 -0000 1.863 @@ -1,5 +1,14 @@ 2007-07-03 Brian Warner + * buildbot/slave/commands.py (rmdirRecursive): chmod everything to + 0700 before removing it, to deal with situations where a build will + leave files around without write permissions and the 'copy' or + 'clobber' VC checkout modes need to blow away the tree first. + Thanks to Steve Milner for the suggestion and the patch (which I + mangled horribly). Closes #29. + * buildbot/test/test_slavecommand.py (Utilities.test_rmdirRecursive): + test for it + * buildbot/test/runutils.py (RunMixin.disappearSlave): oops, add an allowReconnect= argument to let callers control whether they want this don't-let-it-reconnect behavior, since some tests care. From warner at users.sourceforge.net Tue Jul 3 17:59:05 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Tue, 03 Jul 2007 17:59:05 +0000 Subject: [Buildbot-commits] buildbot/buildbot/test test_slavecommand.py, 1.24, 1.25 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/test In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv24963/buildbot/test Modified Files: test_slavecommand.py Log Message: [project @ rmdirRecursive: chmod files to 0700 before deleting them. Closes #29.] Original author: warner at lothar.com Date: 2007-07-03 17:51:51+00:00 Index: test_slavecommand.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/test/test_slavecommand.py,v retrieving revision 1.24 retrieving revision 1.25 diff -u -d -r1.24 -r1.25 --- test_slavecommand.py 11 Dec 2006 08:23:29 -0000 1.24 +++ test_slavecommand.py 3 Jul 2007 17:59:03 -0000 1.25 @@ -14,6 +14,42 @@ # test slavecommand.py by running the various commands with a fake # SlaveBuilder object that logs the calls to sendUpdate() +class Utilities(unittest.TestCase): + def mkdir(self, basedir, path, mode=None): + fn = os.path.join(basedir, path) + os.makedirs(fn) + if mode is not None: + os.chmod(fn, mode) + + def touch(self, basedir, path, mode=None): + fn = os.path.join(basedir, path) + f = open(fn, "w") + f.write("touch\n") + f.close() + if mode is not None: + os.chmod(fn, mode) + + def test_rmdirRecursive(self): + basedir = "slavecommand/Utilities/test_rmdirRecursive" + os.makedirs(basedir) + d = os.path.join(basedir, "doomed") + self.mkdir(d, "a/b") + self.touch(d, "a/b/1.txt") + self.touch(d, "a/b/2.txt", 0444) + self.touch(d, "a/b/3.txt", 0) + self.mkdir(d, "a/c") + self.touch(d, "a/c/1.txt") + self.touch(d, "a/c/2.txt", 0444) + self.touch(d, "a/c/3.txt", 0) + os.chmod(os.path.join(d, "a/c"), 0444) + self.mkdir(d, "a/d") + self.touch(d, "a/d/1.txt") + self.touch(d, "a/d/2.txt", 0444) + self.touch(d, "a/d/3.txt", 0) + os.chmod(os.path.join(d, "a/d"), 0) + + commands.rmdirRecursive(d) + self.failIf(os.path.exists(d)) class ShellBase(SignalMixin): From warner at users.sourceforge.net Tue Jul 3 19:17:51 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Tue, 03 Jul 2007 19:17:51 +0000 Subject: [Buildbot-commits] buildbot/buildbot/steps source.py,1.6,1.7 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/steps In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv26243/buildbot/steps Modified Files: source.py Log Message: [project @ when using a patch in a Source step, add [patch] to the description. Closes #49] Original author: warner at lothar.com Date: 2007-07-03 19:14:45+00:00 Index: source.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/steps/source.py,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- source.py 18 Jun 2007 02:52:49 -0000 1.6 +++ source.py 3 Jul 2007 19:17:49 -0000 1.7 @@ -465,6 +465,8 @@ revstuff.append("[branch]") if revision is not None: revstuff.append("r%s" % revision) + if patch is not None: + revstuff.append("[patch]") self.description.extend(revstuff) self.descriptionDone.extend(revstuff) From warner at users.sourceforge.net Tue Jul 3 19:17:51 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Tue, 03 Jul 2007 19:17:51 +0000 Subject: [Buildbot-commits] buildbot ChangeLog,1.863,1.864 Message-ID: Update of /cvsroot/buildbot/buildbot In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv26243 Modified Files: ChangeLog Log Message: [project @ when using a patch in a Source step, add [patch] to the description. Closes #49] Original author: warner at lothar.com Date: 2007-07-03 19:14:45+00:00 Index: ChangeLog =================================================================== RCS file: /cvsroot/buildbot/buildbot/ChangeLog,v retrieving revision 1.863 retrieving revision 1.864 diff -u -d -r1.863 -r1.864 --- ChangeLog 3 Jul 2007 17:59:02 -0000 1.863 +++ ChangeLog 3 Jul 2007 19:17:49 -0000 1.864 @@ -1,5 +1,9 @@ 2007-07-03 Brian Warner + * buildbot/steps/source.py (SVN.startVC): when applying a patch, + add "[patch]" to the step's display. Thanks to Dustin Mitchell for + the patch. Closes #49. + * buildbot/slave/commands.py (rmdirRecursive): chmod everything to 0700 before removing it, to deal with situations where a build will leave files around without write permissions and the 'copy' or From warner at users.sourceforge.net Tue Jul 3 19:21:31 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Tue, 03 Jul 2007 19:21:31 +0000 Subject: [Buildbot-commits] buildbot ChangeLog,1.864,1.865 Message-ID: Update of /cvsroot/buildbot/buildbot In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv27853 Modified Files: ChangeLog Log Message: [project @ buildbot.texinfo: correct the description of Dependent schedulers] Original author: warner at lothar.com Date: 2007-07-03 19:21:12+00:00 Index: ChangeLog =================================================================== RCS file: /cvsroot/buildbot/buildbot/ChangeLog,v retrieving revision 1.864 retrieving revision 1.865 diff -u -d -r1.864 -r1.865 --- ChangeLog 3 Jul 2007 19:17:49 -0000 1.864 +++ ChangeLog 3 Jul 2007 19:21:29 -0000 1.865 @@ -1,5 +1,8 @@ 2007-07-03 Brian Warner + * docs/buildbot.texinfo (Scheduler Types): correct the description + of Dependent schedulers. Thanks to Greg Ward for the patch. + * buildbot/steps/source.py (SVN.startVC): when applying a patch, add "[patch]" to the step's display. Thanks to Dustin Mitchell for the patch. Closes #49. From warner at users.sourceforge.net Tue Jul 3 19:21:32 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Tue, 03 Jul 2007 19:21:32 +0000 Subject: [Buildbot-commits] buildbot/docs buildbot.texinfo,1.100,1.101 Message-ID: Update of /cvsroot/buildbot/buildbot/docs In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv27853/docs Modified Files: buildbot.texinfo Log Message: [project @ buildbot.texinfo: correct the description of Dependent schedulers] Original author: warner at lothar.com Date: 2007-07-03 19:21:12+00:00 Index: buildbot.texinfo =================================================================== RCS file: /cvsroot/buildbot/buildbot/docs/buildbot.texinfo,v retrieving revision 1.100 retrieving revision 1.101 diff -u -d -r1.100 -r1.101 --- buildbot.texinfo 2 Jul 2007 17:50:17 -0000 1.100 +++ buildbot.texinfo 3 Jul 2007 19:21:29 -0000 1.101 @@ -2096,11 +2096,10 @@ follows multiple branches at once. Each branch gets a separate timer. @item Dependent -This scheduler watches an ``upstream'' Builder. When that Builder -successfully builds a particular set of Changes, it triggers builds of -the same code on a configured set of ``downstream'' builders. The next -section (@pxref{Build Dependencies}) describes this scheduler in more -detail. +This scheduler watches an ``upstream'' Scheduler. When all the +Builders launched by that Scheduler successfully finish, the Dependent +scheduler is triggered. The next section (@pxref{Build Dependencies}) +describes this scheduler in more detail. @item Periodic This simple scheduler just triggers a build every N seconds. From warner at users.sourceforge.net Wed Jul 4 05:09:43 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Wed, 04 Jul 2007 05:09:43 +0000 Subject: [Buildbot-commits] buildbot/buildbot/steps shell.py,1.5,1.6 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/steps In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv31546/buildbot/steps Modified Files: shell.py Log Message: [project @ ShellCommand: allow workdir= to be a WithProperties. Closes #43.] Original author: warner at lothar.com Date: 2007-07-04 05:08:34+00:00 Index: shell.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/steps/shell.py,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- shell.py 18 Jun 2007 02:52:49 -0000 1.5 +++ shell.py 4 Jul 2007 05:09:41 -0000 1.6 @@ -170,6 +170,11 @@ command_argv.append(argv) return command_argv + def _interpolateWorkdir(self, workdir): + if isinstance(workdir, WithProperties): + return workdir.render(self.build) + return workdir + def setupEnvironment(self, cmd): # merge in anything from Build.slaveEnvironment . Earlier steps # (perhaps ones which compile libraries or sub-projects that need to @@ -213,6 +218,7 @@ assert isinstance(command, (list, tuple, str)) # create the actual RemoteShellCommand instance now kwargs = self.remote_kwargs + kwargs['workdir'] = self._interpolateWorkdir(kwargs['workdir']) kwargs['command'] = command kwargs['logfiles'] = self.logfiles cmd = RemoteShellCommand(**kwargs) From warner at users.sourceforge.net Wed Jul 4 05:09:44 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Wed, 04 Jul 2007 05:09:44 +0000 Subject: [Buildbot-commits] buildbot/docs buildbot.texinfo,1.101,1.102 Message-ID: Update of /cvsroot/buildbot/buildbot/docs In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv31546/docs Modified Files: buildbot.texinfo Log Message: [project @ ShellCommand: allow workdir= to be a WithProperties. Closes #43.] Original author: warner at lothar.com Date: 2007-07-04 05:08:34+00:00 Index: buildbot.texinfo =================================================================== RCS file: /cvsroot/buildbot/buildbot/docs/buildbot.texinfo,v retrieving revision 1.101 retrieving revision 1.102 diff -u -d -r1.101 -r1.102 --- buildbot.texinfo 3 Jul 2007 19:21:29 -0000 1.101 +++ buildbot.texinfo 4 Jul 2007 05:09:42 -0000 1.102 @@ -3970,7 +3970,10 @@ You can use build properties in ShellCommands by using the @code{WithProperties} wrapper when setting the arguments of the ShellCommand. This interpolates the named build properties into the -generated shell command. +generated shell command. You can also use a @code{WithProperties} as +the @code{workdir=} argument: this allows the working directory for a +command to be varied for each build, depending upon various build +properties. @example from buildbot.steps.shell import ShellCommand, WithProperties From warner at users.sourceforge.net Wed Jul 4 05:09:43 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Wed, 04 Jul 2007 05:09:43 +0000 Subject: [Buildbot-commits] buildbot ChangeLog,1.865,1.866 Message-ID: Update of /cvsroot/buildbot/buildbot In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv31546 Modified Files: ChangeLog Log Message: [project @ ShellCommand: allow workdir= to be a WithProperties. Closes #43.] Original author: warner at lothar.com Date: 2007-07-04 05:08:34+00:00 Index: ChangeLog =================================================================== RCS file: /cvsroot/buildbot/buildbot/ChangeLog,v retrieving revision 1.865 retrieving revision 1.866 diff -u -d -r1.865 -r1.866 --- ChangeLog 3 Jul 2007 19:21:29 -0000 1.865 +++ ChangeLog 4 Jul 2007 05:09:41 -0000 1.866 @@ -1,5 +1,11 @@ 2007-07-03 Brian Warner + * buildbot/steps/shell.py (ShellCommand): allow workdir= to be a + WithProperties instance. Thanks to Axel Hecht for the patch. + Closes #43. + * buildbot/test/test_properties.py (Interpolate.testWorkdir): test it + * docs/buildbot.texinfo (Build Properties): document it + * docs/buildbot.texinfo (Scheduler Types): correct the description of Dependent schedulers. Thanks to Greg Ward for the patch. From warner at users.sourceforge.net Wed Jul 4 05:09:44 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Wed, 04 Jul 2007 05:09:44 +0000 Subject: [Buildbot-commits] buildbot/buildbot/test test_properties.py, 1.7, 1.8 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/test In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv31546/buildbot/test Modified Files: test_properties.py Log Message: [project @ ShellCommand: allow workdir= to be a WithProperties. Closes #43.] Original author: warner at lothar.com Date: 2007-07-04 05:08:34+00:00 Index: test_properties.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/test/test_properties.py,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- test_properties.py 18 Jun 2007 02:52:49 -0000 1.7 +++ test_properties.py 4 Jul 2007 05:09:41 -0000 1.8 @@ -60,6 +60,15 @@ self.failUnlessEqual(cmd, ["tar", "czf", "build-47.tar.gz", "source"]) + def testWorkdir(self): + self.build.setProperty("revision", 47) + self.failUnlessEqual(self.build_status.getProperty("revision"), 47) + c = ShellCommand(command=["tar", "czf", "foo.tar.gz", "source"]) + c.setBuild(self.build) + workdir = WithProperties("workdir-%d", "revision") + workdir = c._interpolateWorkdir(workdir) + self.failUnlessEqual(workdir, "workdir-47") + def testWithPropertiesDict(self): self.build.setProperty("other", "foo") self.build.setProperty("missing", None) From warner at users.sourceforge.net Wed Jul 4 05:09:49 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Wed, 04 Jul 2007 05:09:49 +0000 Subject: [Buildbot-commits] buildbot/buildbot/slave commands.py,1.81,1.82 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/slave In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv31577/buildbot/slave Modified Files: commands.py Log Message: [project @ ShellCommand: create the workdir if it didn't already exist] Original author: warner at lothar.com Date: 2007-07-04 05:09:08+00:00 Index: commands.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/slave/commands.py,v retrieving revision 1.81 retrieving revision 1.82 diff -u -d -r1.81 -r1.82 --- commands.py 3 Jul 2007 17:59:03 -0000 1.81 +++ commands.py 4 Jul 2007 05:09:47 -0000 1.82 @@ -309,6 +309,9 @@ return self.deferred def _startCommand(self): + # ensure workdir exists + if not os.path.isdir(self.workdir): + os.makedirs(self.workdir) log.msg("ShellCommand._startCommand") if self.notreally: self.sendStatus({'header': "command '%s' in dir %s" % \ From warner at users.sourceforge.net Wed Jul 4 05:09:49 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Wed, 04 Jul 2007 05:09:49 +0000 Subject: [Buildbot-commits] buildbot ChangeLog,1.866,1.867 Message-ID: Update of /cvsroot/buildbot/buildbot In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv31577 Modified Files: ChangeLog Log Message: [project @ ShellCommand: create the workdir if it didn't already exist] Original author: warner at lothar.com Date: 2007-07-04 05:09:08+00:00 Index: ChangeLog =================================================================== RCS file: /cvsroot/buildbot/buildbot/ChangeLog,v retrieving revision 1.866 retrieving revision 1.867 diff -u -d -r1.866 -r1.867 --- ChangeLog 4 Jul 2007 05:09:41 -0000 1.866 +++ ChangeLog 4 Jul 2007 05:09:47 -0000 1.867 @@ -5,6 +5,8 @@ Closes #43. * buildbot/test/test_properties.py (Interpolate.testWorkdir): test it * docs/buildbot.texinfo (Build Properties): document it + * buildbot/slave/commands.py (ShellCommand._startCommand): create the + workdir if it didn't already exist. * docs/buildbot.texinfo (Scheduler Types): correct the description of Dependent schedulers. Thanks to Greg Ward for the patch. From warner at users.sourceforge.net Wed Jul 4 05:52:06 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Wed, 04 Jul 2007 05:52:06 +0000 Subject: [Buildbot-commits] buildbot ChangeLog,1.867,1.868 Message-ID: Update of /cvsroot/buildbot/buildbot In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv15887 Modified Files: ChangeLog Log Message: [project @ ShellCommand: log the environment with one variable per line, instead of a single very long line] Original author: warner at lothar.com Date: 2007-07-04 05:43:04+00:00 Index: ChangeLog =================================================================== RCS file: /cvsroot/buildbot/buildbot/ChangeLog,v retrieving revision 1.867 retrieving revision 1.868 diff -u -d -r1.867 -r1.868 --- ChangeLog 4 Jul 2007 05:09:47 -0000 1.867 +++ ChangeLog 4 Jul 2007 05:52:03 -0000 1.868 @@ -1,5 +1,12 @@ 2007-07-03 Brian Warner + * buildbot/slave/commands.py (ShellCommand._startCommand): when + logging the environment variables, put one variable on each line, + rather than having one really long line with all of them. This + should make them a bit more readable and not trigger the + horizontal scrollbar (when viewing it in a web browser) quite so + much. Thanks to Albert Hofkamp for the patch. + * buildbot/steps/shell.py (ShellCommand): allow workdir= to be a WithProperties instance. Thanks to Axel Hecht for the patch. Closes #43. From warner at users.sourceforge.net Wed Jul 4 05:52:06 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Wed, 04 Jul 2007 05:52:06 +0000 Subject: [Buildbot-commits] buildbot/buildbot/slave commands.py,1.82,1.83 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/slave In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv15887/buildbot/slave Modified Files: commands.py Log Message: [project @ ShellCommand: log the environment with one variable per line, instead of a single very long line] Original author: warner at lothar.com Date: 2007-07-04 05:43:04+00:00 Index: commands.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/slave/commands.py,v retrieving revision 1.82 retrieving revision 1.83 diff -u -d -r1.82 -r1.83 --- commands.py 4 Jul 2007 05:09:47 -0000 1.82 +++ commands.py 4 Jul 2007 05:52:04 -0000 1.83 @@ -362,9 +362,13 @@ self.sendStatus({'header': msg+"\n"}) # then the environment, since it sometimes causes problems - msg = " environment: %s" % (self.environ,) - log.msg(" " + msg) - self.sendStatus({'header': msg+"\n"}) + msg = " environment:\n" + env_names = self.environ.keys() + env_names.sort() + for name in env_names: + msg += " %s=%s\n" % (name, self.environ[name]) + log.msg(" environment: %s" % (self.environ,)) + self.sendStatus({'header': msg}) # this will be buffered until connectionMade is called if self.initialStdin: From warner at users.sourceforge.net Fri Jul 13 07:21:12 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Fri, 13 Jul 2007 07:21:12 +0000 Subject: [Buildbot-commits] site index.html,1.72,1.73 Message-ID: Update of /cvsroot/buildbot/site In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv15612 Modified Files: index.html Log Message: direct folks from buildbot.sf.net to visit buildbot.net instead Index: index.html =================================================================== RCS file: /cvsroot/buildbot/site/index.html,v retrieving revision 1.72 retrieving revision 1.73 diff -u -d -r1.72 -r1.73 --- index.html 7 Aug 2006 00:25:31 -0000 1.72 +++ index.html 13 Jul 2007 07:21:08 -0000 1.73 @@ -3,607 +3,17 @@ The BuildBot -

The BuildBot

-

(from the README)

- -

The BuildBot is a system to automate the compile/test cycle required by -most software projects to validate code changes. By automatically rebuilding -and testing the tree each time something has changed, build problems are -pinpointed quickly, before other developers are inconvenienced by the -failure. The guilty developer can be identified and harassed without human -intervention. By running the builds on a variety of platforms, developers who -do not have the facilities to test their changes everywhere before checkin -will at least know shortly afterwards whether they have broken the build or -not. Warning counts, lint checks, image size, compile time, and other build -parameters can be tracked over time, are more visible, and are therefore -easier to improve.

- -

The overall goal is to reduce tree breakage and provide a platform to run -tests or code-quality checks that are too annoying or pedantic for any human -to waste their time with. Developers get immediate (and potentially public) -feedback about their changes, encouraging them to be more careful about -testing before checkin.

- -

Current contents:

- -
    -
  • The current release is buildbot-0.7.3 . You can download the source - from the sf.net download page here. - The release is signed with my GPG public key, available here.
  • - -
  • The latest code is available from CVS for browsing - or read-only - checkout. There are also Arch and Darcs repositories which track the - main CVS tree and provide lower-latency access than anonymous CVS, details - are here. There is also a copy of the CVS - user's manual available, which may give you - an idea of what sorts of features are coming up in the next release.
  • - -
  • The README file contains an overview, while the User's Manual contains complete documentation. - The API Reference may be useful when - writing the configuration file: the various Steps and Schedulers are - documented there.
  • - -
  • Recent changes are summarized in the NEWS file, - while the complete details are in the ChangeLog.
  • - -
  • The paper delivered at - PyCon-2003, along with the slides.
  • - -
  • The SourceForge - Project Page
  • - -
  • Please join the buildbot-devel - mailing - list to be notified about new releases, discuss how to configure and - use the buildbot, and to hear about new development. This is both a user - and a developer mailing list. -
  • - -
  • You can also join the buildbot-commits - mailing - list to be notified about changes in CVS. -
  • - -
  • Older versions (0.6.6 and earlier) require some pre-packaged VC - repositories to run certain unit tests, available in this tarball: buildbot-test-vc-1.tar.gz
  • -
- -

Getting Buildbot

-
    -
  • From Source: download the latest version from the SourceForge - Project Page, - run setup.py install as per the README, - and read the User's Manual about configuring - your new buildbot.
  • - -
  • Ubuntu Users: install the 'buildbot' package from - the Dapper 'universe' distribution. (thanks to Matthias Klose for making - this happen!)
  • - -
  • Darwin Users: run port install buildbot (thanks to - Olivier Bonnet for making this - happen!)
  • -
- - -

Success Stories

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Twisted - Buildbot - - home page - - The original publically-visible Buildbot installation runs the - Twisted unit test suite. -
Id Software - - - TTimo (at Id software) is using a Buildbot for testing Wolfenstein: - Enemy Territory Linux. -
Nunatek - - - Christopher Armstrong (radix) has set up a Buildbot to do web testing - (using MaxQ) for one of his clients, as well as internally at Nunatak - to run python unit tests. -
? - - - 'nbm' reports that the first-or-second-largest media company - in South Africa uses buildbot, testing PHP code. -
GStreamer - Buildbot - - home page - - Thomas Vander Stichele at Fluendo - is using a Buildbot to run multi-distribution tests for their - GStreamer-based streaming multimedia framework. -
ILM - - Dave Peticolas at Industrial Light & Magic is using a Buildbot - internally to test lots of python code -
Free Geek - Buildbot - - - The Free Geek project has a buildbot for the diagnostic tools they use - to test donated hardware. -
PBP - - home page - - Cory Dodt has created a BuildStep which allows Buildbots to drive - tests. PBP is a web testing tool that (as I understand it) behaves as - an HTTP client and makes sure a web application responds to queries - correctly. With this BuildStep, you can incorporate PBP tests into your - compile/build/test cycle. -
Mono - Buildbot - - home page - - According to Fawad Halim, the Mono project has a buildbot running to - test the HEAD and release branches of the main project on several - architectures. -
SpamAssassin - Buildbot - - home page - - Justin Mason reports that the SpamAssassin project is running a - buildbot too. -
Boost - Buildbot - - home page - - Rene Rivera says that the well-known Boost C++ project is moving all - their testing to run under a buildbot, but it does not currently (aug - 2005) appear to be online yet. -
Monotone - Buildbot - - home page - - The Monotone version control system is using a buildbot to run unit - tests. Their buildbot has been extended to handle Monotone's - somewhat-unique VC scheme by Nathaniel Smith, and hopefully the patches - will be merged into the main release soon. -
ETLab - - home page - - Mark Dillavou reports that he's installed a Buildbot in the Enabling - Technology Laboratory at the University of Alabama, Birmingham, to - maintain their visualization and virtual-environment projects. -
Netbox Blue - - - Stephen Thorne says that his company, Netbox Blue, uses a buildbot to - build and test their network security appliance. -
Ethereal - Buildbot - - home page - - Ulf Lamping reports that the Ethereal project, a well-known packet - sniffer, uses a buildbot for their cross-platform compatibility - testing. Joerg Mayer reports that they've changed their name to Wireshark and their new buildbot - is here. -
VideoLAN - Buildbot - - home page - - Cl?ment Stenac writes in to say that the VideoLAN Project has a - Buildbot to do their continuous-integration and nightly builds. -
Nuxeo - Buildbot - - home page - - Stefane Fermigier reports that Nuxeo SAS is running this buildbot to - test their ECM project named CPS. -
Zope - Buildbot - - home page - - The Zope project (a large and well-known application server for - building web Content Management Systems and the like) is using a - buildbot to track the status of Zope3. -
OpenID - - home page - - Kevin Turner reports that JanRain, Inc. is using a buildbot for their - multi-language OpenID libraries. -
Python - Buildbot - - home page - - Python, the language that the Buildbot is written in, has recently set - up its own Buildbot. Guido van Rossum mentioned it in his blog, - and again in his keynote at PyCon2006. -
KDE - Buildbot - - home page - - The KDE Project has a buildbot, working on their unstable code branch. -
WebKit - Buildbot - - home page - - The OpenDarwin WebKit component (which includes the HTML renderer used - by the Safari browser in OS-X) has a buildbot too. -
ASCEND - Buildbot - - home page - - John Pye writes to say that the ASCEND - project is using a buildbot. -
Logicalware - Buildbot - - home page - - Kevin Campbell reports that his company is using a buildbot to help - them provide commercial support of a product over a large range of - architectures. -
CodeSourcery - - home page - - Stefan Seefeld is using a buildbot for internal builds and tests at his - company. -
Xenomai - - home page - - Niklaus Giger has set up a buildbot for the Xenomai project. -
Aqsis - Buildbot - - home page - Paul Gregory has set up a buildbot for the Aqsis rendering project -
Enfold Systems - Buildbot - - home page - Sidnei da Silva reports that his company has a buildbot to test and - drive automated builds. One of his buildslaves is installed as a Windows - Service (using py2exe).
Auger Observatory - Buildbot - - home page - Tom Paul reports that a buildbot is in use at the Pierre Auger - Observatory to test the data processing and analysis software in use - there. "The observatory is designed to unveil the origins and - composition of the highest energy cosmic rays, and is operated by a - collaboration of about 300 physicists (running code on quite a few - different platforms)".
Cheesecake - Buildbot - - home page - Michal Kwiatkowski reports that the pycheesecake project is using - a buildbot to run all their functional and unit tests. This project - ranks many python packages according to such quality metrics like - pylint scores, percentage of documented methods, and - downloadability.
ReactOS - Buildbot - - home page - Aleksey Bragin has set up a buildbot for the ReactOS project, to - automate the creation of installation CD images. This project is - dedicated to creating a GPLed windows-compatible operating system - from the ground up.
- - install a Buildbot today and get your name added here! -
- - -

- - - - - - - - - -
Buildbotlink to the buildbot's main status page
home pagelink to the project's home page
-

- -
- - - - - - SourceForge.net Logo - -
- Brian Warner - <warner @ lothar.com> -
- - - +

This page has moved! Please check out our new Trac instance at http://buildbot.net. It has everything you +want to know about Buildbot configuration and development.

-

The pretty home page icon home
-page comes from the Tango Project, and is -used under the Creative Commons -Attribution Share-Alike license.

+

thanks!

+

-Brian

-Last modified: Sun Aug 6 17:24:52 PDT 2006 +Last modified: Fri Jul 13 00:21:01 PDT 2007 From warner at users.sourceforge.net Tue Jul 17 19:48:42 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Tue, 17 Jul 2007 19:48:42 +0000 Subject: [Buildbot-commits] buildbot ChangeLog,1.868,1.869 Message-ID: Update of /cvsroot/buildbot/buildbot In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv22951 Modified Files: ChangeLog Log Message: [project @ add BuildStep.getLog] Original author: warner at lothar.com Date: 2007-07-17 19:48:16+00:00 Index: ChangeLog =================================================================== RCS file: /cvsroot/buildbot/buildbot/ChangeLog,v retrieving revision 1.868 retrieving revision 1.869 diff -u -d -r1.868 -r1.869 --- ChangeLog 4 Jul 2007 05:52:03 -0000 1.868 +++ ChangeLog 17 Jul 2007 19:48:39 -0000 1.869 @@ -1,3 +1,10 @@ +2007-07-17 Brian Warner + + * buildbot/process/buildstep.py (BuildStep.getLog): add a + convenience method to retrieve a log added with + addLog()/addCompleteLog()/etc or logfiles= . I should have added + this two years ago.. + 2007-07-03 Brian Warner * buildbot/slave/commands.py (ShellCommand._startCommand): when From warner at users.sourceforge.net Tue Jul 17 19:48:42 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Tue, 17 Jul 2007 19:48:42 +0000 Subject: [Buildbot-commits] buildbot/buildbot/process buildstep.py,1.6,1.7 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/process In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv22951/buildbot/process Modified Files: buildstep.py Log Message: [project @ add BuildStep.getLog] Original author: warner at lothar.com Date: 2007-07-17 19:48:16+00:00 Index: buildstep.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/process/buildstep.py,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- buildstep.py 18 Jun 2007 02:52:49 -0000 1.6 +++ buildstep.py 17 Jul 2007 19:48:40 -0000 1.7 @@ -837,10 +837,11 @@ self._connectPendingLogObservers() return loog - # TODO: add a getLog() ? At the moment all logs have to be retrieved from - # the RemoteCommand that created them, but for status summarizers it - # would be more convenient to get them from the BuildStep / BSStatus, - # especially if there are multiple RemoteCommands involved. + def getLog(self, name): + for l in self.step_status.getLogs(): + if l.getName() == name: + return l + raise KeyError("no log named '%s'" % (name,)) def addCompleteLog(self, name, text): log.msg("addCompleteLog(%s)" % name) From warner at users.sourceforge.net Tue Jul 17 19:48:42 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Tue, 17 Jul 2007 19:48:42 +0000 Subject: [Buildbot-commits] buildbot/docs buildbot.texinfo,1.102,1.103 Message-ID: Update of /cvsroot/buildbot/buildbot/docs In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv22951/docs Modified Files: buildbot.texinfo Log Message: [project @ add BuildStep.getLog] Original author: warner at lothar.com Date: 2007-07-17 19:48:16+00:00 Index: buildbot.texinfo =================================================================== RCS file: /cvsroot/buildbot/buildbot/docs/buildbot.texinfo,v retrieving revision 1.102 retrieving revision 1.103 diff -u -d -r1.102 -r1.103 --- buildbot.texinfo 4 Jul 2007 05:09:42 -0000 1.102 +++ buildbot.texinfo 17 Jul 2007 19:48:40 -0000 1.103 @@ -197,6 +197,7 @@ Writing New BuildSteps * BuildStep LogFiles:: +* Reading Logfiles:: * Adding LogObservers:: * BuildStep URLs:: @@ -4269,11 +4270,12 @@ @menu * BuildStep LogFiles:: +* Reading Logfiles:: * Adding LogObservers:: * BuildStep URLs:: @end menu - at node BuildStep LogFiles, Adding LogObservers, Writing New BuildSteps, Writing New BuildSteps + at node BuildStep LogFiles, Reading Logfiles, Writing New BuildSteps, Writing New BuildSteps @subsubsection BuildStep LogFiles Each BuildStep has a collection of ``logfiles''. Each one has a short @@ -4363,8 +4365,31 @@ calling @code{addStdout}. These secondary LogFiles can be used as the source of a LogObserver just like the normal ``stdio'' LogFile. + at node Reading Logfiles, Adding LogObservers, BuildStep LogFiles, Writing New BuildSteps + at subsubsection Reading Logfiles - at node Adding LogObservers, BuildStep URLs, BuildStep LogFiles, Writing New BuildSteps +Once a LogFile has been added to a BuildStep with @code{addLog()}, + at code{addCompleteLog()}, @code{addHTMLLog()}, or @code{logfiles=}, +your BuildStep can retrieve it by using @code{getLog()}: + + at example +class MyBuildStep(ShellCommand): + logfiles = @{ "nodelog": "_test/node.log" @} + + def evaluateCommand(self, cmd): + nodelog = self.getLog("nodelog") + if "STARTED" in nodelog.getText(): + return SUCCESS + else: + return FAILURE + at end example + +For a complete list of the methods you can call on a LogFile, please +see the docstrings on the @code{IStatusLog} class in + at file{buildbot/interfaces.py}. + + + at node Adding LogObservers, BuildStep URLs, Reading Logfiles, Writing New BuildSteps @subsubsection Adding LogObservers @cindex LogObserver From warner at users.sourceforge.net Tue Jul 17 19:48:42 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Tue, 17 Jul 2007 19:48:42 +0000 Subject: [Buildbot-commits] buildbot/buildbot/test test_steps.py,1.39,1.40 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/test In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv22951/buildbot/test Modified Files: test_steps.py Log Message: [project @ add BuildStep.getLog] Original author: warner at lothar.com Date: 2007-07-17 19:48:16+00:00 Index: test_steps.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/test/test_steps.py,v retrieving revision 1.39 retrieving revision 1.40 diff -u -d -r1.39 -r1.40 --- test_steps.py 18 Jun 2007 02:52:49 -0000 1.39 +++ test_steps.py 17 Jul 2007 19:48:40 -0000 1.40 @@ -236,6 +236,8 @@ self.failUnlessEqual(len(logs), 1) l1 = logs[0] self.failUnlessEqual(l1.getText(), "some stdout here") + l1a = s.getLog("newlog") + self.failUnlessEqual(l1a.getText(), "some stdout here") def test_addHTMLLog(self): s = makeBuildStep("test_steps.Steps.test_addHTMLLog") @@ -255,6 +257,8 @@ self.failUnlessEqual(len(logs), 1) l1 = logs[0] self.failUnlessEqual(l1.getText(), "some stdout here") + l1a = s.getLog("newlog") + self.failUnlessEqual(l1a.getText(), "some stdout here") def test_addLogObserver(self): s = makeBuildStep("test_steps.Steps.test_addLogObserver") From warner at users.sourceforge.net Thu Jul 26 19:38:47 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Thu, 26 Jul 2007 19:38:47 +0000 Subject: [Buildbot-commits] buildbot/buildbot/changes hgbuildbot.py, NONE, 1.1 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/changes In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv13166/buildbot/changes Added Files: hgbuildbot.py Log Message: [project @ add hgbuildbot.py hook function, by Frederic Leroy. Addresses #50.] Original author: warner at lothar.com Date: 2007-07-26 19:38:06+00:00 --- NEW FILE: hgbuildbot.py --- # hgbuildbot.py - mercurial hooks for buildbot # # Copyright 2007 Frederic Leroy # # This software may be used and distributed according to the terms # of the GNU General Public License, incorporated herein by reference. from mercurial.demandload import * from mercurial.i18n import gettext as _ from mercurial.node import * from buildbot.clients import sendchange from twisted.internet import defer, reactor demandload(globals(), "os sys mercurial:hg,util") # hook extension to send change notifications to buildbot when a changeset is # brought into the repository from elsewhere. # # default mode is to use mercurial branch # # to use, configure hgbuildbot in .hg/hgrc like this: # # [hooks] # changegroup = python:buildbot.changes.hgbuildbot.hook # # [hgbuildbot] # # config items go in here # # config items: # # REQUIRED: # master = host:port # host to send buildbot changes # # OPTIONAL: # branchtype = inrepo|dirname # dirname: branch = name of directory # # containing the repository # # # # inrepo: branch = mercurial branch # # branch = branchname # if set, branch is always branchname def hook(ui, repo, hooktype, node=None, source=None, **kwargs): # read config parameters master = ui.config('hgbuildbot', 'master') if master: branchtype = ui.config('hgbuildbot', 'branchtype') branch = ui.config('hgbuildbot', 'branch') else: ui.write("* You must add a [hgbuildbot] section to .hg/hgrc in " "order to use buildbot hook\n") return if branch is None: if branchtype is not None: if branchtype == 'dirname': branch = os.path.basename(os.getcwd()) if branchtype == 'inrepo': branch=repo.workingctx().branch() if hooktype == 'changegroup': s = sendchange.Sender(master, None) d = defer.Deferred() reactor.callLater(0, d.callback, None) # process changesets def _send(res, c): ui.status("rev %s sent\n" % c['revision']) return s.send(c['branch'], c['revision'], c['comments'], c['files'], c['username']) node=bin(node) start = repo.changelog.rev(node) end = repo.changelog.count() for rev in xrange(start, end): # send changeset n = repo.changelog.node(rev) changeset=repo.changelog.extract(repo.changelog.revision(n)) change = { 'master': master, # note: this is more likely to be a full email address, which # would make the left-hand "Changes" column kind of wide. The # buildmaster should probably be improved to display an # abbreviation of the username. 'username': changeset[1], 'revision': hex(n), 'comments': changeset[4], 'files': changeset[3], 'branch': branch } d.addCallback(_send, change) d.addCallbacks(s.printSuccess, s.printFailure) d.addBoth(s.stop) s.run() else: ui.status(_('hgbuildbot: hook %s not supported\n') % hooktype) return From warner at users.sourceforge.net Thu Jul 26 19:38:47 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Thu, 26 Jul 2007 19:38:47 +0000 Subject: [Buildbot-commits] buildbot ChangeLog,1.869,1.870 Message-ID: Update of /cvsroot/buildbot/buildbot In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv13166 Modified Files: ChangeLog Log Message: [project @ add hgbuildbot.py hook function, by Frederic Leroy. Addresses #50.] Original author: warner at lothar.com Date: 2007-07-26 19:38:06+00:00 Index: ChangeLog =================================================================== RCS file: /cvsroot/buildbot/buildbot/ChangeLog,v retrieving revision 1.869 retrieving revision 1.870 diff -u -d -r1.869 -r1.870 --- ChangeLog 17 Jul 2007 19:48:39 -0000 1.869 +++ ChangeLog 26 Jul 2007 19:38:45 -0000 1.870 @@ -1,3 +1,10 @@ +2007-07-26 Brian Warner + + * buildbot/changes/hgbuildbot.py (hook): add an in-process + Mercurial change-sending hook, contributed by Frederic Leroy. + Thanks! Addresses #50. + * docs/buildbot.texinfo (MercurialHook): document it + 2007-07-17 Brian Warner * buildbot/process/buildstep.py (BuildStep.getLog): add a From warner at users.sourceforge.net Thu Jul 26 19:38:47 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Thu, 26 Jul 2007 19:38:47 +0000 Subject: [Buildbot-commits] buildbot/docs buildbot.texinfo,1.103,1.104 Message-ID: Update of /cvsroot/buildbot/buildbot/docs In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv13166/docs Modified Files: buildbot.texinfo Log Message: [project @ add hgbuildbot.py hook function, by Frederic Leroy. Addresses #50.] Original author: warner at lothar.com Date: 2007-07-26 19:38:06+00:00 Index: buildbot.texinfo =================================================================== RCS file: /cvsroot/buildbot/buildbot/docs/buildbot.texinfo,v retrieving revision 1.103 retrieving revision 1.104 diff -u -d -r1.103 -r1.104 --- buildbot.texinfo 17 Jul 2007 19:48:40 -0000 1.103 +++ buildbot.texinfo 26 Jul 2007 19:38:45 -0000 1.104 @@ -154,6 +154,7 @@ * P4Source:: * BonsaiPoller:: * SVNPoller:: +* MercurialHook:: Build Process @@ -2552,6 +2553,9 @@ @itemize @bullet @item pb.PBChangeSource (listening for connections from @code{contrib/hg_buildbot.py} run in an 'incoming' hook) + at item pb.PBChangeSource (listening for connections from + at code{buildbot/changes/hgbuildbot.py} run as an in-process 'changegroup' +hook) @end itemize @item Arch/Bazaar @@ -2577,6 +2581,7 @@ * P4Source:: * BonsaiPoller:: * SVNPoller:: +* MercurialHook:: @end menu @node Choosing ChangeSources, CVSToys - PBService, Change Sources, Change Sources @@ -2738,13 +2743,14 @@ clients to connect and push change notices @emph{into} the Buildmaster. This is used by the built-in @code{buildbot sendchange} notification tool, as well as the VC-specific - at file{contrib/svn_buildbot.py} and @file{contrib/arch_buildbot.py} -tools. These tools are run by the repository (in a commit hook -script), and connect to the buildmaster directly each time a file is -comitted. This is also useful for creating new kinds of change sources -that work on a @code{push} model instead of some kind of subscription -scheme, for example a script which is run out of an email .forward -file. + at file{contrib/svn_buildbot.py}, @file{contrib/arch_buildbot.py}, + at file{contrib/hg_buildbot.py} tools, and the + at code{buildbot.changes.hgbuildbot} hook. These tools are run by the +repository (in a commit hook script), and connect to the buildmaster +directly each time a file is comitted. This is also useful for +creating new kinds of change sources that work on a @code{push} model +instead of some kind of subscription scheme, for example a script +which is run out of an email .forward file. This ChangeSource can be configured to listen on its own TCP port, or it can share the port that the buildmaster is already using for the @@ -2866,7 +2872,7 @@ arguments it accepts. - at node SVNPoller, , BonsaiPoller, Change Sources + at node SVNPoller, MercurialHook, BonsaiPoller, Change Sources @subsection SVNPoller @csindex buildbot.changes.svnpoller.SVNPoller @@ -3140,6 +3146,96 @@ return (branch, '/'.join(pieces)) @end example + at node MercurialHook, , SVNPoller, Change Sources + at subsection MercurialHook + +Since Mercurial is written in python, the hook script can invoke +Buildbot's @code{sendchange} function directly, rather than having to +spawn an external process. This function delivers the same sort of +changes as @code{buildbot sendchange} and the various hook scripts in +contrib/, so you'll need to add a @code{pb.PBChangeSource} to your +buildmaster to receive these changes. + +To set this up, first choose a Mercurial repository that represents +your central ``official'' source tree. This will be the same +repository that your buildslaves will eventually pull from. Install +Buildbot on the machine that hosts this repository, using the same +version of python as Mercurial is using (so that the Mercurial hook +can import code from buildbot). Then add the following to the + at code{.hg/hgrc} file in that repository, replacing the buildmaster +hostname/portnumber as appropriate for your buildbot: + + at example +[hooks] +changegroup.buildbot = python:buildbot.changes.hgbuildbot.hook + +[hgbuildbot] +master = buildmaster.example.org:9987 + at end example + +(Note that Mercurial lets you define multiple @code{changegroup} hooks +by giving them distinct names, like @code{changegroup.foo} and + at code{changegroup.bar}, which is why we use + at code{changegroup.buildbot} in this example. There is nothing magical +about the ``buildbot'' suffix in the hook name. The + at code{[hgbuildbot]} section @emph{is} special, however, as it is the +only section that the buildbot hook pays attention to.) + +Also note that this runs as a @code{changegroup} hook, rather than as +an @code{incoming} hook. The @code{changegroup} hook is run with +multiple revisions at a time (say, if multiple revisions are being +pushed to this repository in a single @command{hg push} command), +whereas the @code{incoming} hook is run with just one revision at a +time. The @code{hgbuildbot.hook} function will only work with the + at code{changegroup} hook. + +The @code{[hgbuildbot]} section has two other parameters that you +might specify, both of which control the name of the branch that is +attached to the changes coming from this hook. + +One common branch naming policy for Mercurial repositories is to use +it just like Darcs: each branch goes into a separate repository, and +all the branches for a single project share a common parent directory. +For example, you might have @file{/var/repos/PROJECT/trunk/} and + at file{/var/repos/PROJECT/release}. To use this style, use the + at code{branchtype = dirname} setting, which simply uses the last +component of the repository's enclosing directory as the branch name: + + at example +[hgbuildbot] +master = buildmaster.example.org:9987 +branchtype = dirname + at end example + +Another approach is to use Mercurial's built-in branches (the kind +created with @command{hg branch} and listed with @command{hg +branches}). This feature associates persistent names with particular +lines of descent within a single repository. (note that the buildbot + at code{source.Mercurial} checkout step does not yet support this kind +of branch). To have the commit hook deliver this sort of branch name +with the Change object, use @code{branchtype = inrepo}: + + at example +[hgbuildbot] +master = buildmaster.example.org:9987 +branchtype = inrepo + at end example + +Finally, if you want to simply specify the branchname directly, for +all changes, use @code{branch = BRANCHNAME}. This overrides + at code{branchtype}: + + at example +[hgbuildbot] +master = buildmaster.example.org:9987 +branch = trunk + at end example + +If you use @code{branch=} like this, you'll need to put a separate +.hgrc in each repository. If you use @code{branchtype=}, you may be +able to use the same .hgrc for all your repositories, stored in + at file{~/.hgrc} or @file{/etc/mercurial/hgrc}. + @node Build Process, Status Delivery, Getting Source Code Changes, Top @chapter Build Process From warner at users.sourceforge.net Thu Jul 26 22:12:46 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Thu, 26 Jul 2007 22:12:46 +0000 Subject: [Buildbot-commits] buildbot ChangeLog,1.870,1.871 Message-ID: Update of /cvsroot/buildbot/buildbot In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv8657 Modified Files: ChangeLog Log Message: [project @ hgbuildbot.py: make it compatible with both mercurial 0.9.1 and the current 0.9.4] Original author: warner at lothar.com Date: 2007-07-26 22:11:59+00:00 Index: ChangeLog =================================================================== RCS file: /cvsroot/buildbot/buildbot/ChangeLog,v retrieving revision 1.870 retrieving revision 1.871 diff -u -d -r1.870 -r1.871 --- ChangeLog 26 Jul 2007 19:38:45 -0000 1.870 +++ ChangeLog 26 Jul 2007 22:12:44 -0000 1.871 @@ -5,6 +5,9 @@ Thanks! Addresses #50. * docs/buildbot.texinfo (MercurialHook): document it + * buildbot/changes/hgbuildbot.py: change the way imports are done, + to make it compatible with at least hg-0.9.1 and the current 0.9.4 + 2007-07-17 Brian Warner * buildbot/process/buildstep.py (BuildStep.getLog): add a From warner at users.sourceforge.net Thu Jul 26 22:12:46 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Thu, 26 Jul 2007 22:12:46 +0000 Subject: [Buildbot-commits] buildbot/buildbot/changes hgbuildbot.py, 1.1, 1.2 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/changes In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv8657/buildbot/changes Modified Files: hgbuildbot.py Log Message: [project @ hgbuildbot.py: make it compatible with both mercurial 0.9.1 and the current 0.9.4] Original author: warner at lothar.com Date: 2007-07-26 22:11:59+00:00 Index: hgbuildbot.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/changes/hgbuildbot.py,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- hgbuildbot.py 26 Jul 2007 19:38:44 -0000 1.1 +++ hgbuildbot.py 26 Jul 2007 22:12:44 -0000 1.2 @@ -5,13 +5,6 @@ # This software may be used and distributed according to the terms # of the GNU General Public License, incorporated herein by reference. -from mercurial.demandload import * -from mercurial.i18n import gettext as _ -from mercurial.node import * -from buildbot.clients import sendchange -from twisted.internet import defer, reactor -demandload(globals(), "os sys mercurial:hg,util") - # hook extension to send change notifications to buildbot when a changeset is # brought into the repository from elsewhere. # @@ -38,6 +31,24 @@ # # branch = branchname # if set, branch is always branchname +import os + +from mercurial.i18n import gettext as _ +from mercurial.node import bin, hex + +# mercurial's on-demand-importing hacks interfere with the: +#from zope.interface import Interface +# that Twisted needs to do, so disable it. +try: + from mercurial import demandimport + demandimport.disable() +except ImportError: + pass + +from buildbot.clients import sendchange +from twisted.internet import defer, reactor + + def hook(ui, repo, hooktype, node=None, source=None, **kwargs): # read config parameters master = ui.config('hgbuildbot', 'master') From warner at users.sourceforge.net Fri Jul 27 10:13:57 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Fri, 27 Jul 2007 10:13:57 +0000 Subject: [Buildbot-commits] buildbot/buildbot/slave __init__.py,1.1,1.2 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/slave In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv31962/buildbot/slave Modified Files: __init__.py Log Message: [project @ rename c['bots'] to c['slaves'], and use buildbot.slave.BuildSlave instances instead of tuples. Closes #63.] Original author: warner at lothar.com Date: 2007-07-27 09:11:01+00:00 Index: __init__.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/slave/__init__.py,v retrieving revision 1.1 retrieving revision 1.2 diff -u -d -r1.1 -r1.2 --- __init__.py 26 Aug 2004 08:59:53 -0000 1.1 +++ __init__.py 27 Jul 2007 10:13:55 -0000 1.2 @@ -0,0 +1,10 @@ + +from buildbot.util import ComparableMixin + +class BuildSlave(ComparableMixin): + compare_attrs = ["name", "password"] + + def __init__(self, name, password): + self.name = name + self.password = password + From warner at users.sourceforge.net Fri Jul 27 10:13:57 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Fri, 27 Jul 2007 10:13:57 +0000 Subject: [Buildbot-commits] buildbot ChangeLog,1.871,1.872 Message-ID: Update of /cvsroot/buildbot/buildbot In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv31962 Modified Files: ChangeLog Log Message: [project @ rename c['bots'] to c['slaves'], and use buildbot.slave.BuildSlave instances instead of tuples. Closes #63.] Original author: warner at lothar.com Date: 2007-07-27 09:11:01+00:00 Index: ChangeLog =================================================================== RCS file: /cvsroot/buildbot/buildbot/ChangeLog,v retrieving revision 1.871 retrieving revision 1.872 diff -u -d -r1.871 -r1.872 --- ChangeLog 26 Jul 2007 22:12:44 -0000 1.871 +++ ChangeLog 27 Jul 2007 10:13:54 -0000 1.872 @@ -1,3 +1,15 @@ +2007-07-27 Brian Warner + + * buildbot/master.py (BuildMaster.loadConfig_Slaves): rename + c['bots'] to c['slaves'], and use buildbot.slave.BuildSlave + instances instead of tuples. Closes #63. + * buildbot/slave/__init__.py (BuildSlave): define marker class + * buildbot/scripts/sample.cfg: use c['slaves'] in sample config + * docs/buildbot.texinfo (Buildslave Specifiers): document c['slaves'] + * buildbot/test/test_*.py: update tests to match + * buildbot/test/test_config.py (ConfigTest.testBots): verify that + the c['bots'] backwards-compatibility handler works + 2007-07-26 Brian Warner * buildbot/changes/hgbuildbot.py (hook): add an in-process From warner at users.sourceforge.net Fri Jul 27 10:13:57 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Fri, 27 Jul 2007 10:13:57 +0000 Subject: [Buildbot-commits] buildbot/buildbot/scripts sample.cfg,1.12,1.13 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/scripts In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv31962/buildbot/scripts Modified Files: sample.cfg Log Message: [project @ rename c['bots'] to c['slaves'], and use buildbot.slave.BuildSlave instances instead of tuples. Closes #63.] Original author: warner at lothar.com Date: 2007-07-27 09:11:01+00:00 Index: sample.cfg =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/scripts/sample.cfg,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- sample.cfg 22 Sep 2006 05:46:28 -0000 1.12 +++ sample.cfg 27 Jul 2007 10:13:55 -0000 1.13 @@ -16,10 +16,11 @@ ####### BUILDSLAVES -# the 'bots' list defines the set of allowable buildslaves. Each element is a -# tuple of bot-name and bot-password. These correspond to values given to the -# buildslave's mktap invocation. -c['bots'] = [("bot1name", "bot1passwd")] +# the 'slaves' list defines the set of allowable buildslaves. Each element is +# a tuple of bot-name and bot-password. These correspond to values given to +# the buildslave's mktap invocation. +from buildbot.slave import BuildSlave +c['slaves'] = [BuildSlave("bot1name", "bot1passwd")] # 'slavePortnum' defines the TCP port to listen on. This must match the value From warner at users.sourceforge.net Fri Jul 27 10:13:57 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Fri, 27 Jul 2007 10:13:57 +0000 Subject: [Buildbot-commits] buildbot/buildbot master.py,1.105,1.106 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv31962/buildbot Modified Files: master.py Log Message: [project @ rename c['bots'] to c['slaves'], and use buildbot.slave.BuildSlave instances instead of tuples. Closes #63.] Original author: warner at lothar.com Date: 2007-07-27 09:11:01+00:00 Index: master.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/master.py,v retrieving revision 1.105 retrieving revision 1.106 diff -u -d -r1.105 -r1.106 --- master.py 7 Feb 2007 03:42:41 -0000 1.105 +++ master.py 27 Jul 2007 10:13:55 -0000 1.106 @@ -11,6 +11,7 @@ pickle = cPickle except ImportError: import pickle +import warnings from zope.interface import implements from twisted.python import log, components @@ -29,6 +30,7 @@ from buildbot.changes.changes import Change, ChangeMaster from buildbot.sourcestamp import SourceStamp from buildbot import interfaces +from buildbot.slave import BuildSlave ######################################## @@ -38,7 +40,7 @@ class BotPerspective(NewCredPerspective): """This is the master-side representative for a remote buildbot slave. There is exactly one for each slave described in the config file (the - c['bots'] list). When buildbots connect in (.attach), they get a + c['slaves'] list). When buildbots connect in (.attach), they get a reference to this instance. The BotMaster object is stashed as the .service attribute.""" @@ -530,7 +532,7 @@ self.statusTargets = [] - self.bots = [] + self.slaves = [] # this ChangeMaster is a dummy, only used by tests. In the real # buildmaster, where the BuildMaster instance is activated # (startService is called) by twistd, this attribute is overwritten. @@ -649,21 +651,21 @@ log.err("config file must define BuildmasterConfig") raise - known_keys = "bots sources schedulers builders slavePortnum " + \ - "debugPassword manhole " + \ - "status projectName projectURL buildbotURL" - known_keys = known_keys.split() + known_keys = ("bots", "slaves", "sources", "schedulers", "builders", + "slavePortnum", "debugPassword", "manhole", + "status", "projectName", "projectURL", "buildbotURL", + ) for k in config.keys(): if k not in known_keys: log.msg("unknown key '%s' defined in config dictionary" % k) try: # required - bots = config['bots'] sources = config['sources'] schedulers = config['schedulers'] builders = config['builders'] slavePortnum = config['slavePortnum'] + #slaves = config['slaves'] # optional debugPassword = config.get('debugPassword') @@ -678,10 +680,28 @@ log.msg("leaving old configuration in place") raise + #if "bots" in config: + # raise KeyError("c['bots'] is no longer accepted") + + slaves = config.get('slaves', []) + if "bots" in config: + m = ("c['bots'] is deprecated as of 0.7.6, please use " + "c['slaves'] instead") + log.msg(m) + warnings.warn(m, DeprecationWarning) + for name, passwd in config['bots']: + slaves.append(BuildSlave(name, passwd)) + + if "bots" not in config and "slaves" not in config: + log.msg("config dictionary must have either 'bots' or 'slaves'") + log.msg("leaving old configuration in place") + raise KeyError("must have either 'bots' or 'slaves'") + # do some validation first - for name, passwd in bots: - if name in ("debug", "change", "status"): - raise KeyError, "reserved name '%s' used for a bot" % name + for s in slaves: + assert isinstance(s, BuildSlave) + if s.name in ("debug", "change", "status"): + raise KeyError, "reserved name '%s' used for a bot" % s.name if config.has_key('interlocks'): raise KeyError("c['interlocks'] is no longer accepted") @@ -698,7 +718,7 @@ for s in status: assert interfaces.IStatusReceiver(s, None) - slavenames = [name for name,pw in bots] + slavenames = [s.name for s in slaves] buildernames = [] dirnames = [] for b in builders: @@ -784,10 +804,10 @@ self.projectURL = projectURL self.buildbotURL = buildbotURL - # self.bots: Disconnect any that were attached and removed from the - # list. Update self.checker with the new list of passwords, - # including debug/change/status. - d.addCallback(lambda res: self.loadConfig_Slaves(bots)) + # self.slaves: Disconnect any that were attached and removed from the + # list. Update self.checker with the new list of passwords, including + # debug/change/status. + d.addCallback(lambda res: self.loadConfig_Slaves(slaves)) # self.debugPassword if debugPassword: @@ -846,25 +866,30 @@ d.addCallback(lambda res: self.botmaster.maybeStartAllBuilds()) return d - def loadConfig_Slaves(self, bots): + def loadConfig_Slaves(self, slaves): # set up the Checker with the names and passwords of all valid bots self.checker.users = {} # violates abstraction, oh well - for user, passwd in bots: - self.checker.addUser(user, passwd) + for s in slaves: + self.checker.addUser(s.name, s.password) self.checker.addUser("change", "changepw") # identify new/old bots - old = self.bots; oldnames = [name for name,pw in old] - new = bots; newnames = [name for name,pw in new] + old = []; new = [] + for s in slaves: + if s not in self.slaves: + new.append(s) + for s in self.slaves: + if s not in slaves: + old.append(s) # removeSlave will hang up on the old bot - dl = [self.botmaster.removeSlave(name) - for name in oldnames if name not in newnames] - [self.botmaster.addSlave(name) - for name in newnames if name not in oldnames] - - # all done - self.bots = bots - return defer.DeferredList(dl, fireOnOneErrback=1, consumeErrors=0) + dl = [self.botmaster.removeSlave(s.name) for s in old] + d = defer.DeferredList(dl, fireOnOneErrback=True) + def _add(res): + for s in new: + self.botmaster.addSlave(s.name) + self.slaves = slaves + d.addCallback(_add) + return d def loadConfig_Sources(self, sources): log.msg("loadConfig_Sources, change_svc is", self.change_svc, From warner at users.sourceforge.net Fri Jul 27 10:13:58 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Fri, 27 Jul 2007 10:13:58 +0000 Subject: [Buildbot-commits] buildbot/docs buildbot.texinfo,1.104,1.105 Message-ID: Update of /cvsroot/buildbot/buildbot/docs In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv31962/docs Modified Files: buildbot.texinfo Log Message: [project @ rename c['bots'] to c['slaves'], and use buildbot.slave.BuildSlave instances instead of tuples. Closes #63.] Original author: warner at lothar.com Date: 2007-07-27 09:11:01+00:00 Index: buildbot.texinfo =================================================================== RCS file: /cvsroot/buildbot/buildbot/docs/buildbot.texinfo,v retrieving revision 1.104 retrieving revision 1.105 diff -u -d -r1.104 -r1.105 --- buildbot.texinfo 26 Jul 2007 19:38:45 -0000 1.104 +++ buildbot.texinfo 27 Jul 2007 10:13:56 -0000 1.105 @@ -2212,17 +2212,19 @@ @node Buildslave Specifiers, Defining Builders, Setting the slaveport, Configuration @section Buildslave Specifiers - at bcindex c['bots'] + at bcindex c['slaves'] -The @code{c['bots']} key is a list of known buildslaves. Each -buildslave is defined by a tuple of (slavename, slavepassword). These -are the same two values that need to be provided to the buildslave -administrator when they create the buildslave. +The @code{c['slaves']} key is a list of known buildslaves. Each +buildslave is defined by an instance of the BuildSlave class, created +with two values: (slavename, slavepassword). These are the same two +values that need to be provided to the buildslave administrator when +they create the buildslave. @example -c['bots'] = [('bot-solaris', 'solarispasswd'), - ('bot-bsd', 'bsdpasswd'), - ] +from buildbot.slave import BuildSlave +c['slaves'] = [BuildSlave('bot-solaris', 'solarispasswd'), + BuildSlave('bot-bsd', 'bsdpasswd'), + ] @end example The slavenames must be unique, of course. The password exists to @@ -2234,6 +2236,11 @@ will be rejected when they attempt to connect, and a message describing the problem will be put in the log file (see @ref{Logfiles}). +Historical note: in buildbot-0.7.5 and earlier, the @code{c['bots']} +key was used instead, and it took a list of (name, password) tuples. +This key is accepted for backwards compatibility, but is deprecated as +of 0.7.6 and will go away in some future release. + @node Defining Builders, Defining Status Targets, Buildslave Specifiers, Configuration @section Defining Builders @@ -2261,7 +2268,7 @@ @item slavename This specifies which buildslave will be used by this Builder. - at code{slavename} must appear in the @code{c['bots']} list. Each + at code{slavename} must appear in the @code{c['slaves']} list. Each buildslave can accomodate multiple Builders. @item slavenames From warner at users.sourceforge.net Fri Jul 27 10:13:58 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Fri, 27 Jul 2007 10:13:58 +0000 Subject: [Buildbot-commits] buildbot/buildbot/test test_changes.py, 1.10, 1.11 test_config.py, 1.44, 1.45 test_control.py, 1.15, 1.16 test_dependencies.py, 1.6, 1.7 test_locks.py, 1.8, 1.9 test_properties.py, 1.8, 1.9 test_run.py, 1.44, 1.45 test_slaves.py, 1.9, 1.10 test_status.py, 1.41, 1.42 test_steps.py, 1.40, 1.41 test_vc.py, 1.74, 1.75 test_web.py, 1.44, 1.45 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/test In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv31962/buildbot/test Modified Files: test_changes.py test_config.py test_control.py test_dependencies.py test_locks.py test_properties.py test_run.py test_slaves.py test_status.py test_steps.py test_vc.py test_web.py Log Message: [project @ rename c['bots'] to c['slaves'], and use buildbot.slave.BuildSlave instances instead of tuples. Closes #63.] Original author: warner at lothar.com Date: 2007-07-27 09:11:01+00:00 Index: test_changes.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/test/test_changes.py,v retrieving revision 1.10 retrieving revision 1.11 diff -u -d -r1.10 -r1.11 --- test_changes.py 11 Dec 2006 08:23:29 -0000 1.10 +++ test_changes.py 27 Jul 2007 10:13:55 -0000 1.11 @@ -97,7 +97,7 @@ config_empty = """ BuildmasterConfig = c = {} -c['bots'] = [] +c['slaves'] = [] c['builders'] = [] c['sources'] = [] c['schedulers'] = [] Index: test_config.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/test/test_config.py,v retrieving revision 1.44 retrieving revision 1.45 diff -u -d -r1.44 -r1.45 --- test_config.py 18 Jun 2007 03:58:23 -0000 1.44 +++ test_config.py 27 Jul 2007 10:13:55 -0000 1.45 @@ -36,7 +36,7 @@ emptyCfg = \ """ BuildmasterConfig = c = {} -c['bots'] = [] +c['slaves'] = [] c['sources'] = [] c['schedulers'] = [] c['builders'] = [] @@ -49,8 +49,9 @@ buildersCfg = \ """ from buildbot.process.factory import BasicBuildFactory +from buildbot.slave import BuildSlave BuildmasterConfig = c = {} -c['bots'] = [('bot1', 'pw1')] +c['slaves'] = [BuildSlave('bot1', 'pw1')] c['sources'] = [] c['schedulers'] = [] c['slavePortnum'] = 9999 @@ -158,8 +159,9 @@ interlockCfgBad = \ """ from buildbot.process.factory import BasicBuildFactory +from buildbot.slave import BuildSlave c = {} -c['bots'] = [('bot1', 'pw1')] +c['slaves'] = [BuildSlave('bot1', 'pw1')] c['sources'] = [] c['schedulers'] = [] f1 = BasicBuildFactory('cvsroot', 'cvsmodule') @@ -181,8 +183,9 @@ from buildbot.steps.dummy import Dummy from buildbot.process.factory import BuildFactory, s from buildbot.locks import MasterLock +from buildbot.slave import BuildSlave c = {} -c['bots'] = [('bot1', 'pw1')] +c['slaves'] = [BuildSlave('bot1', 'pw1')] c['sources'] = [] c['schedulers'] = [] l1 = MasterLock('lock1') @@ -203,8 +206,9 @@ from buildbot.steps.dummy import Dummy from buildbot.process.factory import BuildFactory, s from buildbot.locks import MasterLock, SlaveLock +from buildbot.slave import BuildSlave c = {} -c['bots'] = [('bot1', 'pw1')] +c['slaves'] = [BuildSlave('bot1', 'pw1')] c['sources'] = [] c['schedulers'] = [] l1 = MasterLock('lock1') @@ -225,8 +229,9 @@ from buildbot.steps.dummy import Dummy from buildbot.process.factory import BuildFactory, s from buildbot.locks import MasterLock +from buildbot.slave import BuildSlave c = {} -c['bots'] = [('bot1', 'pw1')] +c['slaves'] = [BuildSlave('bot1', 'pw1')] c['sources'] = [] c['schedulers'] = [] l1 = MasterLock('lock1') @@ -247,8 +252,9 @@ """ from buildbot.process.factory import BasicBuildFactory from buildbot.locks import MasterLock +from buildbot.slave import BuildSlave c = {} -c['bots'] = [('bot1', 'pw1')] +c['slaves'] = [BuildSlave('bot1', 'pw1')] c['sources'] = [] c['schedulers'] = [] f1 = BasicBuildFactory('cvsroot', 'cvsmodule') @@ -268,8 +274,9 @@ """ from buildbot.process.factory import BasicBuildFactory from buildbot.locks import MasterLock +from buildbot.slave import BuildSlave c = {} -c['bots'] = [('bot1', 'pw1')] +c['slaves'] = [BuildSlave('bot1', 'pw1')] c['sources'] = [] c['schedulers'] = [] f1 = BasicBuildFactory('cvsroot', 'cvsmodule') @@ -291,8 +298,9 @@ from buildbot.steps.dummy import Dummy from buildbot.process.factory import BuildFactory, s from buildbot.locks import MasterLock +from buildbot.slave import BuildSlave c = {} -c['bots'] = [('bot1', 'pw1')] +c['slaves'] = [BuildSlave('bot1', 'pw1')] c['sources'] = [] c['schedulers'] = [] l1 = MasterLock('lock1') @@ -315,8 +323,9 @@ from buildbot.steps.dummy import Dummy from buildbot.process.factory import BuildFactory, s from buildbot.locks import MasterLock +from buildbot.slave import BuildSlave c = {} -c['bots'] = [('bot1', 'pw1')] +c['slaves'] = [BuildSlave('bot1', 'pw1')] c['sources'] = [] c['schedulers'] = [] l1 = MasterLock('lock1') @@ -339,8 +348,9 @@ from buildbot.steps.dummy import Dummy from buildbot.process.factory import BuildFactory, s from buildbot.locks import MasterLock +from buildbot.slave import BuildSlave c = {} -c['bots'] = [('bot1', 'pw1')] +c['slaves'] = [BuildSlave('bot1', 'pw1')] c['sources'] = [] c['schedulers'] = [] l1 = MasterLock('lock1') @@ -362,8 +372,9 @@ """ from buildbot.scheduler import Scheduler, Dependent from buildbot.process.factory import BasicBuildFactory +from buildbot.slave import BuildSlave c = {} -c['bots'] = [('bot1', 'pw1')] +c['slaves'] = [BuildSlave('bot1', 'pw1')] c['sources'] = [] f1 = BasicBuildFactory('cvsroot', 'cvsmodule') b1 = {'name':'builder1', 'slavename':'bot1', @@ -496,6 +507,15 @@ master.loadConfig(emptyCfg) self.failUnlessEqual(master.checker.users, {"change": "changepw"}) + slavesCfg = (emptyCfg + + "from buildbot.slave import BuildSlave\n" + "c['slaves'] = [BuildSlave('bot1','pw1'), " + "BuildSlave('bot2','pw2')]\n") + master.loadConfig(slavesCfg) + self.failUnlessEqual(master.checker.users, + {"change": "changepw", + "bot1": "pw1", + "bot2": "pw2"}) def testSources(self): @@ -1107,8 +1127,9 @@ from buildbot.process.factory import BuildFactory, s from buildbot.steps.shell import ShellCommand from buildbot.steps.source import Darcs +from buildbot.slave import BuildSlave BuildmasterConfig = c = {} -c['bots'] = [('bot1', 'pw1')] +c['slaves'] = [BuildSlave('bot1', 'pw1')] c['sources'] = [] c['schedulers'] = [] c['slavePortnum'] = 9999 Index: test_control.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/test/test_control.py,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- test_control.py 11 Dec 2006 08:40:17 -0000 1.15 +++ test_control.py 27 Jul 2007 10:13:55 -0000 1.16 @@ -15,6 +15,7 @@ config = """ from buildbot.process import factory from buildbot.steps import dummy +from buildbot.slave import BuildSlave def s(klass, **kwargs): return (klass, kwargs) @@ -23,7 +24,7 @@ s(dummy.Dummy, timeout=1), ]) c = {} -c['bots'] = [['bot1', 'sekrit']] +c['slaves'] = [BuildSlave('bot1', 'sekrit')] c['sources'] = [] c['schedulers'] = [] c['builders'] = [{'name': 'force', 'slavename': 'bot1', Index: test_dependencies.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/test/test_dependencies.py,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- test_dependencies.py 11 Dec 2006 08:23:29 -0000 1.6 +++ test_dependencies.py 27 Jul 2007 10:13:55 -0000 1.7 @@ -11,11 +11,12 @@ from buildbot import scheduler from buildbot.process import factory from buildbot.steps import dummy +from buildbot.slave import BuildSlave s = factory.s from buildbot.test.test_locks import LockStep BuildmasterConfig = c = {} -c['bots'] = [('bot1', 'sekrit'), ('bot2', 'sekrit')] +c['slaves'] = [BuildSlave('bot1', 'sekrit'), BuildSlave('bot2', 'sekrit')] c['sources'] = [] c['schedulers'] = [] c['slavePortnum'] = 0 Index: test_locks.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/test/test_locks.py,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- test_locks.py 11 Dec 2006 08:23:29 -0000 1.8 +++ test_locks.py 27 Jul 2007 10:13:55 -0000 1.9 @@ -283,11 +283,12 @@ config_1 = """ from buildbot import locks from buildbot.process import factory +from buildbot.slave import BuildSlave s = factory.s from buildbot.test.test_locks import LockStep BuildmasterConfig = c = {} -c['bots'] = [('bot1', 'sekrit'), ('bot2', 'sekrit')] +c['slaves'] = [BuildSlave('bot1', 'sekrit'), BuildSlave('bot2', 'sekrit')] c['sources'] = [] c['schedulers'] = [] c['slavePortnum'] = 0 Index: test_properties.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/test/test_properties.py,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- test_properties.py 4 Jul 2007 05:09:41 -0000 1.8 +++ test_properties.py 27 Jul 2007 10:13:55 -0000 1.9 @@ -135,10 +135,11 @@ run_config = """ from buildbot.process import factory from buildbot.steps.shell import ShellCommand, WithProperties +from buildbot.slave import BuildSlave s = factory.s BuildmasterConfig = c = {} -c['bots'] = [('bot1', 'sekrit')] +c['slaves'] = [BuildSlave('bot1', 'sekrit')] c['sources'] = [] c['schedulers'] = [] c['slavePortnum'] = 0 Index: test_run.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/test/test_run.py,v retrieving revision 1.44 retrieving revision 1.45 diff -u -d -r1.44 -r1.45 --- test_run.py 3 Jul 2007 17:25:08 -0000 1.44 +++ test_run.py 27 Jul 2007 10:13:55 -0000 1.45 @@ -15,6 +15,7 @@ config_base = """ from buildbot.process import factory from buildbot.steps import dummy +from buildbot.slave import BuildSlave s = factory.s f1 = factory.QuickBuildFactory('fakerep', 'cvsmodule', configure=None) @@ -25,7 +26,7 @@ ]) BuildmasterConfig = c = {} -c['bots'] = [['bot1', 'sekrit']] +c['slaves'] = [BuildSlave('bot1', 'sekrit')] c['sources'] = [] c['schedulers'] = [] c['builders'] = [] Index: test_slaves.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/test/test_slaves.py,v retrieving revision 1.9 retrieving revision 1.10 diff -u -d -r1.9 -r1.10 --- test_slaves.py 3 Jul 2007 17:25:08 -0000 1.9 +++ test_slaves.py 27 Jul 2007 10:13:55 -0000 1.10 @@ -13,10 +13,12 @@ config_1 = """ from buildbot.process import factory from buildbot.steps import dummy +from buildbot.slave import BuildSlave s = factory.s BuildmasterConfig = c = {} -c['bots'] = [('bot1', 'sekrit'), ('bot2', 'sekrit'), ('bot3', 'sekrit')] +c['slaves'] = [BuildSlave('bot1', 'sekrit'), BuildSlave('bot2', 'sekrit'), + BuildSlave('bot3', 'sekrit')] c['sources'] = [] c['schedulers'] = [] c['slavePortnum'] = 0 @@ -190,10 +192,11 @@ config_3 = """ from buildbot.process import factory from buildbot.steps import dummy +from buildbot.slave import BuildSlave s = factory.s BuildmasterConfig = c = {} -c['bots'] = [('bot1', 'sekrit')] +c['slaves'] = [BuildSlave('bot1', 'sekrit')] c['sources'] = [] c['schedulers'] = [] c['slavePortnum'] = 0 Index: test_status.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/test/test_status.py,v retrieving revision 1.41 retrieving revision 1.42 diff -u -d -r1.41 -r1.42 --- test_status.py 17 Apr 2007 06:38:51 -0000 1.41 +++ test_status.py 27 Jul 2007 10:13:55 -0000 1.42 @@ -729,6 +729,7 @@ config_base = """ from buildbot.process import factory from buildbot.steps import dummy +from buildbot.slave import BuildSlave s = factory.s f1 = factory.QuickBuildFactory('fakerep', 'cvsmodule', configure=None) @@ -739,7 +740,7 @@ ]) BuildmasterConfig = c = {} -c['bots'] = [['bot1', 'sekrit']] +c['slaves'] = [BuildSlave('bot1', 'sekrit')] c['sources'] = [] c['schedulers'] = [] c['builders'] = [] Index: test_steps.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/test/test_steps.py,v retrieving revision 1.40 retrieving revision 1.41 diff -u -d -r1.40 -r1.41 --- test_steps.py 17 Jul 2007 19:48:40 -0000 1.40 +++ test_steps.py 27 Jul 2007 10:13:55 -0000 1.41 @@ -311,11 +311,12 @@ version_config = """ from buildbot.process import factory from buildbot.test.test_steps import VersionCheckingStep +from buildbot.slave import BuildSlave BuildmasterConfig = c = {} f1 = factory.BuildFactory([ factory.s(VersionCheckingStep), ]) -c['bots'] = [['bot1', 'sekrit']] +c['slaves'] = [BuildSlave('bot1', 'sekrit')] c['sources'] = [] c['schedulers'] = [] c['builders'] = [{'name':'quick', 'slavename':'bot1', Index: test_vc.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/test/test_vc.py,v retrieving revision 1.74 retrieving revision 1.75 diff -u -d -r1.74 -r1.75 --- test_vc.py 18 Jun 2007 02:52:49 -0000 1.74 +++ test_vc.py 27 Jul 2007 10:13:55 -0000 1.75 @@ -97,13 +97,14 @@ config_vc = """ from buildbot.process import factory from buildbot.steps import source +from buildbot.slave import BuildSlave s = factory.s f1 = factory.BuildFactory([ %s, ]) c = {} -c['bots'] = [['bot1', 'sekrit']] +c['slaves'] = [BuildSlave('bot1', 'sekrit')] c['sources'] = [] c['schedulers'] = [] c['builders'] = [{'name': 'vc', 'slavename': 'bot1', Index: test_web.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/test/test_web.py,v retrieving revision 1.44 retrieving revision 1.45 diff -u -d -r1.44 -r1.45 --- test_web.py 18 Jun 2007 02:52:49 -0000 1.44 +++ test_web.py 27 Jul 2007 10:13:55 -0000 1.45 @@ -36,7 +36,7 @@ base_config = """ from buildbot.status import html BuildmasterConfig = c = { - 'bots': [], + 'slaves': [], 'sources': [], 'schedulers': [], 'builders': [], @@ -281,6 +281,7 @@ from buildbot.steps import dummy from buildbot.scheduler import Scheduler from buildbot.changes.base import ChangeSource +from buildbot.slave import BuildSlave s = factory.s class DiscardScheduler(Scheduler): @@ -290,7 +291,7 @@ pass BuildmasterConfig = c = {} -c['bots'] = [('bot1', 'sekrit'), ('bot2', 'sekrit')] +c['slaves'] = [BuildSlave('bot1', 'sekrit'), BuildSlave('bot2', 'sekrit')] c['sources'] = [DummyChangeSource()] c['schedulers'] = [DiscardScheduler('discard', None, 60, ['b1'])] c['slavePortnum'] = 0 @@ -385,9 +386,10 @@ config = """ from buildbot.status import html from buildbot.process.factory import BasicBuildFactory +from buildbot.slave import BuildSlave f1 = BasicBuildFactory('cvsroot', 'cvsmodule') BuildmasterConfig = { - 'bots': [('bot1', 'passwd1')], + 'slaves': [BuildSlave('bot1', 'passwd1')], 'sources': [], 'schedulers': [], 'builders': [{'name': 'builder1', 'slavename': 'bot1', From warner at users.sourceforge.net Sat Jul 28 02:03:03 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sat, 28 Jul 2007 02:03:03 +0000 Subject: [Buildbot-commits] buildbot ChangeLog,1.872,1.873 Message-ID: Update of /cvsroot/buildbot/buildbot In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv6911 Modified Files: ChangeLog Log Message: [project @ buildbot.texinfo: move the changesource types up a level, removing the one-entry menu in the process] Original author: warner at lothar.com Date: 2007-07-28 00:47:29+00:00 Index: ChangeLog =================================================================== RCS file: /cvsroot/buildbot/buildbot/ChangeLog,v retrieving revision 1.872 retrieving revision 1.873 diff -u -d -r1.872 -r1.873 --- ChangeLog 27 Jul 2007 10:13:54 -0000 1.872 +++ ChangeLog 28 Jul 2007 02:03:00 -0000 1.873 @@ -1,5 +1,9 @@ 2007-07-27 Brian Warner + * docs/buildbot.texinfo (Getting Source Code Changes): move all + the changesource types up a level, removing the one-entry menu in + the process + * buildbot/master.py (BuildMaster.loadConfig_Slaves): rename c['bots'] to c['slaves'], and use buildbot.slave.BuildSlave instances instead of tuples. Closes #63. From warner at users.sourceforge.net Sat Jul 28 02:03:04 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sat, 28 Jul 2007 02:03:04 +0000 Subject: [Buildbot-commits] buildbot/docs buildbot.texinfo,1.105,1.106 Message-ID: Update of /cvsroot/buildbot/buildbot/docs In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv6911/docs Modified Files: buildbot.texinfo Log Message: [project @ buildbot.texinfo: move the changesource types up a level, removing the one-entry menu in the process] Original author: warner at lothar.com Date: 2007-07-28 00:47:29+00:00 Index: buildbot.texinfo =================================================================== RCS file: /cvsroot/buildbot/buildbot/docs/buildbot.texinfo,v retrieving revision 1.105 retrieving revision 1.106 diff -u -d -r1.105 -r1.106 --- buildbot.texinfo 27 Jul 2007 10:13:56 -0000 1.105 +++ buildbot.texinfo 28 Jul 2007 02:03:01 -0000 1.106 @@ -143,9 +143,6 @@ Getting Source Code Changes * Change Sources:: - -Change Sources - * Choosing ChangeSources:: * CVSToys - PBService:: * CVSToys - mail notification:: @@ -2475,11 +2472,20 @@ @menu * Change Sources:: +* Choosing ChangeSources:: +* CVSToys - PBService:: +* CVSToys - mail notification:: +* Other mail notification ChangeSources:: +* PBChangeSource:: +* P4Source:: +* BonsaiPoller:: +* SVNPoller:: +* MercurialHook:: @end menu - at node Change Sources, , Getting Source Code Changes, Getting Source Code Changes + at node Change Sources, Choosing ChangeSources, Getting Source Code Changes, Getting Source Code Changes @section Change Sources @c TODO: rework this, the one-buildmaster-one-tree thing isn't quite @@ -2579,20 +2585,8 @@ a suitable @code{MaildirSource}. - at menu -* Choosing ChangeSources:: -* CVSToys - PBService:: -* CVSToys - mail notification:: -* Other mail notification ChangeSources:: -* PBChangeSource:: -* P4Source:: -* BonsaiPoller:: -* SVNPoller:: -* MercurialHook:: - at end menu - - at node Choosing ChangeSources, CVSToys - PBService, Change Sources, Change Sources - at subsection Choosing ChangeSources + at node Choosing ChangeSources, CVSToys - PBService, Change Sources, Getting Source Code Changes + at section Choosing ChangeSources The @code{master.cfg} configuration file has a dictionary key named @code{BuildmasterConfig['sources']}, which holds a list of @@ -2617,8 +2611,8 @@ files. - at node CVSToys - PBService, CVSToys - mail notification, Choosing ChangeSources, Change Sources - at subsection CVSToys - PBService + at node CVSToys - PBService, CVSToys - mail notification, Choosing ChangeSources, Getting Source Code Changes + at section CVSToys - PBService @csindex buildbot.changes.freshcvs.FreshCVSSource @@ -2691,8 +2685,8 @@ - at node CVSToys - mail notification, Other mail notification ChangeSources, CVSToys - PBService, Change Sources - at subsection CVSToys - mail notification + at node CVSToys - mail notification, Other mail notification ChangeSources, CVSToys - PBService, Getting Source Code Changes + at section CVSToys - mail notification @csindex buildbot.changes.mail.FCMaildirSource @@ -2727,8 +2721,8 @@ The @code{FCMaildirSource} is created with two parameters: the directory name of the maildir root, and the prefix to strip. - at node Other mail notification ChangeSources, PBChangeSource, CVSToys - mail notification, Change Sources - at subsection Other mail notification ChangeSources + at node Other mail notification ChangeSources, PBChangeSource, CVSToys - mail notification, Getting Source Code Changes + at section Other mail notification ChangeSources @csindex buildbot.changes.mail.SyncmailMaildirSource @csindex buildbot.changes.mail.BonsaiMaildirSource @@ -2741,8 +2735,8 @@ @code{BonsaiMaildirSource} parses messages sent out by Bonsai. - at node PBChangeSource, P4Source, Other mail notification ChangeSources, Change Sources - at subsection PBChangeSource + at node PBChangeSource, P4Source, Other mail notification ChangeSources, Getting Source Code Changes + at section PBChangeSource @csindex buildbot.changes.pb.PBChangeSource @@ -2811,8 +2805,8 @@ @end table - at node P4Source, BonsaiPoller, PBChangeSource, Change Sources - at subsection P4Source + at node P4Source, BonsaiPoller, PBChangeSource, Getting Source Code Changes + at section P4Source @csindex buildbot.changes.p4poller.P4Source @@ -2862,8 +2856,8 @@ )) @end example - at node BonsaiPoller, SVNPoller, P4Source, Change Sources - at subsection BonsaiPoller + at node BonsaiPoller, SVNPoller, P4Source, Getting Source Code Changes + at section BonsaiPoller @csindex buildbot.changes.bonsaipoller.BonsaiPoller @@ -2879,8 +2873,8 @@ arguments it accepts. - at node SVNPoller, MercurialHook, BonsaiPoller, Change Sources - at subsection SVNPoller + at node SVNPoller, MercurialHook, BonsaiPoller, Getting Source Code Changes + at section SVNPoller @csindex buildbot.changes.svnpoller.SVNPoller @@ -3153,8 +3147,8 @@ return (branch, '/'.join(pieces)) @end example - at node MercurialHook, , SVNPoller, Change Sources - at subsection MercurialHook + at node MercurialHook, , SVNPoller, Getting Source Code Changes + at section MercurialHook Since Mercurial is written in python, the hook script can invoke Buildbot's @code{sendchange} function directly, rather than having to From warner at users.sourceforge.net Sat Jul 28 02:03:13 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sat, 28 Jul 2007 02:03:13 +0000 Subject: [Buildbot-commits] buildbot ChangeLog,1.873,1.874 Message-ID: Update of /cvsroot/buildbot/buildbot In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv7187 Modified Files: ChangeLog Log Message: [project @ buildbot.texinfo: refactor docs on email-based ChangeSources] Original author: warner at lothar.com Date: 2007-07-28 01:55:13+00:00 Index: ChangeLog =================================================================== RCS file: /cvsroot/buildbot/buildbot/ChangeLog,v retrieving revision 1.873 retrieving revision 1.874 diff -u -d -r1.873 -r1.874 --- ChangeLog 28 Jul 2007 02:03:00 -0000 1.873 +++ ChangeLog 28 Jul 2007 02:03:09 -0000 1.874 @@ -1,5 +1,8 @@ 2007-07-27 Brian Warner + * docs/buildbot.texinfo (Getting Source Code Changes): refactor + docs on email-based ChangeSources + * docs/buildbot.texinfo (Getting Source Code Changes): move all the changesource types up a level, removing the one-entry menu in the process From warner at users.sourceforge.net Sat Jul 28 02:03:13 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sat, 28 Jul 2007 02:03:13 +0000 Subject: [Buildbot-commits] buildbot/docs buildbot.texinfo,1.106,1.107 Message-ID: Update of /cvsroot/buildbot/buildbot/docs In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv7187/docs Modified Files: buildbot.texinfo Log Message: [project @ buildbot.texinfo: refactor docs on email-based ChangeSources] Original author: warner at lothar.com Date: 2007-07-28 01:55:13+00:00 Index: buildbot.texinfo =================================================================== RCS file: /cvsroot/buildbot/buildbot/docs/buildbot.texinfo,v retrieving revision 1.106 retrieving revision 1.107 diff -u -d -r1.106 -r1.107 --- buildbot.texinfo 28 Jul 2007 02:03:01 -0000 1.106 +++ buildbot.texinfo 28 Jul 2007 02:03:09 -0000 1.107 @@ -145,14 +145,25 @@ * Change Sources:: * Choosing ChangeSources:: * CVSToys - PBService:: -* CVSToys - mail notification:: -* Other mail notification ChangeSources:: +* Mail-parsing ChangeSources:: * PBChangeSource:: * P4Source:: * BonsaiPoller:: * SVNPoller:: * MercurialHook:: +Mail-parsing ChangeSources + +* Subscribing the Buildmaster:: +* Using Maildirs:: +* Parsing Email Change Messages:: + +Parsing Email Change Messages + +* CVSToys MailNotification:: +* SyncmailMaildirSource:: +* BonsaiMaildirSource:: + Build Process * Build Steps:: @@ -1380,7 +1391,7 @@ the @code{repoURL} argument. - at uref{http://abridgegame.org/darcs/, Darcs} doesn't really have the + at uref{http://darcs.net/, Darcs} doesn't really have the notion of a single master repository. Nor does it really have branches. In Darcs, each working directory is also a repository, and there are operations to push and pull patches from one of these @@ -2474,8 +2485,7 @@ * Change Sources:: * Choosing ChangeSources:: * CVSToys - PBService:: -* CVSToys - mail notification:: -* Other mail notification ChangeSources:: +* Mail-parsing ChangeSources:: * PBChangeSource:: * P4Source:: * BonsaiPoller:: @@ -2611,7 +2621,7 @@ files. - at node CVSToys - PBService, CVSToys - mail notification, Choosing ChangeSources, Getting Source Code Changes + at node CVSToys - PBService, Mail-parsing ChangeSources, Choosing ChangeSources, Getting Source Code Changes @section CVSToys - PBService @csindex buildbot.changes.freshcvs.FreshCVSSource @@ -2684,9 +2694,147 @@ it handles. + at node Mail-parsing ChangeSources, PBChangeSource, CVSToys - PBService, Getting Source Code Changes + at section Mail-parsing ChangeSources + +Many projects publish information about changes to their source tree +by sending an email message out to a mailing list, frequently named +PROJECT-commits or PROJECT-changes. Each message usually contains a +description of the change (who made the change, which files were +affected) and sometimes a copy of the diff. Humans can subscribe to +this list to stay informed about what's happening to the source tree. + +The Buildbot can also be subscribed to a -commits mailing list, and +can trigger builds in response to Changes that it hears about. The +buildmaster admin needs to arrange for these email messages to arrive +in a place where the buildmaster can find them, and configure the +buildmaster to parse the messages correctly. Once that is in place, +the email parser will create Change objects and deliver them to the +Schedulers (see @pxref{Scheduler Types}) just like any other +ChangeSource. + +There are two components to setting up an email-based ChangeSource. +The first is to route the email messages to the buildmaster, which is +done by dropping them into a ``maildir''. The second is to actually +parse the messages, which is highly dependent upon the tool that was +used to create them. Each VC system has a collection of favorite +change-emailing tools, and each has a slightly different format, so +each has a different parsing function. + + at menu +* Subscribing the Buildmaster:: +* Using Maildirs:: +* Parsing Email Change Messages:: + at end menu + + at node Subscribing the Buildmaster, Using Maildirs, Mail-parsing ChangeSources, Mail-parsing ChangeSources + at subsection Subscribing the Buildmaster + +The recommended way to install the buildbot is to create a dedicated +account for the buildmaster. If you do this, the account will probably +have a distinct email address (perhaps + at email{buildmaster@@example.org}). Then just arrange for this +account's email to be delivered to a suitable maildir (described in +the next section). + +If the buildbot does not have its own account, ``extension addresses'' +can be used to distinguish between email intended for the buildmaster +and email intended for the rest of the account. In most modern MTAs, +the e.g. @code{foo@@example.org} account has control over every email +address at example.org which begins with "foo", such that email +addressed to @email{account-foo@@example.org} can be delivered to a +different destination than @email{account-bar@@example.org}. qmail +does this by using separate .qmail files for the two destinations +(@file{.qmail-foo} and @file{.qmail-bar}, with @file{.qmail} +controlling the base address and @file{.qmail-default} controlling all +other extensions). Other MTAs have similar mechanisms. + +Thus you can assign an extension address like + at email{foo-buildmaster@@example.org} to the buildmaster, and retain + at email{foo@@example.org} for your own use. + + + at node Using Maildirs, Parsing Email Change Messages, Subscribing the Buildmaster, Mail-parsing ChangeSources + at subsection Using Maildirs + +A ``maildir'' is a simple directory structure originally developed for +qmail that allows safe atomic update without locking. Create a base +directory with three subdirectories: ``new'', ``tmp'', and ``cur''. +When messages arrive, they are put into a uniquely-named file (using +pids, timestamps, and random numbers) in ``tmp''. When the file is +complete, it is atomically renamed into ``new''. Eventually the +buildmaster notices the file in ``new'', reads and parses the +contents, then moves it into ``cur''. A cronjob can be used to delete +files in ``cur'' at leisure. + +Maildirs are frequently created with the @command{maildirmake} tool, +but a simple @command{mkdir -p ~/MAILDIR/@{cur,new,tmp@}} is pretty much +equivalent. + +Many modern MTAs can deliver directly to maildirs. The usual .forward +or .procmailrc syntax is to name the base directory with a trailing +slash, so something like @code{~/MAILDIR/} . qmail and postfix are +maildir-capable MTAs, and procmail is a maildir-capable MDA (Mail +Delivery Agent). + +For MTAs which cannot put files into maildirs directly, the +``safecat'' tool can be executed from a .forward file to accomplish +the same thing. + +The Buildmaster uses the linux DNotify facility to receive immediate +notification when the maildir's ``new'' directory has changed. When +this facility is not available, it polls the directory for new +messages, every 10 seconds by default. + + at node Parsing Email Change Messages, , Using Maildirs, Mail-parsing ChangeSources + at subsection Parsing Email Change Messages + +The second component to setting up an email-based ChangeSource is to +parse the actual notices. This is highly dependent upon the VC system +and commit script in use. + +A couple of common tools used to create these change emails are: + + at table @samp + + at item CVS + at table @samp + at item CVSToys MailNotifier +http://twistedmatrix.com/users/acapnotic/wares/code/CVSToys/ + at item Bonsai notification +http://www.mozilla.org/bonsai.html + at item syncmail +http://sourceforge.net/projects/cvs-syncmail + at end table + + at item SVN + at table @samp + at item svnmailer +http://opensource.perlig.de/en/svnmailer/ + at item commit-email.pl +(distributed with Subversion) + at end table + + at item Mercurial + at table @samp + at item NotifyExtension +http://www.selenic.com/mercurial/wiki/index.cgi/NotifyExtension + at end table + + at end table + +The following sections describe the parsers available for each of +these tools. + + at menu +* CVSToys MailNotification:: +* SyncmailMaildirSource:: +* BonsaiMaildirSource:: + at end menu + + at node CVSToys MailNotification, SyncmailMaildirSource, Parsing Email Change Messages, Parsing Email Change Messages + at subsubsection CVSToys MailNotification - at node CVSToys - mail notification, Other mail notification ChangeSources, CVSToys - PBService, Getting Source Code Changes - at section CVSToys - mail notification @csindex buildbot.changes.mail.FCMaildirSource @@ -2699,43 +2847,28 @@ The Buildbot's @code{FCMaildirSource} is a ChangeSource which knows how to parse these CVSToys messages and turn them into Change objects. -It watches a Maildir for new messages. The usually installation -process looks like: - - at enumerate - at item -Create a mailing list, @code{projectname-commits}. - at item -In CVSToys' freshCfg file, use a @code{MailNotification} action to -send commit mail to this mailing list. - at item -Subscribe the buildbot user to the mailing list. - at item -Configure your .qmail or .forward file to deliver these messages into -a maildir. - at item -In the Buildbot's master.cfg file, use a @code{FCMaildirSource} to -watch the maildir for commit messages. - at end enumerate +It watches a Maildir for new messages. The @code{FCMaildirSource} is created with two parameters: the directory name of the maildir root, and the prefix to strip. - at node Other mail notification ChangeSources, PBChangeSource, CVSToys - mail notification, Getting Source Code Changes - at section Other mail notification ChangeSources + at node SyncmailMaildirSource, BonsaiMaildirSource, CVSToys MailNotification, Parsing Email Change Messages + at subsubsection SyncmailMaildirSource @csindex buildbot.changes.mail.SyncmailMaildirSource - at csindex buildbot.changes.mail.BonsaiMaildirSource - -There are other types of maildir-watching ChangeSources, which only -differ in the function used to parse the message body. @code{SyncmailMaildirSource} knows how to parse the message format used in mail sent by Syncmail. + at node BonsaiMaildirSource, , SyncmailMaildirSource, Parsing Email Change Messages + at subsubsection BonsaiMaildirSource + + at csindex buildbot.changes.mail.BonsaiMaildirSource + @code{BonsaiMaildirSource} parses messages sent out by Bonsai. - at node PBChangeSource, P4Source, Other mail notification ChangeSources, Getting Source Code Changes + + at node PBChangeSource, P4Source, Mail-parsing ChangeSources, Getting Source Code Changes @section PBChangeSource @csindex buildbot.changes.pb.PBChangeSource @@ -3663,7 +3796,7 @@ The @code{Darcs} build step performs a - at uref{http://abridgegame.org/darcs/, Darcs} checkout or update. + at uref{http://darcs.net/, Darcs} checkout or update. Like @xref{SVN}, this step can either be configured to always check out a specific tree, or set up to pull from a particular branch that From warner at users.sourceforge.net Sat Jul 28 02:37:17 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sat, 28 Jul 2007 02:37:17 +0000 Subject: [Buildbot-commits] buildbot/docs buildbot.texinfo,1.107,1.108 Message-ID: Update of /cvsroot/buildbot/buildbot/docs In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv20422/docs Modified Files: buildbot.texinfo Log Message: [project @ buildbot.texinfo: more MaildirSource docs refactoring] Original author: warner at lothar.com Date: 2007-07-28 02:36:12+00:00 Index: buildbot.texinfo =================================================================== RCS file: /cvsroot/buildbot/buildbot/docs/buildbot.texinfo,v retrieving revision 1.107 retrieving revision 1.108 diff -u -d -r1.107 -r1.108 --- buildbot.texinfo 28 Jul 2007 02:03:09 -0000 1.107 +++ buildbot.texinfo 28 Jul 2007 02:37:14 -0000 1.108 @@ -160,7 +160,7 @@ Parsing Email Change Messages -* CVSToys MailNotification:: +* FCMaildirSource:: * SyncmailMaildirSource:: * BonsaiMaildirSource:: @@ -2719,7 +2719,18 @@ parse the messages, which is highly dependent upon the tool that was used to create them. Each VC system has a collection of favorite change-emailing tools, and each has a slightly different format, so -each has a different parsing function. +each has a different parsing function. There is a separate +ChangeSource variant for each parsing function. + +Once you've chosen a maildir location and a parsing function, create +the change source and put it in the @code{c['sources']} list. Since +buildmasters usually only have a single change source, + at code{c['sources']} can also be a single instance: + + at example +from buildbot.changes.mail import SyncmailMaildirSource +c['sources'] = SyncmailMaildirSource("~/maildir-buildbot", prefix="/trunk/") + at end example @menu * Subscribing the Buildmaster:: @@ -2800,11 +2811,11 @@ @item CVS @table @samp @item CVSToys MailNotifier -http://twistedmatrix.com/users/acapnotic/wares/code/CVSToys/ + at ref{FCMaildirSource} @item Bonsai notification -http://www.mozilla.org/bonsai.html + at ref{BonsaiMaildirSource} @item syncmail -http://sourceforge.net/projects/cvs-syncmail + at ref{SyncmailMaildirSource} @end table @item SVN @@ -2823,49 +2834,75 @@ @end table +Most of these parsers accept a @code{prefix=} argument, which is used +to limit the set of files that the buildmaster pays attention to. This +is most useful for systems like CVS and SVN which put multiple +projects in a single repository (or use repository names to indicate +branches). Each filename that appears in the email is tested against +the prefix: if the filename does not start with the prefix, the file +is ignored. If the filename @emph{does} start with the prefix, that +prefix is stripped from the filename before any further processing is +done. Thus the prefix usually ends with a slash. + + The following sections describe the parsers available for each of these tools. @menu -* CVSToys MailNotification:: +* FCMaildirSource:: * SyncmailMaildirSource:: * BonsaiMaildirSource:: @end menu - at node CVSToys MailNotification, SyncmailMaildirSource, Parsing Email Change Messages, Parsing Email Change Messages - at subsubsection CVSToys MailNotification + at node FCMaildirSource, SyncmailMaildirSource, Parsing Email Change Messages, Parsing Email Change Messages + at subsubsection FCMaildirSource @csindex buildbot.changes.mail.FCMaildirSource -CVSToys also provides a @code{MailNotification} action which will send -email to a list of recipients for each commit. This tends to work -better than using @code{/bin/mail} from within the CVSROOT/loginfo -file directly, as CVSToys will batch together all files changed during -the same CVS invocation, and can provide more information (like -creating a ViewCVS URL for each file changed). +http://twistedmatrix.com/users/acapnotic/wares/code/CVSToys/ -The Buildbot's @code{FCMaildirSource} is a ChangeSource which knows -how to parse these CVSToys messages and turn them into Change objects. -It watches a Maildir for new messages. +This parser works with the CVSToys @code{MailNotification} action, +which will send email to a list of recipients for each commit. This +tends to work better than using @code{/bin/mail} from within the +CVSROOT/loginfo file directly, as CVSToys will batch together all +files changed during the same CVS invocation, and can provide more +information (like creating a ViewCVS URL for each file changed). -The @code{FCMaildirSource} is created with two parameters: the -directory name of the maildir root, and the prefix to strip. +The Buildbot's @code{FCMaildirSource} knows for to parse these CVSToys +messages and turn them into Change objects. It can be given two +parameters: the directory name of the maildir root, and the prefix to +strip. - at node SyncmailMaildirSource, BonsaiMaildirSource, CVSToys MailNotification, Parsing Email Change Messages + at example +from buildbot.changes.mail import FCMaildirSource +c['sources'] = FCMaildirSource("~/maildir-buildbot") + at end example + + at node SyncmailMaildirSource, BonsaiMaildirSource, FCMaildirSource, Parsing Email Change Messages @subsubsection SyncmailMaildirSource @csindex buildbot.changes.mail.SyncmailMaildirSource - at code{SyncmailMaildirSource} knows how to parse the message format -used in mail sent by Syncmail. +http://sourceforge.net/projects/cvs-syncmail + + at code{SyncmailMaildirSource} knows how to parse the message format used by +the CVS ``syncmail'' script. + + at example +from buildbot.changes.mail import SyncmailMaildirSource +c['sources'] = SyncmailMaildirSource("~/maildir-buildbot") + at end example @node BonsaiMaildirSource, , SyncmailMaildirSource, Parsing Email Change Messages @subsubsection BonsaiMaildirSource @csindex buildbot.changes.mail.BonsaiMaildirSource - at code{BonsaiMaildirSource} parses messages sent out by Bonsai. +http://www.mozilla.org/bonsai.html + + at code{bonsai_parser} parses messages sent out by Bonsai, the CVS +tree-management system built by Mozilla. @node PBChangeSource, P4Source, Mail-parsing ChangeSources, Getting Source Code Changes From warner at users.sourceforge.net Sat Jul 28 05:57:52 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sat, 28 Jul 2007 05:57:52 +0000 Subject: [Buildbot-commits] buildbot/buildbot/test test_mailparse.py, 1.5, 1.6 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/test In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv28244/buildbot/test Modified Files: test_mailparse.py Log Message: [project @ changes/mail.py: refactor, giving each parser a separate subclass] Original author: warner at lothar.com Date: 2007-07-28 05:38:27+00:00 Index: test_mailparse.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/test/test_mailparse.py,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- test_mailparse.py 6 Sep 2006 00:41:55 -0000 1.5 +++ test_mailparse.py 28 Jul 2007 05:57:50 -0000 1.6 @@ -2,13 +2,14 @@ from twisted.trial import unittest from twisted.python import util -from buildbot.changes.mail import parseFreshCVSMail, parseSyncmail +from buildbot.changes.mail import FCMaildirSource, SyncmailMaildirSource class Test1(unittest.TestCase): def get(self, msg): msg = util.sibpath(__file__, msg) - return parseFreshCVSMail(None, open(msg, "r")) + s = FCMaildirSource(None) + return s.parse(open(msg, "r")) def testMsg1(self): c = self.get("mail/msg1") @@ -110,7 +111,8 @@ class Test2(unittest.TestCase): def get(self, msg): msg = util.sibpath(__file__, msg) - return parseFreshCVSMail(None, open(msg, "r"), prefix="Twisted") + s = FCMaildirSource(None) + return s.parse(open(msg, "r"), prefix="Twisted") def testMsg1p(self): c = self.get("mail/msg1") @@ -196,11 +198,13 @@ class Test3(unittest.TestCase): def get(self, msg): msg = util.sibpath(__file__, msg) - return parseSyncmail(None, open(msg, "r"), prefix="buildbot") + s = SyncmailMaildirSource(None) + return s.parse(open(msg, "r"), prefix="buildbot") def getNoPrefix(self, msg): msg = util.sibpath(__file__, msg) - return parseSyncmail(None, open(msg, "r")) + s = SyncmailMaildirSource(None) + return s.parse(open(msg, "r")) def testMsgS1(self): c = self.get("mail/syncmail.1") From warner at users.sourceforge.net Sat Jul 28 05:57:52 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sat, 28 Jul 2007 05:57:52 +0000 Subject: [Buildbot-commits] buildbot ChangeLog,1.874,1.875 Message-ID: Update of /cvsroot/buildbot/buildbot In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv28244 Modified Files: ChangeLog Log Message: [project @ changes/mail.py: refactor, giving each parser a separate subclass] Original author: warner at lothar.com Date: 2007-07-28 05:38:27+00:00 Index: ChangeLog =================================================================== RCS file: /cvsroot/buildbot/buildbot/ChangeLog,v retrieving revision 1.874 retrieving revision 1.875 diff -u -d -r1.874 -r1.875 --- ChangeLog 28 Jul 2007 02:03:09 -0000 1.874 +++ ChangeLog 28 Jul 2007 05:57:50 -0000 1.875 @@ -1,5 +1,9 @@ 2007-07-27 Brian Warner + * buildbot/changes/mail.py: refactor: move parsing into a method + named 'parse', each parser type gets a separate subclass + * buildbot/test/test_mailparse.py: match changes + * docs/buildbot.texinfo (Getting Source Code Changes): refactor docs on email-based ChangeSources From warner at users.sourceforge.net Sat Jul 28 05:57:52 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sat, 28 Jul 2007 05:57:52 +0000 Subject: [Buildbot-commits] buildbot/buildbot/changes mail.py,1.24,1.25 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/changes In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv28244/buildbot/changes Modified Files: mail.py Log Message: [project @ changes/mail.py: refactor, giving each parser a separate subclass] Original author: warner at lothar.com Date: 2007-07-28 05:38:27+00:00 Index: mail.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/changes/mail.py,v retrieving revision 1.24 retrieving revision 1.25 diff -u -d -r1.24 -r1.25 --- mail.py 23 Jan 2007 21:04:32 -0000 1.24 +++ mail.py 28 Jul 2007 05:57:50 -0000 1.25 @@ -12,197 +12,228 @@ from buildbot.changes import changes from buildbot.changes.maildir import MaildirService -def parseFreshCVSMail(self, fd, prefix=None, sep="/"): - """Parse mail sent by FreshCVS""" - # this uses rfc822.Message so it can run under python2.1 . In the future - # it will be updated to use python2.2's "email" module. +class MaildirSource(MaildirService, util.ComparableMixin): + """This source will watch a maildir that is subscribed to a FreshCVS + change-announcement mailing list. + """ + implements(IChangeSource) - m = Message(fd) - # FreshCVS sets From: to "user CVS ", but the <> part may be - # modified by the MTA (to include a local domain) - name, addr = m.getaddr("from") - if not name: - return None # no From means this message isn't from FreshCVS - cvs = name.find(" CVS") - if cvs == -1: - return None # this message isn't from FreshCVS - who = name[:cvs] + compare_attrs = ["basedir", "pollinterval"] + name = None - # we take the time of receipt as the time of checkin. Not correct, but it - # avoids the out-of-order-changes issue. See the comment in parseSyncmail - # about using the 'Date:' header - when = util.now() + def __init__(self, maildir, prefix=None): + MaildirService.__init__(self, maildir) + self.prefix = prefix - files = [] - comments = "" - isdir = 0 - lines = m.fp.readlines() - while lines: - line = lines.pop(0) - if line == "Modified files:\n": - break - while lines: - line = lines.pop(0) - if line == "\n": - break - line = line.rstrip("\n") - linebits = line.split(None, 1) - file = linebits[0] - if prefix: - # insist that the file start with the prefix: FreshCVS sends - # changes we don't care about too - bits = file.split(sep) - if bits[0] == prefix: - file = sep.join(bits[1:]) - else: + def describe(self): + return "%s mailing list in maildir %s" % (self.name, self.basedir) + + def messageReceived(self, filename): + path = os.path.join(self.basedir, "new", filename) + change = self.parse(open(path, "r"), self.prefix) + if change: + self.parent.addChange(change) + os.rename(os.path.join(self.basedir, "new", filename), + os.path.join(self.basedir, "cur", filename)) + +class FCMaildirSource(MaildirSource): + name = "FreshCVS" + + def parse(self, fd, prefix=None, sep="/"): + """Parse mail sent by FreshCVS""" + # this uses rfc822.Message so it can run under python2.1 . In the + # future it will be updated to use python2.2's "email" module. + + m = Message(fd) + # FreshCVS sets From: to "user CVS ", but the <> part may be + # modified by the MTA (to include a local domain) + name, addr = m.getaddr("from") + if not name: + return None # no From means this message isn't from FreshCVS + cvs = name.find(" CVS") + if cvs == -1: + return None # this message isn't from FreshCVS + who = name[:cvs] + + # we take the time of receipt as the time of checkin. Not correct, + # but it avoids the out-of-order-changes issue. See the comment in + # parseSyncmail about using the 'Date:' header + when = util.now() + + files = [] + comments = "" + isdir = 0 + lines = m.fp.readlines() + while lines: + line = lines.pop(0) + if line == "Modified files:\n": break - if len(linebits) == 1: - isdir = 1 - elif linebits[1] == "0 0": - isdir = 1 - files.append(file) - while lines: - line = lines.pop(0) - if line == "Log message:\n": - break - # message is terminated by "ViewCVS links:" or "Index:..." (patch) - while lines: - line = lines.pop(0) - if line == "ViewCVS links:\n": - break - if line.find("Index: ") == 0: - break - comments += line - comments = comments.rstrip() + "\n" + while lines: + line = lines.pop(0) + if line == "\n": + break + line = line.rstrip("\n") + linebits = line.split(None, 1) + file = linebits[0] + if prefix: + # insist that the file start with the prefix: FreshCVS sends + # changes we don't care about too + bits = file.split(sep) + if bits[0] == prefix: + file = sep.join(bits[1:]) + else: + break + if len(linebits) == 1: + isdir = 1 + elif linebits[1] == "0 0": + isdir = 1 + files.append(file) + while lines: + line = lines.pop(0) + if line == "Log message:\n": + break + # message is terminated by "ViewCVS links:" or "Index:..." (patch) + while lines: + line = lines.pop(0) + if line == "ViewCVS links:\n": + break + if line.find("Index: ") == 0: + break + comments += line + comments = comments.rstrip() + "\n" - if not files: - return None - - change = changes.Change(who, files, comments, isdir, when=when) + if not files: + return None - return change + change = changes.Change(who, files, comments, isdir, when=when) -def parseSyncmail(self, fd, prefix=None, sep="/"): - """Parse messages sent by the 'syncmail' program, as suggested by the - sourceforge.net CVS Admin documentation. Syncmail is maintained at - syncmail.sf.net . - """ - # pretty much the same as freshcvs mail, not surprising since CVS is the - # one creating most of the text + return change - m = Message(fd) - # The mail is sent from the person doing the checkin. Assume that the - # local username is enough to identify them (this assumes a one-server - # cvs-over-rsh environment rather than the server-dirs-shared-over-NFS - # model) - name, addr = m.getaddr("from") - if not addr: - return None # no From means this message isn't from FreshCVS - at = addr.find("@") - if at == -1: - who = addr # might still be useful - else: - who = addr[:at] +class SyncmailMaildirSource(MaildirSource): + name = "Syncmail" - # we take the time of receipt as the time of checkin. Not correct (it - # depends upon the email latency), but it avoids the out-of-order-changes - # issue. Also syncmail doesn't give us anything better to work with, - # unless you count pulling the v1-vs-v2 timestamp out of the diffs, which - # would be ugly. TODO: Pulling the 'Date:' header from the mail is a - # possibility, and email.Utils.parsedate_tz may be useful. It should be - # configurable, however, because there are a lot of broken clocks out - # there. - when = util.now() + def parse(self, fd, prefix=None, sep="/"): + """Parse messages sent by the 'syncmail' program, as suggested by the + sourceforge.net CVS Admin documentation. Syncmail is maintained at + syncmail.sf.net . + """ + # pretty much the same as freshcvs mail, not surprising since CVS is + # the one creating most of the text - subject = m.getheader("subject") - # syncmail puts the repository-relative directory in the subject: - # mprefix + "%(dir)s %(file)s,%(oldversion)s,%(newversion)s", where - # 'mprefix' is something that could be added by a mailing list - # manager. - # this is the only reasonable way to determine the directory name - space = subject.find(" ") - if space != -1: - directory = subject[:space] - else: - directory = subject - - files = [] - comments = "" - isdir = 0 - branch = None + m = Message(fd) + # The mail is sent from the person doing the checkin. Assume that the + # local username is enough to identify them (this assumes a one-server + # cvs-over-rsh environment rather than the server-dirs-shared-over-NFS + # model) + name, addr = m.getaddr("from") + if not addr: + return None # no From means this message isn't from FreshCVS + at = addr.find("@") + if at == -1: + who = addr # might still be useful + else: + who = addr[:at] - lines = m.fp.readlines() - while lines: - line = lines.pop(0) + # we take the time of receipt as the time of checkin. Not correct (it + # depends upon the email latency), but it avoids the + # out-of-order-changes issue. Also syncmail doesn't give us anything + # better to work with, unless you count pulling the v1-vs-v2 + # timestamp out of the diffs, which would be ugly. TODO: Pulling the + # 'Date:' header from the mail is a possibility, and + # email.Utils.parsedate_tz may be useful. It should be configurable, + # however, because there are a lot of broken clocks out there. + when = util.now() - if (line == "Modified Files:\n" or - line == "Added Files:\n" or - line == "Removed Files:\n"): - break + subject = m.getheader("subject") + # syncmail puts the repository-relative directory in the subject: + # mprefix + "%(dir)s %(file)s,%(oldversion)s,%(newversion)s", where + # 'mprefix' is something that could be added by a mailing list + # manager. + # this is the only reasonable way to determine the directory name + space = subject.find(" ") + if space != -1: + directory = subject[:space] + else: + directory = subject - while lines: - line = lines.pop(0) - if line == "\n": - break - if line == "Log Message:\n": - lines.insert(0, line) - break - line = line.lstrip() - line = line.rstrip() - # note: syncmail will send one email per directory involved in a - # commit, with multiple files if they were in the same directory. - # Unlike freshCVS, it makes no attempt to collect all related - # commits into a single message. + files = [] + comments = "" + isdir = 0 + branch = None - # note: syncmail will report a Tag underneath the ... Files: line - # e.g.: Tag: BRANCH-DEVEL + lines = m.fp.readlines() + while lines: + line = lines.pop(0) - if line.startswith('Tag:'): - branch = line.split(' ')[-1].rstrip() - continue + if (line == "Modified Files:\n" or + line == "Added Files:\n" or + line == "Removed Files:\n"): + break - # note: it doesn't actually make sense to use portable functions - # like os.path.join and os.sep, because these filenames all use - # separator conventions established by the remote CVS server (which - # is probably running on unix), not the local buildmaster system. - thesefiles = line.split(" ") - for f in thesefiles: - f = sep.join([directory, f]) - if prefix: - # insist that the file start with the prefix: we may get - # changes we don't care about too - bits = f.split(sep) - if bits[0] == prefix: - f = sep.join(bits[1:]) - else: - break - # TODO: figure out how new directories are described, set .isdir - files.append(f) + while lines: + line = lines.pop(0) + if line == "\n": + break + if line == "Log Message:\n": + lines.insert(0, line) + break + line = line.lstrip() + line = line.rstrip() + # note: syncmail will send one email per directory involved in a + # commit, with multiple files if they were in the same directory. + # Unlike freshCVS, it makes no attempt to collect all related + # commits into a single message. - if not files: - return None + # note: syncmail will report a Tag underneath the ... Files: line + # e.g.: Tag: BRANCH-DEVEL - while lines: - line = lines.pop(0) - if line == "Log Message:\n": - break - # message is terminated by "Index:..." (patch) or "--- NEW FILE.." - # or "--- filename DELETED ---". Sigh. - while lines: - line = lines.pop(0) - if line.find("Index: ") == 0: - break - if re.search(r"^--- NEW FILE", line): - break - if re.search(r" DELETED ---$", line): - break - comments += line - comments = comments.rstrip() + "\n" - - change = changes.Change(who, files, comments, isdir, when=when, - branch=branch) + if line.startswith('Tag:'): + branch = line.split(' ')[-1].rstrip() + continue - return change + # note: it doesn't actually make sense to use portable functions + # like os.path.join and os.sep, because these filenames all use + # separator conventions established by the remote CVS server (which + # is probably running on unix), not the local buildmaster system. + thesefiles = line.split(" ") + for f in thesefiles: + f = sep.join([directory, f]) + if prefix: + # insist that the file start with the prefix: we may get + # changes we don't care about too + bits = f.split(sep) + if bits[0] == prefix: + f = sep.join(bits[1:]) + else: + break + # TODO: figure out how new directories are described, set + # .isdir + files.append(f) + + if not files: + return None + + while lines: + line = lines.pop(0) + if line == "Log Message:\n": + break + # message is terminated by "Index:..." (patch) or "--- NEW FILE.." + # or "--- filename DELETED ---". Sigh. + while lines: + line = lines.pop(0) + if line.find("Index: ") == 0: + break + if re.search(r"^--- NEW FILE", line): + break + if re.search(r" DELETED ---$", line): + break + comments += line + comments = comments.rstrip() + "\n" + + change = changes.Change(who, files, comments, isdir, when=when, + branch=branch) + + return change # Bonsai mail parser by Stephen Davis. # @@ -231,106 +262,72 @@ # actually make a new directory part of the build process. That's my story # and I'm sticking to it. -def parseBonsaiMail(self, fd, prefix=None, sep="/"): - """Parse mail sent by the Bonsai cvs loginfo script.""" - - msg = Message(fd) - - # we don't care who the email came from b/c the cvs user is in the msg - # text - - who = "unknown" - timestamp = None - files = [] - lines = msg.fp.readlines() - - # read the control lines (what/who/where/file/etc.) - while lines: - line = lines.pop(0) - if line == "LOGCOMMENT\n": - break; - line = line.rstrip("\n") - - # we'd like to do the following but it won't work if the number of - # items doesn't match so... - # what, timestamp, user, repo, module, file = line.split( '|' ) - items = line.split('|') - if len(items) < 6: - # not a valid line, assume this isn't a bonsai message - return None - - try: - # just grab the bottom-most timestamp, they're probably all the - # same. TODO: I'm assuming this is relative to the epoch, but - # this needs testing. - timestamp = int(items[1]) - except ValueError: - pass - - user = items[2] - if user: - who = user +class BonsaiMaildirSource(MaildirSource): + name = "Bonsai" - module = items[4] - file = items[5] - if module and file: - path = "%s/%s" % (module, file) - files.append(path) - sticky = items[7] - branch = items[8] + def parse(self, fd, prefix=None, sep="/"): + """Parse mail sent by the Bonsai cvs loginfo script.""" - # if no files changed, return nothing - if not files: - return None + msg = Message(fd) - # read the comments - comments = "" - while lines: - line = lines.pop(0) - if line == ":ENDLOGCOMMENT\n": - break - comments += line - comments = comments.rstrip() + "\n" + # we don't care who the email came from b/c the cvs user is in the + # msg text - # return buildbot Change object - return changes.Change(who, files, comments, when=timestamp, branch=branch) + who = "unknown" + timestamp = None + files = [] + lines = msg.fp.readlines() + # read the control lines (what/who/where/file/etc.) + while lines: + line = lines.pop(0) + if line == "LOGCOMMENT\n": + break; + line = line.rstrip("\n") + # we'd like to do the following but it won't work if the number of + # items doesn't match so... + # what, timestamp, user, repo, module, file = line.split( '|' ) + items = line.split('|') + if len(items) < 6: + # not a valid line, assume this isn't a bonsai message + return None -class MaildirSource(MaildirService, util.ComparableMixin): - """This source will watch a maildir that is subscribed to a FreshCVS - change-announcement mailing list. - """ - implements(IChangeSource) + try: + # just grab the bottom-most timestamp, they're probably all the + # same. TODO: I'm assuming this is relative to the epoch, but + # this needs testing. + timestamp = int(items[1]) + except ValueError: + pass - compare_attrs = ["basedir", "pollinterval", "parser"] - parser = None - name = None + user = items[2] + if user: + who = user - def __init__(self, maildir, prefix=None, sep="/"): - MaildirService.__init__(self, maildir) - self.prefix = prefix - self.sep = sep + module = items[4] + file = items[5] + if module and file: + path = "%s/%s" % (module, file) + files.append(path) + sticky = items[7] + branch = items[8] - def describe(self): - return "%s mailing list in maildir %s" % (self.name, self.basedir) + # if no files changed, return nothing + if not files: + return None - def messageReceived(self, filename): - path = os.path.join(self.basedir, "new", filename) - change = self.parser(open(path, "r"), self.prefix, self.sep) - if change: - self.parent.addChange(change) - os.rename(os.path.join(self.basedir, "new", filename), - os.path.join(self.basedir, "cur", filename)) + # read the comments + comments = "" + while lines: + line = lines.pop(0) + if line == ":ENDLOGCOMMENT\n": + break + comments += line + comments = comments.rstrip() + "\n" -class FCMaildirSource(MaildirSource): - parser = parseFreshCVSMail - name = "FreshCVS" + # return buildbot Change object + return changes.Change(who, files, comments, when=timestamp, + branch=branch) -class SyncmailMaildirSource(MaildirSource): - parser = parseSyncmail - name = "Syncmail" -class BonsaiMaildirSource(MaildirSource): - parser = parseBonsaiMail - name = "Bonsai" From warner at users.sourceforge.net Sat Jul 28 05:57:57 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sat, 28 Jul 2007 05:57:57 +0000 Subject: [Buildbot-commits] buildbot ChangeLog,1.875,1.876 Message-ID: Update of /cvsroot/buildbot/buildbot In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv28278 Modified Files: ChangeLog Log Message: [project @ changes/mail.py: remove sep=, fix handling of prefix=] Original author: warner at lothar.com Date: 2007-07-28 05:55:17+00:00 Index: ChangeLog =================================================================== RCS file: /cvsroot/buildbot/buildbot/ChangeLog,v retrieving revision 1.875 retrieving revision 1.876 diff -u -d -r1.875 -r1.876 --- ChangeLog 28 Jul 2007 05:57:50 -0000 1.875 +++ ChangeLog 28 Jul 2007 05:57:55 -0000 1.876 @@ -1,7 +1,13 @@ 2007-07-27 Brian Warner * buildbot/changes/mail.py: refactor: move parsing into a method - named 'parse', each parser type gets a separate subclass + named 'parse', each parser type gets a separate subclass. Remove + the old 'sep' argument (hardcode it to '/'), fix usage of prefix= + to be a simple leading-substring match. Add a warning to the logs + if prefix= does not end in a slash, since that's probably a + mistake. Fix both places where a prefix= mismatch would skip all + subsequent files in the same email, instead of just skipping the + one that didn't match. * buildbot/test/test_mailparse.py: match changes * docs/buildbot.texinfo (Getting Source Code Changes): refactor From warner at users.sourceforge.net Sat Jul 28 05:57:57 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sat, 28 Jul 2007 05:57:57 +0000 Subject: [Buildbot-commits] buildbot/buildbot/test test_mailparse.py, 1.6, 1.7 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/test In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv28278/buildbot/test Modified Files: test_mailparse.py Log Message: [project @ changes/mail.py: remove sep=, fix handling of prefix=] Original author: warner at lothar.com Date: 2007-07-28 05:55:17+00:00 Index: test_mailparse.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/test/test_mailparse.py,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- test_mailparse.py 28 Jul 2007 05:57:50 -0000 1.6 +++ test_mailparse.py 28 Jul 2007 05:57:55 -0000 1.7 @@ -112,7 +112,7 @@ def get(self, msg): msg = util.sibpath(__file__, msg) s = FCMaildirSource(None) - return s.parse(open(msg, "r"), prefix="Twisted") + return s.parse(open(msg, "r"), prefix="Twisted/") def testMsg1p(self): c = self.get("mail/msg1") @@ -199,7 +199,7 @@ def get(self, msg): msg = util.sibpath(__file__, msg) s = SyncmailMaildirSource(None) - return s.parse(open(msg, "r"), prefix="buildbot") + return s.parse(open(msg, "r"), prefix="buildbot/") def getNoPrefix(self, msg): msg = util.sibpath(__file__, msg) From warner at users.sourceforge.net Sat Jul 28 05:57:57 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sat, 28 Jul 2007 05:57:57 +0000 Subject: [Buildbot-commits] buildbot/buildbot/changes mail.py,1.25,1.26 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/changes In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv28278/buildbot/changes Modified Files: mail.py Log Message: [project @ changes/mail.py: remove sep=, fix handling of prefix=] Original author: warner at lothar.com Date: 2007-07-28 05:55:17+00:00 Index: mail.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/changes/mail.py,v retrieving revision 1.25 retrieving revision 1.26 diff -u -d -r1.25 -r1.26 --- mail.py 28 Jul 2007 05:57:50 -0000 1.25 +++ mail.py 28 Jul 2007 05:57:55 -0000 1.26 @@ -7,6 +7,7 @@ from rfc822 import Message from zope.interface import implements +from twisted.python import log from buildbot import util from buildbot.interfaces import IChangeSource from buildbot.changes import changes @@ -24,6 +25,9 @@ def __init__(self, maildir, prefix=None): MaildirService.__init__(self, maildir) self.prefix = prefix + if prefix and not prefix.endswith("/"): + log.msg("%s: you probably want your prefix=('%s') to end with " + "a slash") def describe(self): return "%s mailing list in maildir %s" % (self.name, self.basedir) @@ -39,7 +43,7 @@ class FCMaildirSource(MaildirSource): name = "FreshCVS" - def parse(self, fd, prefix=None, sep="/"): + def parse(self, fd, prefix=None): """Parse mail sent by FreshCVS""" # this uses rfc822.Message so it can run under python2.1 . In the # future it will be updated to use python2.2's "email" module. @@ -78,11 +82,10 @@ if prefix: # insist that the file start with the prefix: FreshCVS sends # changes we don't care about too - bits = file.split(sep) - if bits[0] == prefix: - file = sep.join(bits[1:]) + if file.startswith(prefix): + file = file[len(prefix):] else: - break + continue if len(linebits) == 1: isdir = 1 elif linebits[1] == "0 0": @@ -112,7 +115,7 @@ class SyncmailMaildirSource(MaildirSource): name = "Syncmail" - def parse(self, fd, prefix=None, sep="/"): + def parse(self, fd, prefix=None): """Parse messages sent by the 'syncmail' program, as suggested by the sourceforge.net CVS Admin documentation. Syncmail is maintained at syncmail.sf.net . @@ -191,20 +194,16 @@ branch = line.split(' ')[-1].rstrip() continue - # note: it doesn't actually make sense to use portable functions - # like os.path.join and os.sep, because these filenames all use - # separator conventions established by the remote CVS server (which - # is probably running on unix), not the local buildmaster system. thesefiles = line.split(" ") for f in thesefiles: - f = sep.join([directory, f]) + f = directory + "/" + f if prefix: # insist that the file start with the prefix: we may get # changes we don't care about too - bits = f.split(sep) - if bits[0] == prefix: - f = sep.join(bits[1:]) + if f.startswith(prefix): + f = f[len(prefix):] else: + continue break # TODO: figure out how new directories are described, set # .isdir @@ -265,7 +264,7 @@ class BonsaiMaildirSource(MaildirSource): name = "Bonsai" - def parse(self, fd, prefix=None, sep="/"): + def parse(self, fd, prefix=None): """Parse mail sent by the Bonsai cvs loginfo script.""" msg = Message(fd) From warner at users.sourceforge.net Sat Jul 28 16:48:36 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sat, 28 Jul 2007 16:48:36 +0000 Subject: [Buildbot-commits] buildbot/buildbot/test/mail svn-commit.1, NONE, 1.1 svn-commit.2, NONE, 1.1 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/test/mail In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv18563/buildbot/test/mail Added Files: svn-commit.1 svn-commit.2 Log Message: [project @ mail.py: add changesource for SVN's commit-email.pl script, contributed by Justin Mason. Closes SF#1072845.] Original author: warner at lothar.com Date: 2007-07-28 16:47:40+00:00 --- NEW FILE: svn-commit.1 --- X-Original-To: jm at jmason.org Delivered-To: jm at dogma.boxhost.net Received: from localhost [127.0.0.1] by localhost with IMAP (fetchmail-6.2.5) for jm at localhost (single-drop); Wed, 12 Apr 2006 01:52:04 +0100 (IST) Received: from mail.apache.org (hermes.apache.org [209.237.227.199]) by dogma.boxhost.net (Postfix) with SMTP id 34F07310051 for ; Wed, 12 Apr 2006 01:44:17 +0100 (IST) Received: (qmail 71414 invoked by uid 500); 12 Apr 2006 00:44:16 -0000 Mailing-List: contact commits-help at spamassassin.apache.org; run by ezmlm Precedence: bulk list-help: list-unsubscribe: List-Post: Reply-To: "SpamAssassin Dev" List-Id: Delivered-To: mailing list commits at spamassassin.apache.org Received: (qmail 71403 invoked by uid 99); 12 Apr 2006 00:44:16 -0000 Received: from asf.osuosl.org (HELO asf.osuosl.org) (140.211.166.49) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 11 Apr 2006 17:44:16 -0700 X-ASF-Spam-Status: No, hits=-9.4 required=10.0 tests=ALL_TRUSTED,NO_REAL_NAME Received: from [209.237.227.194] (HELO minotaur.apache.org) (209.237.227.194) by apache.org (qpsmtpd/0.29) with SMTP; Tue, 11 Apr 2006 17:44:15 -0700 Received: (qmail 51950 invoked by uid 65534); 12 Apr 2006 00:43:55 -0000 Message-ID: <20060412004355.51949.qmail at minotaur.apache.org> Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r393348 - /spamassassin/trunk/sa-update.raw Date: Wed, 12 Apr 2006 00:43:54 -0000 To: commits at spamassassin.apache.org From: felicity at apache.org X-Mailer: svnmailer-1.0.7 X-Virus-Checked: Checked by ClamAV on apache.org Status: O X-UID: 62932 X-Keywords: Author: felicity Date: Tue Apr 11 17:43:54 2006 New Revision: 393348 URL: http://svn.apache.org/viewcvs?rev=393348&view=rev Log: bug 4864: remove extraneous front-slash from gpghomedir path Modified: spamassassin/trunk/sa-update.raw Modified: spamassassin/trunk/sa-update.raw URL: http://svn.apache.org/viewcvs/spamassassin/trunk/sa-update.raw?rev=393348&r1=393347&r2=393348&view=diff ============================================================================== --- spamassassin/trunk/sa-update.raw (original) +++ spamassassin/trunk/sa-update.raw Tue Apr 11 17:43:54 2006 @@ -120,7 +120,7 @@ @{$opt{'channel'}} = (); my $GPG_ENABLED = 1; -$opt{'gpghomedir'} = File::Spec->catfile($LOCAL_RULES_DIR, '/sa-update-keys'); +$opt{'gpghomedir'} = File::Spec->catfile($LOCAL_RULES_DIR, 'sa-update-keys'); Getopt::Long::Configure( qw(bundling no_getopt_compat no_auto_abbrev no_ignore_case)); --- NEW FILE: svn-commit.2 --- X-Original-To: jm at jmason.org Delivered-To: jm at dogma.boxhost.net Received: from localhost [127.0.0.1] by localhost with IMAP (fetchmail-6.2.5) for jm at localhost (single-drop); Thu, 09 Mar 2006 21:44:57 +0000 (GMT) Received: from minotaur.apache.org (minotaur.apache.org [209.237.227.194]) by dogma.boxhost.net (Postfix) with SMTP id 0D3463105BF for ; Thu, 9 Mar 2006 19:52:50 +0000 (GMT) Received: (qmail 30661 invoked by uid 1833); 9 Mar 2006 19:52:44 -0000 Delivered-To: jm at locus.apache.org Received: (qmail 30451 invoked from network); 9 Mar 2006 19:52:38 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (209.237.227.199) by minotaur.apache.org with SMTP; 9 Mar 2006 19:52:38 -0000 Received: (qmail 97860 invoked by uid 500); 9 Mar 2006 19:52:29 -0000 Delivered-To: apmail-jm at apache.org Received: (qmail 97837 invoked by uid 500); 9 Mar 2006 19:52:28 -0000 Mailing-List: contact commits-help at spamassassin.apache.org; run by ezmlm Precedence: bulk list-help: [...1179 lines suppressed...] Modified: spamassassin/branches/3.1/spamd/spamd.raw URL: http://svn.apache.org/viewcvs/spamassassin/branches/3.1/spamd/spamd.raw?rev=384590&r1=384589&r2=384590&view=diff ============================================================================== --- spamassassin/branches/3.1/spamd/spamd.raw (original) +++ spamassassin/branches/3.1/spamd/spamd.raw Thu Mar 9 11:51:59 2006 @@ -2049,6 +2049,9 @@ foreach (keys %children) { kill 'INT' => $_; my $pid = waitpid($_, 0); + if ($scaling) { + $scaling->child_exited($pid); + } info("spamd: child $pid killed successfully"); } %children = (); From warner at users.sourceforge.net Sat Jul 28 16:48:36 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sat, 28 Jul 2007 16:48:36 +0000 Subject: [Buildbot-commits] buildbot ChangeLog,1.876,1.877 Message-ID: Update of /cvsroot/buildbot/buildbot In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv18563 Modified Files: ChangeLog Log Message: [project @ mail.py: add changesource for SVN's commit-email.pl script, contributed by Justin Mason. Closes SF#1072845.] Original author: warner at lothar.com Date: 2007-07-28 16:47:40+00:00 Index: ChangeLog =================================================================== RCS file: /cvsroot/buildbot/buildbot/ChangeLog,v retrieving revision 1.876 retrieving revision 1.877 diff -u -d -r1.876 -r1.877 --- ChangeLog 28 Jul 2007 05:57:55 -0000 1.876 +++ ChangeLog 28 Jul 2007 16:48:34 -0000 1.877 @@ -1,3 +1,12 @@ +2007-07-28 Brian Warner + + * buildbot/changes/mail.py (SVNCommitEmailMaildirSource): add a + parser for the "commit-email.pl" script that is shipped with SVN, + written by Justin Mason. Thanks! Closes SF#1072845. + * buildbot/test/mail/svn-commit.*: sample messages + * buildbot/test/test_mailparse.py (TestSVNCommitEmail): test it + * docs/buildbot.texinfo (SVNCommitEmailMaildirSource): docs + 2007-07-27 Brian Warner * buildbot/changes/mail.py: refactor: move parsing into a method From warner at users.sourceforge.net Sat Jul 28 16:48:36 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sat, 28 Jul 2007 16:48:36 +0000 Subject: [Buildbot-commits] buildbot/buildbot/test test_mailparse.py, 1.7, 1.8 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/test In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv18563/buildbot/test Modified Files: test_mailparse.py Log Message: [project @ mail.py: add changesource for SVN's commit-email.pl script, contributed by Justin Mason. Closes SF#1072845.] Original author: warner at lothar.com Date: 2007-07-28 16:47:40+00:00 Index: test_mailparse.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/test/test_mailparse.py,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- test_mailparse.py 28 Jul 2007 05:57:55 -0000 1.7 +++ test_mailparse.py 28 Jul 2007 16:48:34 -0000 1.8 @@ -2,13 +2,13 @@ from twisted.trial import unittest from twisted.python import util -from buildbot.changes.mail import FCMaildirSource, SyncmailMaildirSource +from buildbot.changes import mail -class Test1(unittest.TestCase): +class TestFreshCVS(unittest.TestCase): def get(self, msg): msg = util.sibpath(__file__, msg) - s = FCMaildirSource(None) + s = mail.FCMaildirSource(None) return s.parse(open(msg, "r")) def testMsg1(self): @@ -108,10 +108,10 @@ self.assertEqual(c.isdir, 1) -class Test2(unittest.TestCase): +class TestFreshCVS_Prefix(unittest.TestCase): def get(self, msg): msg = util.sibpath(__file__, msg) - s = FCMaildirSource(None) + s = mail.FCMaildirSource(None) return s.parse(open(msg, "r"), prefix="Twisted/") def testMsg1p(self): @@ -195,15 +195,15 @@ self.assertEqual(c, None) -class Test3(unittest.TestCase): +class TestSyncmail(unittest.TestCase): def get(self, msg): msg = util.sibpath(__file__, msg) - s = SyncmailMaildirSource(None) + s = mail.SyncmailMaildirSource(None) return s.parse(open(msg, "r"), prefix="buildbot/") def getNoPrefix(self, msg): msg = util.sibpath(__file__, msg) - s = SyncmailMaildirSource(None) + s = mail.SyncmailMaildirSource(None) return s.parse(open(msg, "r")) def testMsgS1(self): @@ -249,3 +249,45 @@ ]) self.assertEqual(c.branch, "BRANCH-DEVEL") self.assertEqual(c.isdir, 0) + + +class TestSVNCommitEmail(unittest.TestCase): + def get(self, msg, prefix): + msg = util.sibpath(__file__, msg) + s = mail.SVNCommitEmailMaildirSource(None) + return s.parse(open(msg, "r"), prefix) + + def test1(self): + c = self.get("mail/svn-commit.1", "spamassassin/trunk/") + self.failUnless(c) + self.failUnlessEqual(c.who, "felicity") + self.failUnlessEqual(c.files, ["sa-update.raw"]) + self.failUnlessEqual(c.branch, None) + self.failUnlessEqual(c.comments, + "bug 4864: remove extraneous front-slash " + "from gpghomedir path\n") + + def test2a(self): + c = self.get("mail/svn-commit.2", "spamassassin/trunk/") + self.failIf(c) + + def test2b(self): + c = self.get("mail/svn-commit.2", "spamassassin/branches/3.1/") + self.failUnless(c) + self.failUnlessEqual(c.who, "sidney") + self.failUnlessEqual(c.files, + ["lib/Mail/SpamAssassin/Timeout.pm", + "MANIFEST", + "lib/Mail/SpamAssassin/Logger.pm", + "lib/Mail/SpamAssassin/Plugin/DCC.pm", + "lib/Mail/SpamAssassin/Plugin/DomainKeys.pm", + "lib/Mail/SpamAssassin/Plugin/Pyzor.pm", + "lib/Mail/SpamAssassin/Plugin/Razor2.pm", + "lib/Mail/SpamAssassin/Plugin/SPF.pm", + "lib/Mail/SpamAssassin/SpamdForkScaling.pm", + "spamd/spamd.raw", + ]) + self.failUnlessEqual(c.comments, + "Bug 4696: consolidated fixes for timeout bugs\n") + + From warner at users.sourceforge.net Sat Jul 28 16:48:36 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sat, 28 Jul 2007 16:48:36 +0000 Subject: [Buildbot-commits] buildbot/buildbot/changes mail.py,1.26,1.27 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/changes In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv18563/buildbot/changes Modified Files: mail.py Log Message: [project @ mail.py: add changesource for SVN's commit-email.pl script, contributed by Justin Mason. Closes SF#1072845.] Original author: warner at lothar.com Date: 2007-07-28 16:47:40+00:00 Index: mail.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/changes/mail.py,v retrieving revision 1.26 retrieving revision 1.27 diff -u -d -r1.26 -r1.27 --- mail.py 28 Jul 2007 05:57:55 -0000 1.26 +++ mail.py 28 Jul 2007 16:48:34 -0000 1.27 @@ -329,4 +329,131 @@ return changes.Change(who, files, comments, when=timestamp, branch=branch) +# svn "commit-email.pl" handler. The format is very similar to freshcvs mail; +# here's a sample: + +# From: username [at] apache.org [slightly obfuscated to avoid spam here] +# To: commits [at] spamassassin.apache.org +# Subject: svn commit: r105955 - in spamassassin/trunk: . lib/Mail +# ... +# +# Author: username +# Date: Sat Nov 20 00:17:49 2004 [note: TZ = local tz on server!] +# New Revision: 105955 +# +# Modified: [also Removed: and Added:] +# [filename] +# ... +# Log: +# [log message] +# ... +# +# +# Modified: spamassassin/trunk/lib/Mail/SpamAssassin.pm +# [unified diff] +# +# [end of mail] + +class SVNCommitEmailMaildirSource(MaildirSource): + name = "SVN commit-email.pl" + + def parse(self, fd, prefix=None): + """Parse messages sent by the svn 'commit-email.pl' trigger. + """ + + m = Message(fd) + # The mail is sent from the person doing the checkin. Assume that the + # local username is enough to identify them (this assumes a one-server + # cvs-over-rsh environment rather than the server-dirs-shared-over-NFS + # model) + name, addr = m.getaddr("from") + if not addr: + return None # no From means this message isn't from FreshCVS + at = addr.find("@") + if at == -1: + who = addr # might still be useful + else: + who = addr[:at] + + # we take the time of receipt as the time of checkin. Not correct (it + # depends upon the email latency), but it avoids the + # out-of-order-changes issue. Also syncmail doesn't give us anything + # better to work with, unless you count pulling the v1-vs-v2 + # timestamp out of the diffs, which would be ugly. TODO: Pulling the + # 'Date:' header from the mail is a possibility, and + # email.Utils.parsedate_tz may be useful. It should be configurable, + # however, because there are a lot of broken clocks out there. + when = util.now() + + files = [] + comments = "" + isdir = 0 + lines = m.fp.readlines() + rev = None + while lines: + line = lines.pop(0) + + # "Author: jmason" + match = re.search(r"^Author: (\S+)", line) + if match: + who = match.group(1) + + # "New Revision: 105955" + match = re.search(r"^New Revision: (\d+)", line) + if match: + rev = match.group(1) + + # possible TODO: use "Date: ..." data here instead of time of + # commit message receipt, above. however, this timestamp is + # specified *without* a timezone, in the server's local TZ, so to + # be accurate buildbot would need a config setting to specify the + # source server's expected TZ setting! messy. + + # this stanza ends with the "Log:" + if (line == "Log:\n"): + break + + # commit message is terminated by the file-listing section + while lines: + line = lines.pop(0) + if (line == "Modified:\n" or + line == "Added:\n" or + line == "Removed:\n"): + break + comments += line + comments = comments.rstrip() + "\n" + + while lines: + line = lines.pop(0) + if line == "\n": + break + if line.find("Modified:\n") == 0: + continue # ignore this line + if line.find("Added:\n") == 0: + continue # ignore this line + if line.find("Removed:\n") == 0: + continue # ignore this line + line = line.strip() + + thesefiles = line.split(" ") + for f in thesefiles: + if prefix: + # insist that the file start with the prefix: we may get + # changes we don't care about too + if f.startswith(prefix): + f = f[len(prefix):] + else: + log.msg("ignored file from svn commit: prefix '%s' " + "does not match filename '%s'" % (prefix, f)) + continue + + # TODO: figure out how new directories are described, set + # .isdir + files.append(f) + + if not files: + log.msg("no matching files found, ignoring commit") + return None + + return changes.Change(who, files, comments, when=when, revision=rev) From warner at users.sourceforge.net Sat Jul 28 16:48:36 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Sat, 28 Jul 2007 16:48:36 +0000 Subject: [Buildbot-commits] buildbot/docs buildbot.texinfo,1.108,1.109 Message-ID: Update of /cvsroot/buildbot/buildbot/docs In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv18563/docs Modified Files: buildbot.texinfo Log Message: [project @ mail.py: add changesource for SVN's commit-email.pl script, contributed by Justin Mason. Closes SF#1072845.] Original author: warner at lothar.com Date: 2007-07-28 16:47:40+00:00 Index: buildbot.texinfo =================================================================== RCS file: /cvsroot/buildbot/buildbot/docs/buildbot.texinfo,v retrieving revision 1.108 retrieving revision 1.109 diff -u -d -r1.108 -r1.109 --- buildbot.texinfo 28 Jul 2007 02:37:14 -0000 1.108 +++ buildbot.texinfo 28 Jul 2007 16:48:34 -0000 1.109 @@ -163,6 +163,7 @@ * FCMaildirSource:: * SyncmailMaildirSource:: * BonsaiMaildirSource:: +* SVNCommitEmailMaildirSource:: Build Process @@ -2563,6 +2564,7 @@ @item pb.PBChangeSource (listening for connections from a long-running @code{contrib/svn_watcher.py} or @code{contrib/svnpoller.py} polling process + at item mail.SVNCommitEmailMaildirSource (watching for email sent by commit-email.pl) @item svnpoller.SVNPoller (polling the SVN repository) @end itemize @@ -2823,7 +2825,7 @@ @item svnmailer http://opensource.perlig.de/en/svnmailer/ @item commit-email.pl -(distributed with Subversion) + at ref{SVNCommitEmailMaildirSource} @end table @item Mercurial @@ -2834,6 +2836,10 @@ @end table + +The following sections describe the parsers available for each of +these tools. + Most of these parsers accept a @code{prefix=} argument, which is used to limit the set of files that the buildmaster pays attention to. This is most useful for systems like CVS and SVN which put multiple @@ -2844,14 +2850,11 @@ prefix is stripped from the filename before any further processing is done. Thus the prefix usually ends with a slash. - -The following sections describe the parsers available for each of -these tools. - @menu * FCMaildirSource:: * SyncmailMaildirSource:: * BonsaiMaildirSource:: +* SVNCommitEmailMaildirSource:: @end menu @node FCMaildirSource, SyncmailMaildirSource, Parsing Email Change Messages, Parsing Email Change Messages @@ -2894,16 +2897,38 @@ c['sources'] = SyncmailMaildirSource("~/maildir-buildbot") @end example - at node BonsaiMaildirSource, , SyncmailMaildirSource, Parsing Email Change Messages + at node BonsaiMaildirSource, SVNCommitEmailMaildirSource, SyncmailMaildirSource, Parsing Email Change Messages @subsubsection BonsaiMaildirSource @csindex buildbot.changes.mail.BonsaiMaildirSource http://www.mozilla.org/bonsai.html - at code{bonsai_parser} parses messages sent out by Bonsai, the CVS + at code{BonsaiMaildirSource} parses messages sent out by Bonsai, the CVS tree-management system built by Mozilla. + at example +from buildbot.changes.mail import BonsaiMaildirSource +c['sources'] = BonsaiMaildirSource("~/maildir-buildbot") + at end example + + at node SVNCommitEmailMaildirSource, , BonsaiMaildirSource, Parsing Email Change Messages + at subsubsection SVNCommitEmailMaildirSource + + at csindex buildbot.changes.mail.SVNCommitEmailMaildirSource + + at code{SVNCommitEmailMaildirSource} parses message sent out by the + at code{commit-email.pl} script, which is included in the Subversion +distribution. + +It does not currently handle branches: all of the Change objects that +it creates will be associated with the default (i.e. trunk) branch. + + at example +from buildbot.changes.mail import SVNCommitEmailMaildirSource +c['sources'] = SVNCommitEmailMaildirSource("~/maildir-buildbot") + at end example + @node PBChangeSource, P4Source, Mail-parsing ChangeSources, Getting Source Code Changes @section PBChangeSource From warner at users.sourceforge.net Mon Jul 30 02:42:57 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Mon, 30 Jul 2007 02:42:57 +0000 Subject: [Buildbot-commits] buildbot ChangeLog,1.877,1.878 Message-ID: Update of /cvsroot/buildbot/buildbot In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv7593 Modified Files: ChangeLog Log Message: rename sample emails a bit Index: ChangeLog =================================================================== RCS file: /cvsroot/buildbot/buildbot/ChangeLog,v retrieving revision 1.877 retrieving revision 1.878 diff -u -d -r1.877 -r1.878 --- ChangeLog 28 Jul 2007 16:48:34 -0000 1.877 +++ ChangeLog 30 Jul 2007 02:42:55 -0000 1.878 @@ -1,5 +1,8 @@ 2007-07-28 Brian Warner + * buildbot/test/test_mailparse.py: rename sample emails a bit + * buildbot/test/mail/msg*: same + * buildbot/changes/mail.py (SVNCommitEmailMaildirSource): add a parser for the "commit-email.pl" script that is shipped with SVN, written by Justin Mason. Thanks! Closes SF#1072845. From warner at users.sourceforge.net Mon Jul 30 02:42:57 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Mon, 30 Jul 2007 02:42:57 +0000 Subject: [Buildbot-commits] buildbot/buildbot/test test_mailparse.py, 1.8, 1.9 Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/test In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv7593/buildbot/test Modified Files: test_mailparse.py Log Message: rename sample emails a bit Index: test_mailparse.py =================================================================== RCS file: /cvsroot/buildbot/buildbot/buildbot/test/test_mailparse.py,v retrieving revision 1.8 retrieving revision 1.9 diff -u -d -r1.8 -r1.9 --- test_mailparse.py 28 Jul 2007 16:48:34 -0000 1.8 +++ test_mailparse.py 30 Jul 2007 02:42:55 -0000 1.9 @@ -12,14 +12,14 @@ return s.parse(open(msg, "r")) def testMsg1(self): - c = self.get("mail/msg1") + c = self.get("mail/freshcvs.1") self.assertEqual(c.who, "moshez") self.assertEqual(c.files, ["Twisted/debian/python-twisted.menu.in"]) self.assertEqual(c.comments, "Instance massenger, apparently\n") self.assertEqual(c.isdir, 0) def testMsg2(self): - c = self.get("mail/msg2") + c = self.get("mail/freshcvs.2") self.assertEqual(c.who, "itamarst") self.assertEqual(c.files, ["Twisted/twisted/web/woven/form.py", "Twisted/twisted/python/formmethod.py"]) @@ -29,7 +29,7 @@ def testMsg3(self): # same as msg2 but missing the ViewCVS section - c = self.get("mail/msg3") + c = self.get("mail/freshcvs.3") self.assertEqual(c.who, "itamarst") self.assertEqual(c.files, ["Twisted/twisted/web/woven/form.py", "Twisted/twisted/python/formmethod.py"]) @@ -39,7 +39,7 @@ def testMsg4(self): # same as msg3 but also missing CVS patch section - c = self.get("mail/msg4") + c = self.get("mail/freshcvs.4") self.assertEqual(c.who, "itamarst") self.assertEqual(c.files, ["Twisted/twisted/web/woven/form.py", "Twisted/twisted/python/formmethod.py"]) @@ -49,7 +49,7 @@ def testMsg5(self): # creates a directory - c = self.get("mail/msg5") + c = self.get("mail/freshcvs.5") self.assertEqual(c.who, "etrepum") self.assertEqual(c.files, ["Twisted/doc/examples/cocoaDemo"]) self.assertEqual(c.comments, @@ -58,7 +58,7 @@ def testMsg6(self): # adds files - c = self.get("mail/msg6") + c = self.get("mail/freshcvs.6") self.assertEqual(c.who, "etrepum") self.assertEqual(c.files, [ "Twisted/doc/examples/cocoaDemo/MyAppDelegate.py", @@ -75,7 +75,7 @@ def testMsg7(self): # deletes files - c = self.get("mail/msg7") + c = self.get("mail/freshcvs.7") self.assertEqual(c.who, "etrepum") self.assertEqual(c.files, [ "Twisted/doc/examples/cocoaDemo/MyAppDelegate.py", @@ -92,7 +92,7 @@ def testMsg8(self): # files outside Twisted/ - c = self.get("mail/msg8") + c = self.get("mail/freshcvs.8") self.assertEqual(c.who, "acapnotic") self.assertEqual(c.files, [ "CVSROOT/freshCfg" ]) self.assertEqual(c.comments, "it doesn't work with invalid syntax\n") @@ -100,7 +100,7 @@ def testMsg9(self): # also creates a directory - c = self.get("mail/msg9") + c = self.get("mail/freshcvs.9") self.assertEqual(c.who, "exarkun") self.assertEqual(c.files, ["Twisted/sandbox/exarkun/persist-plugin"]) self.assertEqual(c.comments, @@ -115,13 +115,13 @@ return s.parse(open(msg, "r"), prefix="Twisted/") def testMsg1p(self): - c = self.get("mail/msg1") + c = self.get("mail/freshcvs.1") self.assertEqual(c.who, "moshez") self.assertEqual(c.files, ["debian/python-twisted.menu.in"]) self.assertEqual(c.comments, "Instance massenger, apparently\n") def testMsg2p(self): - c = self.get("mail/msg2") + c = self.get("mail/freshcvs.2") self.assertEqual(c.who, "itamarst") self.assertEqual(c.files, ["twisted/web/woven/form.py", "twisted/python/formmethod.py"]) @@ -130,7 +130,7 @@ def testMsg3p(self): # same as msg2 but missing the ViewCVS section - c = self.get("mail/msg3") + c = self.get("mail/freshcvs.3") self.assertEqual(c.who, "itamarst") self.assertEqual(c.files, ["twisted/web/woven/form.py", "twisted/python/formmethod.py"]) @@ -139,7 +139,7 @@ def testMsg4p(self): # same as msg3 but also missing CVS patch section - c = self.get("mail/msg4") + c = self.get("mail/freshcvs.4") self.assertEqual(c.who, "itamarst") self.assertEqual(c.files, ["twisted/web/woven/form.py", "twisted/python/formmethod.py"]) @@ -148,7 +148,7 @@ def testMsg5p(self): # creates a directory - c = self.get("mail/msg5") + c = self.get("mail/freshcvs.5") self.assertEqual(c.who, "etrepum") self.assertEqual(c.files, ["doc/examples/cocoaDemo"]) self.assertEqual(c.comments, @@ -157,7 +157,7 @@ def testMsg6p(self): # adds files - c = self.get("mail/msg6") + c = self.get("mail/freshcvs.6") self.assertEqual(c.who, "etrepum") self.assertEqual(c.files, [ "doc/examples/cocoaDemo/MyAppDelegate.py", @@ -174,7 +174,7 @@ def testMsg7p(self): # deletes files - c = self.get("mail/msg7") + c = self.get("mail/freshcvs.7") self.assertEqual(c.who, "etrepum") self.assertEqual(c.files, [ "doc/examples/cocoaDemo/MyAppDelegate.py", @@ -191,7 +191,7 @@ def testMsg8p(self): # files outside Twisted/ - c = self.get("mail/msg8") + c = self.get("mail/freshcvs.8") self.assertEqual(c, None) From warner at users.sourceforge.net Mon Jul 30 02:42:57 2007 From: warner at users.sourceforge.net (Brian Warner) Date: Mon, 30 Jul 2007 02:42:57 +0000 Subject: [Buildbot-commits] buildbot/buildbot/test/mail freshcvs.1, NONE, 1.1 freshcvs.2, NONE, 1.1 freshcvs.3, NONE, 1.1 freshcvs.4, NONE, 1.1 freshcvs.5, NONE, 1.1 freshcvs.6, NONE, 1.1 freshcvs.7, NONE, 1.1 freshcvs.8, NONE, 1.1 freshcvs.9, NONE, 1.1 msg1, 1.1, NONE msg2, 1.1, NONE msg3, 1.1, NONE msg4, 1.1, NONE msg5, 1.1, NONE msg6, 1.1, NONE msg7, 1.1, NONE msg8, 1.1, NONE msg9, 1.1, NONE Message-ID: Update of /cvsroot/buildbot/buildbot/buildbot/test/mail In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv7593/buildbot/test/mail Added Files: freshcvs.1 freshcvs.2 freshcvs.3 freshcvs.4 freshcvs.5 freshcvs.6 freshcvs.7 freshcvs.8 freshcvs.9 Removed Files: msg1 msg2 msg3 msg4 msg5 msg6 msg7 msg8 msg9 Log Message: rename sample emails a bit --- NEW FILE: freshcvs.1 --- Return-Path: Delivered-To: warner-twistedcvs at luther.lothar.com Received: (qmail 11151 invoked by uid 1000); 11 Jan 2003 17:10:04 -0000 Delivered-To: warner-twistedcvs at lothar.com Received: (qmail 1548 invoked by uid 13574); 11 Jan 2003 17:06:39 -0000 Received: from unknown (HELO pyramid.twistedmatrix.com) ([64.123.27.105]) (envelope-sender ) by 130.94.181.6 (qmail-ldap-1.03) with SMTP for ; 11 Jan 2003 17:06:39 -0000 Received: from localhost ([127.0.0.1] helo=pyramid.twistedmatrix.com) by pyramid.twistedmatrix.com with esmtp (Exim 3.35 #1 (Debian)) id 18XP0U-0002Mq-00; Sat, 11 Jan 2003 11:01:14 -0600 Received: from acapnotic by pyramid.twistedmatrix.com with local (Exim 3.35 #1 (Debian)) id 18XP02-0002MN-00 for ; Sat, 11 Jan 2003 11:00:46 -0600 To: twisted-commits at twistedmatrix.com From: moshez CVS Reply-To: twisted-python at twistedmatrix.com X-Mailer: CVSToys From: moshez CVS Reply-To: twisted-python at twistedmatrix.com Message-Id: Subject: [Twisted-commits] Instance massenger, apparently Sender: twisted-commits-admin at twistedmatrix.com Errors-To: twisted-commits-admin at twistedmatrix.com X-BeenThere: twisted-commits at twistedmatrix.com X-Mailman-Version: 2.0.11 Precedence: bulk List-Help: List-Post: List-Subscribe: , List-Id: List-Unsubscribe: , List-Archive: Date: Sat, 11 Jan 2003 11:00:46 -0600 Status: Modified files: Twisted/debian/python-twisted.menu.in 1.3 1.4 Log message: Instance massenger, apparently ViewCVS links: http://twistedmatrix.com/users/jh.twistd/viewcvs/cgi/viewcvs.cgi/debian/python-twisted.menu.in.diff?r1=text&tr1=1.3&r2=text&tr2=1.4&cvsroot=Twisted Index: Twisted/debian/python-twisted.menu.in diff -u Twisted/debian/python-twisted.menu.in:1.3 Twisted/debian/python-twisted.menu.in:1.4 --- Twisted/debian/python-twisted.menu.in:1.3 Sat Dec 28 10:02:12 2002 +++ Twisted/debian/python-twisted.menu.in Sat Jan 11 09:00:44 2003 @@ -1,7 +1,7 @@ ?package(python at VERSION@-twisted):\ needs=x11\ section="Apps/Net"\ -title="Twisted Instant Messenger (@VERSION@)"\ +title="Twisted Instance Messenger (@VERSION@)"\ command="/usr/bin/t-im at VERSION@" ?package(python at VERSION@-twisted):\ . _______________________________________________ Twisted-commits mailing list Twisted-commits at twistedmatrix.com http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-commits --- NEW FILE: freshcvs.2 --- Return-Path: Delivered-To: warner-twistedcvs at luther.lothar.com Received: (qmail 32220 invoked by uid 1000); 14 Jan 2003 21:50:04 -0000 Delivered-To: warner-twistedcvs at lothar.com Received: (qmail 7923 invoked by uid 13574); 14 Jan 2003 21:49:48 -0000 Received: from unknown (HELO pyramid.twistedmatrix.com) ([64.123.27.105]) (envelope-sender ) by 130.94.181.6 (qmail-ldap-1.03) with SMTP for ; 14 Jan 2003 21:49:48 -0000 Received: from localhost ([127.0.0.1] helo=pyramid.twistedmatrix.com) by pyramid.twistedmatrix.com with esmtp (Exim 3.35 #1 (Debian)) id 18YYr0-0005en-00; Tue, 14 Jan 2003 15:44:14 -0600 Received: from acapnotic by pyramid.twistedmatrix.com with local (Exim 3.35 #1 (Debian)) id 18YYq7-0005eQ-00 for ; Tue, 14 Jan 2003 15:43:19 -0600 To: twisted-commits at twistedmatrix.com From: itamarst CVS Reply-To: twisted-python at twistedmatrix.com X-Mailer: CVSToys From: itamarst CVS Reply-To: twisted-python at twistedmatrix.com Message-Id: Subject: [Twisted-commits] submit formmethod now subclass of Choice Sender: twisted-commits-admin at twistedmatrix.com Errors-To: twisted-commits-admin at twistedmatrix.com X-BeenThere: twisted-commits at twistedmatrix.com X-Mailman-Version: 2.0.11 Precedence: bulk List-Help: List-Post: List-Subscribe: , List-Id: List-Unsubscribe: , List-Archive: Date: Tue, 14 Jan 2003 15:43:19 -0600 Status: Modified files: Twisted/twisted/web/woven/form.py 1.20 1.21 Twisted/twisted/python/formmethod.py 1.12 1.13 Log message: submit formmethod now subclass of Choice ViewCVS links: http://twistedmatrix.com/users/jh.twistd/viewcvs/cgi/viewcvs.cgi/twisted/web/woven/form.py.diff?r1=text&tr1=1.20&r2=text&tr2=1.21&cvsroot=Twisted http://twistedmatrix.com/users/jh.twistd/viewcvs/cgi/viewcvs.cgi/twisted/python/formmethod.py.diff?r1=text&tr1=1.12&r2=text&tr2=1.13&cvsroot=Twisted Index: Twisted/twisted/web/woven/form.py diff -u Twisted/twisted/web/woven/form.py:1.20 Twisted/twisted/web/woven/form.py:1.21 --- Twisted/twisted/web/woven/form.py:1.20 Tue Jan 14 12:07:29 2003 +++ Twisted/twisted/web/woven/form.py Tue Jan 14 13:43:16 2003 @@ -140,8 +140,8 @@ def input_submit(self, request, content, arg): div = content.div() - for value in arg.buttons: - div.input(type="submit", name=arg.name, value=value) + for tag, value, desc in arg.choices: + div.input(type="submit", name=arg.name, value=tag) div.text(" ") if arg.reset: div.input(type="reset") Index: Twisted/twisted/python/formmethod.py diff -u Twisted/twisted/python/formmethod.py:1.12 Twisted/twisted/python/formmethod.py:1.13 --- Twisted/twisted/python/formmethod.py:1.12 Tue Jan 14 12:07:30 2003 +++ Twisted/twisted/python/formmethod.py Tue Jan 14 13:43:17 2003 @@ -180,19 +180,13 @@ return 1 -class Submit(Argument): +class Submit(Choice): """Submit button or a reasonable facsimile thereof.""" - def __init__(self, name, buttons=["Submit"], reset=0, shortDesc=None, longDesc=None): - Argument.__init__(self, name, shortDesc=shortDesc, longDesc=longDesc) - self.buttons = buttons + def __init__(self, name, choices=[("Submit", "submit", "Submit form")], + reset=0, shortDesc=None, longDesc=None): + Choice.__init__(self, name, choices=choices, shortDesc=shortDesc, longDesc=longDesc) self.reset = reset - - def coerce(self, val): - if val in self.buttons: - return val - else: - raise InputError, "no such action" class PresentationHint: . _______________________________________________ Twisted-commits mailing list Twisted-commits at twistedmatrix.com http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-commits --- NEW FILE: freshcvs.3 --- Return-Path: Delivered-To: warner-twistedcvs at luther.lothar.com Received: (qmail 32220 invoked by uid 1000); 14 Jan 2003 21:50:04 -0000 Delivered-To: warner-twistedcvs at lothar.com Received: (qmail 7923 invoked by uid 13574); 14 Jan 2003 21:49:48 -0000 Received: from unknown (HELO pyramid.twistedmatrix.com) ([64.123.27.105]) (envelope-sender ) by 130.94.181.6 (qmail-ldap-1.03) with SMTP for ; 14 Jan 2003 21:49:48 -0000 Received: from localhost ([127.0.0.1] helo=pyramid.twistedmatrix.com) by pyramid.twistedmatrix.com with esmtp (Exim 3.35 #1 (Debian)) id 18YYr0-0005en-00; Tue, 14 Jan 2003 15:44:14 -0600 Received: from acapnotic by pyramid.twistedmatrix.com with local (Exim 3.35 #1 (Debian)) id 18YYq7-0005eQ-00 for ; Tue, 14 Jan 2003 15:43:19 -0600 To: twisted-commits at twistedmatrix.com From: itamarst CVS Reply-To: twisted-python at twistedmatrix.com X-Mailer: CVSToys From: itamarst CVS Reply-To: twisted-python at twistedmatrix.com Message-Id: Subject: [Twisted-commits] submit formmethod now subclass of Choice Sender: twisted-commits-admin at twistedmatrix.com Errors-To: twisted-commits-admin at twistedmatrix.com X-BeenThere: twisted-commits at twistedmatrix.com X-Mailman-Version: 2.0.11 Precedence: bulk List-Help: List-Post: List-Subscribe: , List-Id: List-Unsubscribe: , List-Archive: Date: Tue, 14 Jan 2003 15:43:19 -0600 Status: Modified files: Twisted/twisted/web/woven/form.py 1.20 1.21 Twisted/twisted/python/formmethod.py 1.12 1.13 Log message: submit formmethod now subclass of Choice Index: Twisted/twisted/web/woven/form.py diff -u Twisted/twisted/web/woven/form.py:1.20 Twisted/twisted/web/woven/form.py:1.21 --- Twisted/twisted/web/woven/form.py:1.20 Tue Jan 14 12:07:29 2003 +++ Twisted/twisted/web/woven/form.py Tue Jan 14 13:43:16 2003 @@ -140,8 +140,8 @@ def input_submit(self, request, content, arg): div = content.div() - for value in arg.buttons: - div.input(type="submit", name=arg.name, value=value) + for tag, value, desc in arg.choices: + div.input(type="submit", name=arg.name, value=tag) div.text(" ") if arg.reset: div.input(type="reset") Index: Twisted/twisted/python/formmethod.py diff -u Twisted/twisted/python/formmethod.py:1.12 Twisted/twisted/python/formmethod.py:1.13 --- Twisted/twisted/python/formmethod.py:1.12 Tue Jan 14 12:07:30 2003 +++ Twisted/twisted/python/formmethod.py Tue Jan 14 13:43:17 2003 @@ -180,19 +180,13 @@ return 1 -class Submit(Argument): +class Submit(Choice): """Submit button or a reasonable facsimile thereof.""" - def __init__(self, name, buttons=["Submit"], reset=0, shortDesc=None, longDesc=None): - Argument.__init__(self, name, shortDesc=shortDesc, longDesc=longDesc) - self.buttons = buttons + def __init__(self, name, choices=[("Submit", "submit", "Submit form")], + reset=0, shortDesc=None, longDesc=None): + Choice.__init__(self, name, choices=choices, shortDesc=shortDesc, longDesc=longDesc) self.reset = reset - - def coerce(self, val): - if val in self.buttons: - return val - else: - raise InputError, "no such action" class PresentationHint: . _______________________________________________ Twisted-commits mailing list Twisted-commits at twistedmatrix.com http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-commits --- NEW FILE: freshcvs.4 --- Return-Path: Delivered-To: warner-twistedcvs at luther.lothar.com Received: (qmail 32220 invoked by uid 1000); 14 Jan 2003 21:50:04 -0000 Delivered-To: warner-twistedcvs at lothar.com Received: (qmail 7923 invoked by uid 13574); 14 Jan 2003 21:49:48 -0000 Received: from unknown (HELO pyramid.twistedmatrix.com) ([64.123.27.105]) (envelope-sender ) by 130.94.181.6 (qmail-ldap-1.03) with SMTP for ; 14 Jan 2003 21:49:48 -0000 Received: from localhost ([127.0.0.1] helo=pyramid.twistedmatrix.com) by pyramid.twistedmatrix.com with esmtp (Exim 3.35 #1 (Debian)) id 18YYr0-0005en-00; Tue, 14 Jan 2003 15:44:14 -0600 Received: from acapnotic by pyramid.twistedmatrix.com with local (Exim 3.35 #1 (Debian)) id 18YYq7-0005eQ-00 for ; Tue, 14 Jan 2003 15:43:19 -0600 To: twisted-commits at twistedmatrix.com From: itamarst CVS Reply-To: twisted-python at twistedmatrix.com X-Mailer: CVSToys From: itamarst CVS Reply-To: twisted-python at twistedmatrix.com Message-Id: Subject: [Twisted-commits] submit formmethod now subclass of Choice Sender: twisted-commits-admin at twistedmatrix.com Errors-To: twisted-commits-admin at twistedmatrix.com X-BeenThere: twisted-commits at twistedmatrix.com X-Mailman-Version: 2.0.11 Precedence: bulk List-Help: List-Post: List-Subscribe: , List-Id: List-Unsubscribe: , List-Archive: Date: Tue, 14 Jan 2003 15:43:19 -0600 Status: Modified files: Twisted/twisted/web/woven/form.py 1.20 1.21 Twisted/twisted/python/formmethod.py 1.12 1.13 Log message: submit formmethod now subclass of Choice --- NEW FILE: freshcvs.5 --- Return-Path: Delivered-To: warner-twistedcvs at luther.lothar.com Received: (qmail 5865 invoked by uid 1000); 17 Jan 2003 07:00:04 -0000 Delivered-To: warner-twistedcvs at lothar.com Received: (qmail 40460 invoked by uid 13574); 17 Jan 2003 06:51:55 -0000 Received: from unknown (HELO pyramid.twistedmatrix.com) ([64.123.27.105]) (envelope-sender ) by 130.94.181.6 (qmail-ldap-1.03) with SMTP for ; 17 Jan 2003 06:51:55 -0000 Received: from localhost ([127.0.0.1] helo=pyramid.twistedmatrix.com) by pyramid.twistedmatrix.com with esmtp (Exim 3.35 #1 (Debian)) id 18ZQGk-0003WL-00; Fri, 17 Jan 2003 00:46:22 -0600 Received: from acapnotic by pyramid.twistedmatrix.com with local (Exim 3.35 #1 (Debian)) id 18ZQFy-0003VP-00 for ; Fri, 17 Jan 2003 00:45:34 -0600 To: twisted-commits at twistedmatrix.com From: etrepum CVS Reply-To: twisted-python at twistedmatrix.com X-Mailer: CVSToys From: etrepum CVS Reply-To: twisted-python at twistedmatrix.com Message-Id: Subject: [Twisted-commits] Directory /cvs/Twisted/doc/examples/cocoaDemo added to the repository Sender: twisted-commits-admin at twistedmatrix.com Errors-To: twisted-commits-admin at twistedmatrix.com X-BeenThere: twisted-commits at twistedmatrix.com X-Mailman-Version: 2.0.11 Precedence: bulk List-Help: List-Post: List-Subscribe: , List-Id: List-Unsubscribe: , List-Archive: Date: Fri, 17 Jan 2003 00:45:34 -0600 Status: Modified files: Twisted/doc/examples/cocoaDemo 0 0 Log message: Directory /cvs/Twisted/doc/examples/cocoaDemo added to the repository ViewCVS links: http://twistedmatrix.com/users/jh.twistd/viewcvs/cgi/viewcvs.cgi/doc/examples/cocoaDemo.diff?r1=text&tr1=NONE&r2=text&tr2=NONE&cvsroot=Twisted . _______________________________________________ Twisted-commits mailing list Twisted-commits at twistedmatrix.com http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-commits --- NEW FILE: freshcvs.6 --- Return-Path: Delivered-To: warner-twistedcvs at luther.lothar.com Received: (qmail 7252 invoked by uid 1000); 17 Jan 2003 07:10:04 -0000 Delivered-To: warner-twistedcvs at lothar.com Received: (qmail 43115 invoked by uid 13574); 17 Jan 2003 07:07:57 -0000 Received: from unknown (HELO pyramid.twistedmatrix.com) ([64.123.27.105]) (envelope-sender ) by 130.94.181.6 (qmail-ldap-1.03) with SMTP for ; 17 Jan 2003 07:07:57 -0000 Received: from localhost ([127.0.0.1] helo=pyramid.twistedmatrix.com) by pyramid.twistedmatrix.com with esmtp (Exim 3.35 #1 (Debian)) id 18ZQW6-0003dA-00; Fri, 17 Jan 2003 01:02:14 -0600 Received: from acapnotic by pyramid.twistedmatrix.com with local (Exim 3.35 #1 (Debian)) id 18ZQV7-0003cm-00 for ; Fri, 17 Jan 2003 01:01:13 -0600 To: twisted-commits at twistedmatrix.com From: etrepum CVS Reply-To: twisted-python at twistedmatrix.com X-Mailer: CVSToys From: etrepum CVS Reply-To: twisted-python at twistedmatrix.com Message-Id: Subject: [Twisted-commits] Cocoa (OS X) clone of the QT demo, using polling reactor Sender: twisted-commits-admin at twistedmatrix.com Errors-To: twisted-commits-admin at twistedmatrix.com X-BeenThere: twisted-commits at twistedmatrix.com X-Mailman-Version: 2.0.11 Precedence: bulk List-Help: List-Post: List-Subscribe: , List-Id: List-Unsubscribe: , List-Archive: Date: Fri, 17 Jan 2003 01:01:13 -0600 Status: Modified files: Twisted/doc/examples/cocoaDemo/MyAppDelegate.py None 1.1 Twisted/doc/examples/cocoaDemo/__main__.py None 1.1 Twisted/doc/examples/cocoaDemo/bin-python-main.m None 1.1 Twisted/doc/examples/cocoaDemo/English.lproj/InfoPlist.strings None 1.1 Twisted/doc/examples/cocoaDemo/English.lproj/MainMenu.nib/classes.nib None 1.1 Twisted/doc/examples/cocoaDemo/English.lproj/MainMenu.nib/info.nib None 1.1 Twisted/doc/examples/cocoaDemo/English.lproj/MainMenu.nib/keyedobjects.nib None 1.1 Twisted/doc/examples/cocoaDemo/cocoaDemo.pbproj/project.pbxproj None 1.1 Log message: Cocoa (OS X) clone of the QT demo, using polling reactor Requires pyobjc ( http://pyobjc.sourceforge.net ), it's not much different than the template project. The reactor is iterated periodically by a repeating NSTimer. ViewCVS links: http://twistedmatrix.com/users/jh.twistd/viewcvs/cgi/viewcvs.cgi/doc/examples/cocoaDemo/MyAppDelegate.py.diff?r1=text&tr1=None&r2=text&tr2=1.1&cvsroot=Twisted http://twistedmatrix.com/users/jh.twistd/viewcvs/cgi/viewcvs.cgi/doc/examples/cocoaDemo/__main__.py.diff?r1=text&tr1=None&r2=text&tr2=1.1&cvsroot=Twisted http://twistedmatrix.com/users/jh.twistd/viewcvs/cgi/viewcvs.cgi/doc/examples/cocoaDemo/bin-python-main.m.diff?r1=text&tr1=None&r2=text&tr2=1.1&cvsroot=Twisted http://twistedmatrix.com/users/jh.twistd/viewcvs/cgi/viewcvs.cgi/doc/examples/cocoaDemo/English.lproj/InfoPlist.strings.diff?r1=text&tr1=None&r2=text&tr2=1.1&cvsroot=Twisted http://twistedmatrix.com/users/jh.twistd/viewcvs/cgi/viewcvs.cgi/doc/examples/cocoaDemo/English.lproj/MainMenu.nib/classes.nib.diff?r1=text&tr1=None&r2=text&tr2=1.1&cvsroot=Twisted http://twistedmatrix.com/users/jh.twistd/viewcvs/cgi/viewcvs.cgi/doc/examples/cocoaDemo/English.lproj/MainMenu.nib/info.nib.diff?r1=text&tr1=None&r2=text&tr2=1.1&cvsroot=Twisted http://twistedmatrix.com/users/jh.twistd/viewcvs/cgi/viewcvs.cgi/doc/examples/cocoaDemo/English.lproj/MainMenu.nib/keyedobjects.nib.diff?r1=text&tr1=None&r2=text&tr2=1.1&cvsroot=Twisted http://twistedmatrix.com/users/jh.twistd/viewcvs/cgi/viewcvs.cgi/doc/examples/cocoaDemo/cocoaDemo.pbproj/project.pbxproj.diff?r1=text&tr1=None&r2=text&tr2=1.1&cvsroot=Twisted . _______________________________________________ Twisted-commits mailing list Twisted-commits at twistedmatrix.com http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-commits --- NEW FILE: freshcvs.7 --- Return-Path: Delivered-To: warner-twistedcvs at luther.lothar.com Received: (qmail 8665 invoked by uid 1000); 17 Jan 2003 08:00:03 -0000 Delivered-To: warner-twistedcvs at lothar.com Received: (qmail 50728 invoked by uid 13574); 17 Jan 2003 07:51:14 -0000 Received: from unknown (HELO pyramid.twistedmatrix.com) ([64.123.27.105]) (envelope-sender ) by 130.94.181.6 (qmail-ldap-1.03) with SMTP for ; 17 Jan 2003 07:51:14 -0000 Received: from localhost ([127.0.0.1] helo=pyramid.twistedmatrix.com) by pyramid.twistedmatrix.com with esmtp (Exim 3.35 #1 (Debian)) id 18ZRBm-0003pN-00; Fri, 17 Jan 2003 01:45:18 -0600 Received: from acapnotic by pyramid.twistedmatrix.com with local (Exim 3.35 #1 (Debian)) id 18ZRBQ-0003ou-00 for ; Fri, 17 Jan 2003 01:44:56 -0600 To: twisted-commits at twistedmatrix.com From: etrepum CVS Reply-To: twisted-python at twistedmatrix.com X-Mailer: CVSToys From: etrepum CVS Reply-To: twisted-python at twistedmatrix.com Message-Id: Subject: [Twisted-commits] Directories break debian build script, waiting for reasonable fix Sender: twisted-commits-admin at twistedmatrix.com Errors-To: twisted-commits-admin at twistedmatrix.com X-BeenThere: twisted-commits at twistedmatrix.com X-Mailman-Version: 2.0.11 Precedence: bulk List-Help: List-Post: List-Subscribe: , List-Id: List-Unsubscribe: , List-Archive: Date: Fri, 17 Jan 2003 01:44:56 -0600 Status: Modified files: Twisted/doc/examples/cocoaDemo/MyAppDelegate.py 1.1 None Twisted/doc/examples/cocoaDemo/__main__.py 1.1 None Twisted/doc/examples/cocoaDemo/bin-python-main.m 1.1 None Twisted/doc/examples/cocoaDemo/English.lproj/InfoPlist.strings 1.1 None Twisted/doc/examples/cocoaDemo/English.lproj/MainMenu.nib/classes.nib 1.1 None Twisted/doc/examples/cocoaDemo/English.lproj/MainMenu.nib/info.nib 1.1 None Twisted/doc/examples/cocoaDemo/English.lproj/MainMenu.nib/keyedobjects.nib 1.1 None Twisted/doc/examples/cocoaDemo/cocoaDemo.pbproj/project.pbxproj 1.1 None Log message: Directories break debian build script, waiting for reasonable fix ViewCVS links: http://twistedmatrix.com/users/jh.twistd/viewcvs/cgi/viewcvs.cgi/doc/examples/cocoaDemo/MyAppDelegate.py.diff?r1=text&tr1=1.1&r2=text&tr2=None&cvsroot=Twisted http://twistedmatrix.com/users/jh.twistd/viewcvs/cgi/viewcvs.cgi/doc/examples/cocoaDemo/__main__.py.diff?r1=text&tr1=1.1&r2=text&tr2=None&cvsroot=Twisted http://twistedmatrix.com/users/jh.twistd/viewcvs/cgi/viewcvs.cgi/doc/examples/cocoaDemo/bin-python-main.m.diff?r1=text&tr1=1.1&r2=text&tr2=None&cvsroot=Twisted http://twistedmatrix.com/users/jh.twistd/viewcvs/cgi/viewcvs.cgi/doc/examples/cocoaDemo/English.lproj/InfoPlist.strings.diff?r1=text&tr1=1.1&r2=text&tr2=None&cvsroot=Twisted http://twistedmatrix.com/users/jh.twistd/viewcvs/cgi/viewcvs.cgi/doc/examples/cocoaDemo/English.lproj/MainMenu.nib/classes.nib.diff?r1=text&tr1=1.1&r2=text&tr2=None&cvsroot=Twisted http://twistedmatrix.com/users/jh.twistd/viewcvs/cgi/viewcvs.cgi/doc/examples/cocoaDemo/English.lproj/MainMenu.nib/info.nib.diff?r1=text&tr1=1.1&r2=text&tr2=None&cvsroot=Twisted http://twistedmatrix.com/users/jh.twistd/viewcvs/cgi/viewcvs.cgi/doc/examples/cocoaDemo/English.lproj/MainMenu.nib/keyedobjects.nib.diff?r1=text&tr1=1.1&r2=text&tr2=None&cvsroot=Twisted http://twistedmatrix.com/users/jh.twistd/viewcvs/cgi/viewcvs.cgi/doc/examples/cocoaDemo/cocoaDemo.pbproj/project.pbxproj.diff?r1=text&tr1=1.1&r2=text&tr2=None&cvsroot=Twisted . _______________________________________________ Twisted-commits mailing list Twisted-commits at twistedmatrix.com http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-commits --- NEW FILE: freshcvs.8 --- Return-Path: Delivered-To: warner-twistedcvs at luther.lothar.com Received: (qmail 10804 invoked by uid 1000); 19 Jan 2003 14:10:03 -0000 Delivered-To: warner-twistedcvs at lothar.com Received: (qmail 6704 invoked by uid 13574); 19 Jan 2003 14:00:20 -0000 Received: from unknown (HELO pyramid.twistedmatrix.com) ([64.123.27.105]) (envelope-sender ) by 130.94.181.6 (qmail-ldap-1.03) with SMTP for ; 19 Jan 2003 14:00:20 -0000 Received: from localhost ([127.0.0.1] helo=pyramid.twistedmatrix.com) by pyramid.twistedmatrix.com with esmtp (Exim 3.35 #1 (Debian)) id 18aFtx-0002WS-00; Sun, 19 Jan 2003 07:54:17 -0600 Received: from acapnotic by pyramid.twistedmatrix.com with local (Exim 3.35 #1 (Debian)) id 18aFtH-0002W3-00 for ; Sun, 19 Jan 2003 07:53:35 -0600 To: twisted-commits at twistedmatrix.com From: acapnotic CVS X-Mailer: CVSToys Message-Id: Subject: [Twisted-commits] it doesn't work with invalid syntax Sender: twisted-commits-admin at twistedmatrix.com Errors-To: twisted-commits-admin at twistedmatrix.com X-BeenThere: twisted-commits at twistedmatrix.com X-Mailman-Version: 2.0.11 Precedence: bulk List-Help: List-Post: List-Subscribe: , List-Id: List-Unsubscribe: , List-Archive: Date: Sun, 19 Jan 2003 07:53:35 -0600 Status: Modified files: CVSROOT/freshCfg 1.16 1.17 Log message: it doesn't work with invalid syntax Index: CVSROOT/freshCfg diff -u CVSROOT/freshCfg:1.16 CVSROOT/freshCfg:1.17 --- CVSROOT/freshCfg:1.16 Sun Jan 19 05:52:34 2003 +++ CVSROOT/freshCfg Sun Jan 19 05:53:34 2003 @@ -27,7 +27,7 @@ ('/cvs', '^Reality', None, MailNotification(['reality-commits'])), ('/cvs', '^Twistby', None, MailNotification(['acapnotic'])), ('/cvs', '^CVSToys', None, - MailNotification(['CVSToys-list'] + MailNotification(['CVSToys-list'], "http://twistedmatrix.com/users/jh.twistd/" "viewcvs/cgi/viewcvs.cgi/", replyTo="cvstoys-list at twistedmatrix.com"),) _______________________________________________ Twisted-commits mailing list Twisted-commits at twistedmatrix.com http://twistedmatrix.com/cgi-bin/mailman/listinfo/twisted-commits --- NEW FILE: freshcvs.9 --- >From twisted-python at twistedmatrix.com Fri Dec 26 07:25:13 2003 From: twisted-python at twistedmatrix.com (exarkun CVS) Date: Fri, 26 Dec 2003 00:25:13 -0700 Subject: [Twisted-commits] Directory /cvs/Twisted/sandbox/exarkun/persist-plugin added to the repository Message-ID: Modified files: Twisted/sandbox/exarkun/persist-plugin Log message: Directory /cvs/Twisted/sandbox/exarkun/persist-plugin added to the repository ViewCVS links: http://cvs.twistedmatrix.com/cvs/sandbox/exarkun/persist-plugin?cvsroot=Twisted --- msg1 DELETED --- --- msg2 DELETED --- --- msg3 DELETED --- --- msg4 DELETED --- --- msg5 DELETED --- --- msg6 DELETED --- --- msg7 DELETED --- --- msg8 DELETED --- --- msg9 DELETED ---