def body(self, req): status = self.getStatus(req) control = self.getControl(req) builders = req.args.get("builder", status.getBuilderNames()) branches = [b for b in req.args.get("branch", []) if b] data = "" data += "<h2>Latest builds: %s</h2>\n" % ", ".join(branches) data += "<table>\n" building = False online = 0 base_builders_url = self.path_to_root(req) + "builders/" for bn in builders: base_builder_url = base_builders_url + urllib.quote(bn, safe='') builder = status.getBuilder(bn) data += "<tr>\n" data += '<td class="box"><a href="%s">%s</a></td>\n' \ % (base_builder_url, html.escape(bn)) builds = list(builder.generateFinishedBuilds(map_branches(branches), num_builds=1)) if builds: b = builds[0] url = (base_builder_url + "/builds/%d" % b.getNumber()) try: label = b.getProperty("got_revision") except KeyError: label = None if not label or len(str(label)) > 20: label = "#%d" % b.getNumber() text = ['<a href="%s">%s</a>' % (url, label)] text.extend(b.getText()) box = Box(text, b.getColor(), class_="LastBuild box %s" % build_get_class(b)) data += box.td(align="center") else: data += '<td class="LastBuild box" >no build</td>\n' current_box = ICurrentBox(builder).getBox(status) data += current_box.td(align="center") builder_status = builder.getState()[0] if builder_status == "building": building = True online += 1 elif builder_status != "offline": online += 1 data += "</table>\n" if control is not None: if building: stopURL = "builders/_all/stop" data += make_stop_form(stopURL, True, "Builds") if online: forceURL = "builders/_all/force" data += make_force_build_form(forceURL, True) return data
def body(self, req): status = self.getStatus(req) control = self.getControl(req) numbuilds = int(req.args.get("numbuilds", [self.numbuilds])[0]) builders = req.args.get("builder", []) branches = [b for b in req.args.get("branch", []) if b] g = status.generateFinishedBuilds(builders, map_branches(branches), numbuilds, max_search=numbuilds) data = "" # really this is "up to %d builds" html_branches = map(html.escape, branches) data += "<h1>Last %d finished builds: %s</h1>\n" % \ (numbuilds, ", ".join(html_branches)) if builders: html_builders = map(html.escape, builders) data += ("<p>of builders: %s</p>\n" % (", ".join(html_builders))) data += "<ul>\n" got = 0 building = False online = 0 for build in g: got += 1 data += " <li>" + self.make_line(req, build) + "</li>\n" builder_status = build.getBuilder().getState()[0] if builder_status == "building": building = True online += 1 elif builder_status != "offline": online += 1 if not got: data += " <li>No matching builds found</li>\n" data += "</ul>\n" if control is not None: if building: stopURL = "builders/_all/stop" data += make_stop_form(stopURL, self.isUsingUserPasswd(req), True, "Builds") if online: forceURL = "builders/_all/force" data += make_force_build_form(forceURL, self.isUsingUserPasswd(req), True) return data
def body(self, req): status = self.getStatus(req) control = self.getControl(req) builders = req.args.get("builder", status.getBuilderNames()) branches = [b for b in req.args.get("branch", []) if b] data = "" data += "<h2>Latest builds: %s</h2>\n" % ", ".join(branches) data += "<table>\n" building = False online = 0 base_builders_url = self.path_to_root(req) + "builders/" for bn in builders: base_builder_url = base_builders_url + urllib.quote(bn, safe='') builder = status.getBuilder(bn) data += "<tr>\n" data += '<td class="box"><a href="%s">%s</a></td>\n' \ % (base_builder_url, html.escape(bn)) builds = list( builder.generateFinishedBuilds(map_branches(branches), num_builds=1)) if builds: b = builds[0] url = (base_builder_url + "/builds/%d" % b.getNumber()) try: label = b.getProperty("got_revision") except KeyError: label = None if not label or len(str(label)) > 20: label = "#%d" % b.getNumber() text = ['<a href="%s">%s</a>' % (url, label)] text.extend(b.getText()) box = Box(text, b.getColor(), class_="LastBuild box %s" % build_get_class(b)) data += box.td(align="center") else: data += '<td class="LastBuild box" >no build</td>\n' current_box = ICurrentBox(builder).getBox(status) data += current_box.td(align="center") builder_status = builder.getState()[0] if builder_status == "building": building = True online += 1 elif builder_status != "offline": online += 1 data += "</table>\n" if control is not None: if building: stopURL = "builders/_all/stop" data += make_stop_form(stopURL, True, "Builds") if online: forceURL = "builders/_all/force" data += make_force_build_form(forceURL, True) return data
def body(self, req): b = self.builder_status control = self.builder_control status = self.getStatus(req) slaves = b.getSlaves() connected_slaves = [s for s in slaves if s.isConnected()] projectName = status.getProjectName() data = '<a href="%s">%s</a>\n' % (self.path_to_root(req), projectName) data += "<h1>Builder: %s</h1>\n" % html.escape(b.getName()) # the first section shows builds which are currently running, if any. current = b.getCurrentBuilds() if current: data += "<h2>Currently Building:</h2>\n" data += "<ul>\n" for build in current: data += " <li>" + self.build_line(build, req) + "</li>\n" data += "</ul>\n" else: data += "<h2>no current builds</h2>\n" # Then a section with the last 5 builds, with the most recent build # distinguished from the rest. data += "<h2>Recent Builds:</h2>\n" data += "<ul>\n" for i,build in enumerate(b.generateFinishedBuilds(num_builds=5)): data += " <li>" + self.make_line(req, build, False) + "</li>\n" if i == 0: data += "<br />\n" # separator # TODO: or empty list? data += "</ul>\n" data += "<h2>Buildslaves:</h2>\n" data += "<ol>\n" for slave in slaves: data += "<li><b>%s</b>: " % html.escape(slave.getName()) if slave.isConnected(): data += "CONNECTED\n" if 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()) else: data += ("NOT CONNECTED\n") data += "</li>\n" data += "</ol>\n" if control is not None and connected_slaves: forceURL = urllib.quote(req.childLink("force")) data += make_force_build_form(forceURL) elif control is not None: data += """ <p>All buildslaves appear to be offline, so it's not possible to force this build to execute at this time.</p> """ if control is not None: pingURL = urllib.quote(req.childLink("ping")) data += """ <form action="%s" class='command pingbuilder'> <p>To ping the buildslave(s), push the 'Ping' button</p> <input type="submit" value="Ping Builder" /> </form> """ % pingURL return data
def body(self, req): b = self.builder_status control = self.builder_control status = self.getStatus(req) slaves = b.getSlaves() connected_slaves = [s for s in slaves if s.isConnected()] projectName = status.getProjectName() data = '<a href="%s">%s</a>\n' % (self.path_to_root(req), projectName) data += "<h1>Builder: %s</h1>\n" % html.escape(b.getName()) # the first section shows builds which are currently running, if any. current = b.getCurrentBuilds() if current: data += "<h2>Currently Building:</h2>\n" data += "<ul>\n" for build in current: data += " <li>" + self.build_line(build, req) + "</li>\n" data += "</ul>\n" else: data += "<h2>no current builds</h2>\n" # Then a section with the last 5 builds, with the most recent build # distinguished from the rest. data += "<h2>Recent Builds:</h2>\n" data += "<ul>\n" for i, build in enumerate(b.generateFinishedBuilds(num_builds=5)): data += " <li>" + self.make_line(req, build, False) + "</li>\n" if i == 0: data += "<br />\n" # separator # TODO: or empty list? data += "</ul>\n" data += "<h2>Buildslaves:</h2>\n" data += "<ol>\n" for slave in slaves: slaveurl = path_to_slave(req, slave) data += "<li><b><a href=\"%s\">%s</a></b>: " % ( html.escape(slaveurl), html.escape(slave.getName())) if slave.isConnected(): data += "CONNECTED\n" if 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()) else: data += ("NOT CONNECTED\n") data += "</li>\n" data += "</ol>\n" if control is not None and connected_slaves: forceURL = urllib.quote(req.childLink("force")) data += make_force_build_form(forceURL) elif control is not None: data += """ <p>All buildslaves appear to be offline, so it's not possible to force this build to execute at this time.</p> """ if control is not None: pingURL = urllib.quote(req.childLink("ping")) data += """ <form action="%s" class='command pingbuilder'> <p>To ping the buildslave(s), push the 'Ping' button</p> <input type="submit" value="Ping Builder" /> </form> """ % pingURL # TODO: this stuff should be generated by a template of some sort projectURL = status.getProjectURL() projectName = status.getProjectName() data += '<hr /><div class="footer">\n' welcomeurl = self.path_to_root(req) + "index.html" data += '[<a href="%s">welcome</a>]\n' % welcomeurl data += "<br />\n" data += '<a href="http://buildbot.sourceforge.net/">Buildbot</a>' data += "-%s " % version if projectName: data += "working for the " if projectURL: data += "<a href=\"%s\">%s</a> project." % (projectURL, projectName) else: data += "%s project." % projectName data += "<br />\n" data += ("Page built: " + time.strftime( "%a %d %b %Y %H:%M:%S", time.localtime(util.now())) + "\n") data += '</div>\n' return data
def body(self, req): b = self.builder_status control = self.builder_control status = self.getStatus(req) slaves = b.getSlaves() connected_slaves = [s for s in slaves if s.isConnected()] projectName = status.getProjectName() data = '' # the first section shows builds which are currently running, if any. current = b.getCurrentBuilds() if current: data += "<h2>Currently Building:</h2>\n" data += "<ul>\n" for build in current: data += " <li>" + self.build_line(build, req) + "</li>\n" data += "</ul>\n" else: data += "<h2>No current builds</h2>\n" # Then a section with the last 5 builds, with the most recent build # distinguished from the rest. data += "<h2>Recent Builds</h2>\n" data += "<ul>\n" numbuilds = int(req.args.get('numbuilds', ['5'])[0]) for i, build in enumerate( b.generateFinishedBuilds(num_builds=int(numbuilds))): data += " <li>" + self.make_line(req, build, False) + "</li>\n" if i == 0: data += "<br />\n" # separator # TODO: or empty list? data += "</ul>\n" data += "<h2>Buildslaves:</h2>\n" data += "<ol>\n" for slave in slaves: slaveurl = path_to_slave(req, slave) data += "<li><b><a href=\"%s\">%s</a></b>: " % ( html.escape(slaveurl), html.escape(slave.getName())) if slave.isConnected(): data += "CONNECTED\n" if slave.getAdmin(): data += make_row("Admin:", html.escape(slave.getAdmin())) if slave.getHost(): data += "<span class='label'>Host info:</span>\n" data += html.PRE(html.escape(slave.getHost())) else: data += ("NOT CONNECTED\n") data += "</li>\n" data += "</ol>\n" if control is not None and connected_slaves: forceURL = path_to_builder(req, b) + '/force' data += make_force_build_form(forceURL, self.isUsingUserPasswd(req)) elif control is not None: data += """ <p>All buildslaves appear to be offline, so it's not possible to force this build to execute at this time.</p> """ if control is not None: pingURL = path_to_builder(req, b) + '/ping' data += """ <form method="post" action="%s" class='command pingbuilder'> <p>To ping the buildslave(s), push the 'Ping' button</p> <input type="submit" value="Ping Builder" /> </form> """ % pingURL return data
def body(self, req): b = self.builder_status control = self.builder_control status = self.getStatus(req) slaves = b.getSlaves() connected_slaves = [s for s in slaves if s.isConnected()] projectName = status.getProjectName() data = '<a href="%s">%s</a>\n' % (self.path_to_root(req), projectName) data += "<h1>Builder: %s</h1>\n" % html.escape(b.getName()) # the first section shows builds which are currently running, if any. current = b.getCurrentBuilds() if current: data += "<h2>Currently Building:</h2>\n" data += "<ul>\n" for build in current: data += " <li>" + self.build_line(build, req) + "</li>\n" data += "</ul>\n" else: data += "<h2>no current builds</h2>\n" # Then a section with the last 5 builds, with the most recent build # distinguished from the rest. data += "<h2>Recent Builds:</h2>\n" data += "<ul>\n" for i,build in enumerate(b.generateFinishedBuilds(num_builds=5)): data += " <li>" + self.make_line(req, build, False) + "</li>\n" if i == 0: data += "<br />\n" # separator # TODO: or empty list? data += "</ul>\n" data += "<h2>Buildslaves:</h2>\n" data += "<ol>\n" for slave in slaves: slaveurl = path_to_slave(req, slave) data += "<li><b><a href=\"%s\">%s</a></b>: " % (html.escape(slaveurl), html.escape(slave.getName())) if slave.isConnected(): data += "CONNECTED\n" if 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()) else: data += ("NOT CONNECTED\n") data += "</li>\n" data += "</ol>\n" if control is not None and connected_slaves: forceURL = urllib.quote(req.childLink("force")) data += make_force_build_form(forceURL) elif control is not None: data += """ <p>All buildslaves appear to be offline, so it's not possible to force this build to execute at this time.</p> """ if control is not None: pingURL = urllib.quote(req.childLink("ping")) data += """ <form action="%s" class='command pingbuilder'> <p>To ping the buildslave(s), push the 'Ping' button</p> <input type="submit" value="Ping Builder" /> </form> """ % pingURL # TODO: this stuff should be generated by a template of some sort projectURL = status.getProjectURL() projectName = status.getProjectName() data += '<hr /><div class="footer">\n' welcomeurl = self.path_to_root(req) + "index.html" data += '[<a href="%s">welcome</a>]\n' % welcomeurl data += "<br />\n" data += '<a href="http://buildbot.sourceforge.net/">Buildbot</a>' data += "-%s " % version if projectName: data += "working for the " if projectURL: data += "<a href=\"%s\">%s</a> project." % (projectURL, projectName) else: data += "%s project." % projectName data += "<br />\n" data += ("Page built: " + time.strftime("%a %d %b %Y %H:%M:%S", time.localtime(util.now())) + "\n") data += '</div>\n' return data
def body(self, req): b = self.builder_status control = self.builder_control status = self.getStatus(req) slaves = b.getSlaves() connected_slaves = [s for s in slaves if s.isConnected()] projectName = status.getProjectName() data = '<a href="%s">%s</a>\n' % (self.path_to_root(req), projectName) data += "<h1>Builder: %s</h1>\n" % html.escape(b.getName()) # the first section shows builds which are currently running, if any. current = b.getCurrentBuilds() if current: data += "<h2>Currently Building:</h2>\n" data += "<ul>\n" for build in current: data += " <li>" + self.build_line(build, req) + "</li>\n" data += "</ul>\n" else: data += "<h2>no current builds</h2>\n" pending = b.getPendingBuilds() if pending: data += "<h2>Pending Builds:</h2>\n" data += "<ul>\n" for request in pending: data += " <li>" + self.request_line(request, req) + "</li>\n" data += "</ul>\n" cancelURL = path_to_builder(req, self.builder_status) + '/cancelbuild' if self.builder_control is not None: data += ''' <form action="%s" class="command cancelbuild" style="display:inline" method="post"> <input type="hidden" name="id" value="all" /> <input type="submit" value="Cancel All" /> </form>''' % cancelURL else: data += "<h2>no pending builds</h2>\n" # Then a section with the last 5 builds, with the most recent build # distinguished from the rest. data += "<h2>Recent Builds:</h2>\n" data += "(<a href=\"%s\">view in waterfall</a>)\n" % (self.path_to_root(req)+"waterfall?show="+html.escape(b.getName())) data += "<ul>\n" numbuilds = req.args.get('numbuilds', ['5'])[0] for i,build in enumerate(b.generateFinishedBuilds(num_builds=int(numbuilds))): data += " <li>" + self.make_line(req, build, False) + "</li>\n" if i == 0: data += "<br />\n" # separator # TODO: or empty list? data += "</ul>\n" data += "<h2>Buildslaves:</h2>\n" data += "<ol>\n" for slave in slaves: slaveurl = path_to_slave(req, slave) data += "<li><b><a href=\"%s\">%s</a></b>: " % (html.escape(slaveurl), html.escape(slave.getName())) if slave.isConnected(): data += "CONNECTED\n" if 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()) else: data += ("NOT CONNECTED\n") data += "</li>\n" data += "</ol>\n" if control is not None and connected_slaves: forceURL = path_to_builder(req, b) + '/force' data += make_force_build_form(forceURL, self.isUsingUserPasswd(req)) elif control is not None: data += """ <p>All buildslaves appear to be offline, so it's not possible to force this build to execute at this time.</p> """ if control is not None: pingURL = path_to_builder(req, b) + '/ping' data += """ <form method="post" action="%s" class='command pingbuilder'> <p>To ping the buildslave(s), push the 'Ping' button</p> <input type="submit" value="Ping Builder" /> </form> """ % pingURL data += self.footer(status, req) return data