[Buildbot-commits] buildbot/buildbot/status builder.py,1.45,1.46 html.py,1.46,1.47

Brian Warner warner at users.sourceforge.net
Fri Dec 3 22:54:55 UTC 2004


Update of /cvsroot/buildbot/buildbot/buildbot/status
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv20004/buildbot/status

Modified Files:
	builder.py html.py 
Log Message:
Make commands (and builds) interruptible. Improve lost-slave behavior.
Merging in several days of changes from local Arch branch, see ChangeLog for
details about individual files.


Index: builder.py
===================================================================
RCS file: /cvsroot/buildbot/buildbot/buildbot/status/builder.py,v
retrieving revision 1.45
retrieving revision 1.46
diff -u -d -r1.45 -r1.46
--- builder.py	24 Nov 2004 02:41:22 -0000	1.45
+++ builder.py	3 Dec 2004 22:54:52 -0000	1.46
@@ -340,8 +340,11 @@
         return (self.finished is not None)
 
     def waitUntilFinished(self):
-        d = defer.Deferred()
-        self.finishedWatchers.append(d)
+        if self.finished:
+            d = defer.succeed(self)
+        else:
+            d = defer.Deferred()
+            self.finishedWatchers.append(d)
         return d
 
     # while the step is running, the following methods make sense.
@@ -580,8 +583,11 @@
         return (self.finished is not None)
 
     def waitUntilFinished(self):
-        d = defer.Deferred()
-        self.finishedWatchers.append(d)
+        if self.finished:
+            d = defer.succeed(self)
+        else:
+            d = defer.Deferred()
+            self.finishedWatchers.append(d)
         return d
 
     # while the build is running, the following methods make sense.
@@ -1365,7 +1371,7 @@
         return self.botmaster.builders[name].builder_status
 
     def getSlave(self, slavename):
-        return self.botmaster.slaveStatus[slavename]
+        return self.botmaster.slaves[slavename].slave_status
 
     def subscribe(self, target):
         self.watchers.append(target)

Index: html.py
===================================================================
RCS file: /cvsroot/buildbot/buildbot/buildbot/status/html.py,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -d -r1.46 -r1.47
--- html.py	24 Nov 2004 03:35:05 -0000	1.46
+++ html.py	3 Dec 2004 22:54:52 -0000	1.47
@@ -5,10 +5,11 @@
 from twisted.python import log, components
 import urllib
 
+from twisted.internet import defer, reactor
 from twisted.web.resource import Resource
 from twisted.web import static, html, server, distrib
 from twisted.web.error import NoResource
-from twisted.web.util import Redirect
+from twisted.web.util import Redirect, DeferredResource
 from twisted.application import service, internet
 from twisted.spread import pb
 
@@ -35,6 +36,23 @@
 class IHTMLLog(components.Interface):
     pass
 
+ROW_TEMPLATE = '''
+<div class="row">
+  <span class="label">%(label)s</span>
+  <span class="field">%(field)s</span>
+</div>'''
+
+def make_row(label, field):
+    """Create a name/value row for the HTML.
+
+    `label` is plain text; it will be HTML-encoded.
+
+    `field` is a bit of HTML structure; it will not be encoded in
+    any way.
+    """
+    label = html.escape(label)
+    return ROW_TEMPLATE % {"label": label, "field": field}
+
 colormap = {
     'green': '#72ff75',
     }
@@ -227,9 +245,10 @@
 class StatusResourceBuild(HtmlResource):
     title = "Build"
 
-    def __init__(self, build):
+    def __init__(self, build, control):
         HtmlResource.__init__(self)
         self.build = build
+        self.control = control
 
     def body(self, request):
         b = self.build
@@ -246,6 +265,19 @@
                 data += "<h3><a href=\"%s\">test results</a></h3>\n" % url
         else:
             data += "<h2>Build In Progress</h2>"
+            if self.control is not None:
+                stopURL = urllib.quote(request.childLink("stop"))
+                data += """
+                <form action="%s" class='command stopbuild'>
+                <p>To stop this build, fill out the following fields and
+                push the 'Stop' button</p>\n""" % stopURL
+                data += make_row("Your name:",
+                                 "<input type='text' name='username' />")
+                data += make_row("Reason for stopping build:",
+                                 "<input type='text' name='comments' />")
+                data += """<input type="submit" value="Stop Builder" />
+                </form>
+                """
 
         data += ("<h2>Blamelist:</h2>\n"
                  " <ol>\n")
