Gentoo Archives: gentoo-commits

From: "Zac Medico (zmedico)" <zmedico@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] portage r13699 - main/trunk/pym/_emerge
Date: Fri, 26 Jun 2009 21:32:03
Message-Id: E1MKJ1d-0001m1-LG@stork.gentoo.org
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']