slot_collision: be consistent with missing IUSE
authorZac Medico <zmedico@gentoo.org>
Sun, 10 Jul 2011 00:51:06 +0000 (17:51 -0700)
committerZac Medico <zmedico@gentoo.org>
Sun, 10 Jul 2011 00:51:06 +0000 (17:51 -0700)
Special handling for missing IUSE that was introduced in commit
9a193d42032005396800eb30e550691513529c79 is also useful in one
more spot.

pym/_emerge/resolver/slot_collision.py
pym/portage/tests/resolver/test_slot_collisions.py

index d43b8892d162e67aa77e7af23b9c40ff04ee2ea8..00429976a4b1d4c39876795019e68361a3c66840 100644 (file)
@@ -337,14 +337,21 @@ class slot_conflict_handler(object):
                                                        #are fewer possible solutions.
                                                        use = sub_type
                                                        for ppkg, atom, other_pkg in parents:
-                                                               parent_use = None
-                                                               if isinstance(ppkg, Package):
-                                                                       parent_use = _pkg_use_enabled(ppkg)
-                                                               violated_atom = atom.unevaluated_atom.violated_conditionals( \
-                                                                       _pkg_use_enabled(other_pkg), other_pkg.iuse.is_valid_flag,
-                                                                       parent_use=parent_use)
-                                                               if use in violated_atom.use.enabled.union(violated_atom.use.disabled):
+                                                               missing_iuse = other_pkg.iuse.get_missing_iuse(
+                                                                       atom.unevaluated_atom.use.required)
+                                                               if missing_iuse:
                                                                        unconditional_use_deps.add((ppkg, atom))
+                                                               else:
+                                                                       parent_use = None
+                                                                       if isinstance(ppkg, Package):
+                                                                               parent_use = _pkg_use_enabled(ppkg)
+                                                                       violated_atom = atom.unevaluated_atom.violated_conditionals(
+                                                                               _pkg_use_enabled(other_pkg),
+                                                                               other_pkg.iuse.is_valid_flag,
+                                                                               parent_use=parent_use)
+                                                                       if use in violated_atom.use.enabled or \
+                                                                               use in violated_atom.use.disabled:
+                                                                               unconditional_use_deps.add((ppkg, atom))
                                                                # When USE flags are removed, it can be
                                                                # essential to see all broken reverse
                                                                # dependencies here, so don't omit any.
index 5839a39c3ca674fa84a9759a34b2406675281376..4867cea0508adb56f7403661185d9c5133107c90 100644 (file)
@@ -31,6 +31,15 @@ class SlotCollisionTestCase(TestCase):
                        "sci-libs/Q-2": { "SLOT": "2", "IUSE": "+bar +foo", "EAPI": 2, "PDEPEND": "sci-libs/Q:1[bar?,foo?]" },
                        "sci-libs/P-1": { "DEPEND": "sci-libs/Q:1[foo=]", "IUSE": "foo", "EAPI": 2 },
 
+                       "sys-libs/A-1": { "RDEPEND": "foo? ( sys-libs/J[foo=] )", "IUSE": "+foo", "EAPI": "4" },
+                       "sys-libs/B-1": { "RDEPEND": "bar? ( sys-libs/J[bar=] )", "IUSE": "+bar", "EAPI": "4" },
+                       "sys-libs/C-1": { "RDEPEND": "sys-libs/J[bar]", "EAPI": "4" },
+                       "sys-libs/D-1": { "RDEPEND": "sys-libs/J[bar?]", "IUSE": "bar", "EAPI": "4" },
+                       "sys-libs/E-1": { "RDEPEND": "sys-libs/J[foo(+)?]", "IUSE": "+foo", "EAPI": "4" },
+                       "sys-libs/F-1": { "RDEPEND": "sys-libs/J[foo(+)]", "EAPI": "4" },
+                       "sys-libs/J-1": { "IUSE": "+foo", "EAPI": "4" },
+                       "sys-libs/J-2": { "IUSE": "+bar", "EAPI": "4" },
+
                        "app-misc/A-1": { "IUSE": "foo +bar", "REQUIRED_USE": "^^ ( foo bar )", "EAPI": "4" },
                        "app-misc/B-1": { "DEPEND": "=app-misc/A-1[foo=]", "IUSE": "foo", "EAPI": 2 },
                        "app-misc/C-1": { "DEPEND": "=app-misc/A-1[foo]", "EAPI": 2 },
@@ -62,6 +71,15 @@ class SlotCollisionTestCase(TestCase):
                                ignore_mergelist_order = True,
                                slot_collision_solutions = [ {"dev-libs/A-1": {"foo": True}, "dev-libs/D-1": {"foo": True}} ]),
 
+                       ResolverPlaygroundTestCase(
+                               ["sys-libs/A", "sys-libs/B", "sys-libs/C", "sys-libs/D", "sys-libs/E", "sys-libs/F"],
+                               options = { "--autounmask": 'n' },
+                               success = False,
+                               ignore_mergelist_order = True,
+                               slot_collision_solutions = [],
+                               mergelist = ['sys-libs/J-2', 'sys-libs/J-1', 'sys-libs/A-1', 'sys-libs/B-1', 'sys-libs/C-1', 'sys-libs/D-1', 'sys-libs/E-1', 'sys-libs/F-1'],
+                               ),
+
                        #A version based conflicts, nothing we can do.
                        ResolverPlaygroundTestCase(
                                ["=app-misc/X-1", "=app-misc/Y-1"],