On Thu,  2 Nov 2017 02:21:14 -0700
Zac Medico <zmed...@gentoo.org> wrote:

> 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
> ---
>  pym/portage/dep/dep_check.py                       | 11 ++-
>  .../tests/resolver/test_or_downgrade_installed.py  | 97
> ++++++++++++++++++++++ 2 files changed, 107 insertions(+), 1
> deletion(-) create mode 100644
> pym/portage/tests/resolver/test_or_downgrade_installed.py
> 
> diff --git a/pym/portage/dep/dep_check.py
> b/pym/portage/dep/dep_check.py index 35caecc74..2c69c1c48 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:
> +                             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()

looks good

-- 
Brian Dolbec <dolsen>


Reply via email to