From b3d51db7521faa2f7c2dbc0d71894e46e74231d0 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Sun, 8 May 2011 22:13:52 -0700 Subject: unmerge: use expand_new_virt for sys pkg warnings --- pym/_emerge/actions.py | 64 ++------------------------------- pym/_emerge/unmerge.py | 9 ++++- pym/portage/dbapi/_expand_new_virt.py | 66 +++++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+), 63 deletions(-) create mode 100644 pym/portage/dbapi/_expand_new_virt.py diff --git a/pym/_emerge/actions.py b/pym/_emerge/actions.py index 29ecb3871..9bc3aafc5 100644 --- a/pym/_emerge/actions.py +++ b/pym/_emerge/actions.py @@ -31,7 +31,8 @@ from portage.cache.cache_errors import CacheError from portage.const import GLOBAL_CONFIG_PATH, NEWS_LIB_PATH from portage.const import _ENABLE_DYN_LINK_MAP, _ENABLE_SET_CONFIG from portage.dbapi.dep_expand import dep_expand -from portage.dep import Atom, extended_cp_match, _get_useflag_re +from portage.dbapi._expand_new_virt import expand_new_virt +from portage.dep import Atom, extended_cp_match from portage.exception import InvalidAtom from portage.output import blue, bold, colorize, create_color_func, darkgreen, \ red, yellow @@ -1282,67 +1283,6 @@ def action_deselect(settings, trees, opts, atoms): world_set.unlock() return os.EX_OK -def expand_new_virt(vardb, atom): - """ - Iterate over the recursively expanded RDEPEND atoms of - a new-style virtual. If atom is not a new-style virtual - or it does not match an installed package then it is - yielded without any expansion. - """ - if not isinstance(atom, Atom): - atom = Atom(atom) - traversed = set() - stack = [atom] - - while stack: - atom = stack.pop() - if atom.blocker: - yield atom - continue - - matches = vardb.match(atom) - if not (matches and matches[-1].startswith("virtual/")): - yield atom - continue - - virt_cpv = matches[-1] - if virt_cpv in traversed: - continue - - traversed.add(virt_cpv) - eapi, iuse, rdepend, use = vardb.aux_get(virt_cpv, - ["EAPI", "IUSE", "RDEPEND", "USE"]) - if not portage.eapi_is_supported(eapi): - yield atom - continue - - # Validate IUSE and IUSE, for early detection of vardb corruption. - useflag_re = _get_useflag_re(eapi) - valid_iuse = [] - for x in iuse.split(): - if x[:1] in ("+", "-"): - x = x[1:] - if useflag_re.match(x) is not None: - valid_iuse.append(x) - valid_iuse = frozenset(valid_iuse) - - iuse_implicit_match = vardb.settings._iuse_implicit_match - valid_use = [] - for x in use.split(): - if x in valid_iuse or iuse_implicit_match(x): - valid_use.append(x) - valid_use = frozenset(valid_use) - - success, atoms = portage.dep_check(rdepend, - None, vardb.settings, myuse=valid_use, - myroot=vardb.root, trees={vardb.root:{"porttree":vardb.vartree, - "vartree":vardb.vartree}}) - - if success: - stack.extend(atoms) - else: - yield atom - class _info_pkgs_ver(object): def __init__(self, ver, repo_suffix, provide_suffix): self.ver = ver diff --git a/pym/_emerge/unmerge.py b/pym/_emerge/unmerge.py index 68b61edc2..7e66ff9fb 100644 --- a/pym/_emerge/unmerge.py +++ b/pym/_emerge/unmerge.py @@ -8,6 +8,7 @@ import sys import textwrap import portage from portage import os +from portage.dbapi._expand_new_virt import expand_new_virt from portage.output import bold, colorize, darkgreen, green from portage._sets import SETPREFIX from portage.util import cmp_sort_key @@ -57,7 +58,13 @@ def unmerge(root_config, myopts, unmerge_action, try: if os.access(vdb_path, os.W_OK): vdb_lock = portage.locks.lockdir(vdb_path) - realsyslist = sets["system"].getAtoms() + + realsyslist = [] + for x in sets["system"].getAtoms(): + for atom in expand_new_virt(vartree.dbapi, x): + if not atom.blocker: + realsyslist.append(atom) + syslist = [] for x in realsyslist: mycp = portage.dep_getkey(x) diff --git a/pym/portage/dbapi/_expand_new_virt.py b/pym/portage/dbapi/_expand_new_virt.py new file mode 100644 index 000000000..7a233f10b --- /dev/null +++ b/pym/portage/dbapi/_expand_new_virt.py @@ -0,0 +1,66 @@ +# Copyright 2011 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +import portage +from portage.dep import Atom, _get_useflag_re + +def expand_new_virt(vardb, atom): + """ + Iterate over the recursively expanded RDEPEND atoms of + a new-style virtual. If atom is not a new-style virtual + or it does not match an installed package then it is + yielded without any expansion. + """ + if not isinstance(atom, Atom): + atom = Atom(atom) + traversed = set() + stack = [atom] + + while stack: + atom = stack.pop() + if atom.blocker: + yield atom + continue + + matches = vardb.match(atom) + if not (matches and matches[-1].startswith("virtual/")): + yield atom + continue + + virt_cpv = matches[-1] + if virt_cpv in traversed: + continue + + traversed.add(virt_cpv) + eapi, iuse, rdepend, use = vardb.aux_get(virt_cpv, + ["EAPI", "IUSE", "RDEPEND", "USE"]) + if not portage.eapi_is_supported(eapi): + yield atom + continue + + # Validate IUSE and IUSE, for early detection of vardb corruption. + useflag_re = _get_useflag_re(eapi) + valid_iuse = [] + for x in iuse.split(): + if x[:1] in ("+", "-"): + x = x[1:] + if useflag_re.match(x) is not None: + valid_iuse.append(x) + valid_iuse = frozenset(valid_iuse) + + iuse_implicit_match = vardb.settings._iuse_implicit_match + valid_use = [] + for x in use.split(): + if x in valid_iuse or iuse_implicit_match(x): + valid_use.append(x) + valid_use = frozenset(valid_use) + + success, atoms = portage.dep_check(rdepend, + None, vardb.settings, myuse=valid_use, + myroot=vardb.root, trees={vardb.root:{"porttree":vardb.vartree, + "vartree":vardb.vartree}}) + + if success: + stack.extend(atoms) + else: + yield atom -- cgit v1.2.3-1-g7c22