| Index: pym/portage/dbapi/vartree.py
|
| diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py
|
| index 08263d6d3bd03267f7f1cb058300319e8777acce..891c516a0825bfba4bc6922eefff822267707194 100644
|
| --- a/pym/portage/dbapi/vartree.py
|
| +++ b/pym/portage/dbapi/vartree.py
|
| @@ -148,13 +148,9 @@ class vardbapi(dbapi):
|
|
|
| self._plib_registry = None
|
| if _ENABLE_PRESERVE_LIBS:
|
| - try:
|
| - self._plib_registry = PreservedLibsRegistry(self.root,
|
| - os.path.join(self._eroot, PRIVATE_PATH,
|
| - "preserved_libs_registry"))
|
| - except PermissionDenied:
|
| - # apparently this user isn't allowed to access PRIVATE_PATH
|
| - pass
|
| + self._plib_registry = PreservedLibsRegistry(self.root,
|
| + os.path.join(self._eroot, PRIVATE_PATH,
|
| + "preserved_libs_registry"))
|
|
|
| self._linkmap = None
|
| if _ENABLE_DYN_LINK_MAP:
|
| @@ -1437,6 +1433,41 @@ class dblink(object):
|
| self.contentscache = pkgfiles
|
| return pkgfiles
|
|
|
| + def _prune_plib_registry(self, others_in_slot=[]):
|
| + # remove preserved libraries that don't have any consumers left
|
| + plib_registry = self.vartree.dbapi._plib_registry
|
| + if plib_registry:
|
| + plib_registry.lock()
|
| + try:
|
| + plib_registry.load()
|
| +
|
| + # Skip this if another package in the same slot has just been
|
| + # merged on top of this package, since the other package has
|
| + # already called LinkageMap.rebuild() and passed it's NEEDED file
|
| + # in as an argument.
|
| + if not others_in_slot:
|
| + self._linkmap_rebuild(exclude_pkgs=(self.mycpv,))
|
| +
|
| + cpv_lib_map = self._find_unused_preserved_libs()
|
| + if cpv_lib_map:
|
| + self._remove_preserved_libs(cpv_lib_map)
|
| + for cpv, removed in cpv_lib_map.items():
|
| + if not self.vartree.dbapi.cpv_exists(cpv):
|
| + for dblnk in others_in_slot:
|
| + if dblnk.mycpv == cpv:
|
| + # This one just got merged so it doesn't
|
| + # register with cpv_exists() yet.
|
| + self.vartree.dbapi.removeFromContents(
|
| + dblnk, removed)
|
| + break
|
| + continue
|
| + self.vartree.dbapi.removeFromContents(cpv, removed)
|
| + plib_registry.unregister(self.mycpv, self.settings["SLOT"],
|
| + self.vartree.dbapi.cpv_counter(self.mycpv))
|
| + plib_registry.store()
|
| + finally:
|
| + plib_registry.unlock()
|
| +
|
| def unmerge(self, pkgfiles=None, trimworld=None, cleanup=True,
|
| ldpath_mtimes=None, others_in_slot=None):
|
| """
|
| @@ -1574,15 +1605,6 @@ class dblink(object):
|
| self._unmerge_pkgfiles(pkgfiles, others_in_slot)
|
| self._clear_contents_cache()
|
|
|
| - # Remove the registration of preserved libs for this pkg instance
|
| - plib_registry = self.vartree.dbapi._plib_registry
|
| - if plib_registry is None:
|
| - # preserve-libs is entirely disabled
|
| - pass
|
| - else:
|
| - plib_registry.unregister(self.mycpv, self.settings["SLOT"],
|
| - self.vartree.dbapi.cpv_counter(self.mycpv))
|
| -
|
| if myebuildpath:
|
| ebuild_phase = "postrm"
|
| phase = EbuildPhase(background=background,
|
| @@ -1597,37 +1619,7 @@ class dblink(object):
|
| showMessage(_("!!! FAILED postrm: %s\n") % retval,
|
| level=logging.ERROR, noiselevel=-1)
|
|
|
| - # Skip this if another package in the same slot has just been
|
| - # merged on top of this package, since the other package has
|
| - # already called LinkageMap.rebuild() and passed it's NEEDED file
|
| - # in as an argument.
|
| - if not others_in_slot:
|
| - self._linkmap_rebuild(exclude_pkgs=(self.mycpv,))
|
| -
|
| - # remove preserved libraries that don't have any consumers left
|
| - cpv_lib_map = self._find_unused_preserved_libs()
|
| - if cpv_lib_map:
|
| - self._remove_preserved_libs(cpv_lib_map)
|
| - for cpv, removed in cpv_lib_map.items():
|
| - if not self.vartree.dbapi.cpv_exists(cpv):
|
| - for dblnk in others_in_slot:
|
| - if dblnk.mycpv == cpv:
|
| - # This one just got merged so it doesn't
|
| - # register with cpv_exists() yet.
|
| - self.vartree.dbapi.removeFromContents(
|
| - dblnk, removed)
|
| - break
|
| - continue
|
| - self.vartree.dbapi.removeFromContents(cpv, removed)
|
| - else:
|
| - # Prune any preserved libs that may have
|
| - # been unmerged with this package.
|
| - if plib_registry is None:
|
| - # preserve-libs is entirely disabled
|
| - pass
|
| - else:
|
| - plib_registry.pruneNonExisting()
|
| -
|
| + self._prune_plib_registry(others_in_slot)
|
| finally:
|
| self.vartree.dbapi._bump_mtime(self.mycpv)
|
| if builddir_lock:
|
| @@ -3335,12 +3327,6 @@ class dblink(object):
|
| self.delete()
|
| _movefile(self.dbtmpdir, self.dbpkgdir, mysettings=self.settings)
|
|
|
| - # keep track of the libs we preserved
|
| - if self.vartree.dbapi._plib_registry is not None and \
|
| - preserve_paths:
|
| - self.vartree.dbapi._plib_registry.register(self.mycpv,
|
| - slot, counter, sorted(preserve_paths))
|
| -
|
| # Check for file collisions with blocking packages
|
| # and remove any colliding files from their CONTENTS
|
| # since they now belong to this package.
|
| @@ -3351,27 +3337,37 @@ class dblink(object):
|
| self.vartree.dbapi.removeFromContents(blocker, iter(contents),
|
| relative_paths=False)
|
|
|
| - # Unregister any preserved libs that this package has overwritten
|
| - # and update the contents of the packages that owned them.
|
| plib_registry = self.vartree.dbapi._plib_registry
|
| - if plib_registry is None:
|
| - # preserve-libs is entirely disabled
|
| - pass
|
| - else:
|
| - plib_dict = plib_registry.getPreservedLibs()
|
| - for cpv, paths in plib_collisions.items():
|
| - if cpv not in plib_dict:
|
| - continue
|
| - if cpv == self.mycpv:
|
| - continue
|
| - try:
|
| - slot, counter = self.vartree.dbapi.aux_get(
|
| - cpv, ["SLOT", "COUNTER"])
|
| - except KeyError:
|
| - continue
|
| - remaining = [f for f in plib_dict[cpv] if f not in paths]
|
| - plib_registry.register(cpv, slot, counter, remaining)
|
| - self.vartree.dbapi.removeFromContents(cpv, paths)
|
| + if plib_registry:
|
| + plib_registry.lock()
|
| + try:
|
| + plib_registry.load()
|
| +
|
| + if preserve_paths:
|
| + # keep track of the libs we preserved
|
| + plib_registry.register(self.mycpv, slot, counter,
|
| + sorted(preserve_paths))
|
| +
|
| + # Unregister any preserved libs that this package has overwritten
|
| + # and update the contents of the packages that owned them.
|
| + plib_dict = plib_registry.getPreservedLibs()
|
| + for cpv, paths in plib_collisions.items():
|
| + if cpv not in plib_dict:
|
| + continue
|
| + if cpv == self.mycpv:
|
| + continue
|
| + try:
|
| + slot, counter = self.vartree.dbapi.aux_get(
|
| + cpv, ["SLOT", "COUNTER"])
|
| + except KeyError:
|
| + continue
|
| + remaining = [f for f in plib_dict[cpv] if f not in paths]
|
| + plib_registry.register(cpv, slot, counter, remaining)
|
| + self.vartree.dbapi.removeFromContents(cpv, paths)
|
| +
|
| + plib_registry.store()
|
| + finally:
|
| + plib_registry.unlock()
|
|
|
| self.vartree.dbapi._add(self)
|
| contents = self.getcontents()
|
| @@ -3410,14 +3406,7 @@ class dblink(object):
|
|
|
| # For gcc upgrades, preserved libs have to be removed after the
|
| # the library path has been updated.
|
| - self._linkmap_rebuild()
|
| - cpv_lib_map = self._find_unused_preserved_libs()
|
| - if cpv_lib_map:
|
| - self._remove_preserved_libs(cpv_lib_map)
|
| - for cpv, removed in cpv_lib_map.items():
|
| - if not self.vartree.dbapi.cpv_exists(cpv):
|
| - continue
|
| - self.vartree.dbapi.removeFromContents(cpv, removed)
|
| + self._prune_plib_registry()
|
|
|
| return os.EX_OK
|
|
|
| @@ -3839,14 +3828,6 @@ class dblink(object):
|
| self.lockdb()
|
| self.vartree.dbapi._bump_mtime(self.mycpv)
|
| try:
|
| - plib_registry = self.vartree.dbapi._plib_registry
|
| - if plib_registry is None:
|
| - # preserve-libs is entirely disabled
|
| - pass
|
| - else:
|
| - plib_registry.load()
|
| - plib_registry.pruneNonExisting()
|
| -
|
| retval = self.treewalk(mergeroot, myroot, inforoot, myebuild,
|
| cleanup=cleanup, mydbapi=mydbapi, prev_mtimes=prev_mtimes)
|
|
|
| @@ -4001,13 +3982,6 @@ def unmerge(cat, pkg, myroot=None, settings=None,
|
| try:
|
| mylink.lockdb()
|
| if mylink.exists():
|
| - plib_registry = vartree.dbapi._plib_registry
|
| - if plib_registry is None:
|
| - # preserve-libs is entirely disabled
|
| - pass
|
| - else:
|
| - plib_registry.load()
|
| - plib_registry.pruneNonExisting()
|
| retval = mylink.unmerge(ldpath_mtimes=ldpath_mtimes)
|
| if retval == os.EX_OK:
|
| mylink.delete()
|
|
|