diff options
Diffstat (limited to 'bin/get_preserved_libs')
-rwxr-xr-x | bin/get_preserved_libs | 126 |
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() |