@@ -262,10 +294,31 @@
         #data += html.PRE(b.changesText()) # TODO
         return data
 
+    def stop(self, request):
+        log.msg("web stopBuild of build %s:%s" % \
+                (self.build.getBuilder().getName(),
+                 self.build.getNumber()))
+        name = request.args.get("username", ["<unknown>"])[0]
+        comments = request.args.get("comments", ["<no reason specified>"])[0]
+        reason = ("The web-page 'stop build' button was pressed by "
+                  "'%s': %s\n" % (name, comments))
+        self.control.stopBuild(reason)
+        # we're at http://localhost:8080/svn-hello/builds/5/stop?[args] and
+        # we want to go to: http://localhost:8080/svn-hello/builds/5 or
+        # http://localhost:8080/
+        #
+        #return Redirect("../%d" % self.build.getNumber())
+        r = Redirect("../../..")
+        d = defer.Deferred()
+        reactor.callLater(1, d.callback, r)
+        return DeferredResource(d)
+
     def getChild(self, path, request):
         if path == "tests":
             # TODO: this will collide with a step named 'tests'
             return StatusResourceTestResults(self.build.getTestResults())
+        if path == "stop":
+            return self.stop(request)
         stepname = path
         steps = self.build.getSteps()
         for s in steps:
@@ -285,17 +338,14 @@
     def body(self, request):
         b = self.builder
         slave = b.getSlave()
-        data = self.make_row("Builder:",
-                             html.escape(b.getName()))
+        data = make_row("Builder:", html.escape(b.getName()))
         b1 = b.getBuild(-1)
         if b1 is not None:
-            data += self.make_row("Current/last build:",
-                                  str(b1.getNumber()))
+            data += make_row("Current/last build:", str(b1.getNumber()))
         if slave.isConnected():
             data += "\nCONNECTED (slave '%s')<br />\n" % slave.getName()
             if slave.getAdmin():
-                data += self.make_row("Admin:",
-                                      html.escape(slave.getAdmin()))
+                data += make_row("Admin:", html.escape(slave.getAdmin()))
             if slave.getHost():
                 data += "<span class='label'>Host info:</span>\n"
                 data += html.PRE(slave.getHost())
@@ -309,10 +359,10 @@
                 <form action='%(forceURL)s' class='command forcebuild'>
                 <p>To force a build, fill out the following fields and
                 push the 'Force Build' button</p>"""
-                + self.make_row("Your name:",
-                                "<input type='text' name='username' />")
-                + self.make_row("Reason for build:",
-                                "<input type='text' name='comments' />")
+                + make_row("Your name:",
+                           "<input type='text' name='username' />")
+                + make_row("Reason for build:",
+                           "<input type='text' name='comments' />")
                 + """
                 <input type='submit' value='Force Build' />
                 </form>
@@ -334,23 +384,6 @@
 
         return data
 
-    def make_row(self, label, field):
-        """Create a name/value row for the HTML.
-
-        `label` is plain text; it will be HTML-encoded.
-
-        `field` is a bit of HTML structure; it will not be encoded in
-        any way.
-        """
-        label = html.escape(label)
-        return self.ROW_TEMPLATE % {"label": label, "field": field}
-
-    ROW_TEMPLATE = '''
-    <div class="row">
-      <span class="label">%(label)s</span>
-      <span class="field">%(field)s</span>
-    </div>'''
-
     def force(self, request):
         name = request.args.get("username", ["<unknown>"])[0]
         reason = request.args.get("comments", ["<no reason specified>"])[0]
@@ -378,6 +411,8 @@
         return Redirect("..")
 
     def getChild(self, path, request):
+        log.msg('path=%s, postpath=%s, prepath=%s' % (path, request.postpath,
+                                                      request.prepath))
         if path == "force":
             return self.force(request)
         if path == "ping":
@@ -407,7 +442,10 @@
         if path == "builds":
             build = self.builder.getBuild(num)
             if build:
-                return StatusResourceBuild(build)
+                control = None
+                if self.control:
+                    control = self.control.getBuild(num)
+                return StatusResourceBuild(build, control)
             else:
                 return NoResource("No such build '%d'" % num)
         return NoResource("really weird URL %s" % path)





More information about the Commits mailing list