From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from pigeon.gentoo.org ([208.92.234.80] helo=lists.gentoo.org) by finch.gentoo.org with esmtp (Exim 4.77) (envelope-from ) id 1SmcYv-0006Kg-M0 for garchives@archives.gentoo.org; Thu, 05 Jul 2012 03:17:02 +0000 Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id D74A9E0566; Thu, 5 Jul 2012 03:16:53 +0000 (UTC) Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) by pigeon.gentoo.org (Postfix) with ESMTP id 01F51E0566 for ; Thu, 5 Jul 2012 03:16:52 +0000 (UTC) Received: from hornbill.gentoo.org (hornbill.gentoo.org [94.100.119.163]) (using TLSv1 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id 38CDE1B4025 for ; Thu, 5 Jul 2012 03:16:52 +0000 (UTC) Received: from localhost.localdomain (localhost [127.0.0.1]) by hornbill.gentoo.org (Postfix) with ESMTP id ED9DDE5436 for ; Thu, 5 Jul 2012 03:16:50 +0000 (UTC) From: "Zac Medico" To: gentoo-commits@lists.gentoo.org Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "Zac Medico" Message-ID: <1341458200.02bcf332a88bbf25b9e0391b1a6d781ab4bbe0b9.zmedico@gentoo> Subject: [gentoo-commits] proj/portage:master commit in: pym/portage/tests/resolver/, pym/_emerge/ X-VCS-Repository: proj/portage X-VCS-Files: pym/_emerge/depgraph.py pym/portage/tests/resolver/test_slot_abi_downgrade.py X-VCS-Directories: pym/portage/tests/resolver/ pym/_emerge/ X-VCS-Committer: zmedico X-VCS-Committer-Name: Zac Medico X-VCS-Revision: 02bcf332a88bbf25b9e0391b1a6d781ab4bbe0b9 X-VCS-Branch: master Date: Thu, 5 Jul 2012 03:16:50 +0000 (UTC) Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: quoted-printable X-Archives-Salt: d983df5a-914a-43f5-a23d-5277bfa8c94b X-Archives-Hash: 1de0f7f3c07a49d5b36d861c0e730721 commit: 02bcf332a88bbf25b9e0391b1a6d781ab4bbe0b9 Author: Zac Medico gentoo org> AuthorDate: Thu Jul 5 03:16:40 2012 +0000 Commit: Zac Medico gentoo org> CommitDate: Thu Jul 5 03:16:40 2012 +0000 URL: http://git.overlays.gentoo.org/gitweb/?p=3Dproj/portage.git;a= =3Dcommit;h=3D02bcf332 Rebuild for slot-abi downgrades, bug #424651. --- pym/_emerge/depgraph.py | 109 +++++++--- .../tests/resolver/test_slot_abi_downgrade.py | 225 ++++++++++++++= ++++++ 2 files changed, 298 insertions(+), 36 deletions(-) diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py index 480cb90..f819aef 100644 --- a/pym/_emerge/depgraph.py +++ b/pym/_emerge/depgraph.py @@ -24,7 +24,8 @@ from portage.dep import Atom, best_match_to_list, extra= ct_affecting_use, \ _repo_separator from portage.dep._slot_abi import ignore_built_slot_abi_deps from portage.eapi import eapi_has_strong_blocks, eapi_has_required_use -from portage.exception import InvalidAtom, InvalidDependString, PortageE= xception +from portage.exception import (InvalidAtom, InvalidDependString, + PackageNotFound, PortageException) from portage.output import colorize, create_color_func, \ darkgreen, green bad =3D create_color_func("BAD") @@ -1047,6 +1048,7 @@ class depgraph(object): return None =20 debug =3D "--debug" in self._frozen_config.myopts + want_downgrade =3D None =20 for replacement_parent in self._iter_similar_available(dep.parent, dep.parent.slot_atom): @@ -1087,10 +1089,13 @@ class depgraph(object): if pkg.slot !=3D dep.child.slot: continue if pkg < dep.child: + if want_downgrade is None: + want_downgrade =3D self._downgrade_probe(dep.child) # be careful not to trigger a rebuild when # the only version available with a # different slot_abi is an older version - continue + if not want_downgrade: + continue =20 if debug: msg =3D [] @@ -1122,12 +1127,33 @@ class depgraph(object): =20 return None =20 + def _downgrade_probe(self, pkg): + """ + Detect cases where a downgrade of the given package is considered + desirable due to the current version being masked or unavailable. + """ + available_pkg =3D None + for available_pkg in self._iter_similar_available(pkg, + pkg.slot_atom): + if available_pkg >=3D pkg: + # There's an available package of the same or higher + # version, so downgrade seems undesirable. + return False + + return available_pkg is not None + def _iter_similar_available(self, graph_pkg, atom): """ Given a package that's in the graph, do a rough check to see if a similar package is available to install. The given graph_pkg itself may be yielded only if it's not installed. """ + + usepkgonly =3D "--usepkgonly" in self._frozen_config.myopts + useoldpkg_atoms =3D self._frozen_config.useoldpkg_atoms + use_ebuild_visibility =3D self._frozen_config.myopts.get( + '--use-ebuild-visibility', 'n') !=3D 'n' + for pkg in self._iter_match_pkgs_any( graph_pkg.root_config, atom): if pkg.cp !=3D graph_pkg.cp: @@ -1142,6 +1168,14 @@ class depgraph(object): continue if not self._pkg_visibility_check(pkg): continue + if pkg.built: + if self._equiv_binary_installed(pkg): + continue + if not (not use_ebuild_visibility and + (usepkgonly or useoldpkg_atoms.findAtomForPackage( + pkg, modified_use=3Dself._pkg_use_enabled(pkg)))) and \ + not self._equiv_ebuild_visible(pkg): + continue yield pkg =20 def _slot_abi_trigger_reinstalls(self): @@ -3811,6 +3845,38 @@ class depgraph(object): =20 return not arg =20 + def _equiv_ebuild_visible(self, pkg, autounmask_level=3DNone): + try: + pkg_eb =3D self._pkg( + pkg.cpv, "ebuild", pkg.root_config, myrepo=3Dpkg.repo) + except portage.exception.PackageNotFound: + pkg_eb_visible =3D False + for pkg_eb in self._iter_match_pkgs(pkg.root_config, + "ebuild", Atom("=3D%s" % (pkg.cpv,))): + if self._pkg_visibility_check(pkg_eb, autounmask_level): + pkg_eb_visible =3D True + break + if not pkg_eb_visible: + return False + else: + if not self._pkg_visibility_check(pkg_eb, autounmask_level): + return False + + return True + + def _equiv_binary_installed(self, pkg): + build_time =3D pkg.metadata.get('BUILD_TIME') + if not build_time: + return False + + try: + inst_pkg =3D self._pkg(pkg.cpv, "installed", + pkg.root_config, installed=3DTrue) + except PackageNotFound: + return False + + return build_time =3D=3D inst_pkg.metadata.get('BUILD_TIME') + class _AutounmaskLevel(object): __slots__ =3D ("allow_use_changes", "allow_unstable_keywords", "allow_= license_changes", \ "allow_missing_keywords", "allow_unmasks") @@ -4241,22 +4307,9 @@ class depgraph(object): if not use_ebuild_visibility and (usepkgonly or useoldpkg): if pkg.installed and pkg.masks: continue - else: - try: - pkg_eb =3D self._pkg( - pkg.cpv, "ebuild", root_config, myrepo=3Dpkg.repo) - except portage.exception.PackageNotFound: - pkg_eb_visible =3D False - for pkg_eb in self._iter_match_pkgs(pkg.root_config, - "ebuild", Atom("=3D%s" % (pkg.cpv,))): - if self._pkg_visibility_check(pkg_eb, autounmask_level): - pkg_eb_visible =3D True - break - if not pkg_eb_visible: - continue - else: - if not self._pkg_visibility_check(pkg_eb, autounmask_level): - continue + elif not self._equiv_ebuild_visible(pkg, + autounmask_level=3Dautounmask_level): + continue =20 # Calculation of USE for unbuilt ebuilds is relatively # expensive, so it is only performed lazily, after the @@ -7137,24 +7190,8 @@ class _dep_check_composite_db(dbapi): if not avoid_update: if not use_ebuild_visibility and usepkgonly: return False - else: - try: - pkg_eb =3D self._depgraph._pkg( - pkg.cpv, "ebuild", pkg.root_config, - myrepo=3Dpkg.repo) - except portage.exception.PackageNotFound: - pkg_eb_visible =3D False - for pkg_eb in self._depgraph._iter_match_pkgs( - pkg.root_config, "ebuild", - Atom("=3D%s" % (pkg.cpv,))): - if self._depgraph._pkg_visibility_check(pkg_eb): - pkg_eb_visible =3D True - break - if not pkg_eb_visible: - return False - else: - if not self._depgraph._pkg_visibility_check(pkg_eb): - return False + elif not self._depgraph._equiv_ebuild_visible(pkg): + return False =20 in_graph =3D self._depgraph._dynamic_config._slot_pkg_map[ self._root].get(pkg.slot_atom) diff --git a/pym/portage/tests/resolver/test_slot_abi_downgrade.py b/pym/= portage/tests/resolver/test_slot_abi_downgrade.py new file mode 100644 index 0000000..45a7555 --- /dev/null +++ b/pym/portage/tests/resolver/test_slot_abi_downgrade.py @@ -0,0 +1,225 @@ +# Copyright 2012 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +from portage.tests import TestCase +from portage.tests.resolver.ResolverPlayground import (ResolverPlaygroun= d, + ResolverPlaygroundTestCase) + +class SlotAbiDowngradeTestCase(TestCase): + + def __init__(self, *args, **kwargs): + super(SlotAbiDowngradeTestCase, self).__init__(*args, **kwargs) + + def testSubSlot(self): + ebuilds =3D { + "dev-libs/icu-4.8" : { + "EAPI": "4-slot-abi", + "SLOT": "0/48" + }, + "dev-libs/libxml2-2.7.8" : { + "EAPI": "4-slot-abi", + "DEPEND": "dev-libs/icu:=3D", + "RDEPEND": "dev-libs/icu:=3D" + }, + } + binpkgs =3D { + "dev-libs/icu-49" : { + "EAPI": "4-slot-abi", + "SLOT": "0/49" + }, + "dev-libs/icu-4.8" : { + "EAPI": "4-slot-abi", + "SLOT": "0/48" + }, + "dev-libs/libxml2-2.7.8" : { + "EAPI": "4-slot-abi", + "DEPEND": "dev-libs/icu:0/49=3D", + "RDEPEND": "dev-libs/icu:0/49=3D" + }, + } + installed =3D { + "dev-libs/icu-49" : { + "EAPI": "4-slot-abi", + "SLOT": "0/49" + }, + "dev-libs/libxml2-2.7.8" : { + "EAPI": "4-slot-abi", + "DEPEND": "dev-libs/icu:0/49=3D", + "RDEPEND": "dev-libs/icu:0/49=3D" + }, + } + + world =3D ["dev-libs/libxml2"] + + test_cases =3D ( + + ResolverPlaygroundTestCase( + ["dev-libs/icu"], + options =3D {"--oneshot": True}, + success =3D True, + mergelist =3D ["dev-libs/icu-4.8", "dev-libs/libxml2-2.7.8" ]), + + ResolverPlaygroundTestCase( + ["dev-libs/icu"], + options =3D {"--oneshot": True, "--ignore-built-slot-abi-deps": "y"}= , + success =3D True, + mergelist =3D ["dev-libs/icu-4.8"]), + + ResolverPlaygroundTestCase( + ["dev-libs/icu"], + options =3D {"--oneshot": True, "--usepkg": True}, + success =3D True, + mergelist =3D ["[binary]dev-libs/icu-4.8", "dev-libs/libxml2-2.7.8" = ]), + + ResolverPlaygroundTestCase( + ["dev-libs/icu"], + options =3D {"--oneshot": True, "--usepkgonly": True}, + success =3D True, + mergelist =3D ["[binary]dev-libs/icu-49"]), + + ResolverPlaygroundTestCase( + ["@world"], + options =3D {"--update": True, "--deep": True}, + success =3D True, + mergelist =3D ["dev-libs/icu-4.8", "dev-libs/libxml2-2.7.8" ]), + + ResolverPlaygroundTestCase( + ["@world"], + options =3D {"--update": True, "--deep": True, "--ignore-built-slot-= abi-deps": "y"}, + success =3D True, + mergelist =3D ["dev-libs/icu-4.8"]), + + ResolverPlaygroundTestCase( + ["@world"], + options =3D {"--update": True, "--deep": True, "--usepkg": True}, + success =3D True, + mergelist =3D ["[binary]dev-libs/icu-4.8", "dev-libs/libxml2-2.7.8" = ]), + + ResolverPlaygroundTestCase( + ["@world"], + options =3D {"--update": True, "--deep": True, "--usepkgonly": True}= , + success =3D True, + mergelist =3D []), + + ) + + playground =3D ResolverPlayground(ebuilds=3Debuilds, binpkgs=3Dbinpkgs= , + installed=3Dinstalled, world=3Dworld, debug=3DFalse) + 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() + + def testWholeSlotSubSlotMix(self): + ebuilds =3D { + "dev-libs/glib-1.2.10" : { + "SLOT": "1" + }, + "dev-libs/glib-2.30.2" : { + "EAPI": "4-slot-abi", + "SLOT": "2/2.30" + }, + "dev-libs/dbus-glib-0.98" : { + "EAPI": "4-slot-abi", + "DEPEND": "dev-libs/glib:2=3D", + "RDEPEND": "dev-libs/glib:2=3D" + }, + } + binpkgs =3D { + "dev-libs/glib-1.2.10" : { + "SLOT": "1" + }, + "dev-libs/glib-2.30.2" : { + "EAPI": "4-slot-abi", + "SLOT": "2/2.30" + }, + "dev-libs/glib-2.32.3" : { + "EAPI": "4-slot-abi", + "SLOT": "2/2.32" + }, + "dev-libs/dbus-glib-0.98" : { + "EAPI": "4-slot-abi", + "DEPEND": "dev-libs/glib:2/2.32=3D", + "RDEPEND": "dev-libs/glib:2/2.32=3D" + }, + } + installed =3D { + "dev-libs/glib-1.2.10" : { + "EAPI": "4-slot-abi", + "SLOT": "1" + }, + "dev-libs/glib-2.32.3" : { + "EAPI": "4-slot-abi", + "SLOT": "2/2.32" + }, + "dev-libs/dbus-glib-0.98" : { + "EAPI": "4-slot-abi", + "DEPEND": "dev-libs/glib:2/2.32=3D", + "RDEPEND": "dev-libs/glib:2/2.32=3D" + }, + } + + world =3D ["dev-libs/glib:1", "dev-libs/dbus-glib"] + + test_cases =3D ( + + ResolverPlaygroundTestCase( + ["dev-libs/glib"], + options =3D {"--oneshot": True}, + success =3D True, + mergelist =3D ["dev-libs/glib-2.30.2", "dev-libs/dbus-glib-0.98" ]), + + ResolverPlaygroundTestCase( + ["dev-libs/glib"], + options =3D {"--oneshot": True, "--ignore-built-slot-abi-deps": "y"}= , + success =3D True, + mergelist =3D ["dev-libs/glib-2.30.2"]), + + ResolverPlaygroundTestCase( + ["dev-libs/glib"], + options =3D {"--oneshot": True, "--usepkg": True}, + success =3D True, + mergelist =3D ["[binary]dev-libs/glib-2.30.2", "dev-libs/dbus-glib-0= .98" ]), + + ResolverPlaygroundTestCase( + ["dev-libs/glib"], + options =3D {"--oneshot": True, "--usepkgonly": True}, + success =3D True, + mergelist =3D ["[binary]dev-libs/glib-2.32.3"]), + + ResolverPlaygroundTestCase( + ["@world"], + options =3D {"--update": True, "--deep": True}, + success =3D True, + mergelist =3D ["dev-libs/glib-2.30.2", "dev-libs/dbus-glib-0.98" ]), + + ResolverPlaygroundTestCase( + ["@world"], + options =3D {"--update": True, "--deep": True, "--ignore-built-slot-= abi-deps": "y"}, + success =3D True, + mergelist =3D ["dev-libs/glib-2.30.2"]), + + ResolverPlaygroundTestCase( + ["@world"], + options =3D {"--update": True, "--deep": True, "--usepkg": True}, + success =3D True, + mergelist =3D ["[binary]dev-libs/glib-2.30.2", "dev-libs/dbus-glib-0= .98" ]), + + ResolverPlaygroundTestCase( + ["@world"], + options =3D {"--update": True, "--deep": True, "--usepkgonly": True}= , + success =3D True, + mergelist =3D []), + + ) + + playground =3D ResolverPlayground(ebuilds=3Debuilds, binpkgs=3Dbinpkgs= , + installed=3Dinstalled, world=3Dworld, debug=3DFalse) + 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()