Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/buildbot/buildbot/clients/debug.py
diff options
context:
space:
mode:
Diffstat (limited to 'buildbot/buildbot/clients/debug.py')
-rw-r--r--buildbot/buildbot/clients/debug.py181
1 files changed, 181 insertions, 0 deletions
diff --git a/buildbot/buildbot/clients/debug.py b/buildbot/buildbot/clients/debug.py
new file mode 100644
index 0000000..5413765
--- /dev/null
+++ b/buildbot/buildbot/clients/debug.py
@@ -0,0 +1,181 @@
+
+from twisted.internet import gtk2reactor
+gtk2reactor.install()
+from twisted.internet import reactor
+from twisted.python import util
+from twisted.spread import pb
+from twisted.cred import credentials
+import gtk.glade
+import sys, re
+
+class DebugWidget:
+ def __init__(self, master="localhost:8007", passwd="debugpw"):
+ self.connected = 0
+ try:
+ host, port = re.search(r'(.+):(\d+)', master).groups()
+ except:
+ print "unparseable master location '%s'" % master
+ print " expecting something more like localhost:8007"
+ raise
+ self.host = host
+ self.port = int(port)
+ self.passwd = passwd
+ self.remote = None
+ xml = self.xml = gtk.glade.XML(util.sibpath(__file__, "debug.glade"))
+ g = xml.get_widget
+ self.buildname = g('buildname')
+ self.filename = g('filename')
+ self.connectbutton = g('connectbutton')
+ self.connectlabel = g('connectlabel')
+ g('window1').connect('destroy', lambda win: gtk.main_quit())
+ # put the master info in the window's titlebar
+ g('window1').set_title("Buildbot Debug Tool: %s" % master)
+ c = xml.signal_connect
+ c('do_connect', self.do_connect)
+ c('do_reload', self.do_reload)
+ c('do_rebuild', self.do_rebuild)
+ c('do_poke_irc', self.do_poke_irc)
+ c('do_build', self.do_build)
+ c('do_ping', self.do_ping)
+ c('do_commit', self.do_commit)
+ c('on_usebranch_toggled', self.usebranch_toggled)
+ self.usebranch_toggled(g('usebranch'))
+ c('on_userevision_toggled', self.userevision_toggled)
+ self.userevision_toggled(g('userevision'))
+ c('do_current_offline', self.do_current, "offline")
+ c('do_current_idle', self.do_current, "idle")
+ c('do_current_waiting', self.do_current, "waiting")
+ c('do_current_building', self.do_current, "building")
+
+ def do_connect(self, widget):
+ if self.connected:
+ self.connectlabel.set_text("Disconnecting...")
+ if self.remote:
+ self.remote.broker.transport.loseConnection()
+ else:
+ self.connectlabel.set_text("Connecting...")
+ f = pb.PBClientFactory()
+ creds = credentials.UsernamePassword("debug", self.passwd)
+ d = f.login(creds)
+ reactor.connectTCP(self.host, int(self.port), f)
+ d.addCallbacks(self.connect_complete, self.connect_failed)
+ def connect_complete(self, ref):
+ self.connectbutton.set_label("Disconnect")
+ self.connectlabel.set_text("Connected")
+ self.connected = 1
+ self.remote = ref
+ self.remote.callRemote("print", "hello cleveland")
+ self.remote.notifyOnDisconnect(self.disconnected)
+ def connect_failed(self, why):
+ self.connectlabel.set_text("Failed")
+ print why
+ def disconnected(self, ref):
+ self.connectbutton.set_label("Connect")
+ self.connectlabel.set_text("Disconnected")
+ self.connected = 0
+ self.remote = None
+
+ def do_reload(self, widget):
+ if not self.remote:
+ return
+ d = self.remote.callRemote("reload")
+ d.addErrback(self.err)
+ def do_rebuild(self, widget):
+ print "Not yet implemented"
+ return
+ def do_poke_irc(self, widget):
+ if not self.remote:
+ return
+ d = self.remote.callRemote("pokeIRC")
+ d.addErrback(self.err)
+
+ def do_build(self, widget):
+ if not self.remote:
+ return
+ name = self.buildname.get_text()
+ branch = None
+ if self.xml.get_widget("usebranch").get_active():
+ branch = self.xml.get_widget('branch').get_text()
+ if branch == '':
+ branch = None
+ revision = None
+ if self.xml.get_widget("userevision").get_active():
+ revision = self.xml.get_widget('revision').get_text()
+ if revision == '':
+ revision = None
+ reason = "debugclient 'Request Build' button pushed"
+ properties = {}
+ d = self.remote.callRemote("requestBuild",
+ name, reason, branch, revision, properties)
+ d.addErrback(self.err)
+
+ def do_ping(self, widget):
+ if not self.remote:
+ return
+ name = self.buildname.get_text()
+ d = self.remote.callRemote("pingBuilder", name)
+ d.addErrback(self.err)
+
+ def usebranch_toggled(self, widget):
+ rev = self.xml.get_widget('branch')
+ if widget.get_active():
+ rev.set_sensitive(True)
+ else:
+ rev.set_sensitive(False)
+
+ def userevision_toggled(self, widget):
+ rev = self.xml.get_widget('revision')
+ if widget.get_active():
+ rev.set_sensitive(True)
+ else:
+ rev.set_sensitive(False)
+
+ def do_commit(self, widget):
+ if not self.remote:
+ return
+ filename = self.filename.get_text()
+ who = self.xml.get_widget("who").get_text()
+
+ branch = None
+ if self.xml.get_widget("usebranch").get_active():
+ branch = self.xml.get_widget('branch').get_text()
+ if branch == '':
+ branch = None
+
+ revision = None
+ if self.xml.get_widget("userevision").get_active():
+ revision = self.xml.get_widget('revision').get_text()
+ try:
+ revision = int(revision)
+ except ValueError:
+ pass
+ if revision == '':
+ revision = None
+
+ kwargs = { 'revision': revision, 'who': who }
+ if branch:
+ kwargs['branch'] = branch
+ d = self.remote.callRemote("fakeChange", filename, **kwargs)
+ d.addErrback(self.err)
+
+ def do_current(self, widget, state):
+ if not self.remote:
+ return
+ name = self.buildname.get_text()
+ d = self.remote.callRemote("setCurrentState", name, state)
+ d.addErrback(self.err)
+ def err(self, failure):
+ print "received error:", failure
+
+ def run(self):
+ reactor.run()
+
+if __name__ == '__main__':
+ master = "localhost:8007"
+ if len(sys.argv) > 1:
+ master = sys.argv[1]
+ passwd = "debugpw"
+ if len(sys.argv) > 2:
+ passwd = sys.argv[2]
+ d = DebugWidget(master, passwd)
+ d.run()