0 | 0 |
#!/usr/bin/python3
|
1 | 1 |
|
|
2 |
import re
|
|
3 |
import subprocess
|
2 | 4 |
import sys
|
3 | 5 |
import yaml
|
4 | 6 |
|
|
10 | 12 |
for e in y["sources"]:
|
11 | 13 |
excuses[e["source"]] = e
|
12 | 14 |
|
|
15 |
print("generating dot files...", file=sys.stderr)
|
13 | 16 |
rust_excuses = open(sys.argv[1], "w")
|
14 | 17 |
rust_excuses_arch = open(sys.argv[2], "w")
|
15 | 18 |
|
16 | 19 |
already_seen = set()
|
17 | 20 |
|
|
21 |
def edge_dep(name, dep):
|
|
22 |
return " ".join(['"%s"' % name, "->", '"%s"' % dep])
|
|
23 |
|
|
24 |
def edge_dep_label(name, dep, label):
|
|
25 |
return " ".join(['"%s"' % name, "->", '"%s"' % dep, '[label="%s"]' % label])
|
|
26 |
|
18 | 27 |
def print_all(*args, **kwargs):
|
19 | 28 |
print(*args, **kwargs, file=rust_excuses)
|
20 | 29 |
print(*args, **kwargs, file=rust_excuses_arch)
|
|
30 |
|
|
31 |
is_in_debian_cache = {}
|
|
32 |
def is_in_debian(src):
|
|
33 |
if src not in is_in_debian_cache:
|
|
34 |
n = subprocess.check_output("apt-cache showsrc %s 2>/dev/null | grep ^Package: | wc -l" % src, shell=True)
|
|
35 |
is_in_debian_cache[src] = n
|
|
36 |
return is_in_debian_cache[src]
|
21 | 37 |
|
22 | 38 |
def traverse(name, arch="", d=0):
|
23 | 39 |
if name in already_seen:
|
24 | 40 |
return
|
25 | 41 |
already_seen.add(name)
|
|
42 |
|
|
43 |
edges = set()
|
|
44 |
for arch, deps in excuses.get(name, {}).get("dependencies", {}).get("unsatisfiable-dependencies", {}).items():
|
|
45 |
for dep in deps:
|
|
46 |
vers = ""
|
|
47 |
if dep.startswith("librust-"):
|
|
48 |
try:
|
|
49 |
results = re.match(r"librust-(\S+?)(-[.0-9]+)?(\+\S*)?-dev", dep)
|
|
50 |
dep = "rust-" + results.group(1)
|
|
51 |
if results.group(2):
|
|
52 |
vers = results.group(2)
|
|
53 |
except:
|
|
54 |
print(dep, file=sys.stderr)
|
|
55 |
raise
|
|
56 |
edges.add(edge_dep_label(name, dep, vers))
|
|
57 |
print(edge_dep_label(name, dep, "%s/%s" % (vers, arch) if vers else arch), file=rust_excuses_arch)
|
|
58 |
if dep not in already_seen:
|
|
59 |
if is_in_debian(dep):
|
|
60 |
print_all('"%s" [fillcolor="#ffcc66",style=filled]' % dep)
|
|
61 |
else:
|
|
62 |
print_all('"%s" [fillcolor="#ff6666",style=filled]' % dep)
|
|
63 |
for edge in edges:
|
|
64 |
print(edge, file=rust_excuses)
|
|
65 |
|
26 | 66 |
for dep in excuses.get(name, {}).get("dependencies", {}).get("migrate-after", []):
|
27 | 67 |
if "/" in dep:
|
28 | 68 |
dep, arch = dep.split("/")
|
29 | |
print('"%s"' % name, "->", '"%s"' % dep, '[label="%s"]' % arch,
|
30 | |
file=rust_excuses_arch)
|
|
69 |
print(edge_dep_label(name, dep, arch), file=rust_excuses_arch)
|
31 | 70 |
else:
|
32 | |
print_all('"%s"' % name, "->", '"%s"' % dep)
|
|
71 |
print_all(edge_dep(name, dep))
|
33 | 72 |
traverse(dep, arch, d+1)
|
34 | 73 |
|
35 | 74 |
print_all("digraph {")
|