1 |
Author: zmedico |
2 |
Date: 2008-07-03 08:44:29 +0000 (Thu, 03 Jul 2008) |
3 |
New Revision: 10908 |
4 |
|
5 |
Modified: |
6 |
main/trunk/pym/_emerge/__init__.py |
7 |
Log: |
8 |
Split out a _restart_if_necessary() method from Scheduler._merge(). |
9 |
|
10 |
|
11 |
Modified: main/trunk/pym/_emerge/__init__.py |
12 |
=================================================================== |
13 |
--- main/trunk/pym/_emerge/__init__.py 2008-07-03 08:17:09 UTC (rev 10907) |
14 |
+++ main/trunk/pym/_emerge/__init__.py 2008-07-03 08:44:29 UTC (rev 10908) |
15 |
@@ -6954,6 +6954,9 @@ |
16 |
"--fetchonly", "--fetch-all-uri", |
17 |
"--nodeps", "--pretend"]) |
18 |
|
19 |
+ _bad_resume_opts = set(["--ask", "--changelog", |
20 |
+ "--resume", "--skipfirst"]) |
21 |
+ |
22 |
_fetch_log = "/var/log/emerge-fetch.log" |
23 |
|
24 |
class _iface_class(SlotObject): |
25 |
@@ -6993,6 +6996,9 @@ |
26 |
for k in self._binpkg_opts.__slots__: |
27 |
setattr(self._binpkg_opts, k, "--" + k.replace("_", "-") in myopts) |
28 |
|
29 |
+ # The root where the currently running |
30 |
+ # portage instance is installed. |
31 |
+ self._running_root = trees["/"]["root_config"] |
32 |
self.edebug = 0 |
33 |
if settings.get("PORTAGE_DEBUG", "") == "1": |
34 |
self.edebug = 1 |
35 |
@@ -7020,6 +7026,9 @@ |
36 |
self._prefetchers = weakref.WeakValueDictionary() |
37 |
self._failed_fetches = [] |
38 |
self._parallel_fetch = False |
39 |
+ self._pkg_count = self._pkg_count_class( |
40 |
+ curval=0, maxval=len(mergelist)) |
41 |
+ |
42 |
features = self.settings.features |
43 |
if "parallel-fetch" in features and \ |
44 |
not ("--pretend" in self.myopts or \ |
45 |
@@ -7173,6 +7182,58 @@ |
46 |
|
47 |
sys.stderr.write("\n") |
48 |
|
49 |
+ def _restart_if_necessary(self, pkg): |
50 |
+ """ |
51 |
+ Use execv() to restart emerge. This happens |
52 |
+ if portage upgrades itself and there are |
53 |
+ remaining packages in the list. |
54 |
+ """ |
55 |
+ |
56 |
+ if "--pretend" in self.myopts or \ |
57 |
+ "--fetchonly" in self.myopts or \ |
58 |
+ "--fetch-all-uri" in self.myopts: |
59 |
+ return |
60 |
+ |
61 |
+ # Figure out if we need a restart. |
62 |
+ if pkg.root != self._running_root.root or \ |
63 |
+ not portage.match_from_list( |
64 |
+ portage.const.PORTAGE_PACKAGE_ATOM, [pkg]): |
65 |
+ return |
66 |
+ |
67 |
+ if self._pkg_count.curval >= self._pkg_count.maxval: |
68 |
+ return |
69 |
+ |
70 |
+ logger = self._logger |
71 |
+ pkg_count = self._pkg_count |
72 |
+ mtimedb = self._mtimedb |
73 |
+ bad_resume_opts = self._bad_resume_opts |
74 |
+ |
75 |
+ logger.log(" ::: completed emerge (%s of %s) %s to %s" % \ |
76 |
+ (pkg_count.curval, pkg_count.maxval, pkg.cpv, pkg.root)) |
77 |
+ |
78 |
+ logger.log(" *** RESTARTING " + \ |
79 |
+ "emerge via exec() after change of " + \ |
80 |
+ "portage version.") |
81 |
+ |
82 |
+ del mtimedb["resume"]["mergelist"][0] |
83 |
+ mtimedb.commit() |
84 |
+ portage.run_exitfuncs() |
85 |
+ mynewargv = [sys.argv[0], "--resume"] |
86 |
+ resume_opts = self.myopts.copy() |
87 |
+ # For automatic resume, we need to prevent |
88 |
+ # any of bad_resume_opts from leaking in |
89 |
+ # via EMERGE_DEFAULT_OPTS. |
90 |
+ resume_opts["--ignore-default-opts"] = True |
91 |
+ for myopt, myarg in resume_opts.iteritems(): |
92 |
+ if myopt not in bad_resume_opts: |
93 |
+ if myarg is True: |
94 |
+ mynewargv.append(myopt) |
95 |
+ else: |
96 |
+ mynewargv.append(myopt +"="+ myarg) |
97 |
+ # priority only needs to be adjusted on the first run |
98 |
+ os.environ["PORTAGE_NICENESS"] = "0" |
99 |
+ os.execv(mynewargv[0], mynewargv) |
100 |
+ |
101 |
def merge(self): |
102 |
|
103 |
if "--resume" in self.myopts: |
104 |
@@ -7258,6 +7319,8 @@ |
105 |
del _eerror, msg |
106 |
del dropped_tasks |
107 |
self._mergelist = mylist |
108 |
+ self._pkg_count.curval = 0 |
109 |
+ self._pkg_count.maxval = len(mylist) |
110 |
|
111 |
self._logger.log(" *** Finished. Cleaning up...") |
112 |
|
113 |
@@ -7356,8 +7419,6 @@ |
114 |
root_config = self.trees[self.target_root]["root_config"] |
115 |
mymergelist = mylist |
116 |
myfeat = self.settings.features[:] |
117 |
- bad_resume_opts = set(["--ask", "--changelog", "--skipfirst", |
118 |
- "--resume"]) |
119 |
metadata_keys = [k for k in portage.auxdbkeys \ |
120 |
if not k.startswith("UNUSED_")] + ["USE"] |
121 |
|
122 |
@@ -7365,8 +7426,7 @@ |
123 |
# Filter mymergelist so that all the len(mymergelist) calls |
124 |
# below (for display) do not count Uninstall instances. |
125 |
mymergelist = [x for x in mymergelist if x[-1] == "merge"] |
126 |
- pkg_count = self._pkg_count_class( |
127 |
- curval=0, maxval=len(mymergelist)) |
128 |
+ |
129 |
for x in task_list: |
130 |
if x[0] == "blocks": |
131 |
continue |
132 |
@@ -7389,24 +7449,21 @@ |
133 |
mydbapi = vardb |
134 |
else: |
135 |
raise AssertionError("Package type: '%s'" % pkg_type) |
136 |
- if not x.installed: |
137 |
- pkg_count.curval += 1 |
138 |
+ |
139 |
try: |
140 |
- self._execute_task(bad_resume_opts, |
141 |
- mydbapi, pkg_count, |
142 |
- myfeat, mymergelist, x) |
143 |
+ self._execute_task(x) |
144 |
except self._pkg_failure, e: |
145 |
return e.status |
146 |
|
147 |
return os.EX_OK |
148 |
|
149 |
- def _execute_task(self, bad_resume_opts, |
150 |
- mydbapi, pkg_count, myfeat, |
151 |
- mymergelist, pkg): |
152 |
+ def _execute_task(self, pkg): |
153 |
favorites = self._favorites |
154 |
mtimedb = self._mtimedb |
155 |
prefetchers = self._prefetchers |
156 |
+ pkg_count = self._pkg_count |
157 |
mergecount = pkg_count.curval |
158 |
+ mymergelist = self._mergelist |
159 |
pkgsettings = self.pkgsettings[pkg.root] |
160 |
buildpkgonly = "--buildpkgonly" in self.myopts |
161 |
fetch_all = "--fetch-all-uri" in self.myopts |
162 |
@@ -7431,7 +7488,10 @@ |
163 |
pkg_type, myroot, pkg_key, operation = x |
164 |
pkgindex = 2 |
165 |
metadata = pkg.metadata |
166 |
- if pkg.installed: |
167 |
+ if not pkg.installed: |
168 |
+ pkg_count.curval += 1 |
169 |
+ mergecount = pkg_count.curval |
170 |
+ else: |
171 |
if not (buildpkgonly or fetchonly or pretend): |
172 |
uninstall = PackageUninstall(ldpath_mtimes=ldpath_mtimes, |
173 |
opts=self.myopts, pkg=pkg, settings=pkgsettings) |
174 |
@@ -7496,40 +7556,6 @@ |
175 |
world_set.add(myfavkey) |
176 |
world_set.unlock() |
177 |
|
178 |
- if "--pretend" not in self.myopts and \ |
179 |
- "--fetchonly" not in self.myopts and \ |
180 |
- "--fetch-all-uri" not in self.myopts: |
181 |
- |
182 |
- # Figure out if we need a restart. |
183 |
- if myroot == "/" and pkg.cp == "sys-apps/portage": |
184 |
- if len(mymergelist) > mergecount: |
185 |
- emergelog(xterm_titles, |
186 |
- " ::: completed emerge ("+ \ |
187 |
- str(mergecount)+" of "+ \ |
188 |
- str(len(mymergelist))+") "+ \ |
189 |
- x[2]+" to "+x[1]) |
190 |
- emergelog(xterm_titles, " *** RESTARTING " + \ |
191 |
- "emerge via exec() after change of " + \ |
192 |
- "portage version.") |
193 |
- del mtimedb["resume"]["mergelist"][0] |
194 |
- mtimedb.commit() |
195 |
- portage.run_exitfuncs() |
196 |
- mynewargv=[sys.argv[0],"--resume"] |
197 |
- resume_opts = self.myopts.copy() |
198 |
- # For automatic resume, we need to prevent |
199 |
- # any of bad_resume_opts from leaking in |
200 |
- # via EMERGE_DEFAULT_OPTS. |
201 |
- resume_opts["--ignore-default-opts"] = True |
202 |
- for myopt, myarg in resume_opts.iteritems(): |
203 |
- if myopt not in bad_resume_opts: |
204 |
- if myarg is True: |
205 |
- mynewargv.append(myopt) |
206 |
- else: |
207 |
- mynewargv.append(myopt +"="+ myarg) |
208 |
- # priority only needs to be adjusted on the first run |
209 |
- os.environ["PORTAGE_NICENESS"] = "0" |
210 |
- os.execv(mynewargv[0], mynewargv) |
211 |
- |
212 |
if "--pretend" not in self.myopts and \ |
213 |
"--fetchonly" not in self.myopts and \ |
214 |
"--fetch-all-uri" not in self.myopts: |
215 |
@@ -7544,7 +7570,7 @@ |
216 |
str(mergecount)+" of "+str(len(mymergelist))+") "+\ |
217 |
x[2]+" to "+x[1]) |
218 |
|
219 |
- # Unsafe for parallel merges |
220 |
+ self._restart_if_necessary(pkg) |
221 |
del mtimedb["resume"]["mergelist"][0] |
222 |
if not mtimedb["resume"]["mergelist"]: |
223 |
del mtimedb["resume"] |
224 |
|
225 |
-- |
226 |
gentoo-commits@l.g.o mailing list |