| Index: pym/_emerge/depgraph.py
|
| diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py
|
| index 6891b939a66abd7b9e6353cadf5d04cb74ce038b..8686fa6419bb042cd61bfd138954ac1ad3c7ecb9 100644
|
| --- a/pym/_emerge/depgraph.py
|
| +++ b/pym/_emerge/depgraph.py
|
| @@ -68,6 +68,16 @@ class _scheduler_graph_config(object):
|
| self.graph = graph
|
| self.mergelist = mergelist
|
|
|
| +def _wildcard_set(atoms):
|
| + pkgs = InternalPackageSet(allow_wildcard=True)
|
| + for x in atoms:
|
| + try:
|
| + x = Atom(x, allow_wildcard=True)
|
| + except portage.exception.InvalidAtom:
|
| + x = Atom("*/" + x, allow_wildcard=True)
|
| + pkgs.add(x)
|
| + return pkgs
|
| +
|
| class _frozen_depgraph_config(object):
|
|
|
| def __init__(self, settings, trees, myopts, spinner):
|
| @@ -107,13 +117,14 @@ class _frozen_depgraph_config(object):
|
|
|
| self._required_set_names = set(["world"])
|
|
|
| - self.excluded_pkgs = InternalPackageSet(allow_wildcard=True)
|
| - for x in ' '.join(myopts.get("--exclude", [])).split():
|
| - try:
|
| - x = Atom(x, allow_wildcard=True)
|
| - except portage.exception.InvalidAtom:
|
| - x = Atom("*/" + x, allow_wildcard=True)
|
| - self.excluded_pkgs.add(x)
|
| + atoms = ' '.join(myopts.get("--exclude", [])).split()
|
| + self.excluded_pkgs = _wildcard_set(atoms)
|
| + atoms = ' '.join(myopts.get("--reinstall-atoms", [])).split()
|
| + self.reinstall_atoms = _wildcard_set(atoms)
|
| + atoms = ' '.join(myopts.get("--nousepkg-atoms", [])).split()
|
| + self.nousepkg_atoms = _wildcard_set(atoms)
|
| + atoms = ' '.join(myopts.get("--useoldpkg-atoms", [])).split()
|
| + self.useoldpkg_atoms = _wildcard_set(atoms)
|
|
|
| class _depgraph_sets(object):
|
| def __init__(self):
|
| @@ -1271,6 +1282,7 @@ class depgraph(object):
|
| root_config = self._frozen_config.roots[dep_root]
|
| vardb = root_config.trees["vartree"].dbapi
|
|
|
| + reinstall_atoms = self._frozen_config.reinstall_atoms
|
| for atom, child in self._minimize_children(
|
| pkg, dep_priority, root_config, selected_atoms[pkg]):
|
|
|
| @@ -1281,7 +1293,9 @@ class depgraph(object):
|
|
|
| mypriority = dep_priority.copy()
|
| if not atom.blocker:
|
| - inst_pkgs = vardb.match_pkgs(atom)
|
| + inst_pkgs = [inst_pkg for inst_pkg in vardb.match_pkgs(atom)
|
| + if not reinstall_atoms.findAtomForPackage(inst_pkg,
|
| + modified_use=self._pkg_use_enabled(inst_pkg))]
|
| if inst_pkgs:
|
| for inst_pkg in inst_pkgs:
|
| if self._pkg_visibility_check(inst_pkg):
|
| @@ -1327,7 +1341,9 @@ class depgraph(object):
|
| # This is a GLEP 37 virtual, so its deps are all runtime.
|
| mypriority = self._priority(runtime=True)
|
| if not atom.blocker:
|
| - inst_pkgs = vardb.match_pkgs(atom)
|
| + inst_pkgs = [inst_pkg for inst_pkg in vardb.match_pkgs(atom)
|
| + if not reinstall_atoms.findAtomForPackage(inst_pkg,
|
| + modified_use=self._pkg_use_enabled(inst_pkg))]
|
| if inst_pkgs:
|
| for inst_pkg in inst_pkgs:
|
| if self._pkg_visibility_check(inst_pkg):
|
| @@ -2846,6 +2862,10 @@ class depgraph(object):
|
| dont_miss_updates = "--update" in self._frozen_config.myopts
|
| use_ebuild_visibility = self._frozen_config.myopts.get(
|
| '--use-ebuild-visibility', 'n') != 'n'
|
| + reinstall_atoms = self._frozen_config.reinstall_atoms
|
| + nousepkg_atoms = self._frozen_config.nousepkg_atoms
|
| + useoldpkg_atoms = self._frozen_config.useoldpkg_atoms
|
| + matched_oldpkg = []
|
| # Behavior of the "selective" parameter depends on
|
| # whether or not a package matches an argument atom.
|
| # If an installed package provides an old-style
|
| @@ -2885,7 +2905,14 @@ class depgraph(object):
|
| modified_use=self._pkg_use_enabled(pkg)):
|
| continue
|
|
|
| - if packages_with_invalid_use_config and \
|
| + if built and not installed and nousepkg_atoms.findAtomForPackage(pkg, \
|
| + modified_use=self._pkg_use_enabled(pkg)):
|
| + break
|
| +
|
| + useoldpkg = useoldpkg_atoms.findAtomForPackage(pkg, \
|
| + modified_use=self._pkg_use_enabled(pkg))
|
| +
|
| + if packages_with_invalid_use_config and (not built or not useoldpkg) and \
|
| (not pkg.installed or dont_miss_updates):
|
| # Check if a higher version was rejected due to user
|
| # USE configuration. The packages_with_invalid_use_config
|
| @@ -2943,7 +2970,7 @@ class depgraph(object):
|
| # instances (installed or binary).
|
| # If --usepkgonly is enabled, assume that
|
| # the ebuild status should be ignored.
|
| - if not use_ebuild_visibility and usepkgonly:
|
| + if not use_ebuild_visibility and (usepkgonly or useoldpkg):
|
| if pkg.installed and pkg.masks:
|
| continue
|
| else:
|
| @@ -3088,7 +3115,7 @@ class depgraph(object):
|
| break
|
| # Compare built package to current config and
|
| # reject the built package if necessary.
|
| - if built and (not installed or matched_pkgs_ignore_use) and \
|
| + if built and not useoldpkg and (not installed or matched_pkgs_ignore_use) and \
|
| ("--newuse" in self._frozen_config.myopts or \
|
| "--reinstall" in self._frozen_config.myopts or \
|
| "--binpkg-respect-use" in self._frozen_config.myopts):
|
| @@ -3103,7 +3130,7 @@ class depgraph(object):
|
| forced_flags.update(pkgsettings.useforce)
|
| forced_flags.update(pkgsettings.usemask)
|
| cur_iuse = iuses
|
| - if myeb and not usepkgonly:
|
| + if myeb and not usepkgonly and not useoldpkg:
|
| cur_iuse = myeb.iuse.all
|
| if self._reinstall_for_flags(forced_flags,
|
| old_use, iuses,
|
| @@ -3111,7 +3138,7 @@ class depgraph(object):
|
| break
|
| # Compare current config to installed package
|
| # and do not reinstall if possible.
|
| - if not installed and \
|
| + if not installed and not useoldpkg and \
|
| ("--newuse" in self._frozen_config.myopts or \
|
| "--reinstall" in self._frozen_config.myopts) and \
|
| cpv in vardb.match(atom):
|
| @@ -3129,8 +3156,13 @@ class depgraph(object):
|
| cur_use, cur_iuse)
|
| if reinstall_for_flags:
|
| reinstall = True
|
| + if reinstall_atoms.findAtomForPackage(pkg, \
|
| + modified_use=self._pkg_use_enabled(pkg)):
|
| + reinstall = True
|
| if not built:
|
| myeb = pkg
|
| + elif useoldpkg:
|
| + matched_oldpkg.append(pkg)
|
| matched_packages.append(pkg)
|
| if reinstall_for_flags:
|
| self._dynamic_config._reinstall_nodes[pkg] = \
|
| @@ -3214,14 +3246,20 @@ class depgraph(object):
|
| allow_license_changes=allow_license_changes):
|
| return pkg, existing_node
|
|
|
| - bestmatch = portage.best(
|
| - [pkg.cpv for pkg in matched_packages \
|
| + visible_matches = []
|
| + if matched_oldpkg:
|
| + visible_matches = [pkg.cpv for pkg in matched_oldpkg \
|
| if self._pkg_visibility_check(pkg, allow_unstable_keywords=allow_unstable_keywords,
|
| - allow_license_changes=allow_license_changes)])
|
| - if not bestmatch:
|
| + allow_license_changes=allow_license_changes)]
|
| + if not visible_matches:
|
| + visible_matches = [pkg.cpv for pkg in matched_packages \
|
| + if self._pkg_visibility_check(pkg, allow_unstable_keywords=allow_unstable_keywords,
|
| + allow_license_changes=allow_license_changes)]
|
| + if visible_matches:
|
| + bestmatch = portage.best(visible_matches)
|
| + else:
|
| # all are masked, so ignore visibility
|
| - bestmatch = portage.best(
|
| - [pkg.cpv for pkg in matched_packages])
|
| + bestmatch = portage.best([pkg.cpv for pkg in matched_packages])
|
| matched_packages = [pkg for pkg in matched_packages \
|
| if portage.dep.cpvequal(pkg.cpv, bestmatch)]
|
|
|
|
|