? build
? buildbot.egg-info
Index: buildbot/interfaces.py
===================================================================
RCS file: /cvsroot/buildbot/buildbot/buildbot/interfaces.py,v
retrieving revision 1.66
diff -u -r1.66 interfaces.py
--- buildbot/interfaces.py	22 May 2008 22:13:17 -0000	1.66
+++ buildbot/interfaces.py	9 Jun 2008 18:50:22 -0000
@@ -346,6 +346,11 @@
         # 'interlocked' too, but things like the Change list might still be
         # subject to change
 
+    def isBusy():
+        """Returns True if slave is busy (where busy is defined as "is
+           currently building", False otherwise.
+        """
+
     def getLastFinishedBuild():
         """Return the IBuildStatus object representing the last finished
         build, which may be None if the builder has not yet finished any
Index: buildbot/process/builder.py
===================================================================
RCS file: /cvsroot/buildbot/buildbot/buildbot/process/builder.py,v
retrieving revision 1.54
diff -u -r1.54 builder.py
--- buildbot/process/builder.py	22 May 2008 22:13:06 -0000	1.54
+++ buildbot/process/builder.py	9 Jun 2008 18:50:22 -0000
@@ -435,6 +435,9 @@
                 return b
         return None
 
+    def isBusy(self):
+        return self.builder_status.isBusy()
+
     def fireTestEvent(self, name, fire_with=None):
         if fire_with is None:
             fire_with = self
Index: buildbot/status/builder.py
===================================================================
RCS file: /cvsroot/buildbot/buildbot/buildbot/status/builder.py,v
retrieving revision 1.109
diff -u -r1.109 builder.py
--- buildbot/status/builder.py	22 May 2008 22:12:57 -0000	1.109
+++ buildbot/status/builder.py	9 Jun 2008 18:50:22 -0000
@@ -1455,6 +1455,12 @@
     def getCurrentBuilds(self):
         return self.currentBuilds
 
+    def isBusy(self):
+        if len(self.currentBuilds) > 0:
+            return True
+        else:
+            return False
+
     def getLastFinishedBuild(self):
         b = self.getBuild(-1)
         if not (b and b.isFinished()):
Index: buildbot/test/test_run.py
===================================================================
RCS file: /cvsroot/buildbot/buildbot/buildbot/test/test_run.py,v
retrieving revision 1.56
diff -u -r1.56 test_run.py
--- buildbot/test/test_run.py	22 May 2008 22:13:17 -0000	1.56
+++ buildbot/test/test_run.py	9 Jun 2008 18:50:22 -0000
@@ -215,6 +215,74 @@
         return d
 
 
+class Idle(RunMixin, unittest.TestCase):
+    def setUp(self):
+        RunMixin.setUp(self)
+
+        self.master.loadConfig(config_can_build)
+        self.master.readConfig = True
+        self.master.startService()
+
+        return self.connectSlave()
+
+    def isBusy(self):
+        b = self.master.botmaster.builders['dummy'].builder_status
+        return b.isBusy()
+
+    def doBuild(self):
+        c = changes.Change("foo", ["blah"], "stuff")
+        self.master.change_svc.addChange(c)
+
+    def testIsIdle(self):
+        self.failIf(self.isBusy())
+
+    def testIsBusy(self):
+        self.doBuild()
+        d = defer.Deferred()
+        # wait for it to start
+        reactor.callLater(1, d.callback, None)
+        d.addCallback(self._testIsBusy_1)
+        return d
+
+    def _testIsBusy_1(self, res):
+        self.failUnless(self.isBusy())
+        d = defer.Deferred()
+        reactor.callLater(4, d.callback, None)
+        d.addCallback(self._testIsBusy_2)
+        return d
+
+    def _testIsBusy_2(self, res):
+        self.failIf(self.isBusy())
+
+    def testMultiBuild(self):
+        self.doBuild()
+        d = defer.Deferred()
+        # wait for it to start
+        reactor.callLater(1, d.callback, None)
+        d.addCallback(self._testMultiBuild_1)
+        return d
+
+    def _testMultiBuild_1(self, res):
+        self.failUnless(self.isBusy())
+        self.doBuild()
+        self.doBuild()
+        d = defer.Deferred()
+        reactor.callLater(4, d.callback, None)
+        d.addCallback(self._testMultiBuild_2)
+        return d
+
+    def _testMultiBuild_2(self, res):
+        self.failUnless(self.isBusy())
+        d = defer.Deferred()
+        reactor.callLater(6, d.callback, None)
+        d.addCallback(self._testMultiBuild_3)
+        return d
+
+    def _testMultiBuild_3(self, res):
+        self.failIf(self.isBusy())
+
+
+
 class Ping(RunMixin, unittest.TestCase):
     def testPing(self):
         self.master.loadConfig(config_2)

