1 |
Author: zmedico |
2 |
Date: 2009-06-26 21:32:01 +0000 (Fri, 26 Jun 2009) |
3 |
New Revision: 13699 |
4 |
|
5 |
Modified: |
6 |
main/trunk/pym/_emerge/actions.py |
7 |
Log: |
8 |
Bug #275532 - In action_depclean(), free memory from the dep calculation |
9 |
before calling unmerge(). |
10 |
|
11 |
|
12 |
Modified: main/trunk/pym/_emerge/actions.py |
13 |
=================================================================== |
14 |
--- main/trunk/pym/_emerge/actions.py 2009-06-26 20:10:06 UTC (rev 13698) |
15 |
+++ main/trunk/pym/_emerge/actions.py 2009-06-26 21:32:01 UTC (rev 13699) |
16 |
@@ -558,7 +558,6 @@ |
17 |
# that should have been pulled into the graph. On the other hand, it's |
18 |
# relatively safe to ignore missing deps when only asked to remove |
19 |
# specific packages. |
20 |
- allow_missing_deps = len(myfiles) > 0 |
21 |
|
22 |
msg = [] |
23 |
msg.append("Always study the list of packages to be cleaned for any obvious\n") |
24 |
@@ -580,6 +579,60 @@ |
25 |
for x in msg: |
26 |
portage.writemsg_stdout(colorize("WARN", " * ") + x) |
27 |
|
28 |
+ root_config = trees[settings['ROOT']]['root_config'] |
29 |
+ vardb = root_config.trees['vartree'].dbapi |
30 |
+ |
31 |
+ args_set = InternalPackageSet() |
32 |
+ if myfiles: |
33 |
+ args_set.update(myfiles) |
34 |
+ matched_packages = False |
35 |
+ for x in args_set: |
36 |
+ if vardb.match(x): |
37 |
+ matched_packages = True |
38 |
+ break |
39 |
+ if not matched_packages: |
40 |
+ writemsg_level(">>> No packages selected for removal by %s\n" % \ |
41 |
+ action) |
42 |
+ return 0 |
43 |
+ |
44 |
+ # The calculation is done in a separate function so that depgraph |
45 |
+ # references go out of scope and the corresponding memory |
46 |
+ # is freed before we call unmerge(). |
47 |
+ rval, cleanlist, ordered, req_pkg_count = \ |
48 |
+ calc_depclean(settings, trees, ldpath_mtimes, |
49 |
+ myopts, action, args_set, spinner) |
50 |
+ |
51 |
+ import gc |
52 |
+ gc.collect() |
53 |
+ |
54 |
+ if rval != os.EX_OK: |
55 |
+ return rval |
56 |
+ |
57 |
+ if cleanlist: |
58 |
+ unmerge(root_config, myopts, "unmerge", |
59 |
+ cleanlist, ldpath_mtimes, ordered=ordered) |
60 |
+ |
61 |
+ if action == "prune": |
62 |
+ return |
63 |
+ |
64 |
+ if not cleanlist and "--quiet" in myopts: |
65 |
+ return |
66 |
+ |
67 |
+ print "Packages installed: " + str(len(vardb.cpv_all())) |
68 |
+ print "Packages in world: " + \ |
69 |
+ str(len(root_config.sets["world"].getAtoms())) |
70 |
+ print "Packages in system: " + \ |
71 |
+ str(len(root_config.sets["system"].getAtoms())) |
72 |
+ print "Required packages: "+str(req_pkg_count) |
73 |
+ if "--pretend" in myopts: |
74 |
+ print "Number to remove: "+str(len(cleanlist)) |
75 |
+ else: |
76 |
+ print "Number removed: "+str(len(cleanlist)) |
77 |
+ |
78 |
+def calc_depclean(settings, trees, ldpath_mtimes, |
79 |
+ myopts, action, args_set, spinner): |
80 |
+ allow_missing_deps = bool(args_set) |
81 |
+ |
82 |
xterm_titles = "notitles" not in settings.features |
83 |
myroot = settings["ROOT"] |
84 |
root_config = trees[myroot]["root_config"] |
85 |
@@ -621,19 +674,6 @@ |
86 |
if action == "depclean": |
87 |
emergelog(xterm_titles, " >>> depclean") |
88 |
|
89 |
- args_set = InternalPackageSet() |
90 |
- if myfiles: |
91 |
- args_set.update(myfiles) |
92 |
- matched_packages = False |
93 |
- for x in args_set: |
94 |
- if vardb.match(x): |
95 |
- matched_packages = True |
96 |
- break |
97 |
- if not matched_packages: |
98 |
- writemsg_level(">>> No packages selected for removal by %s\n" % \ |
99 |
- action) |
100 |
- return |
101 |
- |
102 |
writemsg_level("\nCalculating dependencies ") |
103 |
resolver_params = create_depgraph_params(myopts, "remove") |
104 |
resolver = depgraph(settings, trees, myopts, resolver_params, spinner) |
105 |
@@ -729,7 +769,7 @@ |
106 |
resolver.display_problems() |
107 |
|
108 |
if not success: |
109 |
- return 1 |
110 |
+ return 1, [], False, 0 |
111 |
|
112 |
def unresolved_deps(): |
113 |
|
114 |
@@ -771,7 +811,7 @@ |
115 |
return False |
116 |
|
117 |
if unresolved_deps(): |
118 |
- return 1 |
119 |
+ return 1, [], False, 0 |
120 |
|
121 |
graph = resolver.digraph.copy() |
122 |
required_pkgs_total = 0 |
123 |
@@ -1025,16 +1065,16 @@ |
124 |
priority=UnmergeDepPriority(runtime=True), |
125 |
root=pkg.root)): |
126 |
resolver.display_problems() |
127 |
- return 1 |
128 |
+ return 1, [], False, 0 |
129 |
|
130 |
writemsg_level("\nCalculating dependencies ") |
131 |
success = resolver._complete_graph() |
132 |
writemsg_level("\b\b... done!\n") |
133 |
resolver.display_problems() |
134 |
if not success: |
135 |
- return 1 |
136 |
+ return 1, [], False, 0 |
137 |
if unresolved_deps(): |
138 |
- return 1 |
139 |
+ return 1, [], False, 0 |
140 |
|
141 |
graph = resolver.digraph.copy() |
142 |
required_pkgs_total = 0 |
143 |
@@ -1043,7 +1083,7 @@ |
144 |
required_pkgs_total += 1 |
145 |
cleanlist = create_cleanlist() |
146 |
if not cleanlist: |
147 |
- return 0 |
148 |
+ return 0, [], False, required_pkgs_total |
149 |
clean_set = set(cleanlist) |
150 |
|
151 |
# Use a topological sort to create an unmerge order such that |
152 |
@@ -1135,26 +1175,9 @@ |
153 |
graph.remove(node) |
154 |
cleanlist.append(node.cpv) |
155 |
|
156 |
- unmerge(root_config, myopts, "unmerge", cleanlist, |
157 |
- ldpath_mtimes, ordered=ordered) |
158 |
+ return 0, cleanlist, ordered, required_pkgs_total |
159 |
+ return 0, [], False, required_pkgs_total |
160 |
|
161 |
- if action == "prune": |
162 |
- return |
163 |
- |
164 |
- if not cleanlist and "--quiet" in myopts: |
165 |
- return |
166 |
- |
167 |
- print "Packages installed: "+str(len(vardb.cpv_all())) |
168 |
- print "Packages in world: " + \ |
169 |
- str(len(root_config.sets["world"].getAtoms())) |
170 |
- print "Packages in system: " + \ |
171 |
- str(len(root_config.sets["system"].getAtoms())) |
172 |
- print "Required packages: "+str(required_pkgs_total) |
173 |
- if "--pretend" in myopts: |
174 |
- print "Number to remove: "+str(len(cleanlist)) |
175 |
- else: |
176 |
- print "Number removed: "+str(len(cleanlist)) |
177 |
- |
178 |
def action_deselect(settings, trees, opts, atoms): |
179 |
root_config = trees[settings['ROOT']]['root_config'] |
180 |
world_set = root_config.sets['world'] |