summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2008-05-08 09:29:13 +0000
committerZac Medico <zmedico@gentoo.org>2008-05-08 09:29:13 +0000
commitb676418ca5e441c442ccf7d826c81e247e29a663 (patch)
tree07ed8c327ca2c925d9ffe7759d75c736ea82ab9a
parentFix namespace breakage. (diff)
downloadportage-multirepo-b676418ca5e441c442ccf7d826c81e247e29a663.tar.gz
portage-multirepo-b676418ca5e441c442ccf7d826c81e247e29a663.tar.bz2
portage-multirepo-b676418ca5e441c442ccf7d826c81e247e29a663.zip
Fix findInstalledBlockers() to check for blockers in both directions.
(trunk r10229) svn path=/main/branches/2.1.2/; revision=10230
-rwxr-xr-xbin/emerge56
1 files changed, 40 insertions, 16 deletions
diff --git a/bin/emerge b/bin/emerge
index 685e40d9..61031a47 100755
--- a/bin/emerge
+++ b/bin/emerge
@@ -1674,22 +1674,6 @@ class BlockerDB(object):
self._installed_pkgs = None
def findInstalledBlockers(self, new_pkg):
- self._update_cache()
- blocker_parents = digraph()
- blocker_atoms = []
- for pkg in self._installed_pkgs:
- for blocker_atom in self._blocker_cache[pkg.cpv].atoms:
- blocker_atom = blocker_atom[1:]
- blocker_atoms.append(blocker_atom)
- blocker_parents.add(blocker_atom, pkg)
-
- blocker_atoms = InternalPackageSet(initial_atoms=blocker_atoms)
- blocking_pkgs = set()
- for atom in blocker_atoms.iterAtomsForPackage(new_pkg):
- blocking_pkgs.update(blocker_parents.parent_nodes(atom))
- return blocking_pkgs
-
- def _update_cache(self):
blocker_cache = self._blocker_cache
dep_keys = ["DEPEND", "RDEPEND", "PDEPEND"]
dep_check_trees = self._dep_check_trees
@@ -1738,6 +1722,46 @@ class BlockerDB(object):
del blocker_cache[cpv]
blocker_cache.flush()
+ blocker_parents = digraph()
+ blocker_atoms = []
+ for pkg in self._installed_pkgs:
+ for blocker_atom in self._blocker_cache[pkg.cpv].atoms:
+ blocker_atom = blocker_atom[1:]
+ blocker_atoms.append(blocker_atom)
+ blocker_parents.add(blocker_atom, pkg)
+
+ blocker_atoms = InternalPackageSet(initial_atoms=blocker_atoms)
+ blocking_pkgs = set()
+ for atom in blocker_atoms.iterAtomsForPackage(new_pkg):
+ blocking_pkgs.update(blocker_parents.parent_nodes(atom))
+
+ # Check for blockers in the other direction.
+ myuse = new_pkg.metadata["USE"].split()
+ depstr = " ".join(new_pkg.metadata[k] for k in dep_keys)
+ try:
+ portage_dep._dep_check_strict = False
+ success, atoms = portage.dep_check(depstr,
+ vardb, settings, myuse=myuse,
+ trees=dep_check_trees, myroot=new_pkg.root)
+ finally:
+ portage_dep._dep_check_strict = True
+ if not success:
+ # We should never get this far with invalid deps.
+ show_invalid_depstring_notice(new_pkg, depstr, atoms)
+ assert False
+
+ blocker_atoms = [atom[1:] for atom in atoms \
+ if atom.startswith("!")]
+ blocker_atoms = InternalPackageSet(initial_atoms=blocker_atoms)
+ for inst_pkg in self._installed_pkgs:
+ try:
+ blocker_atoms.iterAtomsForPackage(inst_pkg).next()
+ except (portage_exception.InvalidDependString, StopIteration):
+ continue
+ blocking_pkgs.add(inst_pkg)
+
+ return blocking_pkgs
+
def show_invalid_depstring_notice(parent_node, depstring, error_msg):
from formatter import AbstractFormatter, DumbWriter