Index: third_party/buildbot_7_12/buildbot/clients/gtkPanes.py |
diff --git a/third_party/buildbot_7_12/buildbot/clients/gtkPanes.py b/third_party/buildbot_7_12/buildbot/clients/gtkPanes.py |
deleted file mode 100644 |
index 8acba1b474dc4893808965182ca1b774609d4e9b..0000000000000000000000000000000000000000 |
--- a/third_party/buildbot_7_12/buildbot/clients/gtkPanes.py |
+++ /dev/null |
@@ -1,532 +0,0 @@ |
- |
-from twisted.internet import gtk2reactor |
-gtk2reactor.install() |
- |
-import sys, time |
- |
-import pygtk |
-pygtk.require("2.0") |
-import gobject, gtk |
-assert(gtk.Window) # in gtk1 it's gtk.GtkWindow |
- |
-from twisted.spread import pb |
- |
-#from buildbot.clients.base import Builder, Client |
-from buildbot.clients.base import TextClient |
-from buildbot.util import now |
- |
-from buildbot.status.builder import SUCCESS, WARNINGS, FAILURE, EXCEPTION |
- |
-''' |
-class Pane: |
- def __init__(self): |
- pass |
- |
-class OneRow(Pane): |
- """This is a one-row status bar. It has one square per Builder, and that |
- square is either red, yellow, or green. """ |
- |
- def __init__(self): |
- Pane.__init__(self) |
- self.widget = gtk.VBox(gtk.FALSE, 2) |
- self.nameBox = gtk.HBox(gtk.TRUE) |
- self.statusBox = gtk.HBox(gtk.TRUE) |
- self.widget.add(self.nameBox) |
- self.widget.add(self.statusBox) |
- self.widget.show_all() |
- self.builders = [] |
- |
- def getWidget(self): |
- return self.widget |
- def addBuilder(self, builder): |
- print "OneRow.addBuilder" |
- # todo: ordering. Should follow the order in which they were added |
- # to the original BotMaster |
- self.builders.append(builder) |
- # add the name to the left column, and a label (with background) to |
- # the right |
- name = gtk.Label(builder.name) |
- status = gtk.Label('??') |
- status.set_size_request(64,64) |
- box = gtk.EventBox() |
- box.add(status) |
- name.show() |
- box.show_all() |
- self.nameBox.add(name) |
- self.statusBox.add(box) |
- builder.haveSomeWidgets([name, status, box]) |
- |
-class R2Builder(Builder): |
- def start(self): |
- self.nameSquare.set_text(self.name) |
- self.statusSquare.set_text("???") |
- self.subscribe() |
- def haveSomeWidgets(self, widgets): |
- self.nameSquare, self.statusSquare, self.statusBox = widgets |
- |
- def remote_newLastBuildStatus(self, event): |
- color = None |
- if event: |
- text = "\n".join(event.text) |
- color = event.color |
- else: |
- text = "none" |
- self.statusSquare.set_text(text) |
- if color: |
- print "color", color |
- self.statusBox.modify_bg(gtk.STATE_NORMAL, |
- gtk.gdk.color_parse(color)) |
- |
- def remote_currentlyOffline(self): |
- self.statusSquare.set_text("offline") |
- def remote_currentlyIdle(self): |
- self.statusSquare.set_text("idle") |
- def remote_currentlyWaiting(self, seconds): |
- self.statusSquare.set_text("waiting") |
- def remote_currentlyInterlocked(self): |
- self.statusSquare.set_text("interlocked") |
- def remote_currentlyBuilding(self, eta): |
- self.statusSquare.set_text("building") |
- |
- |
-class CompactRow(Pane): |
- def __init__(self): |
- Pane.__init__(self) |
- self.widget = gtk.VBox(gtk.FALSE, 3) |
- self.nameBox = gtk.HBox(gtk.TRUE, 2) |
- self.lastBuildBox = gtk.HBox(gtk.TRUE, 2) |
- self.statusBox = gtk.HBox(gtk.TRUE, 2) |
- self.widget.add(self.nameBox) |
- self.widget.add(self.lastBuildBox) |
- self.widget.add(self.statusBox) |
- self.widget.show_all() |
- self.builders = [] |
- |
- def getWidget(self): |
- return self.widget |
- |
- def addBuilder(self, builder): |
- self.builders.append(builder) |
- |
- name = gtk.Label(builder.name) |
- name.show() |
- self.nameBox.add(name) |
- |
- last = gtk.Label('??') |
- last.set_size_request(64,64) |
- lastbox = gtk.EventBox() |
- lastbox.add(last) |
- lastbox.show_all() |
- self.lastBuildBox.add(lastbox) |
- |
- status = gtk.Label('??') |
- status.set_size_request(64,64) |
- statusbox = gtk.EventBox() |
- statusbox.add(status) |
- statusbox.show_all() |
- self.statusBox.add(statusbox) |
- |
- builder.haveSomeWidgets([name, last, lastbox, status, statusbox]) |
- |
- def removeBuilder(self, name, builder): |
- self.nameBox.remove(builder.nameSquare) |
- self.lastBuildBox.remove(builder.lastBuildBox) |
- self.statusBox.remove(builder.statusBox) |
- self.builders.remove(builder) |
- |
-class CompactBuilder(Builder): |
- def setup(self): |
- self.timer = None |
- self.text = [] |
- self.eta = None |
- def start(self): |
- self.nameSquare.set_text(self.name) |
- self.statusSquare.set_text("???") |
- self.subscribe() |
- def haveSomeWidgets(self, widgets): |
- (self.nameSquare, |
- self.lastBuildSquare, self.lastBuildBox, |
- self.statusSquare, self.statusBox) = widgets |
- |
- def remote_currentlyOffline(self): |
- self.eta = None |
- self.stopTimer() |
- self.statusSquare.set_text("offline") |
- self.statusBox.modify_bg(gtk.STATE_NORMAL, |
- gtk.gdk.color_parse("red")) |
- def remote_currentlyIdle(self): |
- self.eta = None |
- self.stopTimer() |
- self.statusSquare.set_text("idle") |
- def remote_currentlyWaiting(self, seconds): |
- self.nextBuild = now() + seconds |
- self.startTimer(self.updateWaiting) |
- def remote_currentlyInterlocked(self): |
- self.stopTimer() |
- self.statusSquare.set_text("interlocked") |
- def startTimer(self, func): |
- # the func must clear self.timer and return gtk.FALSE when the event |
- # has arrived |
- self.stopTimer() |
- self.timer = gtk.timeout_add(1000, func) |
- func() |
- def stopTimer(self): |
- if self.timer: |
- gtk.timeout_remove(self.timer) |
- self.timer = None |
- def updateWaiting(self): |
- when = self.nextBuild |
- if now() < when: |
- next = time.strftime("%H:%M:%S", time.localtime(when)) |
- secs = "[%d seconds]" % (when - now()) |
- self.statusSquare.set_text("waiting\n%s\n%s" % (next, secs)) |
- return gtk.TRUE # restart timer |
- else: |
- # done |
- self.statusSquare.set_text("waiting\n[RSN]") |
- self.timer = None |
- return gtk.FALSE |
- |
- def remote_currentlyBuilding(self, eta): |
- self.stopTimer() |
- self.statusSquare.set_text("building") |
- if eta: |
- d = eta.callRemote("subscribe", self, 5) |
- |
- def remote_newLastBuildStatus(self, event): |
- color = None |
- if event: |
- text = "\n".join(event.text) |
- color = event.color |
- else: |
- text = "none" |
- if not color: color = "gray" |
- self.lastBuildSquare.set_text(text) |
- self.lastBuildBox.modify_bg(gtk.STATE_NORMAL, |
- gtk.gdk.color_parse(color)) |
- |
- def remote_newEvent(self, event): |
- assert(event.__class__ == GtkUpdatingEvent) |
- self.current = event |
- event.builder = self |
- self.text = event.text |
- if not self.text: self.text = ["idle"] |
- self.eta = None |
- self.stopTimer() |
- self.updateText() |
- color = event.color |
- if not color: color = "gray" |
- self.statusBox.modify_bg(gtk.STATE_NORMAL, |
- gtk.gdk.color_parse(color)) |
- |
- def updateCurrent(self): |
- text = self.current.text |
- if text: |
- self.text = text |
- self.updateText() |
- color = self.current.color |
- if color: |
- self.statusBox.modify_bg(gtk.STATE_NORMAL, |
- gtk.gdk.color_parse(color)) |
- def updateText(self): |
- etatext = [] |
- if self.eta: |
- etatext = [time.strftime("%H:%M:%S", time.localtime(self.eta))] |
- if now() > self.eta: |
- etatext += ["RSN"] |
- else: |
- seconds = self.eta - now() |
- etatext += ["[%d secs]" % seconds] |
- text = "\n".join(self.text + etatext) |
- self.statusSquare.set_text(text) |
- def updateTextTimer(self): |
- self.updateText() |
- return gtk.TRUE # restart timer |
- |
- def remote_progress(self, seconds): |
- if seconds == None: |
- self.eta = None |
- else: |
- self.eta = now() + seconds |
- self.startTimer(self.updateTextTimer) |
- self.updateText() |
- def remote_finished(self, eta): |
- self.eta = None |
- self.stopTimer() |
- self.updateText() |
- eta.callRemote("unsubscribe", self) |
-''' |
- |
-class Box: |
- def __init__(self, text="?"): |
- self.text = text |
- self.box = gtk.EventBox() |
- self.label = gtk.Label(text) |
- self.box.add(self.label) |
- self.box.set_size_request(64,64) |
- self.timer = None |
- |
- def getBox(self): |
- return self.box |
- |
- def setText(self, text): |
- self.text = text |
- self.label.set_text(text) |
- |
- def setColor(self, color): |
- if not color: |
- return |
- self.box.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(color)) |
- |
- def setETA(self, eta): |
- if eta: |
- self.when = now() + eta |
- self.startTimer() |
- else: |
- self.stopTimer() |
- |
- def startTimer(self): |
- self.stopTimer() |
- self.timer = gobject.timeout_add(1000, self.update) |
- self.update() |
- |
- def stopTimer(self): |
- if self.timer: |
- gobject.source_remove(self.timer) |
- self.timer = None |
- self.label.set_text(self.text) |
- |
- def update(self): |
- if now() < self.when: |
- next = time.strftime("%H:%M:%S", time.localtime(self.when)) |
- secs = "[%d secs]" % (self.when - now()) |
- self.label.set_text("%s\n%s\n%s" % (self.text, next, secs)) |
- return True # restart timer |
- else: |
- # done |
- self.label.set_text("%s\n[soon]\n[overdue]" % (self.text,)) |
- self.timer = None |
- return False |
- |
- |
- |
-class ThreeRowBuilder: |
- def __init__(self, name, ref): |
- self.name = name |
- |
- self.last = Box() |
- self.current = Box() |
- self.step = Box("idle") |
- self.step.setColor("white") |
- |
- self.ref = ref |
- |
- def getBoxes(self): |
- return self.last.getBox(), self.current.getBox(), self.step.getBox() |
- |
- def getLastBuild(self): |
- d = self.ref.callRemote("getLastFinishedBuild") |
- d.addCallback(self.gotLastBuild) |
- def gotLastBuild(self, build): |
- if build: |
- build.callRemote("getText").addCallback(self.gotLastText) |
- build.callRemote("getResults").addCallback(self.gotLastResult) |
- |
- def gotLastText(self, text): |
- print "Got text", text |
- self.last.setText("\n".join(text)) |
- |
- def gotLastResult(self, result): |
- colormap = {SUCCESS: 'green', |
- FAILURE: 'red', |
- WARNINGS: 'orange', |
- EXCEPTION: 'purple', |
- } |
- self.last.setColor(colormap[result]) |
- |
- def getState(self): |
- self.ref.callRemote("getState").addCallback(self.gotState) |
- def gotState(self, res): |
- state, ETA, builds = res |
- # state is one of: offline, idle, waiting, interlocked, building |
- # TODO: ETA is going away, you have to look inside the builds to get |
- # that value |
- currentmap = {"offline": "red", |
- "idle": "white", |
- "waiting": "yellow", |
- "interlocked": "yellow", |
- "building": "yellow",} |
- text = state |
- self.current.setColor(currentmap[state]) |
- if ETA is not None: |
- text += "\nETA=%s secs" % ETA |
- self.current.setText(state) |
- |
- def buildStarted(self, build): |
- print "[%s] buildStarted" % (self.name,) |
- self.current.setColor("yellow") |
- |
- def buildFinished(self, build, results): |
- print "[%s] buildFinished: %s" % (self.name, results) |
- self.gotLastBuild(build) |
- self.current.setColor("white") |
- self.current.stopTimer() |
- |
- def buildETAUpdate(self, eta): |
- print "[%s] buildETAUpdate: %s" % (self.name, eta) |
- self.current.setETA(eta) |
- |
- |
- def stepStarted(self, stepname, step): |
- print "[%s] stepStarted: %s" % (self.name, stepname) |
- self.step.setText(stepname) |
- self.step.setColor("yellow") |
- def stepFinished(self, stepname, step, results): |
- print "[%s] stepFinished: %s %s" % (self.name, stepname, results) |
- self.step.setText("idle") |
- self.step.setColor("white") |
- self.step.stopTimer() |
- def stepETAUpdate(self, stepname, eta): |
- print "[%s] stepETAUpdate: %s %s" % (self.name, stepname, eta) |
- self.step.setETA(eta) |
- |
- |
-class ThreeRowClient(pb.Referenceable): |
- def __init__(self, window): |
- self.window = window |
- self.buildernames = [] |
- self.builders = {} |
- |
- def connected(self, ref): |
- print "connected" |
- self.ref = ref |
- self.pane = gtk.VBox(False, 2) |
- self.table = gtk.Table(1+3, 1) |
- self.pane.add(self.table) |
- self.window.vb.add(self.pane) |
- self.pane.show_all() |
- ref.callRemote("subscribe", "logs", 5, self) |
- |
- def removeTable(self): |
- for child in self.table.get_children(): |
- self.table.remove(child) |
- self.pane.remove(self.table) |
- |
- def makeTable(self): |
- columns = len(self.builders) |
- self.table = gtk.Table(2, columns) |
- self.pane.add(self.table) |
- for i in range(len(self.buildernames)): |
- name = self.buildernames[i] |
- b = self.builders[name] |
- last,current,step = b.getBoxes() |
- self.table.attach(gtk.Label(name), i, i+1, 0, 1) |
- self.table.attach(last, i, i+1, 1, 2, |
- xpadding=1, ypadding=1) |
- self.table.attach(current, i, i+1, 2, 3, |
- xpadding=1, ypadding=1) |
- self.table.attach(step, i, i+1, 3, 4, |
- xpadding=1, ypadding=1) |
- self.table.show_all() |
- |
- def rebuildTable(self): |
- self.removeTable() |
- self.makeTable() |
- |
- def remote_builderAdded(self, buildername, builder): |
- print "builderAdded", buildername |
- assert buildername not in self.buildernames |
- self.buildernames.append(buildername) |
- |
- b = ThreeRowBuilder(buildername, builder) |
- self.builders[buildername] = b |
- self.rebuildTable() |
- b.getLastBuild() |
- b.getState() |
- |
- def remote_builderRemoved(self, buildername): |
- del self.builders[buildername] |
- self.buildernames.remove(buildername) |
- self.rebuildTable() |
- |
- def remote_builderChangedState(self, name, state, eta): |
- self.builders[name].gotState((state, eta, None)) |
- def remote_buildStarted(self, name, build): |
- self.builders[name].buildStarted(build) |
- def remote_buildFinished(self, name, build, results): |
- self.builders[name].buildFinished(build, results) |
- |
- def remote_buildETAUpdate(self, name, build, eta): |
- self.builders[name].buildETAUpdate(eta) |
- def remote_stepStarted(self, name, build, stepname, step): |
- self.builders[name].stepStarted(stepname, step) |
- def remote_stepFinished(self, name, build, stepname, step, results): |
- self.builders[name].stepFinished(stepname, step, results) |
- |
- def remote_stepETAUpdate(self, name, build, stepname, step, |
- eta, expectations): |
- # expectations is a list of (metricname, current_value, |
- # expected_value) tuples, so that we could show individual progress |
- # meters for each metric |
- self.builders[name].stepETAUpdate(stepname, eta) |
- |
- def remote_logStarted(self, buildername, build, stepname, step, |
- logname, log): |
- pass |
- |
- def remote_logFinished(self, buildername, build, stepname, step, |
- logname, log): |
- pass |
- |
- |
-class GtkClient(TextClient): |
- ClientClass = ThreeRowClient |
- |
- def __init__(self, master): |
- self.master = master |
- |
- w = gtk.Window() |
- self.w = w |
- #w.set_size_request(64,64) |
- w.connect('destroy', lambda win: gtk.main_quit()) |
- self.vb = gtk.VBox(False, 2) |
- self.status = gtk.Label("unconnected") |
- self.vb.add(self.status) |
- self.listener = self.ClientClass(self) |
- w.add(self.vb) |
- w.show_all() |
- |
- def connected(self, ref): |
- self.status.set_text("connected") |
- TextClient.connected(self, ref) |
- |
-""" |
- def addBuilder(self, name, builder): |
- Client.addBuilder(self, name, builder) |
- self.pane.addBuilder(builder) |
- def removeBuilder(self, name): |
- self.pane.removeBuilder(name, self.builders[name]) |
- Client.removeBuilder(self, name) |
- |
- def startConnecting(self, master): |
- self.master = master |
- Client.startConnecting(self, master) |
- self.status.set_text("connecting to %s.." % master) |
- def connected(self, remote): |
- Client.connected(self, remote) |
- self.status.set_text(self.master) |
- remote.notifyOnDisconnect(self.disconnected) |
- def disconnected(self, remote): |
- self.status.set_text("disconnected, will retry") |
-""" |
- |
-def main(): |
- master = "localhost:8007" |
- if len(sys.argv) > 1: |
- master = sys.argv[1] |
- c = GtkClient(master) |
- c.run() |
- |
-if __name__ == '__main__': |
- main() |
- |