Since built-time deps tend to be a superset of run-time deps, evaluate
disjunctive build-time deps before run-time deps, so that choices for
build-time deps influence choices for run-time deps.

Also, fix OnlydepsMinimalTestCase to specify ambiguous_merge_order,
since the merge order is affected by the order of evaluation.

Bug: https://bugs.gentoo.org/639346
---
 pym/_emerge/depgraph.py                            | 12 ++-
 .../resolver/test_disjunctive_depend_order.py      | 87 ++++++++++++++++++++++
 .../tests/resolver/test_onlydeps_minimal.py        |  5 +-
 3 files changed, 98 insertions(+), 6 deletions(-)
 create mode 100644 pym/portage/tests/resolver/test_disjunctive_depend_order.py

diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py
index f54acdc26..6e5ca6508 100644
--- a/pym/_emerge/depgraph.py
+++ b/pym/_emerge/depgraph.py
@@ -3234,7 +3234,15 @@ class depgraph(object):
                        if ignore_hdepend_deps:
                                edepend["HDEPEND"] = ""
 
+               # Since build-time deps tend to be a superset of run-time deps, 
order
+               # dep processing such that build-time deps are popped from
+               # _dep_disjunctive_stack first, so that choices for build-time
+               # deps influence choices for run-time deps (bug 639346).
                deps = (
+                       (myroot, edepend["RDEPEND"],
+                               self._priority(runtime=True)),
+                       (myroot, edepend["PDEPEND"],
+                               self._priority(runtime_post=True)),
                        (depend_root, edepend["DEPEND"],
                                self._priority(buildtime=True,
                                optional=(pkg.built or ignore_depend_deps),
@@ -3243,10 +3251,6 @@ class depgraph(object):
                                self._priority(buildtime=True,
                                optional=(pkg.built or ignore_hdepend_deps),
                                ignored=ignore_hdepend_deps)),
-                       (myroot, edepend["RDEPEND"],
-                               self._priority(runtime=True)),
-                       (myroot, edepend["PDEPEND"],
-                               self._priority(runtime_post=True))
                )
 
                debug = "--debug" in self._frozen_config.myopts
diff --git a/pym/portage/tests/resolver/test_disjunctive_depend_order.py 
b/pym/portage/tests/resolver/test_disjunctive_depend_order.py
new file mode 100644
index 000000000..88f6dac2d
--- /dev/null
+++ b/pym/portage/tests/resolver/test_disjunctive_depend_order.py
@@ -0,0 +1,87 @@
+# 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 DisjunctiveDependOrderTestCase(TestCase):
+
+       def testDisjunctiveDependOrderTestCase(self):
+               ebuilds = {
+                       'virtual/jre-1.8': {
+                               'EAPI': '6',
+                               'SLOT' : '1.8',
+                               'RDEPEND' : '|| ( dev-java/oracle-jre-bin:1.8 
virtual/jdk:1.8 )',
+                       },
+                       'virtual/jdk-1.8': {
+                               'EAPI': '6',
+                               'SLOT' : '1.8',
+                               'RDEPEND' : '|| ( dev-java/icedtea:8 
dev-java/oracle-jdk-bin:1.8 )',
+                       },
+                       'dev-java/icedtea-3.6': {
+                               'SLOT' : '8',
+                       },
+                       'dev-java/oracle-jdk-bin-1.8': {
+                               'SLOT' : '1.8',
+                       },
+                       'dev-java/oracle-jre-bin-1.8': {
+                               'SLOT' : '1.8',
+                       },
+                       'dev-db/hsqldb-1.8'       : {
+                               'DEPEND' : 'virtual/jdk',
+                               'RDEPEND' : 'virtual/jre',
+                       },
+               }
+
+               binpkgs = {
+                       'dev-db/hsqldb-1.8'       : {
+                               'DEPEND' : 'virtual/jdk',
+                               'RDEPEND' : 'virtual/jre',
+                       },
+               }
+
+               test_cases = (
+                       # Test bug 639346, where a redundant jre implementation
+                       # was pulled in because DEPEND was evaluated after
+                       # RDEPEND.
+                       ResolverPlaygroundTestCase(
+                               ['dev-db/hsqldb'],
+                               success=True,
+                               mergelist=[
+                                       'dev-java/icedtea-3.6',
+                                       'virtual/jdk-1.8',
+                                       'virtual/jre-1.8',
+                                       'dev-db/hsqldb-1.8',
+                               ],
+                       ),
+
+                       # The jdk is not needed with --usepkg, so the jre should
+                       # be preferred in this case.
+                       ResolverPlaygroundTestCase(
+                               ['dev-db/hsqldb'],
+                               options = {
+                                       '--usepkg': True
+                               },
+                               success=True,
+                               mergelist=[
+                                       'dev-java/oracle-jre-bin-1.8',
+                                       'virtual/jre-1.8',
+                                       '[binary]dev-db/hsqldb-1.8',
+                               ],
+                       ),
+               )
+
+               playground = ResolverPlayground(debug=False,
+                       binpkgs=binpkgs, ebuilds=ebuilds)
+
+               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()
diff --git a/pym/portage/tests/resolver/test_onlydeps_minimal.py 
b/pym/portage/tests/resolver/test_onlydeps_minimal.py
index 13c79ed55..efda02c59 100644
--- a/pym/portage/tests/resolver/test_onlydeps_minimal.py
+++ b/pym/portage/tests/resolver/test_onlydeps_minimal.py
@@ -25,9 +25,10 @@ class OnlydepsMinimalTestCase(TestCase):
                                success = True,
                                options = { "--onlydeps": True,
                                            "--onlydeps-with-rdeps": "y" },
-                               mergelist = ["dev-libs/B-1",
+                               ambiguous_merge_order = True,
+                               mergelist = [("dev-libs/B-1",
                                             "dev-libs/C-1",
-                                            "dev-libs/D-1"]),
+                                            "dev-libs/D-1")]),
                        ResolverPlaygroundTestCase(
                                ["dev-libs/A"],
                                all_permutations = True,
-- 
2.13.6


Reply via email to