From 911d18e983555ce94012b3765c1cb5f842f416aa Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Fri, 20 Apr 2018 19:11:20 +0300 Subject: Add: icktool build-graph command --- icktool | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 70 insertions(+), 1 deletion(-) (limited to 'icktool') 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() -- cgit v1.2.1