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