summaryrefslogtreecommitdiff
path: root/bin/get_preserved_libs
diff options
context:
space:
mode:
Diffstat (limited to 'bin/get_preserved_libs')
-rwxr-xr-xbin/get_preserved_libs126
1 files changed, 126 insertions, 0 deletions
diff --git a/bin/get_preserved_libs b/bin/get_preserved_libs
new file mode 100755
index 0000000..6f66cb9
--- /dev/null
+++ b/bin/get_preserved_libs
@@ -0,0 +1,126 @@
+#!/usr/bin/python
+
+import sys
+
+from _emerge.actions import load_emerge_config
+import portage.dep
+
+settings, trees, mtimedb = load_emerge_config()
+vardb = trees[settings["ROOT"]]["vartree"].dbapi
+
+linkmap = vardb._linkmap
+reg = vardb._plib_registry
+
+reg.lock()
+try:
+ plibdata = reg.getPreservedLibs()
+
+ if plibdata:
+ sys.stdout.write("# list of bumped libraries:\n")
+
+ for cpv, paths in plibdata.items():
+ sys.stdout.write("%s\n" % (cpv,))
+ for path in sorted(paths):
+ sys.stderr.write(" %s\n" % (path,))
+
+ if plibdata:
+ sys.stdout.write("# list of inverse deps:\n")
+
+ # taken from display_preserved_libs.py, Portage
+ linkmap.rebuild() # can raise CommandNotFound
+ consumer_map = {}
+ search_for_owners = set()
+ for cpv in plibdata:
+ internal_plib_keys = set(linkmap._obj_key(f) for f in plibdata[cpv])
+ for f in plibdata[cpv]:
+ if f in consumer_map:
+ continue
+
+ consumers = []
+ for c in linkmap.findConsumers(f):
+ # Filter out any consumers that are also preserved libs
+ # belonging to the same package as the provider.
+ if linkmap._obj_key(c) not in internal_plib_keys:
+ consumers.append(c)
+ consumers.sort()
+ consumer_map[f] = consumers
+ search_for_owners.update(consumers)
+
+ owners = {}
+ for f in search_for_owners:
+ owner_set = set()
+ for owner in linkmap.getOwners(f):
+ owner_dblink = vardb._dblink(owner)
+ if owner_dblink.exists():
+ owner_set.add(owner_dblink)
+ if owner_set:
+ owners[f] = owner_set
+
+ all_preserved = set()
+ all_preserved.update(*plibdata.values())
+ owners_map = {}
+
+ for cpv in plibdata:
+ sys.stdout.write("%s\n" % (cpv,))
+ samefile_map = {}
+ for f in plibdata[cpv]:
+ obj_key = linkmap._obj_key(f)
+ alt_paths = samefile_map.get(obj_key)
+ if alt_paths is None:
+ alt_paths = set()
+ samefile_map[obj_key] = alt_paths
+ alt_paths.add(f)
+
+ for alt_paths in samefile_map.values():
+ alt_paths = sorted(alt_paths)
+ for p in alt_paths:
+ sys.stderr.write(" - %s" % (p,))
+ f = alt_paths[0]
+ consumers = consumer_map.get(f, [])
+
+ consumers_non_preserved = [c for c in consumers
+ if c not in all_preserved]
+ if consumers_non_preserved:
+ # Filter the consumers that are preserved libraries, since
+ # they don't need to be rebuilt (see bug #461908).
+ consumers = consumers_non_preserved
+
+ for c in consumers:
+ owner_pkgs = []
+ if c in all_preserved:
+ # The owner is displayed elsewhere due to having
+ # its libs preserved, so distinguish this special
+ # case (see bug #461908).
+ owners_desc = "preserved"
+ else:
+ owner_cpvs = [x.mycpv for x in owners.get(c, [])]
+ owner_pkgs.extend(owner_cpvs)
+ owners_desc = ", ".join(owner_cpvs)
+
+ sys.stderr.write(" used by %s (%s)\n" % (c, owners_desc))
+
+ for owner_pkg in owner_pkgs:
+ cp_slot = "%s:%s" % (
+ portage.dep.dep_getkey("=" + owner_pkg),
+ vardb.aux_get(owner_pkg, ["SLOT"])[0]
+ )
+ obj = owners_map.setdefault(cp_slot, set())
+ obj.add(c)
+
+ sys.stdout.flush()
+ sys.stderr.flush()
+
+ if owners_map:
+ sys.stdout.write("# grouped list of rebuilds:\n")
+
+ for owner_pkg in sorted(owners_map.keys()):
+ owner_files = sorted(owners_map[owner_pkg])
+ sys.stdout.write("%s\n" % (owner_pkg,))
+ for owner_file in owner_files:
+ sys.stderr.write(" %s\n" % (owner_file,))
+
+ sys.stdout.flush()
+ sys.stderr.flush()
+
+finally:
+ reg.unlock()