[Buildbot-commits] buildbot/buildbot/clients gtkPanes.py, 1.10, 1.11
Brian Warner
warner at users.sourceforge.net
Tue May 30 07:07:42 UTC 2006
Update of /cvsroot/buildbot/buildbot/buildbot/clients
In directory sc8-pr-cvs3.sourceforge.net:/tmp/cvs-serv1292/buildbot/clients
Modified Files:
gtkPanes.py
Log Message:
[project @ gtkPanes.py: update, show steps and ETAs]
Original author: warner at lothar.com
Date: 2006-05-30 07:06:02
Index: gtkPanes.py
===================================================================
RCS file: /cvsroot/buildbot/buildbot/buildbot/clients/gtkPanes.py,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -d -r1.10 -r1.11
--- gtkPanes.py 28 Oct 2005 00:02:49 -0000 1.10
+++ gtkPanes.py 30 May 2006 07:07:40 -0000 1.11
@@ -9,14 +9,14 @@
import pygtk
pygtk.require("2.0")
-import gtk
+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.util import now
'''
class Pane:
@@ -258,22 +258,67 @@
eta.callRemote("unsubscribe", self)
'''
-class TwoRowBuilder:
- def __init__(self, ref):
- self.lastbox = lastbox = gtk.EventBox()
- self.lastlabel = lastlabel = gtk.Label("?")
- lastbox.add(lastlabel)
- lastbox.set_size_request(64,64)
+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
- self.currentbox = currentbox = gtk.EventBox()
- self.currentlabel = currentlabel = gtk.Label("?")
- currentbox.add(currentlabel)
- currentbox.set_size_request(64,64)
+ def getBox(self):
+ return self.box
+
+ def setText(self, text):
+ self.text = text
+ self.label.set_text(text)
+
+ def setColor(self, color):
+ self.box.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(color))
+
+ def setETA(self, eta):
+ self.when = now() + eta
+ self.startTimer()
+
+ 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]" % (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 setColor(self, box, color):
- box.modify_bg(gtk.STATE_NORMAL, gtk.gdk.color_parse(color))
+ def getBoxes(self):
+ return self.last.getBox(), self.current.getBox(), self.step.getBox()
def getLastBuild(self):
d = self.ref.callRemote("getLastFinishedBuild")
@@ -284,9 +329,9 @@
build.callRemote("getColor").addCallback(self.gotLastColor)
def gotLastText(self, text):
- self.lastlabel.set_text("\n".join(text))
+ self.last.setText("\n".join(text))
def gotLastColor(self, color):
- self.setColor(self.lastbox, color)
+ self.last.setColor(color)
def getState(self):
self.ref.callRemote("getState").addCallback(self.gotState)
@@ -301,18 +346,40 @@
"interlocked": "yellow",
"building": "yellow",}
text = state
- self.setColor(self.currentbox, currentmap[state])
+ self.current.setColor(currentmap[state])
if ETA is not None:
text += "\nETA=%s secs" % ETA
- self.currentlabel.set_text(state)
+ self.current.setText(state)
def buildStarted(self, build):
- pass
+ 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)
-class TwoRowClient(pb.Referenceable):
+ 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):
+ self.step.setETA(eta)
+
+
+class ThreeRowClient(pb.Referenceable):
def __init__(self, window):
self.window = window
self.buildernames = []
@@ -322,11 +389,11 @@
print "connected"
self.ref = ref
self.pane = gtk.VBox(False, 2)
- self.table = gtk.Table(1+2, 1)
+ 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", "builds", 5, self)
+ ref.callRemote("subscribe", "logs", 5, self)
def removeTable(self):
for child in self.table.get_children():
@@ -340,10 +407,13 @@
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(b.lastbox, i, i+1, 1, 2,
+ self.table.attach(last, i, i+1, 1, 2,
xpadding=1, ypadding=1)
- self.table.attach(b.currentbox, i, i+1, 2, 3,
+ 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()
@@ -356,7 +426,7 @@
assert buildername not in self.buildernames
self.buildernames.append(buildername)
- b = TwoRowBuilder(builder)
+ b = ThreeRowBuilder(buildername, builder)
self.builders[buildername] = b
self.rebuildTable()
b.getLastBuild()
@@ -374,9 +444,31 @@
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 = TwoRowClient
+ ClientClass = ThreeRowClient
def __init__(self, master):
self.master = master
More information about the Commits
mailing list