1 |
commit: ba17e2e1eb19612d189f1dbb1280696acc0ac086 |
2 |
Author: Zac Medico <zmedico <AT> gentoo <DOT> org> |
3 |
AuthorDate: Tue Apr 26 23:57:20 2011 +0000 |
4 |
Commit: Zac Medico <zmedico <AT> gentoo <DOT> org> |
5 |
CommitDate: Wed May 4 19:27:05 2011 +0000 |
6 |
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=ba17e2e1 |
7 |
|
8 |
expand_new_virt: use stack for recursion |
9 |
|
10 |
--- |
11 |
pym/_emerge/actions.py | 49 ++++++++++++++++++++++++----------------------- |
12 |
1 files changed, 25 insertions(+), 24 deletions(-) |
13 |
|
14 |
diff --git a/pym/_emerge/actions.py b/pym/_emerge/actions.py |
15 |
index 20b1e3c..7f228a4 100644 |
16 |
--- a/pym/_emerge/actions.py |
17 |
+++ b/pym/_emerge/actions.py |
18 |
@@ -1288,39 +1288,40 @@ def action_deselect(settings, trees, opts, atoms): |
19 |
world_set.unlock() |
20 |
return os.EX_OK |
21 |
|
22 |
-def expand_new_virt(vardb, atom, _traversed=None): |
23 |
+def expand_new_virt(vardb, atom): |
24 |
""" |
25 |
Iterate over the recursively expanded RDEPEND atoms of |
26 |
a new-style virtual. If atom is not a new-style virtual |
27 |
or it does not match an installed package then it is |
28 |
yielded without any expansion. |
29 |
""" |
30 |
- matches = vardb.match(atom) |
31 |
- if not (matches and portage.cpv_getkey(matches[-1]).startswith("virtual/")): |
32 |
- yield atom |
33 |
- return |
34 |
- |
35 |
- virt_cpv = matches[-1] |
36 |
- rdepend, use = vardb.aux_get(virt_cpv, ["RDEPEND", "USE"]) |
37 |
- use = frozenset(use.split()) |
38 |
- success, atoms = portage.dep_check(rdepend, |
39 |
- None, vardb.settings, myuse=use, |
40 |
- myroot=vardb.root, trees={vardb.root:{"porttree":vardb.vartree, |
41 |
- "vartree":vardb.vartree}}) |
42 |
+ traversed = set() |
43 |
+ stack = [atom] |
44 |
+ |
45 |
+ while stack: |
46 |
+ atom = stack.pop() |
47 |
+ matches = vardb.match(atom) |
48 |
+ if not (matches and \ |
49 |
+ portage.cpv_getkey(matches[-1]).startswith("virtual/")): |
50 |
+ yield atom |
51 |
+ continue |
52 |
|
53 |
- if not success: |
54 |
- yield atom |
55 |
- return |
56 |
+ virt_cpv = matches[-1] |
57 |
+ if virt_cpv in traversed: |
58 |
+ continue |
59 |
|
60 |
- if _traversed is None: |
61 |
- _traversed = set([atom]) |
62 |
+ traversed.add(virt_cpv) |
63 |
+ rdepend, use = vardb.aux_get(virt_cpv, ["RDEPEND", "USE"]) |
64 |
+ use = frozenset(use.split()) |
65 |
+ success, atoms = portage.dep_check(rdepend, |
66 |
+ None, vardb.settings, myuse=use, |
67 |
+ myroot=vardb.root, trees={vardb.root:{"porttree":vardb.vartree, |
68 |
+ "vartree":vardb.vartree}}) |
69 |
|
70 |
- for child1 in atoms: |
71 |
- if child1 not in _traversed: |
72 |
- _traversed.add(child1) |
73 |
- for child2 in expand_new_virt(vardb, child1, |
74 |
- _traversed=_traversed): |
75 |
- yield child2 |
76 |
+ if success: |
77 |
+ stack.extend(atoms) |
78 |
+ else: |
79 |
+ yield atom |
80 |
|
81 |
class _info_pkgs_ver(object): |
82 |
def __init__(self, ver, repo_suffix, provide_suffix): |