depclean: don't remove new virtual slots
authorZac Medico <zmedico@gentoo.org>
Sun, 18 Sep 2011 19:42:38 +0000 (12:42 -0700)
committerZac Medico <zmedico@gentoo.org>
Sun, 18 Sep 2011 19:42:38 +0000 (12:42 -0700)
This provides depclean symmetry with the change in update behavior
from commit b95cbb6b78ad6d9b8e2d3edc5fafff122c3ce7c5, so that new
virtual slots won't be removed by depclean immediately after they
have been pulled in.

pym/_emerge/depgraph.py
pym/portage/tests/resolver/test_virtual_slot.py

index f25a22deac3c18e9f0235db215092579ca4ab252..fbbae1e29451fedf38db3878493d4726a568127f 100644 (file)
@@ -6595,7 +6595,8 @@ class _dep_check_composite_db(dbapi):
                if pkg is not None and \
                        atom.slot is None and \
                        pkg.cp.startswith("virtual/") and \
-                       ("--update" not in self._depgraph._frozen_config.myopts or
+                       (("remove" not in self._depgraph._dynamic_config.myparams and
+                       "--update" not in self._depgraph._frozen_config.myopts) or
                        not ret or
                        not self._depgraph._virt_deps_visible(pkg, ignore_use=True)):
                        # For new-style virtual lookahead that occurs inside dep_check()
index fb242011df8863641ae774f2542be98f55d0d81f..4ea66772eb1b0103cf9be68cede7e8f58f3f9337 100644 (file)
@@ -91,3 +91,45 @@ class VirtualSlotResolverTestCase(TestCase):
                                self.assertEqual(test_case.test_success, True, test_case.fail_msg)
                finally:
                        playground.cleanup()
+
+       def testVirtualSlotDepclean(self):
+
+               ebuilds = {
+                       "dev-java/oracle-jdk-bin-1.7.0" : {"SLOT": "1.7", "LICENSE": "TEST"},
+                       "dev-java/sun-jdk-1.6.0" : {"SLOT": "1.6", "LICENSE": "TEST"},
+                       "dev-java/icedtea-6.1.10.3" : {"SLOT": "6"},
+                       "dev-java/icedtea-7" : {"SLOT": "7"},
+                       "app-misc/java-app-1": {"RDEPEND": ">=virtual/jdk-1.6.0"},
+                       "virtual/jdk-1.6.0": {"SLOT": "1.6", "RDEPEND": "|| ( =dev-java/icedtea-6* =dev-java/sun-jdk-1.6.0* )"},
+                       "virtual/jdk-1.7.0": {"SLOT": "1.7", "RDEPEND": "|| ( =dev-java/icedtea-7* =dev-java/oracle-jdk-bin-1.7.0* )"},
+               }
+
+               installed = {
+                       "app-misc/java-app-1": {"RDEPEND": ">=virtual/jdk-1.6.0"},
+                       "dev-java/icedtea-6.1.10.3" : {"SLOT": "6"},
+                       "dev-java/icedtea-7" : {"SLOT": "7"},
+                       "virtual/jdk-1.6.0": {"SLOT" : "1.6", "RDEPEND": "|| ( =dev-java/icedtea-6* =dev-java/sun-jdk-1.6.0* )"},
+                       "virtual/jdk-1.7.0": {"SLOT": "1.7", "RDEPEND": "|| ( =dev-java/icedtea-7* =dev-java/oracle-jdk-bin-1.7.0* )"},
+               }
+
+               world = ("virtual/jdk:1.6", "app-misc/java-app",)
+
+               test_cases = (
+                       # Make sure that depclean doesn't remove a new slot even though
+                       # it is redundant in the sense that the older slot will satisfy
+                       # all dependencies.
+                       ResolverPlaygroundTestCase(
+                               [],
+                               options = {"--depclean" : True},
+                               success = True,
+                               cleanlist = []),
+               )
+
+               playground = ResolverPlayground(
+                       ebuilds=ebuilds, installed=installed, world=world)
+               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()