slot_conflict_handler: fix for bug #348389
authorZac Medico <zmedico@gentoo.org>
Thu, 16 Dec 2010 02:55:53 +0000 (18:55 -0800)
committerZac Medico <zmedico@gentoo.org>
Thu, 16 Dec 2010 02:55:53 +0000 (18:55 -0800)
This fixes a broken assumption about USE dep matching behavior,
since commit 766988aa56bb1bbd2796f96946e62ed78cdf259 introduced
stricter IUSE matching by using Atom.unevaluated_atom for IUSE
checks (thus changing behavior in cases where conditional USE
dependencies disappear upon evaluation).

pym/_emerge/resolver/slot_collision.py

index c51b9f734e4ba53c7370fb1f837f28ea3fdaeedf..0f4c6a53fa7cbd867d3e5e1990904b48f554f2e3 100644 (file)
@@ -231,14 +231,23 @@ class slot_conflict_handler(object):
                                                                collision_reasons[("version", sub_type)] = atoms
                                                        elif not atom_set.findAtomForPackage(other_pkg, \
                                                                modified_use=_pkg_use_enabled(other_pkg)):
-                                                               #Use conditionals not met.
-                                                               violated_atom = atom.violated_conditionals(_pkg_use_enabled(other_pkg), \
-                                                                       other_pkg.iuse.is_valid_flag)
-                                                               for flag in violated_atom.use.enabled.union(violated_atom.use.disabled):
-                                                                       atoms = collision_reasons.get(("use", flag), set())
-                                                                       atoms.add((ppkg, atom, other_pkg))
-                                                                       collision_reasons[("use", flag)] = atoms
-                                                               num_all_specific_atoms += 1
+                                                               missing_iuse = other_pkg.iuse.get_missing_iuse(
+                                                                       atom.unevaluated_atom.use.required)
+                                                               if missing_iuse:
+                                                                       for flag in missing_iuse:
+                                                                               atoms = collision_reasons.get(("use", flag), set())
+                                                                               atoms.add((ppkg, atom, other_pkg))
+                                                                               collision_reasons[("use", flag)] = atoms
+                                                                       num_all_specific_atoms += 1
+                                                               else:
+                                                                       #Use conditionals not met.
+                                                                       violated_atom = atom.violated_conditionals(_pkg_use_enabled(other_pkg), \
+                                                                               other_pkg.iuse.is_valid_flag)
+                                                                       for flag in violated_atom.use.enabled.union(violated_atom.use.disabled):
+                                                                               atoms = collision_reasons.get(("use", flag), set())
+                                                                               atoms.add((ppkg, atom, other_pkg))
+                                                                               collision_reasons[("use", flag)] = atoms
+                                                                       num_all_specific_atoms += 1
 
                                        msg.append(" pulled in by\n")