On Fri, 31 Mar 2017 21:11:41 -0700 Zac Medico <zmed...@gentoo.org> wrote:
> Fix _complete_graph to trigger rebuilds of parent packages when they > pull in installed packages that had already been scheduled for rebuild > by the previous calculation. > > X-Gentoo-bug: 614390 > X-Gentoo-bug-url: https://bugs.gentoo.org/show_bug.cgi?id=614390 > --- > pym/_emerge/depgraph.py | 15 +++ > .../resolver/test_slot_operator_complete_graph.py | 141 > +++++++++++++++++++++ 2 files changed, 156 insertions(+) > create mode 100644 > pym/portage/tests/resolver/test_slot_operator_complete_graph.py > > diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py > index 04e724d..8a614c4 100644 > --- a/pym/_emerge/depgraph.py > +++ b/pym/_emerge/depgraph.py > @@ -6649,6 +6649,21 @@ class depgraph(object): > # will be appropriately reported as > a slot collision # (possibly solvable via backtracking). > pkg = matches[-1] # highest match > + > + if > (self._dynamic_config._allow_backtracking and > + not > self._want_installed_pkg(pkg) and (dep.atom.soname or ( > + dep.atom.package and > dep.atom.slot_operator_built))): > + # If pkg was already > scheduled for rebuild by the previous > + # calculation, then pulling > in the installed instance will > + # trigger a slot conflict > that may go unsolved. Therefore, > + # trigger a rebuild of the > parent if appropriate. > + dep.child = pkg > + new_dep = > self._slot_operator_update_probe(dep) > + if new_dep is not None: > + > self._slot_operator_update_backtrack( > + dep, > new_dep=new_dep) > + continue > + > if not self._add_pkg(pkg, dep): > return 0 > if not > self._create_graph(allow_unsatisfied=True): diff --git > a/pym/portage/tests/resolver/test_slot_operator_complete_graph.py > b/pym/portage/tests/resolver/test_slot_operator_complete_graph.py new > file mode 100644 index 0000000..1d59bce --- /dev/null > +++ b/pym/portage/tests/resolver/test_slot_operator_complete_graph.py > @@ -0,0 +1,141 @@ > +# 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 SlotOperatorCompleteGraphTestCase(TestCase): > + > + def testSlotOperatorCompleteGraph(self): > + > + ebuilds = { > + "app-misc/meta-pkg-2" : { > + "EAPI": "6", > + "DEPEND": "=app-misc/B-2 > =app-misc/C-1 =app-misc/D-1 =dev-libs/foo-2", > + "RDEPEND": "=app-misc/B-2 > =app-misc/C-1 =app-misc/D-1 =dev-libs/foo-2", > + }, > + > + "app-misc/meta-pkg-1" : { > + "EAPI": "6", > + "DEPEND": "=app-misc/B-1 > =app-misc/C-1 =app-misc/D-1 =dev-libs/foo-1", > + "RDEPEND": "=app-misc/B-1 > =app-misc/C-1 =app-misc/D-1 =dev-libs/foo-1", > + }, > + > + "app-misc/B-1" : { > + "EAPI": "6", > + "DEPEND": "dev-libs/foo:=", > + "RDEPEND": "dev-libs/foo:=", > + }, > + > + "app-misc/B-2" : { > + "EAPI": "6", > + "DEPEND": "dev-libs/foo:=", > + "RDEPEND": "dev-libs/foo:=", > + }, > + > + "app-misc/C-1" : { > + "EAPI": "6", > + "DEPEND": "dev-libs/foo:= > app-misc/B", > + "RDEPEND": "dev-libs/foo:= > app-misc/B", > + }, > + > + "app-misc/C-2" : { > + "EAPI": "6", > + "DEPEND": "dev-libs/foo:= > app-misc/B", > + "RDEPEND": "dev-libs/foo:= > app-misc/B", > + }, > + > + "app-misc/D-1" : { > + "EAPI": "6", > + "DEPEND": "dev-libs/foo:=", > + "RDEPEND": "dev-libs/foo:=", > + }, > + > + "app-misc/D-2" : { > + "EAPI": "6", > + "DEPEND": "dev-libs/foo:=", > + "RDEPEND": "dev-libs/foo:=", > + }, > + > + "dev-libs/foo-1" : { > + "EAPI": "6", > + "SLOT": "0/1", > + }, > + > + "dev-libs/foo-2" : { > + "EAPI": "6", > + "SLOT": "0/2", > + }, > + } > + > + installed = { > + "app-misc/meta-pkg-1" : { > + "EAPI": "6", > + "DEPEND": "=app-misc/B-1 > =app-misc/C-1 =app-misc/D-1 =dev-libs/foo-1", > + "RDEPEND": "=app-misc/B-1 > =app-misc/C-1 =app-misc/D-1 =dev-libs/foo-1", > + }, > + > + "app-misc/B-1" : { > + "EAPI": "6", > + "DEPEND": "dev-libs/foo:0/1=", > + "RDEPEND": "dev-libs/foo:0/1=", > + }, > + > + "app-misc/C-1" : { > + "EAPI": "6", > + "DEPEND": "dev-libs/foo:0/1= > app-misc/B", > + "RDEPEND": "dev-libs/foo:0/1= > app-misc/B", > + }, > + > + "app-misc/D-1" : { > + "EAPI": "6", > + "DEPEND": "dev-libs/foo:0/1=", > + "RDEPEND": "dev-libs/foo:0/1=", > + }, > + > + "dev-libs/foo-1" : { > + "EAPI": "6", > + "SLOT": "0/1", > + }, > + } > + > + world = ( > + "app-misc/meta-pkg", > + ) > + > + test_cases = ( > + # Test bug 614390, where the > depgraph._complete_graph > + # method pulled in an installed package that > had been > + # scheduled for rebuild by the previous > calculation, > + # triggering an unsolved slot conflict and > preventing > + # slot operator rebuilds. > + ResolverPlaygroundTestCase( > + ["=app-misc/meta-pkg-2", > "app-misc/C"], > + options = { > + "--backtrack": 5, > + }, > + success = True, > + ambiguous_merge_order = True, > + mergelist = [ > + 'dev-libs/foo-2', > + ('app-misc/D-1', > 'app-misc/C-1', 'app-misc/B-2'), > + 'app-misc/meta-pkg-2', > + ] > + ), > + ) > + > + 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() looks good. I look forward to getting less conflicts with this... -- Brian Dolbec <dolsen>