diff options
author | Zac Medico <zmedico@gentoo.org> | 2008-12-23 08:15:00 +0000 |
---|---|---|
committer | Zac Medico <zmedico@gentoo.org> | 2008-12-23 08:15:00 +0000 |
commit | 414d1ef2d9137277c2ba4ad3ab49058b73e8805c (patch) | |
tree | f700ffd78053ba638f7f086b54d4566305fbafec | |
parent | 39cf62d1eb6724fb2269807ca0e6ac232e8a4878 (diff) | |
download | portage-414d1ef2d9137277c2ba4ad3ab49058b73e8805c.tar.gz portage-414d1ef2d9137277c2ba4ad3ab49058b73e8805c.tar.bz2 portage-414d1ef2d9137277c2ba4ad3ab49058b73e8805c.zip |
Simplify the code from bug #218854. Also, ensure that the set of visible packages
thats used by depgraph._iter_atoms_for_pkg() is consistent with the packages that
have been selected by depgraph._select_pkg_highest_available(). This should correct
potential inconstencies introduced by the package selection changes from bug #252167.
svn path=/main/trunk/; revision=12279
-rw-r--r-- | pym/_emerge/__init__.py | 40 |
1 files changed, 7 insertions, 33 deletions
diff --git a/pym/_emerge/__init__.py b/pym/_emerge/__init__.py index 874e12ac2..a22440c93 100644 --- a/pym/_emerge/__init__.py +++ b/pym/_emerge/__init__.py @@ -4307,7 +4307,7 @@ class depgraph(object): # to the graph. self._graph_trees = {} # All Package instances - self._pkg_cache = self._package_cache(self) + self._pkg_cache = {} for myroot in trees: self.trees[myroot] = {} # Create a RootConfig instance that references @@ -5706,6 +5706,12 @@ class depgraph(object): return ret ret = self._select_pkg_highest_available_imp(root, atom, onlydeps=onlydeps) self._highest_pkg_cache[cache_key] = ret + pkg, existing = ret + if pkg is not None: + settings = pkg.root_config.settings + if visible(settings, pkg) and not (pkg.installed and \ + settings._getMissingKeywords(pkg.cpv, pkg.metadata)): + pkg.root_config.visible_pkgs.cpv_inject(pkg) return ret def _select_pkg_highest_available_imp(self, root, atom, onlydeps=False): @@ -6013,22 +6019,6 @@ class depgraph(object): if pkg.cp == cp] break - # If the installed version is in a different slot and it is higher than - # the highest available visible package, _iter_atoms_for_pkg() may fail - # to properly match the available package with a corresponding argument - # atom. Detect this case and correct it here. - if not selective and len(matched_packages) > 1 and \ - matched_packages[-1].installed and \ - matched_packages[-1].slot_atom != \ - matched_packages[-2].slot_atom and \ - matched_packages[-1] > matched_packages[-2]: - pkg = matched_packages[-2] - if pkg.root == self.target_root and \ - self._set_atoms.findAtomForPackage(pkg): - # Select the available package instead - # of the installed package. - matched_packages.pop() - if len(matched_packages) > 1: bestmatch = portage.best( [pkg.cpv for pkg in matched_packages]) @@ -8472,22 +8462,6 @@ class depgraph(object): metadata = self._cpv_pkg_map[cpv].metadata return [metadata.get(x, "") for x in wants] - class _package_cache(dict): - def __init__(self, depgraph): - dict.__init__(self) - self._depgraph = depgraph - - def __setitem__(self, k, v): - dict.__setitem__(self, k, v) - root_config = self._depgraph.roots[v.root] - try: - if visible(root_config.settings, v) and \ - not (v.installed and \ - v.root_config.settings._getMissingKeywords(v.cpv, v.metadata)): - root_config.visible_pkgs.cpv_inject(v) - except portage.exception.InvalidDependString: - pass - class RepoDisplay(object): def __init__(self, roots): self._shown_repos = {} |