-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpackage_tree.py
More file actions
executable file
·70 lines (58 loc) · 2.07 KB
/
Copy pathpackage_tree.py
File metadata and controls
executable file
·70 lines (58 loc) · 2.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#!/bin/python3
import sys
from dnf import Base
class Node:
def __init__(self, srpm):
self.deps = []
self.srpm = srpm
def getNode(nodes, srpm):
# Get node from list or create one if necessary
node = next((x for x in nodes if x.srpm == srpm), None)
if not node:
node = Node(srpm)
nodes.append(node)
return node
def main(argv):
NAME = argv[0]
# Load COPR repo
base = Base()
base.repos.add_new_repo(f"mbooth:{NAME}", base.conf, baseurl=[f"https://download.copr.fedorainfracloud.org/results/mbooth/{NAME}/fedora-$releasever-$basearch/"])
base.fill_sack(load_system_repo=False)
# Find all RPMs in repository
all_query = base.sack.query().available().latest()
all_pkgs = all_query.run()
srpm_requirements = {}
for pkg in all_pkgs:
# Determine SRPM for RPM
name = pkg.name
if pkg.arch != 'src':
name = pkg.source_name
# Create requirements list for RPM
if name not in srpm_requirements:
srpm_requirements[name] = []
for require in pkg.requires:
if require not in srpm_requirements[name]:
srpm_requirements[name].append(require)
nodes = []
for srpm in srpm_requirements:
# Find RPMs in repository that satisfy the requirements
provides_query = base.sack.query().available().filter(provides=srpm_requirements[srpm])
provides_pkgs = provides_query.run()
# Get node for the SRPM
node = getNode(nodes, srpm)
for pkg in provides_pkgs:
# Ignore if self-provides
if pkg.source_name == srpm:
continue
# Add dependency node as a child to the SRPM node
dep_node = getNode(nodes, pkg.source_name)
if dep_node not in node.deps:
node.deps.append(dep_node)
print("digraph deps {")
print("rankdir=\"LR\";")
for node in nodes:
for dep in node.deps:
print(f"\"{node.srpm}\" -> \"{dep.srpm}\";")
print("}")
if __name__ == "__main__":
main(sys.argv[1:])