Fix the _dep_check_composite_db._visible method to select the highest
version involved in a slot conflict, for consistency with the change
in ab07ac68fa1e04ed64e2e0f6c753ff169a32d517. The included unit test
fails without this fix.

Fixes: ab07ac68fa1e ("depgraph: select highest version involved in slot 
conflict (bug 554070)")
X-Gentoo-Bug: 554070
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=554070
---
 pym/_emerge/depgraph.py                            |   8 +-
 .../resolver/test_imagemagick_graphicsmagick.py    | 104 +++++++++++++++++++++
 2 files changed, 110 insertions(+), 2 deletions(-)
 create mode 100644 
pym/portage/tests/resolver/test_imagemagick_graphicsmagick.py

diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py
index e298337..b387bfd 100644
--- a/pym/_emerge/depgraph.py
+++ b/pym/_emerge/depgraph.py
@@ -9130,8 +9130,12 @@ class _dep_check_composite_db(dbapi):
                        # into the same slot.
                        return True
 
-               in_graph = 
next(self._depgraph._dynamic_config._package_tracker.match(
-                       self._root, pkg.slot_atom, installed=False), None)
+               # Use reversed iteration in order to get descending order here,
+               # so that the highest version involved in a slot conflict is
+               # selected (see bug 554070).
+               in_graph = next(reversed(list(
+                       self._depgraph._dynamic_config._package_tracker.match(
+                       self._root, pkg.slot_atom, installed=False))), None)
 
                if in_graph is None:
                        # Mask choices for packages which are not the highest 
visible
diff --git a/pym/portage/tests/resolver/test_imagemagick_graphicsmagick.py 
b/pym/portage/tests/resolver/test_imagemagick_graphicsmagick.py
new file mode 100644
index 0000000..9e52249
--- /dev/null
+++ b/pym/portage/tests/resolver/test_imagemagick_graphicsmagick.py
@@ -0,0 +1,104 @@
+# Copyright 2016 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 ImageMagickGraphicsMagickTestCase(TestCase):
+
+       def testImageMagickUpdate(self):
+
+               ebuilds = {
+                       "media-gfx/imagemagick-6.9.7.0" : {
+                               "EAPI": "6",
+                               "SLOT": "0/6.9.7.0",
+                       },
+
+                       "media-gfx/imagemagick-6.9.6.6" : {
+                               "EAPI": "6",
+                               "SLOT": "0/6.9.6.6",
+                       },
+
+                       "media-gfx/inkscape-0.91-r3" : {
+                               "EAPI": "6",
+                               "DEPEND": "media-gfx/imagemagick:=",
+                               "RDEPEND": "media-gfx/imagemagick:=",
+                       },
+
+                       "media-video/dvdrip-0.98.11-r3" : {
+                               "EAPI": "6",
+                               "DEPEND": "|| ( 
media-gfx/graphicsmagick[imagemagick] media-gfx/imagemagick )",
+                               "RDEPEND": "|| ( 
media-gfx/graphicsmagick[imagemagick] media-gfx/imagemagick )",
+                       },
+
+                       "media-gfx/graphicsmagick-1.3.25" : {
+                               "EAPI": "6",
+                               "SLOT": "0/1.3",
+                               "IUSE": "imagemagick",
+                               "RDEPEND": "imagemagick? ( 
!media-gfx/imagemagick )",
+                       },
+               }
+
+               installed = {
+                       "media-gfx/imagemagick-6.9.6.6" : {
+                               "EAPI": "6",
+                               "SLOT": "0/6.9.6.6",
+                       },
+
+                       "media-gfx/inkscape-0.91-r3" : {
+                               "EAPI": "6",
+                               "DEPEND": "media-gfx/imagemagick:0/6.9.6.6=",
+                               "RDEPEND": "media-gfx/imagemagick:0/6.9.6.6=",
+                       },
+
+                       "media-video/dvdrip-0.98.11-r3" : {
+                               "EAPI": "6",
+                               "DEPEND": "|| ( 
media-gfx/graphicsmagick[imagemagick] media-gfx/imagemagick )",
+                               "RDEPEND": "|| ( 
media-gfx/graphicsmagick[imagemagick] media-gfx/imagemagick )",
+                       },
+
+                       "media-gfx/graphicsmagick-1.3.25" : {
+                               "EAPI": "6",
+                               "SLOT": "0/1.3",
+                               "IUSE": "imagemagick",
+                               "USE": "",
+                               "RDEPEND": "imagemagick? ( 
!media-gfx/imagemagick )",
+                       },
+               }
+
+               world = (
+                       "media-gfx/inkscape",
+                       "media-video/dvdrip",
+                       "media-gfx/graphicsmagick",
+               )
+
+               test_cases = (
+
+                       # bug #554070: imagemagick upgrade triggered erroneous
+                       # autounmask USE change for 
media-gfx/graphicsmagick[imagemagick]
+                       ResolverPlaygroundTestCase(
+                               ["media-gfx/imagemagick", "@world"],
+                               options = {"--update": True, "--deep": True},
+                               success = True,
+                               mergelist = [
+                                       "media-gfx/imagemagick-6.9.7.0",
+                                       "media-gfx/inkscape-0.91-r3"
+                               ]
+                       ),
+
+               )
+
+               playground = ResolverPlayground(debug=False,
+                       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:
+                       # Disable debug so that cleanup works.
+                       playground.debug = False
+                       playground.cleanup()
-- 
2.7.4


Reply via email to