Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/buildbot/buildbot/status/web/step.py
diff options
context:
space:
mode:
Diffstat (limited to 'buildbot/buildbot/status/web/step.py')
-rw-r--r--buildbot/buildbot/status/web/step.py97
1 files changed, 97 insertions, 0 deletions
diff --git a/buildbot/buildbot/status/web/step.py b/buildbot/buildbot/status/web/step.py
new file mode 100644
index 0000000..b65626f
--- /dev/null
+++ b/buildbot/buildbot/status/web/step.py
@@ -0,0 +1,97 @@
+
+from twisted.web import html
+
+import urllib
+from buildbot.status.web.base import HtmlResource, path_to_builder, \
+ path_to_build
+from buildbot.status.web.logs import LogsResource
+from buildbot import util
+from time import ctime
+
+# /builders/$builder/builds/$buildnum/steps/$stepname
+class StatusResourceBuildStep(HtmlResource):
+ title = "Build Step"
+ addSlash = True
+
+ def __init__(self, build_status, step_status):
+ HtmlResource.__init__(self)
+ self.status = build_status
+ self.step_status = step_status
+
+ def body(self, req):
+ s = self.step_status
+ b = s.getBuild()
+ builder_name = b.getBuilder().getName()
+ build_num = b.getNumber()
+ data = ""
+ data += ('<h1>BuildStep <a href="%s">%s</a>:' %
+ (path_to_builder(req, b.getBuilder()), builder_name))
+ data += '<a href="%s">#%d</a>' % (path_to_build(req, b), build_num)
+ data += ":%s</h1>\n" % s.getName()
+
+ if s.isFinished():
+ data += ("<h2>Finished</h2>\n"
+ "<p>%s</p>\n" % html.escape("%s" % s.getText()))
+ else:
+ data += ("<h2>Not Finished</h2>\n"
+ "<p>ETA %s seconds</p>\n" % s.getETA())
+
+ exp = s.getExpectations()
+ if exp:
+ data += ("<h2>Expectations</h2>\n"
+ "<ul>\n")
+ for e in exp:
+ data += "<li>%s: current=%s, target=%s</li>\n" % \
+ (html.escape(e[0]), e[1], e[2])
+ data += "</ul>\n"
+
+ (start, end) = s.getTimes()
+ data += "<h2>Timing</h2>\n"
+ data += "<table>\n"
+ data += "<tr><td>Start</td><td>%s</td></tr>\n" % ctime(start)
+ if end:
+ data += "<tr><td>End</td><td>%s</td></tr>\n" % ctime(end)
+ data += "<tr><td>Elapsed</td><td>%s</td></tr>\n" % util.formatInterval(end - start)
+ data += "</table>\n"
+
+ logs = s.getLogs()
+ if logs:
+ data += ("<h2>Logs</h2>\n"
+ "<ul>\n")
+ for logfile in logs:
+ if logfile.hasContents():
+ # FIXME: If the step name has a / in it, this is broken
+ # either way. If we quote it but say '/'s are safe,
+ # it chops up the step name. If we quote it and '/'s
+ # are not safe, it escapes the / that separates the
+ # step name from the log number.
+ logname = logfile.getName()
+ logurl = req.childLink("logs/%s" % urllib.quote(logname))
+ data += ('<li><a href="%s">%s</a></li>\n' %
+ (logurl, html.escape(logname)))
+ else:
+ data += '<li>%s</li>\n' % html.escape(logname)
+ data += "</ul>\n"
+
+ return data
+
+ def getChild(self, path, req):
+ if path == "logs":
+ return LogsResource(self.step_status)
+ return HtmlResource.getChild(self, path, req)
+
+
+
+# /builders/$builder/builds/$buildnum/steps
+class StepsResource(HtmlResource):
+ addSlash = True
+
+ def __init__(self, build_status):
+ HtmlResource.__init__(self)
+ self.build_status = build_status
+
+ def getChild(self, path, req):
+ for s in self.build_status.getSteps():
+ if s.getName() == path:
+ return StatusResourceBuildStep(self.build_status, s)
+ return HtmlResource.getChild(self, path, req)