Codebase list rust-libslirp / 00c29ce
dev: more sophisticated excuses output Ximin Luo 5 years ago
2 changed file(s) with 46 addition(s) and 3 deletion(s). Raw diff Collapse all Expand all
00 #!/usr/bin/make -f
11 # Output a nice graph of why stuff isn't yet in Debian Testing.
2 #
3 # - Red nodes means it's not in Debian
4 # - Yellow nodes means it's in Debian, but something else needs a different
5 # version of it.
26 #
37 # Usage:
48 # $ dev/rust-excuses.mk refresh all
00 #!/usr/bin/python3
11
2 import re
3 import subprocess
24 import sys
35 import yaml
46
1012 for e in y["sources"]:
1113 excuses[e["source"]] = e
1214
15 print("generating dot files...", file=sys.stderr)
1316 rust_excuses = open(sys.argv[1], "w")
1417 rust_excuses_arch = open(sys.argv[2], "w")
1518
1619 already_seen = set()
1720
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
1827 def print_all(*args, **kwargs):
1928 print(*args, **kwargs, file=rust_excuses)
2029 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]
2137
2238 def traverse(name, arch="", d=0):
2339 if name in already_seen:
2440 return
2541 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
2666 for dep in excuses.get(name, {}).get("dependencies", {}).get("migrate-after", []):
2767 if "/" in dep:
2868 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)
3170 else:
32 print_all('"%s"' % name, "->", '"%s"' % dep)
71 print_all(edge_dep(name, dep))
3372 traverse(dep, arch, d+1)
3473
3574 print_all("digraph {")