diff -r 7828b9c7be43 -r 6eb7c69356f6 buildbot/scheduler.py
--- a/buildbot/scheduler.py	Thu Jun 19 13:23:12 2008 -0400
+++ b/buildbot/scheduler.py	Wed Jun 25 10:47:24 2008 -0400
@@ -53,33 +53,61 @@
         pass
 
 class BaseUpstreamScheduler(BaseScheduler):
     implements(interfaces.IUpstreamScheduler)
 
     def __init__(self, name, properties={}):
         BaseScheduler.__init__(self, name, properties)
         self.successWatchers = []
+        self.failureWatchers = []
+        self.startWatchers = []
 
+    # these two functions are superceded by the two below, but are being
+    # kept to accomodate existing code.
+    # TODO: remove them
     def subscribeToSuccessfulBuilds(self, watcher):
-        self.successWatchers.append(watcher)
+        self.subscribeToBuilds(watcher)
     def unsubscribeToSuccessfulBuilds(self, watcher):
-        self.successWatchers.remove(watcher)
+        self.unsubscribeToBuilds(watcher)
+
+    def subscribeToBuilds(self, watcher, start=False, success=True,
+                          failure=False):
+        if start:
+            self.startWatchers.append(watcher)
+        if success:
+            self.successWatchers.append(watcher)
+        if failure:
+            self.failureWatchers.append(watcher)
+        
+    def unsubscribeToBuilds(self, watcher, start=False, success=True,
+                            failure=False):
+        if start:
+            self.startWatchers.remove(watcher)
+        if success:
+            self.successWatchers.remove(watcher)
+        if failure:
+            self.failureWatchers.remove(watcher)
 
     def submitBuildSet(self, bs):
         d = bs.waitUntilFinished()
         d.addCallback(self.buildSetFinished)
+        for w in self.startWatchers:
+            w(bs.source)
         BaseScheduler.submitBuildSet(self, bs)
 
     def buildSetFinished(self, bss):
         if not self.running:
             return
+        ss = bss.getSourceStamp()
         if bss.getResults() == builder.SUCCESS:
-            ss = bss.getSourceStamp()
             for w in self.successWatchers:
+                w(ss)
+        else:
+            for w in self.failureWatchers:
                 w(ss)
 
 
 class Scheduler(BaseUpstreamScheduler):
     """The default Scheduler class will run a build after some period of time
     called the C{treeStableTimer}, on a given set of Builders. It only pays
     attention to a single branch. You you can provide a C{fileIsImportant}
     function which will evaluate each Change to decide whether or not it

