Index: third_party/buildbot_7_12/buildbot/status/web/build.py |
diff --git a/third_party/buildbot_7_12/buildbot/status/web/build.py b/third_party/buildbot_7_12/buildbot/status/web/build.py |
deleted file mode 100644 |
index 0025dad0224bd74f41cb2123f5f68ab78e5952c1..0000000000000000000000000000000000000000 |
--- a/third_party/buildbot_7_12/buildbot/status/web/build.py |
+++ /dev/null |
@@ -1,316 +0,0 @@ |
- |
-from twisted.web import html |
-from twisted.web.util import Redirect, DeferredResource |
-from twisted.internet import defer, reactor |
- |
-import urllib, time |
-from twisted.python import log |
-from buildbot.status.web.base import HtmlResource, make_row, make_stop_form, \ |
- make_extra_property_row, css_classes, path_to_builder, path_to_slave, \ |
- make_name_user_passwd_form, getAndCheckProperties |
- |
- |
-from buildbot.status.web.tests import TestsResource |
-from buildbot.status.web.step import StepsResource |
-from buildbot import version, util |
- |
-# /builders/$builder/builds/$buildnum |
-class StatusResourceBuild(HtmlResource): |
- addSlash = True |
- |
- def __init__(self, build_status, build_control, builder_control): |
- HtmlResource.__init__(self) |
- self.build_status = build_status |
- self.build_control = build_control |
- self.builder_control = builder_control |
- |
- def getTitle(self, request): |
- return ("Buildbot: %s Build #%d" % |
- (html.escape(self.build_status.getBuilder().getName()), |
- self.build_status.getNumber())) |
- |
- def body(self, req): |
- b = self.build_status |
- status = self.getStatus(req) |
- projectName = status.getProjectName() |
- projectURL = status.getProjectURL() |
- data = ('<div class="title"><a href="%s">%s</a></div>\n' |
- % (self.path_to_root(req), projectName)) |
- builder_name = b.getBuilder().getName() |
- data += ("<h1><a href=\"%s\">Builder %s</a>: Build #%d</h1>\n" |
- % (path_to_builder(req, b.getBuilder()), |
- builder_name, b.getNumber())) |
- |
- if not b.isFinished(): |
- data += "<h2>Build In Progress</h2>" |
- when = b.getETA() |
- if when is not None: |
- when_time = time.strftime("%H:%M:%S", |
- time.localtime(time.time() + when)) |
- data += "<div>ETA %ds (%s)</div>\n" % (when, when_time) |
- |
- if self.build_control is not None: |
- stopURL = urllib.quote(req.childLink("stop")) |
- data += make_stop_form(stopURL, self.isUsingUserPasswd(req)) |
- |
- if b.isFinished(): |
- # Results map loosely to css_classes |
- results = b.getResults() |
- data += "<h2>Results:</h2>\n" |
- text = " ".join(b.getText()) |
- data += '<span class="%s">%s</span>\n' % (css_classes[results], |
- text) |
- if b.getTestResults(): |
- url = req.childLink("tests") |
- data += "<h3><a href=\"%s\">test results</a></h3>\n" % url |
- |
- ss = b.getSourceStamp() |
- data += "<h2>SourceStamp:</h2>\n" |
- data += " <ul>\n" |
- if ss.branch: |
- data += " <li>Branch: %s</li>\n" % html.escape(ss.branch) |
- if ss.revision: |
- data += " <li>Revision: %s</li>\n" % html.escape(str(ss.revision)) |
- if ss.patch: |
- data += " <li>Patch: YES</li>\n" # TODO: provide link to .diff |
- if ss.changes: |
- data += " <li>Changes: see below</li>\n" |
- if (ss.branch is None and ss.revision is None and ss.patch is None |
- and not ss.changes): |
- data += " <li>build of most recent revision</li>\n" |
- got_revision = None |
- try: |
- got_revision = b.getProperty("got_revision") |
- except KeyError: |
- pass |
- if got_revision: |
- got_revision = str(got_revision) |
- if len(got_revision) > 40: |
- got_revision = "[revision string too long]" |
- data += " <li>Got Revision: %s</li>\n" % got_revision |
- data += " </ul>\n" |
- |
- # TODO: turn this into a table, or some other sort of definition-list |
- # that doesn't take up quite so much vertical space |
- try: |
- slaveurl = path_to_slave(req, status.getSlave(b.getSlavename())) |
- data += "<h2>Buildslave:</h2>\n <a href=\"%s\">%s</a>\n" % (html.escape(slaveurl), html.escape(b.getSlavename())) |
- except KeyError: |
- data += "<h2>Buildslave:</h2>\n %s\n" % html.escape(b.getSlavename()) |
- data += "<h2>Reason:</h2>\n%s\n" % html.escape(b.getReason()) |
- |
- data += "<h2>Steps and Logfiles:</h2>\n" |
- # TODO: |
-# urls = self.original.getURLs() |
-# ex_url_class = "BuildStep external" |
-# for name, target in urls.items(): |
-# text.append('[<a href="%s" class="%s">%s</a>]' % |
-# (target, ex_url_class, html.escape(name))) |
- data += "<ol>\n" |
- for s in b.getSteps(): |
- name = s.getName() |
- time_to_run = 0 |
- (start, end) = s.getTimes() |
- if start and end: |
- time_to_run = end - start |
- if s.isFinished(): |
- css_class = css_classes[s.getResults()[0]] |
- elif s.isStarted(): |
- css_class = "running" |
- else: |
- css_class = "" |
- data += (' <li><span class="%s"><a href=\"%s\">%s</a> [%s] [%d seconds]</span>\n' |
- % (css_class, |
- req.childLink("steps/%s" % urllib.quote(name)), |
- name, |
- " ".join(s.getText()), |
- time_to_run)) |
- data += " <ol>\n" |
- if s.getLogs(): |
- for logfile in s.getLogs(): |
- logname = logfile.getName() |
- logurl = req.childLink("steps/%s/logs/%s" % |
- (urllib.quote(name), |
- urllib.quote(logname))) |
- data += (" <li><a href=\"%s\">%s</a></li>\n" % |
- (logurl, logfile.getName())) |
- if s.getURLs(): |
- for url in s.getURLs().items(): |
- logname = url[0] |
- logurl = url[1] |
- data += (' <li><a href="%s">%s</a></li>\n' % |
- (logurl, html.escape(logname))) |
- data += "</ol>\n" |
- data += " </li>\n" |
- |
- data += "</ol>\n" |
- |
- data += "<h2>Build Properties:</h2>\n" |
- data += "<table><tr><th valign=\"left\">Name</th><th valign=\"left\">Value</th><th valign=\"left\">Source</th></tr>\n" |
- for name, value, source in b.getProperties().asList(): |
- value = str(value) |
- if len(value) > 500: |
- value = value[:500] + " .. [property value too long]" |
- data += "<tr>" |
- data += "<td>%s</td>" % html.escape(name) |
- data += "<td>%s</td>" % html.escape(value) |
- data += "<td>%s</td>" % html.escape(source) |
- data += "</tr>\n" |
- data += "</table>" |
- |
- data += "<h2>Blamelist:</h2>\n" |
- if list(b.getResponsibleUsers()): |
- data += " <ol>\n" |
- for who in b.getResponsibleUsers(): |
- data += " <li>%s</li>\n" % html.escape(who) |
- data += " </ol>\n" |
- else: |
- data += "<div>no responsible users</div>\n" |
- |
- |
- (start, end) = b.getTimes() |
- data += "<h2>Timing</h2>\n" |
- data += "<table>\n" |
- data += "<tr><td>Start</td><td>%s</td></tr>\n" % time.ctime(start) |
- if end: |
- data += "<tr><td>End</td><td>%s</td></tr>\n" % time.ctime(end) |
- data += "<tr><td>Elapsed</td><td>%s</td></tr>\n" % util.formatInterval(end - start) |
- else: |
- now = util.now() |
- data += "<tr><td>Elapsed</td><td>%s</td></tr>\n" % util.formatInterval(now - start) |
- data += "</table>\n" |
- |
- if ss.changes: |
- data += "<h2>All Changes</h2>\n" |
- data += "<ol>\n" |
- for c in ss.changes: |
- data += "<li>" + c.asHTML() + "</li>\n" |
- data += "</ol>\n" |
- #data += html.PRE(b.changesText()) # TODO |
- |
- if b.isFinished() and self.builder_control is not None: |
- data += "<h3>Resubmit Build:</h3>\n" |
- # can we rebuild it exactly? |
- exactly = (ss.revision is not None) or b.getChanges() |
- if exactly: |
- data += ("<p>This tree was built from a specific set of \n" |
- "source files, and can be rebuilt exactly</p>\n") |
- else: |
- data += ("<p>This tree was built from the most recent " |
- "revision") |
- if ss.branch: |
- data += " (along some branch)" |
- data += (" and thus it might not be possible to rebuild it \n" |
- "exactly. Any changes that have been committed \n" |
- "after this build was started <b>will</b> be \n" |
- "included in a rebuild.</p>\n") |
- rebuildURL = urllib.quote(req.childLink("rebuild")) |
- data += ('<form method="post" action="%s" class="command rebuild">\n' |
- % rebuildURL) |
- data += make_name_user_passwd_form(self.isUsingUserPasswd(req)) |
- data += make_extra_property_row(1) |
- data += make_extra_property_row(2) |
- data += make_extra_property_row(3) |
- data += make_row("Reason for re-running build:", |
- "<input type='text' name='comments' />") |
- data += '<input type="submit" value="Rebuild" />\n' |
- data += '</form>\n' |
- |
- data += self.footer(status, req) |
- |
- return data |
- |
- def stop(self, req): |
- if self.isUsingUserPasswd(req): |
- if not self.authUser(req): |
- return Redirect("../../../authfailed") |
- b = self.build_status |
- c = self.build_control |
- log.msg("web stopBuild of build %s:%s" % \ |
- (b.getBuilder().getName(), b.getNumber())) |
- name = req.args.get("username", ["<unknown>"])[0] |
- comments = req.args.get("comments", ["<no reason specified>"])[0] |
- # html-quote both the username and comments, just to be safe |
- reason = ("The web-page 'stop build' button was pressed by " |
- "'%s': %s\n" % (html.escape(name), html.escape(comments))) |
- if c: |
- c.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 |
- r = Redirect("../..") |
- d = defer.Deferred() |
- reactor.callLater(1, d.callback, r) |
- return DeferredResource(d) |
- |
- def rebuild(self, req): |
- if self.isUsingUserPasswd(req): |
- if not self.authUser(req): |
- return Redirect("../../../authfailed") |
- b = self.build_status |
- bc = self.builder_control |
- builder_name = b.getBuilder().getName() |
- log.msg("web rebuild of build %s:%s" % (builder_name, b.getNumber())) |
- name = req.args.get("username", ["<unknown>"])[0] |
- comments = req.args.get("comments", ["<no reason specified>"])[0] |
- reason = ("The web-page 'rebuild' button was pressed by " |
- "'%s': %s\n" % (html.escape(name), html.escape(comments))) |
- extraProperties = getAndCheckProperties(req) |
- if not bc or not b.isFinished() or extraProperties is None: |
- log.msg("could not rebuild: bc=%s, isFinished=%s" |
- % (bc, b.isFinished())) |
- # TODO: indicate an error |
- else: |
- bc.resubmitBuild(b, reason, extraProperties) |
- # we're at |
- # http://localhost:8080/builders/NAME/builds/5/rebuild?[args] |
- # Where should we send them? |
- # |
- # Ideally it would be to the per-build page that they just started, |
- # but we don't know the build number for it yet (besides, it might |
- # have to wait for a current build to finish). The next-most |
- # preferred place is somewhere that the user can see tangible |
- # evidence of their build starting (or to see the reason that it |
- # didn't start). This should be the Builder page. |
- r = Redirect("../..") # the Builder's page |
- d = defer.Deferred() |
- reactor.callLater(1, d.callback, r) |
- return DeferredResource(d) |
- |
- def getChild(self, path, req): |
- if path == "stop": |
- return self.stop(req) |
- if path == "rebuild": |
- return self.rebuild(req) |
- if path == "steps": |
- return StepsResource(self.build_status) |
- if path == "tests": |
- return TestsResource(self.build_status) |
- |
- return HtmlResource.getChild(self, path, req) |
- |
-# /builders/$builder/builds |
-class BuildsResource(HtmlResource): |
- addSlash = True |
- |
- def __init__(self, builder_status, builder_control): |
- HtmlResource.__init__(self) |
- self.builder_status = builder_status |
- self.builder_control = builder_control |
- |
- def getChild(self, path, req): |
- try: |
- num = int(path) |
- except ValueError: |
- num = None |
- if num is not None: |
- build_status = self.builder_status.getBuild(num) |
- if build_status: |
- if self.builder_control: |
- build_control = self.builder_control.getBuild(num) |
- else: |
- build_control = None |
- return StatusResourceBuild(build_status, build_control, |
- self.builder_control) |
- |
- return HtmlResource.getChild(self, path, req) |
- |