54 lines
1.6 KiB
Python
Executable file
54 lines
1.6 KiB
Python
Executable file
#!/usr/bin/python3
|
|
|
|
import yaml
|
|
from pygraphviz import AGraph
|
|
from subprocess import call
|
|
|
|
with open("eclipse.yaml", 'r') as stream:
|
|
yaml = yaml.safe_load(stream)
|
|
|
|
rpms = yaml['data']['components']['rpms']
|
|
|
|
g = AGraph(directed=True, name="G", strict=False, label="Build Order Graph")
|
|
ranks = []
|
|
for key, value in rpms.items():
|
|
rank = value['buildorder']
|
|
if rank not in ranks:
|
|
ranks.append(rank)
|
|
subg = g.get_subgraph(f"{rank}")
|
|
if subg is None:
|
|
subg = g.add_subgraph(name=f"{rank}", label=f"Build Order {rank}", rank="same")
|
|
subg.add_node(f"{rank}")
|
|
subg.add_node(key)
|
|
rs = value['rationale'].replace('\n', ' ').split('.')
|
|
reqs = []
|
|
breqs = []
|
|
for r in rs:
|
|
r = r.strip()
|
|
if not r or r == 'Module API':
|
|
continue
|
|
if r.startswith('Runtime dependency of'):
|
|
r = r[len('Runtime dependency of'):]
|
|
reqs = [x.strip() for x in r.split(',')]
|
|
if r.startswith('Build dependency of'):
|
|
r = r[len('Build dependency of'):]
|
|
breqs = [x.strip() for x in r.split(',')]
|
|
for req in reqs:
|
|
# For Rs, check if also a BR
|
|
if req not in breqs:
|
|
g.add_edge(key, req, color='blue')
|
|
else:
|
|
g.add_edge(key, req, color='purple')
|
|
for breq in breqs:
|
|
# For BRs, check if also a R
|
|
if breq not in reqs:
|
|
g.add_edge(key, breq, color='red')
|
|
ranks.sort()
|
|
for idx, rank in enumerate(ranks):
|
|
if idx+1 < len(ranks):
|
|
g.add_edge(rank, ranks[idx+1], weight=1000)
|
|
|
|
|
|
print(g.string())
|
|
g.draw("build_order_graph.png", prog="dot")
|
|
call('eog build_order_graph.png &', shell=True)
|