diff options
Diffstat (limited to 'lib/portage/tests/resolver/ResolverPlayground.py')
-rw-r--r-- | lib/portage/tests/resolver/ResolverPlayground.py | 99 |
1 files changed, 65 insertions, 34 deletions
diff --git a/lib/portage/tests/resolver/ResolverPlayground.py b/lib/portage/tests/resolver/ResolverPlayground.py index c626bad22..0751e392e 100644 --- a/lib/portage/tests/resolver/ResolverPlayground.py +++ b/lib/portage/tests/resolver/ResolverPlayground.py @@ -1,4 +1,4 @@ -# Copyright 2010-2019 Gentoo Authors +# Copyright 2010-2020 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 import bz2 @@ -22,9 +22,10 @@ from portage.util import ensure_dirs, normalize_path from portage.versions import catsplit import _emerge -from _emerge.actions import calc_depclean +from _emerge.actions import _calc_depclean from _emerge.Blocker import Blocker from _emerge.create_depgraph_params import create_depgraph_params +from _emerge.DependencyArg import DependencyArg from _emerge.depgraph import backtrack_depgraph from _emerge.RootConfig import RootConfig @@ -44,7 +45,7 @@ class ResolverPlayground(object): its work. """ - config_files = frozenset(("eapi", "layout.conf", "make.conf", "package.accept_keywords", + config_files = frozenset(("eapi", "layout.conf", "make.conf", "modules", "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", @@ -66,7 +67,7 @@ class ResolverPlayground(object): """ def __init__(self, ebuilds={}, binpkgs={}, installed={}, profile={}, repo_configs={}, \ - user_config={}, sets={}, world=[], world_sets=[], distfiles={}, + user_config={}, sets={}, world=[], world_sets=[], distfiles={}, eclasses={}, eprefix=None, targetroot=False, debug=False): """ ebuilds: cpv -> metadata mapping simulating available ebuilds. @@ -111,6 +112,7 @@ class ResolverPlayground(object): "uname", "uniq", "xargs", + "zstd", ) # Exclude internal wrappers from PATH lookup. orig_path = os.environ['PATH'] @@ -158,7 +160,7 @@ class ResolverPlayground(object): self._create_ebuilds(ebuilds) self._create_binpkgs(binpkgs) self._create_installed(installed) - self._create_profile(ebuilds, installed, profile, repo_configs, user_config, sets) + self._create_profile(ebuilds, eclasses, installed, profile, repo_configs, user_config, sets) self._create_world(world, world_sets) self.settings, self.trees = self._load_config() @@ -346,7 +348,7 @@ class ResolverPlayground(object): with open(ebuild_path, 'rb') as inputfile: f.write(inputfile.read()) - def _create_profile(self, ebuilds, installed, profile, repo_configs, user_config, sets): + def _create_profile(self, ebuilds, eclasses, installed, profile, repo_configs, user_config, sets): user_config_dir = os.path.join(self.eroot, USER_CONFIG_PATH) @@ -404,7 +406,15 @@ class ResolverPlayground(object): f.write("masters =\n") #Create $profile_dir/eclass (we fail to digest the ebuilds if it's not there) - os.makedirs(os.path.join(repo_dir, "eclass")) + eclass_dir = os.path.join(repo_dir, "eclass") + os.makedirs(eclass_dir) + + for eclass_name, eclass_content in eclasses.items(): + with open(os.path.join(eclass_dir, "{}.eclass".format(eclass_name)), 'wt') as f: + if isinstance(eclass_content, basestring): + eclass_content = [eclass_content] + for line in eclass_content: + f.write("{}\n".format(line)) # Temporarily write empty value of masters until it becomes default. if not repo_config or "layout.conf" not in repo_config: @@ -556,6 +566,9 @@ class ResolverPlayground(object): "PORTAGE_REPOSITORIES": "\n".join("[%s]\n%s" % (repo_name, "\n".join("%s = %s" % (k, v) for k, v in repo_config.items())) for repo_name, repo_config in self._repositories.items()) } + if self.debug: + env["PORTAGE_DEBUG"] = "1" + trees = portage.create_trees(env=env, eprefix=self.eprefix, **create_trees_kwargs) @@ -591,11 +604,16 @@ class ResolverPlayground(object): _emerge.emergelog._disable = True if action in ("depclean", "prune"): - rval, cleanlist, ordered, req_pkg_count = \ - calc_depclean(self.settings, self.trees, None, + depclean_result = _calc_depclean(self.settings, self.trees, None, options, action, InternalPackageSet(initial_atoms=atoms, allow_wildcard=True), None) result = ResolverPlaygroundDepcleanResult( - atoms, rval, cleanlist, ordered, req_pkg_count) + atoms, + depclean_result.returncode, + depclean_result.cleanlist, + depclean_result.ordered, + depclean_result.req_pkg_count, + depclean_result.depgraph, + ) else: params = create_depgraph_params(options, action) success, depgraph, favorites = backtrack_depgraph( @@ -778,18 +796,46 @@ class ResolverPlaygroundTestCase(object): return False return True + +def _mergelist_str(x, depgraph): + if isinstance(x, DependencyArg): + mergelist_str = x.arg + elif isinstance(x, Blocker): + mergelist_str = x.atom + else: + repo_str = "" + if x.repo != "test_repo": + repo_str = _repo_separator + x.repo + 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 + else: + desc = x.operation + mergelist_str = "[%s]%s" % (desc, mergelist_str) + if x.root != depgraph._frozen_config._running_root.root: + mergelist_str += "{targetroot}" + return mergelist_str + + class ResolverPlaygroundResult(object): checks = ( "success", "mergelist", "use_changes", "license_changes", "unstable_keywords", "slot_collision_solutions", "circular_dependency_solutions", "needed_p_mask_changes", - "unsatisfied_deps", "forced_rebuilds", "required_use_unsatisfied" + "unsatisfied_deps", "forced_rebuilds", "required_use_unsatisfied", + "graph_order", ) optional_checks = ( "forced_rebuilds", "required_use_unsatisfied", - "unsatisfied_deps" + "unsatisfied_deps", + "graph_order", ) def __init__(self, atoms, success, mydepgraph, favorites): @@ -808,30 +854,12 @@ class ResolverPlaygroundResult(object): self.forced_rebuilds = None self.required_use_unsatisfied = None + self.graph_order = [_mergelist_str(node, self.depgraph) for node in self.depgraph._dynamic_config.digraph] + if self.depgraph._dynamic_config._serialized_tasks_cache is not None: self.mergelist = [] - host_root = self.depgraph._frozen_config._running_root.root for x in self.depgraph._dynamic_config._serialized_tasks_cache: - if isinstance(x, Blocker): - self.mergelist.append(x.atom) - else: - repo_str = "" - if x.repo != "test_repo": - repo_str = _repo_separator + x.repo - 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 - else: - desc = x.operation - mergelist_str = "[%s]%s" % (desc, mergelist_str) - if x.root != host_root: - mergelist_str += "{targetroot}" - self.mergelist.append(mergelist_str) + self.mergelist.append(_mergelist_str(x, self.depgraph)) if self.depgraph._dynamic_config._needed_use_config_changes: self.use_changes = {} @@ -892,14 +920,17 @@ class ResolverPlaygroundDepcleanResult(object): checks = ( "success", "cleanlist", "ordered", "req_pkg_count", + "graph_order", ) optional_checks = ( "ordered", "req_pkg_count", + "graph_order", ) - def __init__(self, atoms, rval, cleanlist, ordered, req_pkg_count): + def __init__(self, atoms, rval, cleanlist, ordered, req_pkg_count, depgraph): self.atoms = atoms self.success = rval == 0 self.cleanlist = cleanlist self.ordered = ordered self.req_pkg_count = req_pkg_count + self.graph_order = [_mergelist_str(node, depgraph) for node in depgraph._dynamic_config.digraph] |