emerge --depclean: rm unavailable slot bug 445506
authorZac Medico <zmedico@gentoo.org>
Sat, 1 Dec 2012 23:22:59 +0000 (15:22 -0800)
committerZac Medico <zmedico@gentoo.org>
Sat, 1 Dec 2012 23:22:59 +0000 (15:22 -0800)
pym/_emerge/depgraph.py
pym/portage/tests/resolver/test_depclean_slot_unavailable.py [new file with mode: 0644]

index f5fe4352f5d5db4e21ef639dd8c15d5edb4c258a..65a94ab3773be7cfbb05e9272533e2d3e5d91e2f 100644 (file)
@@ -4634,6 +4634,14 @@ class depgraph(object):
                                        unmasked = [pkg for pkg in matches if not pkg.masks]
                                        if unmasked:
                                                matches = unmasked
+                                               if len(matches) > 1:
+                                                       # Now account for packages for which existing
+                                                       # ebuilds are masked or unavailable (bug #445506).
+                                                       unmasked = [pkg for pkg in matches if
+                                                               self._equiv_ebuild_visible(pkg)]
+                                                       if unmasked:
+                                                               matches = unmasked
+
                pkg = matches[-1] # highest match
                in_graph = self._dynamic_config._slot_pkg_map[root].get(pkg.slot_atom)
                return pkg, in_graph
diff --git a/pym/portage/tests/resolver/test_depclean_slot_unavailable.py b/pym/portage/tests/resolver/test_depclean_slot_unavailable.py
new file mode 100644 (file)
index 0000000..9d17189
--- /dev/null
@@ -0,0 +1,79 @@
+# Copyright 2012 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+
+from portage.tests import TestCase
+from portage.tests.resolver.ResolverPlayground import (ResolverPlayground,
+       ResolverPlaygroundTestCase)
+
+class DepcleanUnavailableSlotTestCase(TestCase):
+
+       def testDepcleanUnavailableSlot(self):
+               """
+               Test bug #445506, where we want to remove the slot
+               for which the ebuild is no longer available, even
+               though its version is higher.
+               """
+
+               ebuilds = {
+                       "sys-kernel/gentoo-sources-3.0.53": {
+                               "SLOT": "3.0.53",
+                               "KEYWORDS": "x86"
+                       },
+               }
+
+               installed = {
+                       "sys-kernel/gentoo-sources-3.0.53": {
+                               "SLOT": "3.0.53",
+                               "KEYWORDS": "x86"
+                       },
+                       "sys-kernel/gentoo-sources-3.2.21": {
+                               "SLOT": "3.2.21",
+                               "KEYWORDS": "x86"
+                       },
+               }
+
+               world = [ "sys-kernel/gentoo-sources" ]
+
+               test_cases = (
+
+                       ResolverPlaygroundTestCase(
+                               [],
+                               options = {"--depclean": True},
+                               success = True,
+                               cleanlist = ["sys-kernel/gentoo-sources-3.2.21"]),
+               )
+
+               playground = ResolverPlayground(ebuilds=ebuilds,
+                       installed=installed, world=world, debug=False)
+               try:
+                       for test_case in test_cases:
+                               playground.run_TestCase(test_case)
+                               self.assertEqual(test_case.test_success, True, test_case.fail_msg)
+               finally:
+                       playground.cleanup()
+
+               # Now make the newer version availale and verify that
+               # the lower version is depcleaned.
+               ebuilds.update({
+                       "sys-kernel/gentoo-sources-3.2.21": {
+                               "SLOT": "3.2.21",
+                               "KEYWORDS": "x86"
+                       },
+               })
+
+               test_cases = (
+                       ResolverPlaygroundTestCase(
+                               [],
+                               options = {"--depclean": True},
+                               success = True,
+                               cleanlist = ["sys-kernel/gentoo-sources-3.0.53"]),
+               )
+
+               playground = ResolverPlayground(ebuilds=ebuilds,
+                       installed=installed, world=world, debug=False)
+               try:
+                       for test_case in test_cases:
+                               playground.run_TestCase(test_case)
+                               self.assertEqual(test_case.test_success, True, test_case.fail_msg)
+               finally:
+                       playground.cleanup()