commit: 6d4eb498e59ff6477b4290047bee78c77bd28676 Author: Zac Medico <zmedico <AT> gentoo <DOT> org> AuthorDate: Tue Feb 17 22:56:47 2015 +0000 Commit: Zac Medico <zmedico <AT> gentoo <DOT> org> CommitDate: Wed Mar 4 21:32:07 2015 +0000 URL: http://sources.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=6d4eb498
binpkg-multi-instance 4 of 7 Add a test case to verify that emerge --rebuilt-binaries works with binpkg-multi-instance. This relies on the fact that binary packages of the same version are ordered by BUILD_TIME, so that the latest builds are preferred when appropriate. pym/portage/tests/resolver/ResolverPlayground.py | 25 ++++- .../resolver/binpkg_multi_instance/__init__.py | 2 + .../resolver/binpkg_multi_instance/__test__.py | 2 + .../binpkg_multi_instance/test_rebuilt_binaries.py | 101 +++++++++++++++++++++ 4 files changed, 126 insertions(+), 4 deletions(-) diff --git a/pym/portage/tests/resolver/ResolverPlayground.py b/pym/portage/tests/resolver/ResolverPlayground.py index 84ad17c..6bdf2c7 100644 --- a/pym/portage/tests/resolver/ResolverPlayground.py +++ b/pym/portage/tests/resolver/ResolverPlayground.py @@ -39,6 +39,7 @@ class ResolverPlayground(object): config_files = frozenset(("eapi", "layout.conf", "make.conf", "package.accept_keywords", "package.keywords", "package.license", "package.mask", "package.properties", + "package.provided", "packages", "package.unmask", "package.use", "package.use.aliases", "package.use.stable.mask", "soname.provided", "unpack_dependencies", "use.aliases", "use.force", "use.mask", "layout.conf")) @@ -208,12 +209,18 @@ class ResolverPlayground(object): raise AssertionError('digest creation failed for %s' % ebuild_path) def _create_binpkgs(self, binpkgs): - for cpv, metadata in binpkgs.items(): + # When using BUILD_ID, there can be mutiple instances for the + # same cpv. Therefore, binpkgs may be an iterable instead of + # a dict. + items = getattr(binpkgs, 'items', None) + items = items() if items is not None else binpkgs + for cpv, metadata in items: a = Atom("=" + cpv, allow_repo=True) repo = a.repo if repo is None: repo = "test_repo" + pn = catsplit(a.cp)[1] cat, pf = catsplit(a.cpv) metadata = metadata.copy() metadata.setdefault("SLOT", "0") @@ -225,8 +232,13 @@ class ResolverPlayground(object): repo_dir = self.pkgdir category_dir = os.path.join(repo_dir, cat) - binpkg_path = os.path.join(category_dir, pf + ".tbz2") - ensure_dirs(category_dir) + if "BUILD_ID" in metadata: + binpkg_path = os.path.join(category_dir, pn, + "%s-%s.xpak"% (pf, metadata["BUILD_ID"])) + else: + binpkg_path = os.path.join(category_dir, pf + ".tbz2") + + ensure_dirs(os.path.dirname(binpkg_path)) t = portage.xpak.tbz2(binpkg_path) t.recompose_mem(portage.xpak.xpak_mem(metadata)) @@ -252,6 +264,7 @@ class ResolverPlayground(object): unknown_keys = set(metadata).difference( portage.dbapi.dbapi._known_keys) unknown_keys.discard("BUILD_TIME") + unknown_keys.discard("BUILD_ID") unknown_keys.discard("COUNTER") unknown_keys.discard("repository") unknown_keys.discard("USE") @@ -749,7 +762,11 @@ class ResolverPlaygroundResult(object): repo_str = "" if x.repo != "test_repo": repo_str = _repo_separator + x.repo - mergelist_str = x.cpv + repo_str + build_id_str = "" + if (x.type_name == "binary" and + x.cpv.build_id is not None): + build_id_str = "-%s" % x.cpv.build_id + mergelist_str = x.cpv + build_id_str + repo_str if x.built: if x.operation == "merge": desc = x.type_name diff --git a/pym/portage/tests/resolver/binpkg_multi_instance/__init__.py b/pym/portage/tests/resolver/binpkg_multi_instance/__init__.py new file mode 100644 index 0000000..4725d33 --- /dev/null +++ b/pym/portage/tests/resolver/binpkg_multi_instance/__init__.py @@ -0,0 +1,2 @@ +# Copyright 2015 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 diff --git a/pym/portage/tests/resolver/binpkg_multi_instance/__test__.py b/pym/portage/tests/resolver/binpkg_multi_instance/__test__.py new file mode 100644 index 0000000..4725d33 --- /dev/null +++ b/pym/portage/tests/resolver/binpkg_multi_instance/__test__.py @@ -0,0 +1,2 @@ +# Copyright 2015 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 diff --git a/pym/portage/tests/resolver/binpkg_multi_instance/test_rebuilt_binaries.py b/pym/portage/tests/resolver/binpkg_multi_instance/test_rebuilt_binaries.py new file mode 100644 index 0000000..5729df4 --- /dev/null +++ b/pym/portage/tests/resolver/binpkg_multi_instance/test_rebuilt_binaries.py @@ -0,0 +1,101 @@ +# Copyright 2015 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 RebuiltBinariesCase(TestCase): + + def testRebuiltBinaries(self): + + user_config = { + "make.conf": + ( + "FEATURES=\"binpkg-multi-instance\"", + ), + } + + binpkgs = ( + ("app-misc/A-1", { + "EAPI": "5", + "BUILD_ID": "1", + "BUILD_TIME": "1", + }), + ("app-misc/A-1", { + "EAPI": "5", + "BUILD_ID": "2", + "BUILD_TIME": "2", + }), + ("app-misc/A-1", { + "EAPI": "5", + "BUILD_ID": "3", + "BUILD_TIME": "3", + }), + ("dev-libs/B-1", { + "EAPI": "5", + "BUILD_ID": "1", + "BUILD_TIME": "1", + }), + ("dev-libs/B-1", { + "EAPI": "5", + "BUILD_ID": "2", + "BUILD_TIME": "2", + }), + ("dev-libs/B-1", { + "EAPI": "5", + "BUILD_ID": "3", + "BUILD_TIME": "3", + }), + ) + + installed = { + "app-misc/A-1" : { + "EAPI": "5", + "BUILD_ID": "1", + "BUILD_TIME": "1", + }, + "dev-libs/B-1" : { + "EAPI": "5", + "BUILD_ID": "2", + "BUILD_TIME": "2", + }, + } + + world = ( + "app-misc/A", + "dev-libs/B", + ) + + test_cases = ( + + ResolverPlaygroundTestCase( + ["@world"], + options = { + "--deep": True, + "--rebuilt-binaries": True, + "--update": True, + "--usepkgonly": True, + }, + success = True, + ignore_mergelist_order=True, + mergelist = [ + "[binary]dev-libs/B-1-3", + "[binary]app-misc/A-1-3" + ] + ), + + ) + + playground = ResolverPlayground(debug=False, + binpkgs=binpkgs, installed=installed, + user_config=user_config, 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()