| OLD | NEW |
| (Empty) |
| 1 | |
| 2 from twisted.internet import gtk2reactor | |
| 3 gtk2reactor.install() | |
| 4 from twisted.internet import reactor | |
| 5 from twisted.python import util | |
| 6 from twisted.spread import pb | |
| 7 from twisted.cred import credentials | |
| 8 import gtk.glade | |
| 9 import sys, re | |
| 10 | |
| 11 class DebugWidget: | |
| 12 def __init__(self, master="localhost:8007", passwd="debugpw"): | |
| 13 self.connected = 0 | |
| 14 try: | |
| 15 host, port = re.search(r'(.+):(\d+)', master).groups() | |
| 16 except: | |
| 17 print "unparseable master location '%s'" % master | |
| 18 print " expecting something more like localhost:8007" | |
| 19 raise | |
| 20 self.host = host | |
| 21 self.port = int(port) | |
| 22 self.passwd = passwd | |
| 23 self.remote = None | |
| 24 xml = self.xml = gtk.glade.XML(util.sibpath(__file__, "debug.glade")) | |
| 25 g = xml.get_widget | |
| 26 self.buildname = g('buildname') | |
| 27 self.filename = g('filename') | |
| 28 self.connectbutton = g('connectbutton') | |
| 29 self.connectlabel = g('connectlabel') | |
| 30 g('window1').connect('destroy', lambda win: gtk.main_quit()) | |
| 31 # put the master info in the window's titlebar | |
| 32 g('window1').set_title("Buildbot Debug Tool: %s" % master) | |
| 33 c = xml.signal_connect | |
| 34 c('do_connect', self.do_connect) | |
| 35 c('do_reload', self.do_reload) | |
| 36 c('do_rebuild', self.do_rebuild) | |
| 37 c('do_poke_irc', self.do_poke_irc) | |
| 38 c('do_build', self.do_build) | |
| 39 c('do_ping', self.do_ping) | |
| 40 c('do_commit', self.do_commit) | |
| 41 c('on_usebranch_toggled', self.usebranch_toggled) | |
| 42 self.usebranch_toggled(g('usebranch')) | |
| 43 c('on_userevision_toggled', self.userevision_toggled) | |
| 44 self.userevision_toggled(g('userevision')) | |
| 45 c('do_current_offline', self.do_current, "offline") | |
| 46 c('do_current_idle', self.do_current, "idle") | |
| 47 c('do_current_waiting', self.do_current, "waiting") | |
| 48 c('do_current_building', self.do_current, "building") | |
| 49 | |
| 50 def do_connect(self, widget): | |
| 51 if self.connected: | |
| 52 self.connectlabel.set_text("Disconnecting...") | |
| 53 if self.remote: | |
| 54 self.remote.broker.transport.loseConnection() | |
| 55 else: | |
| 56 self.connectlabel.set_text("Connecting...") | |
| 57 f = pb.PBClientFactory() | |
| 58 creds = credentials.UsernamePassword("debug", self.passwd) | |
| 59 d = f.login(creds) | |
| 60 reactor.connectTCP(self.host, int(self.port), f) | |
| 61 d.addCallbacks(self.connect_complete, self.connect_failed) | |
| 62 def connect_complete(self, ref): | |
| 63 self.connectbutton.set_label("Disconnect") | |
| 64 self.connectlabel.set_text("Connected") | |
| 65 self.connected = 1 | |
| 66 self.remote = ref | |
| 67 self.remote.callRemote("print", "hello cleveland") | |
| 68 self.remote.notifyOnDisconnect(self.disconnected) | |
| 69 def connect_failed(self, why): | |
| 70 self.connectlabel.set_text("Failed") | |
| 71 print why | |
| 72 def disconnected(self, ref): | |
| 73 self.connectbutton.set_label("Connect") | |
| 74 self.connectlabel.set_text("Disconnected") | |
| 75 self.connected = 0 | |
| 76 self.remote = None | |
| 77 | |
| 78 def do_reload(self, widget): | |
| 79 if not self.remote: | |
| 80 return | |
| 81 d = self.remote.callRemote("reload") | |
| 82 d.addErrback(self.err) | |
| 83 def do_rebuild(self, widget): | |
| 84 print "Not yet implemented" | |
| 85 return | |
| 86 def do_poke_irc(self, widget): | |
| 87 if not self.remote: | |
| 88 return | |
| 89 d = self.remote.callRemote("pokeIRC") | |
| 90 d.addErrback(self.err) | |
| 91 | |
| 92 def do_build(self, widget): | |
| 93 if not self.remote: | |
| 94 return | |
| 95 name = self.buildname.get_text() | |
| 96 branch = None | |
| 97 if self.xml.get_widget("usebranch").get_active(): | |
| 98 branch = self.xml.get_widget('branch').get_text() | |
| 99 if branch == '': | |
| 100 branch = None | |
| 101 revision = None | |
| 102 if self.xml.get_widget("userevision").get_active(): | |
| 103 revision = self.xml.get_widget('revision').get_text() | |
| 104 if revision == '': | |
| 105 revision = None | |
| 106 reason = "debugclient 'Request Build' button pushed" | |
| 107 properties = {} | |
| 108 d = self.remote.callRemote("requestBuild", | |
| 109 name, reason, branch, revision, properties) | |
| 110 d.addErrback(self.err) | |
| 111 | |
| 112 def do_ping(self, widget): | |
| 113 if not self.remote: | |
| 114 return | |
| 115 name = self.buildname.get_text() | |
| 116 d = self.remote.callRemote("pingBuilder", name) | |
| 117 d.addErrback(self.err) | |
| 118 | |
| 119 def usebranch_toggled(self, widget): | |
| 120 rev = self.xml.get_widget('branch') | |
| 121 if widget.get_active(): | |
| 122 rev.set_sensitive(True) | |
| 123 else: | |
| 124 rev.set_sensitive(False) | |
| 125 | |
| 126 def userevision_toggled(self, widget): | |
| 127 rev = self.xml.get_widget('revision') | |
| 128 if widget.get_active(): | |
| 129 rev.set_sensitive(True) | |
| 130 else: | |
| 131 rev.set_sensitive(False) | |
| 132 | |
| 133 def do_commit(self, widget): | |
| 134 if not self.remote: | |
| 135 return | |
| 136 filename = self.filename.get_text() | |
| 137 who = self.xml.get_widget("who").get_text() | |
| 138 | |
| 139 branch = None | |
| 140 if self.xml.get_widget("usebranch").get_active(): | |
| 141 branch = self.xml.get_widget('branch').get_text() | |
| 142 if branch == '': | |
| 143 branch = None | |
| 144 | |
| 145 revision = None | |
| 146 if self.xml.get_widget("userevision").get_active(): | |
| 147 revision = self.xml.get_widget('revision').get_text() | |
| 148 try: | |
| 149 revision = int(revision) | |
| 150 except ValueError: | |
| 151 pass | |
| 152 if revision == '': | |
| 153 revision = None | |
| 154 | |
| 155 kwargs = { 'revision': revision, 'who': who } | |
| 156 if branch: | |
| 157 kwargs['branch'] = branch | |
| 158 d = self.remote.callRemote("fakeChange", filename, **kwargs) | |
| 159 d.addErrback(self.err) | |
| 160 | |
| 161 def do_current(self, widget, state): | |
| 162 if not self.remote: | |
| 163 return | |
| 164 name = self.buildname.get_text() | |
| 165 d = self.remote.callRemote("setCurrentState", name, state) | |
| 166 d.addErrback(self.err) | |
| 167 def err(self, failure): | |
| 168 print "received error:", failure | |
| 169 | |
| 170 def run(self): | |
| 171 reactor.run() | |
| 172 | |
| 173 if __name__ == '__main__': | |
| 174 master = "localhost:8007" | |
| 175 if len(sys.argv) > 1: | |
| 176 master = sys.argv[1] | |
| 177 passwd = "debugpw" | |
| 178 if len(sys.argv) > 2: | |
| 179 passwd = sys.argv[2] | |
| 180 d = DebugWidget(master, passwd) | |
| 181 d.run() | |
| OLD | NEW |