1 # vi: encoding=utf-8 ts=8 sts=4 sw=4 et
7 __all__ = ['compute_deps', 'remove_list']
10 """Compute dependenecies between RPM installed on system.
12 Return dictionary from name of package to list of packages required by it.
13 Produce some warnings and progress information to stderr.
15 # pkg-name -> list of stuff returned by rpm -qR
19 # list of required files
24 f = chr_popen("rpm -qa --qf '@\n%{NAME}\n[%{REQUIRENAME}\n]'")
31 cur_pkg = f.readline().strip()
34 rpm_req[cur_pkg].append(l)
40 def add_provides(pkg, what):
42 msg("[%s: %s, %s] " % (what, rpm_prov[what], pkg))
48 f = chr_popen("rpm -qa --qf '@\n%{NAME}\n[%{PROVIDENAME}\n]'")
55 cur_pkg = f.readline().strip()
57 add_provides(cur_pkg, l)
66 f = chr_popen("rpm -qa --qf '@\n%{NAME}\n[%{FILENAMES}\n]'")
73 cur_pkg = f.readline().strip()
76 add_provides(cur_pkg, l)
81 msg("computing deps... ")
82 for pkg, reqs in rpm_req.items():
85 if req[0:7] == "rpmlib(": continue
87 if rpm_prov[req] not in pkg_reqs:
88 pkg_reqs.append(rpm_prov[req])
90 msg("[%s: %s] " % (pkg, req))
91 requires[pkg] = pkg_reqs
94 # map from pkg-name to list of pkg-names required by it
104 def remove_list(req, need):
105 """List of packages scheduled for removal.
107 Given dependency information and list of needed packages compute list
108 of packages that don't need to be present.
112 if n in need_m: return
114 if not n in req: return
117 for n in need: close(n)
120 if not p in need_m: rm.append(p)