summaryrefslogtreecommitdiff
path: root/icktool
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2018-04-20 19:11:20 +0300
committerLars Wirzenius <liw@liw.fi>2018-04-20 19:11:20 +0300
commit911d18e983555ce94012b3765c1cb5f842f416aa (patch)
tree2a51adaf4eecb59406da08ecd80d7e0cfb96ae15 /icktool
parent8c7870e45cc5894fc211a67cb4e7ad73c6ceb5b8 (diff)
downloadick2-911d18e983555ce94012b3765c1cb5f842f416aa.tar.gz
Add: icktool build-graph command
Diffstat (limited to 'icktool')
-rwxr-xr-xicktool71
1 files changed, 70 insertions, 1 deletions
diff --git a/icktool b/icktool
index 7a74c94..6e493d1 100755
--- a/icktool
+++ b/icktool
@@ -153,11 +153,80 @@ class Icktool(cliapp.Application):
self.output.write(table.format())
def _latest_build(self, project_name, builds):
- builds = [b for b in builds['builds'] if b['project'] == project_name]
+ builds = self._find_builds(project_name, builds)
if builds:
return builds[-1]
return None
+ def _find_builds(self, project_name, builds):
+ return [b for b in builds['builds'] if b['project'] == project_name]
+
+ def _find_build(self, builds, build_id):
+ for build in builds:
+ if build['build_id'] == build_id:
+ return build
+ return None
+
+ def cmd_build_graph(self, args):
+ api = self._new_api()
+ token = self._new_token(api)
+ api.set_token(token)
+
+ project_name = args[0]
+ if len(args) > 1:
+ build_id = args[1]
+ else:
+ build_id = 'latest'
+
+ builds = api.show('/builds')
+ builds = self._find_builds(project_name, builds)
+ if not builds:
+ sys.exit('No such build %s' % build_id)
+
+ if build_id == 'latest':
+ build = builds[-1]
+ else:
+ build = self._find_build(builds, build_id)
+
+ actions = build['actions']
+ current = build['current_action']
+ status = build['status']
+
+ styles = {
+ 'done': ('rectangle', '#ffffff'),
+ 'building': ('ellipse', '#00ff00'),
+ 'blocked': ('ellipse', '#bbbbbb'),
+ }
+
+ node_tmpl = 'a{} [label="{}" shape={} style=filled fillcolor="{}"]\n'
+
+ f = self.output
+ f.write('digraph "build_graph" {\n')
+ for i, action in enumerate(actions):
+ if current is None:
+ shape, color = styles['done']
+ elif i < current:
+ shape, color = styles['done']
+ elif i == current:
+ shape, color = styles['building']
+ elif i > current:
+ shape, color = styles['blocked']
+ f.write(
+ node_tmpl.format(
+ i, self._describe_action(action), shape, color))
+ if i > 0:
+ f.write('a{} -> a{}\n'.format(i-1, i))
+ f.write('}\n')
+
+ def _describe_action(self, action):
+ for key in ['action', 'archive']:
+ if key in action:
+ return '{}: {}'.format(key, action[key])
+ for key in ['debootstrap', 'shell', 'python']:
+ if key in action:
+ return key
+ return str(action)
+
def cmd_make_it_so(self, argv):
obj = self._read_object()