? build
? buildbot.egg-info
Index: buildbot/scheduler.py
===================================================================
RCS file: /cvsroot/buildbot/buildbot/buildbot/scheduler.py,v
retrieving revision 1.33
diff -u -r1.33 scheduler.py
--- buildbot/scheduler.py	22 May 2008 22:13:21 -0000	1.33
+++ buildbot/scheduler.py	4 Jun 2008 19:22:10 -0000
@@ -372,6 +372,12 @@
         self.submitBuildSet(bs)
 
 
+class Idle(Periodic):
+    def addChange(self, c):
+        if c.branch == self.branch:
+            self.timer.stopService()
+            self.timer.startService()
+
 
 class Nightly(BaseUpstreamScheduler):
     """Imitate 'cron' scheduling. This can be used to schedule a nightly
Index: buildbot/test/test_scheduler.py
===================================================================
RCS file: /cvsroot/buildbot/buildbot/buildbot/test/test_scheduler.py,v
retrieving revision 1.12
diff -u -r1.12 test_scheduler.py
--- buildbot/test/test_scheduler.py	11 Dec 2006 08:23:29 -0000	1.12
+++ buildbot/test/test_scheduler.py	4 Jun 2008 19:22:10 -0000
@@ -21,6 +21,9 @@
             self.d = None
         return pb.Referenceable() # makes the cleanup work correctly
 
+    def getSetsForBuilder(self, builderName):
+        return [set for set in self.sets if builderName in set.builderNames]
+
 class Scheduling(unittest.TestCase):
     def setUp(self):
         self.master = master = FakeMaster()
@@ -46,6 +49,61 @@
         self.failUnlessEqual(s1.builderNames, ["a","b"])
         self.failUnlessEqual(s1.reason, "The Periodic scheduler named 'quickly' triggered this build")
 
+    # Two builders on different branches, we'll add a change for one to make
+    # sure it resets its timer properly, and that the other one doesn't
+    # Timeline is like this:
+    # (second) : (event) : (function) : (builds running at start of function)
+    # 0 : Builds - a,b             : testIdle1      : <none>
+    # 1 : <nothing>                : <none>         : <n/a>
+    # 2 : addChange - a, Build - a : testIdle1_1    : a: 1, b: 1
+    # 3 : <nothing>                : testIdle1_2    : a: 2, b: 1
+    # 4 : Build - b                : <none>         : <n/a>
+    # 5 : <nothing>                : testIdle1_3    : a: 2, b: 2
+    # 6 : Build - a                : <none>         : <n/a>
+    # 7 : <nothing>                : testIdle1_4    : a: 3, b: 2
+    def testIdle1(self):
+        idle = scheduler.Idle("quick", "a", "a", 4)
+        idle2 = scheduler.Idle("quick2", "b", "b", 4)
+        normal = scheduler.Scheduler("normal", "a", 0, ["0"])
+        self.addScheduler(idle)
+        self.addScheduler(idle2)
+        self.addScheduler(normal)
+        d = defer.Deferred()
+        reactor.callLater(2, d.callback, None)
+        d.addCallback(self._testIdle1_1, [idle, idle2, normal])
+        return d
+
+    def _testIdle1_1(self, res, schedulers):
+        self.failUnless(len(self.master.getSetsForBuilder('a')) == 1)
+        self.failUnless(len(self.master.getSetsForBuilder('b')) == 1)
+        c = Change('me', ['foo', 'bar'], 'blah', branch='a')
+        for s in schedulers:
+            s.addChange(c)
+        d = defer.Deferred()
+        reactor.callLater(1, d.callback, None)
+        d.addCallback(self._testIdle1_2)
+        return d
+
+    def _testIdle1_2(self, res):
+        self.failUnless(len(self.master.getSetsForBuilder('a')) == 2)
+        self.failUnless(len(self.master.getSetsForBuilder('b')) == 1)
+        d = defer.Deferred()
+        reactor.callLater(2, d.callback, None)
+        d.addCallback(self._testIdle1_3)
+        return d
+
+    def _testIdle1_3(self, res):
+        self.failUnless(len(self.master.getSetsForBuilder('a')) == 2)
+        self.failUnless(len(self.master.getSetsForBuilder('b')) == 2)
+        d = defer.Deferred()
+        reactor.callLater(2, d.callback, None)
+        d.addCallback(self._testIdle1_4)
+        return d
+
+    def _testIdle1_4(self, res):
+        self.failUnless(len(self.master.getSetsForBuilder('a')) == 3)
+        self.failUnless(len(self.master.getSetsForBuilder('b')) == 2)
+
     def testNightly(self):
         # now == 15-Nov-2005, 00:05:36 AM . By using mktime, this is
         # converted into the local timezone, which happens to match what
Index: docs/buildbot.texinfo
===================================================================
RCS file: /cvsroot/buildbot/buildbot/docs/buildbot.texinfo,v
retrieving revision 1.150
diff -u -r1.150 buildbot.texinfo
--- docs/buildbot.texinfo	27 May 2008 00:52:29 -0000	1.150
+++ docs/buildbot.texinfo	4 Jun 2008 19:22:11 -0000
@@ -2234,6 +2234,7 @@
 * AnyBranchScheduler::          
 * Dependent Scheduler::          
 * Periodic Scheduler::          
+* Idle Scheduler::
 * Nightly Scheduler::          
 * Try Schedulers::          
 * Triggerable Scheduler::          
@@ -2438,6 +2439,13 @@
 could easily wind up a ``daily'' or ``every afternoon'' scheduler
 depending upon when it was first activated.
 
+@node Idle Scheduler
+@subsection Idle Scheduler
+@slindex buildbot.scheduler.Idle
+
+This scheduler works exactly like a Peridioc one, but its timer gets reset
+when a change comes in.
+
 @node Nightly Scheduler
 @subsection Nightly Scheduler
 @slindex buildbot.scheduler.Nightly
