Follow the black CS for python
Sylvestre Ledru
4 years ago
7 | 7 | import yaml |
8 | 8 | |
9 | 9 | if len(sys.argv) != 3: |
10 | print("""Generates dot files to show the migration deps | |
10 | print( | |
11 | """Generates dot files to show the migration deps | |
11 | 12 | Usage: %s excuses.dot excuses_arch.dot |
12 | 13 | |
13 | 14 | Expects excuses.yaml in the current dir |
14 | """ % sys.argv[0]) | |
15 | """ | |
16 | % sys.argv[0] | |
17 | ) | |
15 | 18 | sys.exit(0) |
16 | 19 | |
17 | 20 | print("parsing excuses.yaml...", file=sys.stderr) |
18 | 21 | with open("excuses.yaml") as fp: |
19 | y = yaml.load(fp) | |
22 | y = yaml.load(fp) | |
20 | 23 | |
21 | 24 | excuses = {} |
22 | 25 | for e in y["sources"]: |
23 | excuses[e["source"]] = e | |
26 | excuses[e["source"]] = e | |
24 | 27 | |
25 | 28 | print("generating dot files...", file=sys.stderr) |
26 | 29 | rust_excuses = open(sys.argv[1], "w") |
28 | 31 | |
29 | 32 | already_seen = set() |
30 | 33 | |
34 | ||
31 | 35 | def edge_dep(name, dep): |
32 | return " ".join(['"%s"' % name, "->", '"%s"' % dep]) | |
36 | return " ".join(['"%s"' % name, "->", '"%s"' % dep]) | |
37 | ||
33 | 38 | |
34 | 39 | def edge_dep_label(name, dep, label): |
35 | return " ".join(['"%s"' % name, "->", '"%s"' % dep, '[label="%s"]' % label]) | |
40 | return " ".join(['"%s"' % name, "->", '"%s"' % dep, '[label="%s"]' % label]) | |
41 | ||
36 | 42 | |
37 | 43 | def print_all(*args, **kwargs): |
38 | print(*args, **kwargs, file=rust_excuses) | |
39 | print(*args, **kwargs, file=rust_excuses_arch) | |
44 | print(*args, **kwargs, file=rust_excuses) | |
45 | print(*args, **kwargs, file=rust_excuses_arch) | |
46 | ||
40 | 47 | |
41 | 48 | is_in_debian_cache = {} |
49 | ||
50 | ||
42 | 51 | def is_in_debian(src): |
43 | global is_in_debian_cache | |
44 | if src not in is_in_debian_cache: | |
45 | n = subprocess.check_output("apt-cache showsrc %s 2>/dev/null | grep ^Package: | wc -l" % src, shell=True) | |
46 | is_in_debian_cache[src] = int(n.strip()) | |
47 | x = is_in_debian_cache[src] | |
48 | return x | |
52 | global is_in_debian_cache | |
53 | if src not in is_in_debian_cache: | |
54 | n = subprocess.check_output( | |
55 | "apt-cache showsrc %s 2>/dev/null | grep ^Package: | wc -l" % src, | |
56 | shell=True, | |
57 | ) | |
58 | is_in_debian_cache[src] = int(n.strip()) | |
59 | x = is_in_debian_cache[src] | |
60 | return x | |
61 | ||
49 | 62 | |
50 | 63 | def traverse(name, arch="", d=0): |
51 | if name in already_seen: | |
52 | return | |
53 | already_seen.add(name) | |
54 | dependencies = excuses.get(name, {}).get("dependencies", {}) | |
64 | if name in already_seen: | |
65 | return | |
66 | already_seen.add(name) | |
67 | dependencies = excuses.get(name, {}).get("dependencies", {}) | |
55 | 68 | |
56 | edges = set() | |
57 | for arch, deps in dependencies.get("unsatisfiable-dependencies", {}).items(): | |
58 | for dep in deps: | |
59 | vers = "" | |
60 | if dep.startswith("librust-"): | |
61 | try: | |
62 | results = re.match(r"librust-(\S+?)(-[.0-9]+)?(\+\S*)?-dev", dep) | |
63 | dep = "rust-" + results.group(1) | |
64 | if results.group(2): | |
65 | vers = results.group(2) | |
66 | except: | |
67 | print(dep, file=sys.stderr) | |
68 | raise | |
69 | edges.add(edge_dep_label(name, dep, vers)) | |
70 | print(edge_dep_label(name, dep, "%s/%s" % (vers, arch) if vers else arch), file=rust_excuses_arch) | |
71 | if dep not in already_seen: | |
72 | if is_in_debian(dep): | |
73 | print_all('"%s" [fillcolor="#ffcc66",style=filled]' % dep) | |
74 | else: | |
75 | print_all('"%s" [fillcolor="#ff6666",style=filled]' % dep) | |
76 | for edge in edges: | |
77 | print(edge, file=rust_excuses) | |
69 | edges = set() | |
70 | for arch, deps in dependencies.get("unsatisfiable-dependencies", {}).items(): | |
71 | for dep in deps: | |
72 | vers = "" | |
73 | if dep.startswith("librust-"): | |
74 | try: | |
75 | results = re.match(r"librust-(\S+?)(-[.0-9]+)?(\+\S*)?-dev", dep) | |
76 | dep = "rust-" + results.group(1) | |
77 | if results.group(2): | |
78 | vers = results.group(2) | |
79 | except Exception: | |
80 | print(dep, file=sys.stderr) | |
81 | raise | |
82 | edges.add(edge_dep_label(name, dep, vers)) | |
83 | print( | |
84 | edge_dep_label(name, dep, "%s/%s" % (vers, arch) if vers else arch), | |
85 | file=rust_excuses_arch, | |
86 | ) | |
87 | if dep not in already_seen: | |
88 | if is_in_debian(dep): | |
89 | print_all('"%s" [fillcolor="#ffcc66",style=filled]' % dep) | |
90 | else: | |
91 | print_all('"%s" [fillcolor="#ff6666",style=filled]' % dep) | |
92 | for edge in edges: | |
93 | print(edge, file=rust_excuses) | |
78 | 94 | |
79 | for dep in dependencies.get("migrate-after", []) + dependencies.get("blocked-by", []): | |
80 | if "/" in dep: | |
81 | dep, arch = dep.split("/") | |
82 | print(edge_dep_label(name, dep, arch), file=rust_excuses_arch) | |
83 | else: | |
84 | print_all(edge_dep(name, dep)) | |
85 | traverse(dep, arch, d+1) | |
95 | for dep in dependencies.get("migrate-after", []) + dependencies.get( | |
96 | "blocked-by", [] | |
97 | ): | |
98 | if "/" in dep: | |
99 | dep, arch = dep.split("/") | |
100 | print(edge_dep_label(name, dep, arch), file=rust_excuses_arch) | |
101 | else: | |
102 | print_all(edge_dep(name, dep)) | |
103 | traverse(dep, arch, d + 1) | |
86 | 104 | |
87 | if not dependencies: | |
88 | age = excuses.get(name, {}).get("policy_info", {}).get("age", {}) | |
89 | if age.get("verdict", "") == "REJECTED_TEMPORARILY": | |
90 | print_all('"%s" [fillcolor="#66ff99",style=filled]' % name) | |
105 | if not dependencies: | |
106 | age = excuses.get(name, {}).get("policy_info", {}).get("age", {}) | |
107 | if age.get("verdict", "") == "REJECTED_TEMPORARILY": | |
108 | print_all('"%s" [fillcolor="#66ff99",style=filled]' % name) | |
91 | 109 | |
92 | #import code | |
93 | #code.interact(local=locals()) | |
110 | ||
111 | # import code | |
112 | # code.interact(local=locals()) | |
113 | ||
94 | 114 | |
95 | 115 | print_all("digraph {") |
96 | 116 | for s in excuses.keys(): |
97 | if s.startswith("rust-"): | |
98 | traverse(s) | |
117 | if s.startswith("rust-"): | |
118 | traverse(s) | |
99 | 119 | print_all("}") |