aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2017-11-02 01:29:11 -0700
committerZac Medico <zmedico@gentoo.org>2017-11-02 12:41:56 -0700
commit7c58e37376166b787abae4713c398feee8abf902 (patch)
treecc3e3c86db39c563e2bf332bd1f6c48713ccde0f
parentUpdates for portage-2.3.13 release (diff)
downloadportage-7c58e37376166b787abae4713c398feee8abf902.tar.gz
portage-7c58e37376166b787abae4713c398feee8abf902.tar.bz2
portage-7c58e37376166b787abae4713c398feee8abf902.zip
dep_zapdeps: install new package, avoid downgrade (bug 635540)
Prefer to install a new package rather than to downgrade an installed package. If the installed package should be downgraded due to it being masked, then allow the downgrade. Bug: https://bugs.gentoo.org/635540 Acked-by: Brian Dolbec <dolsen@gentoo.org>
-rw-r--r--pym/portage/dep/dep_check.py11
-rw-r--r--pym/portage/tests/resolver/test_or_downgrade_installed.py97
2 files changed, 107 insertions, 1 deletions
diff --git a/pym/portage/dep/dep_check.py b/pym/portage/dep/dep_check.py
index 35caecc74..b33f7e5db 100644
--- a/pym/portage/dep/dep_check.py
+++ b/pym/portage/dep/dep_check.py
@@ -323,8 +323,10 @@ def dep_zapdeps(unreduced, reduced, myroot, use_binaries=0, trees=None):
want_update_pkg = trees[myroot].get("want_update_pkg")
downgrade_probe = trees[myroot].get("downgrade_probe")
vardb = None
+ vardb_match_pkgs = None
if "vartree" in trees[myroot]:
vardb = trees[myroot]["vartree"].dbapi
+ vardb_match_pkgs = getattr(vardb, 'match_pkgs', None)
if use_binaries:
mydbapi = trees[myroot]["bintree"].dbapi
else:
@@ -355,6 +357,7 @@ def dep_zapdeps(unreduced, reduced, myroot, use_binaries=0, trees=None):
all_use_satisfied = True
all_use_unmasked = True
conflict_downgrade = False
+ installed_downgrade = False
slot_atoms = collections.defaultdict(list)
slot_map = {}
cp_map = {}
@@ -419,6 +422,12 @@ def dep_zapdeps(unreduced, reduced, myroot, use_binaries=0, trees=None):
avail_pkg = avail_pkg_use
avail_slot = Atom("%s:%s" % (atom.cp, avail_pkg.slot))
+ if vardb_match_pkgs is not None and downgrade_probe is not None:
+ inst_pkg = vardb_match_pkgs(avail_slot)
+ if (inst_pkg and avail_pkg < inst_pkg[-1] and
+ not downgrade_probe(inst_pkg[-1])):
+ installed_downgrade = True
+
slot_map[avail_slot] = avail_pkg
slot_atoms[avail_slot].append(atom)
highest_cpv = cp_map.get(avail_pkg.cp)
@@ -487,7 +496,7 @@ def dep_zapdeps(unreduced, reduced, myroot, use_binaries=0, trees=None):
unsat_use_installed.append(this_choice)
else:
unsat_use_non_installed.append(this_choice)
- elif conflict_downgrade:
+ elif conflict_downgrade or installed_downgrade:
other.append(this_choice)
else:
all_in_graph = True
diff --git a/pym/portage/tests/resolver/test_or_downgrade_installed.py b/pym/portage/tests/resolver/test_or_downgrade_installed.py
new file mode 100644
index 000000000..22307a5bc
--- /dev/null
+++ b/pym/portage/tests/resolver/test_or_downgrade_installed.py
@@ -0,0 +1,97 @@
+# Copyright 2017 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 OrDowngradeInstalledTestCase(TestCase):
+
+ def testOrDowngradeInstalled(self):
+ ebuilds = {
+ 'net-misc/foo-1': {
+ 'EAPI': '6',
+ 'RDEPEND': '|| ( sys-libs/glibc[rpc(-)] net-libs/libtirpc )'
+ },
+ 'net-libs/libtirpc-1': {
+ 'EAPI': '6',
+ },
+ 'sys-libs/glibc-2.26': {
+ 'EAPI': '6',
+ 'IUSE': ''
+ },
+ 'sys-libs/glibc-2.24': {
+ 'EAPI': '6',
+ 'IUSE': '+rpc'
+ },
+ }
+
+ installed = {
+ 'sys-libs/glibc-2.26': {
+ 'EAPI': '6',
+ 'IUSE': ''
+ },
+ }
+
+ world = ['sys-libs/glibc']
+
+ test_cases = (
+ # Test bug 635540, where we need to install libtirpc
+ # rather than downgrade glibc.
+ ResolverPlaygroundTestCase(
+ ['net-misc/foo'],
+ success=True,
+ mergelist=[
+ 'net-libs/libtirpc-1',
+ 'net-misc/foo-1',
+ ],
+ ),
+ )
+
+ 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:
+ playground.debug = False
+ playground.cleanup()
+
+ # In some cases it's necessary to downgrade due to
+ # the installed package being masked (glibc is a
+ # not an ideal example because it's usually not
+ # practical to downgrade it).
+ user_config = {
+ "package.mask" : (
+ ">=sys-libs/glibc-2.26",
+ ),
+ }
+
+ test_cases = (
+ ResolverPlaygroundTestCase(
+ ['net-misc/foo'],
+ success=True,
+ mergelist=[
+ 'sys-libs/glibc-2.24',
+ 'net-misc/foo-1',
+ ],
+ ),
+ )
+
+ playground = ResolverPlayground(debug=False,
+ ebuilds=ebuilds, installed=installed, world=world,
+ user_config=user_config)
+
+ 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.debug = False
+ playground.cleanup()