From: "Zac Medico" <zmedico@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/portage:master commit in: pym/portage/dep/, pym/portage/tests/resolver/
Date: Tue, 18 Nov 2014 07:21:26 +0000 (UTC) [thread overview]
Message-ID: <1416294918.20ff16e8941af389cd1fc80e10aef1a90f3b5aa8.zmedico@gentoo> (raw)
commit: 20ff16e8941af389cd1fc80e10aef1a90f3b5aa8
Author: Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Tue Nov 11 09:08:20 2014 +0000
Commit: Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Tue Nov 18 07:15:18 2014 +0000
URL: http://sources.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=20ff16e8
dep_zapdeps: avoid use.mask/force changes (515584)
This patch causes dep_zapdeps to check which USE flags cause a match
to fail, and uses that information to prioritize choices that do not
require changes to use.mask or use.force.
X-Gentoo-Bug: 515584
X-Gentoo-Bug-URL: https://bugs.gentoo.org/show_bug.cgi?id=515584
Acked-by: Brian Dolbec <dolsen <AT> gentoo.org>
---
pym/portage/dep/dep_check.py | 36 +++++++++++++++-
pym/portage/tests/resolver/test_or_choices.py | 59 ++++++++++++++++++++++++++-
2 files changed, 92 insertions(+), 3 deletions(-)
diff --git a/pym/portage/dep/dep_check.py b/pym/portage/dep/dep_check.py
index 62f42ac..ccdda59 100644
--- a/pym/portage/dep/dep_check.py
+++ b/pym/portage/dep/dep_check.py
@@ -317,6 +317,7 @@ def dep_zapdeps(unreduced, reduced, myroot, use_binaries=0, trees=None):
priority = trees[myroot].get("priority")
graph_db = trees[myroot].get("graph_db")
graph = trees[myroot].get("graph")
+ pkg_use_enabled = trees[myroot].get("pkg_use_enabled")
want_update_pkg = trees[myroot].get("want_update_pkg")
vardb = None
if "vartree" in trees[myroot]:
@@ -349,6 +350,7 @@ def dep_zapdeps(unreduced, reduced, myroot, use_binaries=0, trees=None):
all_available = True
all_use_satisfied = True
+ all_use_unmasked = True
slot_map = {}
cp_map = {}
for atom in atoms:
@@ -369,6 +371,32 @@ def dep_zapdeps(unreduced, reduced, myroot, use_binaries=0, trees=None):
avail_pkg_use = mydbapi_match_pkgs(atom)
if not avail_pkg_use:
all_use_satisfied = False
+
+ if pkg_use_enabled is not None:
+ # Check which USE flags cause the match to fail,
+ # so we can prioritize choices that do not
+ # require changes to use.mask or use.force
+ # (see bug #515584).
+ violated_atom = atom.violated_conditionals(
+ pkg_use_enabled(avail_pkg),
+ avail_pkg.iuse.is_valid_flag)
+
+ # Note that violated_atom.use can be None here,
+ # since evaluation can collapse conditional USE
+ # deps that cause the match to fail due to
+ # missing IUSE (match uses atom.unevaluated_atom
+ # to detect such missing IUSE).
+ if violated_atom.use is not None:
+ for flag in violated_atom.use.enabled:
+ if flag in avail_pkg.use.mask:
+ all_use_unmasked = False
+ break
+ else:
+ for flag in violated_atom.use.disabled:
+ if flag in avail_pkg.use.force and \
+ flag not in avail_pkg.use.mask:
+ all_use_unmasked = False
+ break
else:
# highest (ascending order)
avail_pkg_use = avail_pkg_use[-1]
@@ -416,7 +444,9 @@ def dep_zapdeps(unreduced, reduced, myroot, use_binaries=0, trees=None):
else:
preferred_non_installed.append(this_choice)
else:
- if all_installed_slots:
+ if not all_use_unmasked:
+ other.append(this_choice)
+ elif all_installed_slots:
unsat_use_installed.append(this_choice)
else:
unsat_use_non_installed.append(this_choice)
@@ -490,7 +520,9 @@ def dep_zapdeps(unreduced, reduced, myroot, use_binaries=0, trees=None):
else:
preferred_non_installed.append(this_choice)
else:
- if all_in_graph:
+ if not all_use_unmasked:
+ other.append(this_choice)
+ elif all_in_graph:
unsat_use_in_graph.append(this_choice)
elif all_installed_slots:
unsat_use_installed.append(this_choice)
diff --git a/pym/portage/tests/resolver/test_or_choices.py b/pym/portage/tests/resolver/test_or_choices.py
index d9d14f0..4aae0b2 100644
--- a/pym/portage/tests/resolver/test_or_choices.py
+++ b/pym/portage/tests/resolver/test_or_choices.py
@@ -1,4 +1,4 @@
-# Copyright 2013 Gentoo Foundation
+# Copyright 2013-2014 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
from portage.tests import TestCase
@@ -205,3 +205,60 @@ class OrChoicesTestCase(TestCase):
self.assertEqual(test_case.test_success, True, test_case.fail_msg)
finally:
playground.cleanup()
+
+
+ def testUseMask(self):
+
+ profile = {
+ "use.mask":
+ (
+ "abi_ppc_32",
+ ),
+ }
+
+ ebuilds = {
+
+ "sys-libs/A-1" : {
+ "EAPI": "5",
+ "RDEPEND": "|| ( sys-libs/zlib[abi_ppc_32(-)] " + \
+ "sys-libs/zlib[abi_x86_32(-)] )"
+ },
+
+ "sys-libs/zlib-1.2.8-r1" : {
+ "EAPI": "5",
+ "IUSE": "abi_ppc_32 abi_x86_32"
+ },
+
+ "sys-libs/zlib-1.2.8" : {
+ "EAPI": "5",
+ "IUSE": ""
+ },
+ }
+
+ test_cases = (
+
+ # bug #515584: We want to prefer choices that do
+ # not require changes to use.mask or use.force.
+ # In this case, abi_ppc_32 is use.masked in the
+ # profile, so we want to avoid that choice.
+ ResolverPlaygroundTestCase(
+ ["sys-libs/A"],
+ options = {},
+ success = False,
+ use_changes = {
+ 'sys-libs/zlib-1.2.8-r1': {'abi_x86_32': True}
+ },
+ mergelist = ["sys-libs/zlib-1.2.8-r1", "sys-libs/A-1"]
+ ),
+
+ )
+
+ playground = ResolverPlayground(ebuilds=ebuilds,
+ profile=profile, debug=False)
+ 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()
next reply other threads:[~2014-11-18 7:21 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-11-18 7:21 Zac Medico [this message]
-- strict thread matches above, loose matches on Subject: below --
2018-01-27 20:53 [gentoo-commits] proj/portage:master commit in: pym/portage/dep/, pym/portage/tests/resolver/ Zac Medico
2017-11-02 19:44 Zac Medico
2014-10-28 8:36 Zac Medico
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1416294918.20ff16e8941af389cd1fc80e10aef1a90f3b5aa8.zmedico@gentoo \
--to=zmedico@gentoo.org \
--cc=gentoo-commits@lists.gentoo.org \
--cc=gentoo-dev@lists.gentoo.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox