[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