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.60) (envelope-from ) id 1QEs9Z-0005FP-8F for garchives@archives.gentoo.org; Tue, 26 Apr 2011 23:58:49 +0000 Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id 33B611C001; Tue, 26 Apr 2011 23:58:40 +0000 (UTC) Received: from smtp.gentoo.org (smtp.gentoo.org [140.211.166.183]) by pigeon.gentoo.org (Postfix) with ESMTP id 077A01C001 for ; Tue, 26 Apr 2011 23:58:39 +0000 (UTC) Received: from pelican.gentoo.org (unknown [66.219.59.40]) (using TLSv1 with cipher ADH-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id 8658A2AC027 for ; Tue, 26 Apr 2011 23:58:39 +0000 (UTC) Received: from localhost.localdomain (localhost [127.0.0.1]) by pelican.gentoo.org (Postfix) with ESMTP id AE0DE80505 for ; Tue, 26 Apr 2011 23:58:38 +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: <89ca023f9af14781c202b6f69d4f0e47d0339e88.zmedico@gentoo> Subject: [gentoo-commits] proj/portage:master commit in: pym/_emerge/ X-VCS-Repository: proj/portage X-VCS-Files: pym/_emerge/actions.py X-VCS-Directories: pym/_emerge/ X-VCS-Committer: zmedico X-VCS-Committer-Name: Zac Medico X-VCS-Revision: 89ca023f9af14781c202b6f69d4f0e47d0339e88 Date: Tue, 26 Apr 2011 23:58:38 +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: X-Archives-Hash: bf35ce3bbf9c70e39eb847c2e7752e79 commit: 89ca023f9af14781c202b6f69d4f0e47d0339e88 Author: Zac Medico gentoo org> AuthorDate: Tue Apr 26 23:57:20 2011 +0000 Commit: Zac Medico gentoo org> CommitDate: Tue Apr 26 23:57:20 2011 +0000 URL: http://git.overlays.gentoo.org/gitweb/?p=3Dproj/portage.git;a= =3Dcommit;h=3D89ca023f expand_new_virt: use stack for recursion --- pym/_emerge/actions.py | 49 ++++++++++++++++++++++++------------------= ----- 1 files changed, 25 insertions(+), 24 deletions(-) diff --git a/pym/_emerge/actions.py b/pym/_emerge/actions.py index f2f4181..e4e87da 100644 --- a/pym/_emerge/actions.py +++ b/pym/_emerge/actions.py @@ -1289,39 +1289,40 @@ def action_deselect(settings, trees, opts, atoms)= : world_set.unlock() return os.EX_OK =20 -def expand_new_virt(vardb, atom, _traversed=3DNone): +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. """ - matches =3D vardb.match(atom) - if not (matches and portage.cpv_getkey(matches[-1]).startswith("virtual= /")): - yield atom - return - - virt_cpv =3D matches[-1] - rdepend, use =3D vardb.aux_get(virt_cpv, ["RDEPEND", "USE"]) - use =3D frozenset(use.split()) - success, atoms =3D portage.dep_check(rdepend, - None, vardb.settings, myuse=3Duse, - myroot=3Dvardb.root, trees=3D{vardb.root:{"porttree":vardb.vartree, - "vartree":vardb.vartree}}) + traversed =3D set() + stack =3D [atom] + + while stack: + atom =3D stack.pop() + matches =3D vardb.match(atom) + if not (matches and \ + portage.cpv_getkey(matches[-1]).startswith("virtual/")): + yield atom + continue =20 - if not success: - yield atom - return + virt_cpv =3D matches[-1] + if virt_cpv in traversed: + continue =20 - if _traversed is None: - _traversed =3D set([atom]) + traversed.add(virt_cpv) + rdepend, use =3D vardb.aux_get(virt_cpv, ["RDEPEND", "USE"]) + use =3D frozenset(use.split()) + success, atoms =3D portage.dep_check(rdepend, + None, vardb.settings, myuse=3Duse, + myroot=3Dvardb.root, trees=3D{vardb.root:{"porttree":vardb.vartree, + "vartree":vardb.vartree}}) =20 - for child1 in atoms: - if child1 not in _traversed: - _traversed.add(child1) - for child2 in expand_new_virt(vardb, child1, - _traversed=3D_traversed): - yield child2 + if success: + stack.extend(atoms) + else: + yield atom =20 class _info_pkgs_ver(object): def __init__(self, ver, repo_suffix, provide_suffix):