1 |
commit: e4297ca1075342ec89e089802cd25ae0817f3d5b |
2 |
Author: David James <davidjames <AT> chromium <DOT> org> |
3 |
AuthorDate: Wed May 4 06:32:05 2011 +0000 |
4 |
Commit: Zac Medico <zmedico <AT> gentoo <DOT> org> |
5 |
CommitDate: Wed May 4 17:02:14 2011 +0000 |
6 |
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=e4297ca1 |
7 |
|
8 |
emerge: replace --rebuild with finer grained opts |
9 |
|
10 |
Replace --rebuild option with --rebuild-if-* options. |
11 |
|
12 |
--rebuild-if-new-rev [ y | n ] |
13 |
Rebuild packages when dependencies that are used at both build-time and |
14 |
run-time are built, if the dependency is not already installed with the |
15 |
same version and revision. |
16 |
|
17 |
--rebuild-if-new-ver [ y | n ] |
18 |
Rebuild packages when dependencies that are used at both build-time and |
19 |
run-time are built, if the dependency is not already installed with the |
20 |
same version. Revision numbers are ignored. |
21 |
|
22 |
--rebuild-if-unbuilt [ y | n ] |
23 |
Rebuild packages when dependencies that are used at both build-time and |
24 |
run-time are built. |
25 |
|
26 |
Change-Id: Ia50c1702bfe1b98a8d1891740e7bbb045921a905 |
27 |
|
28 |
Review URL: http://gerrit.chromium.org/gerrit/280 |
29 |
|
30 |
--- |
31 |
man/emerge.1 | 14 ++++++- |
32 |
pym/_emerge/create_depgraph_params.py | 3 +- |
33 |
pym/_emerge/depgraph.py | 54 ++++++++++++++++++++++++---- |
34 |
pym/_emerge/help.py | 24 +++++++++++-- |
35 |
pym/_emerge/main.py | 47 ++++++++++++++++++++---- |
36 |
pym/portage/tests/resolver/test_rebuild.py | 39 ++++++++++++++++++-- |
37 |
6 files changed, 157 insertions(+), 24 deletions(-) |
38 |
|
39 |
diff --git a/man/emerge.1 b/man/emerge.1 |
40 |
index 2e27e48..907bb4f 100644 |
41 |
--- a/man/emerge.1 |
42 |
+++ b/man/emerge.1 |
43 |
@@ -546,9 +546,19 @@ Disable the warning message that's shown prior to |
44 |
to be set in the \fBmake.conf\fR(5) |
45 |
\fBEMERGE_DEFAULT_OPTS\fR variable. |
46 |
.TP |
47 |
-.BR "\-\-rebuild [ y | n ]" |
48 |
+.BR "\-\-rebuild\-if\-new\-rev [ y | n ]" |
49 |
Rebuild packages when dependencies that are used at both build\-time and |
50 |
-run\-time are upgraded. |
51 |
+run\-time are built, if the dependency is not already installed with the |
52 |
+same version and revision. |
53 |
+.TP |
54 |
+.BR "\-\-rebuild\-if\-new\-ver [ y | n ]" |
55 |
+Rebuild packages when dependencies that are used at both build\-time and |
56 |
+run\-time are built, if the dependency is not already installed with the |
57 |
+same version. Revision numbers are ignored. |
58 |
+.TP |
59 |
+.BR "\-\-rebuild\-if\-unbuilt [ y | n ]" |
60 |
+Rebuild packages when dependencies that are used at both build\-time and |
61 |
+run\-time are built. |
62 |
.TP |
63 |
.BR "\-\-rebuilt\-binaries [ y | n ]" |
64 |
Replace installed packages with binary packages that have |
65 |
|
66 |
diff --git a/pym/_emerge/create_depgraph_params.py b/pym/_emerge/create_depgraph_params.py |
67 |
index ae7a8ae..44dceda 100644 |
68 |
--- a/pym/_emerge/create_depgraph_params.py |
69 |
+++ b/pym/_emerge/create_depgraph_params.py |
70 |
@@ -37,7 +37,8 @@ def create_depgraph_params(myopts, myaction): |
71 |
deep = myopts.get("--deep") |
72 |
if deep is not None and deep != 0: |
73 |
myparams["deep"] = deep |
74 |
- if "--complete-graph" in myopts or "--rebuild" in myopts: |
75 |
+ if ("--complete-graph" in myopts or "--rebuild-if-new-rev" in myopts or |
76 |
+ "--rebuild-if-new-ver" in myopts or "--rebuild-if-unbuilt" in myopts): |
77 |
myparams["complete"] = True |
78 |
if "--emptytree" in myopts: |
79 |
myparams["empty"] = True |
80 |
|
81 |
diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py |
82 |
index b0b4b07..ebfbdd4 100644 |
83 |
--- a/pym/_emerge/depgraph.py |
84 |
+++ b/pym/_emerge/depgraph.py |
85 |
@@ -30,6 +30,7 @@ from portage._sets.base import InternalPackageSet |
86 |
from portage.util import cmp_sort_key, writemsg, writemsg_stdout |
87 |
from portage.util import writemsg_level |
88 |
from portage.util.digraph import digraph |
89 |
+from portage.versions import catpkgsplit |
90 |
|
91 |
from _emerge.AtomArg import AtomArg |
92 |
from _emerge.Blocker import Blocker |
93 |
@@ -133,7 +134,9 @@ class _frozen_depgraph_config(object): |
94 |
atoms = ' '.join(myopts.get("--rebuild-ignore", [])).split() |
95 |
self.rebuild_ignore = _wildcard_set(atoms) |
96 |
|
97 |
- self.rebuild = "--rebuild" in myopts |
98 |
+ self.rebuild_if_new_rev = "--rebuild-if-new-rev" in myopts |
99 |
+ self.rebuild_if_new_ver = "--rebuild-if-new-ver" in myopts |
100 |
+ self.rebuild_if_unbuilt = "--rebuild-if-unbuilt" in myopts |
101 |
|
102 |
class _depgraph_sets(object): |
103 |
def __init__(self): |
104 |
@@ -153,19 +156,53 @@ class _rebuild_config(object): |
105 |
self.rebuild_list = backtrack_parameters.rebuild_list.copy() |
106 |
self.orig_rebuild_list = self.rebuild_list.copy() |
107 |
self.reinstall_list = backtrack_parameters.reinstall_list.copy() |
108 |
+ self.rebuild_if_new_rev = frozen_config.rebuild_if_new_rev |
109 |
+ self.rebuild_if_new_ver = frozen_config.rebuild_if_new_ver |
110 |
+ self.rebuild_if_unbuilt = frozen_config.rebuild_if_unbuilt |
111 |
+ self.rebuild = (self.rebuild_if_new_rev or self.rebuild_if_new_ver or |
112 |
+ self.rebuild_if_unbuilt) |
113 |
|
114 |
def add(self, dep_pkg, dep): |
115 |
parent = dep.collapsed_parent |
116 |
priority = dep.collapsed_priority |
117 |
rebuild_exclude = self._frozen_config.rebuild_exclude |
118 |
rebuild_ignore = self._frozen_config.rebuild_ignore |
119 |
- if (self._frozen_config.rebuild and isinstance(parent, Package) and |
120 |
+ if (self.rebuild and isinstance(parent, Package) and |
121 |
parent.built and (priority.buildtime or priority.runtime) and |
122 |
isinstance(dep_pkg, Package) and |
123 |
not rebuild_exclude.findAtomForPackage(parent) and |
124 |
not rebuild_ignore.findAtomForPackage(dep_pkg)): |
125 |
self._graph.add(dep_pkg, parent, priority) |
126 |
|
127 |
+ def _needs_rebuild(self, dep_pkg): |
128 |
+ """Check whether packages that depend on dep_pkg need to be rebuilt.""" |
129 |
+ dep_root_slot = (dep_pkg.root, dep_pkg.slot_atom) |
130 |
+ if dep_pkg.built or dep_root_slot in self.orig_rebuild_list: |
131 |
+ return False |
132 |
+ |
133 |
+ if self.rebuild_if_unbuilt: |
134 |
+ # dep_pkg is being installed from source, so binary |
135 |
+ # packages for parents are invalid. Force rebuild |
136 |
+ return True |
137 |
+ |
138 |
+ trees = self._frozen_config.trees |
139 |
+ vardb = trees[dep_pkg.root]["vartree"].dbapi |
140 |
+ if self.rebuild_if_new_rev: |
141 |
+ # Parent packages are valid if a package with the same |
142 |
+ # cpv is already installed. |
143 |
+ return dep_pkg.cpv not in vardb.match(dep_pkg.slot_atom) |
144 |
+ |
145 |
+ # Otherwise, parent packages are valid if a package with the same |
146 |
+ # version (excluding revision) is already installed. |
147 |
+ assert self.rebuild_if_new_ver |
148 |
+ cpv_norev = catpkgsplit(dep_pkg.cpv)[:-1] |
149 |
+ for inst_cpv in vardb.match(dep_pkg.slot_atom): |
150 |
+ inst_cpv_norev = catpkgsplit(inst_cpv)[:-1] |
151 |
+ if inst_cpv_norev == cpv_norev: |
152 |
+ return False |
153 |
+ |
154 |
+ return True |
155 |
+ |
156 |
def _trigger_rebuild(self, parent, build_deps, runtime_deps): |
157 |
root_slot = (parent.root, parent.slot_atom) |
158 |
if root_slot in self.rebuild_list: |
159 |
@@ -177,10 +214,7 @@ class _rebuild_config(object): |
160 |
kids = set([build_deps[slot_atom], runtime_deps[slot_atom]]) |
161 |
for dep_pkg in kids: |
162 |
dep_root_slot = (dep_pkg.root, slot_atom) |
163 |
- if (not dep_pkg.built and |
164 |
- dep_root_slot not in self.orig_rebuild_list): |
165 |
- # There's no binary package for dep_pkg, so any binary |
166 |
- # package for this parent would be invalid. Force rebuild. |
167 |
+ if self._needs_rebuild(dep_pkg): |
168 |
self.rebuild_list.add(root_slot) |
169 |
return True |
170 |
elif ("--usepkg" in self._frozen_config.myopts and |
171 |
@@ -205,7 +239,13 @@ class _rebuild_config(object): |
172 |
uri = bintree.get_pkgindex_uri(parent.cpv) |
173 |
dep_uri = bintree.get_pkgindex_uri(dep_pkg.cpv) |
174 |
bindb = bintree.dbapi |
175 |
- |
176 |
+ if self.rebuild_if_new_ver and uri and uri != dep_uri: |
177 |
+ cpv_norev = catpkgsplit(dep_pkg.cpv)[:-1] |
178 |
+ for cpv in bindb.match(dep_pkg.slot_atom): |
179 |
+ if cpv_norev == catpkgsplit(cpv)[:-1]: |
180 |
+ dep_uri = bintree.get_pkgindex_uri(cpv) |
181 |
+ if uri == dep_uri: |
182 |
+ break |
183 |
if uri and uri != dep_uri: |
184 |
# 1) Remote binary package is invalid because it was |
185 |
# built without dep_pkg. Force rebuild. |
186 |
|
187 |
diff --git a/pym/_emerge/help.py b/pym/_emerge/help.py |
188 |
index 35008c4..de50b75 100644 |
189 |
--- a/pym/_emerge/help.py |
190 |
+++ b/pym/_emerge/help.py |
191 |
@@ -629,10 +629,28 @@ def help(myopts, havecolor=1): |
192 |
for line in wrap(desc, desc_width): |
193 |
print(desc_indent + line) |
194 |
print() |
195 |
- print(" " + green("--rebuild") + " [ %s | %s ]" % \ |
196 |
+ print(" " + green("--rebuild-if-new-rev") + " [ %s | %s ]" % \ |
197 |
(turquoise("y"), turquoise("n"))) |
198 |
- desc = "Rebuild packages when dependencies that are used " + \ |
199 |
- "at both build-time and run-time are upgraded." |
200 |
+ desc = "Rebuild packages when dependencies that are " + \ |
201 |
+ "used at both build-time and run-time are built, " + \ |
202 |
+ "if the dependency is not already installed with the " + \ |
203 |
+ "same version and revision." |
204 |
+ for line in wrap(desc, desc_width): |
205 |
+ print(desc_indent + line) |
206 |
+ print() |
207 |
+ print(" " + green("--rebuild-if-new-ver") + " [ %s | %s ]" % \ |
208 |
+ (turquoise("y"), turquoise("n"))) |
209 |
+ desc = "Rebuild packages when dependencies that are " + \ |
210 |
+ "used at both build-time and run-time are built, " + \ |
211 |
+ "if the dependency is not already installed with the " + \ |
212 |
+ "same version. Revision numbers are ignored." |
213 |
+ for line in wrap(desc, desc_width): |
214 |
+ print(desc_indent + line) |
215 |
+ print() |
216 |
+ print(" " + green("--rebuild-if-unbuilt") + " [ %s | %s ]" % \ |
217 |
+ (turquoise("y"), turquoise("n"))) |
218 |
+ desc = "Rebuild packages when dependencies that are " + \ |
219 |
+ "used at both build-time and run-time are built." |
220 |
for line in wrap(desc, desc_width): |
221 |
print(desc_indent + line) |
222 |
print() |
223 |
|
224 |
diff --git a/pym/_emerge/main.py b/pym/_emerge/main.py |
225 |
index 1e06ec1..92db36e 100644 |
226 |
--- a/pym/_emerge/main.py |
227 |
+++ b/pym/_emerge/main.py |
228 |
@@ -440,7 +440,9 @@ def insert_optional_args(args): |
229 |
'--package-moves' : y_or_n, |
230 |
'--quiet' : y_or_n, |
231 |
'--quiet-build' : y_or_n, |
232 |
- '--rebuild' : y_or_n, |
233 |
+ '--rebuild-if-new-rev' : y_or_n, |
234 |
+ '--rebuild-if-new-ver' : y_or_n, |
235 |
+ '--rebuild-if-unbuilt' : y_or_n, |
236 |
'--rebuilt-binaries' : y_or_n, |
237 |
'--root-deps' : ('rdeps',), |
238 |
'--select' : y_or_n, |
239 |
@@ -777,9 +779,27 @@ def parse_opts(tmpcmdline, silent=False): |
240 |
"choices" : true_y_or_n |
241 |
}, |
242 |
|
243 |
- "--rebuild": { |
244 |
+ "--rebuild-if-new-rev": { |
245 |
"help" : "Rebuild packages when dependencies that are " + \ |
246 |
- "used at both build-time and run-time are upgraded.", |
247 |
+ "used at both build-time and run-time are built, " + \ |
248 |
+ "if the dependency is not already installed with the " + \ |
249 |
+ "same version and revision.", |
250 |
+ "type" : "choice", |
251 |
+ "choices" : true_y_or_n |
252 |
+ }, |
253 |
+ |
254 |
+ "--rebuild-if-new-ver": { |
255 |
+ "help" : "Rebuild packages when dependencies that are " + \ |
256 |
+ "used at both build-time and run-time are built, " + \ |
257 |
+ "if the dependency is not already installed with the " + \ |
258 |
+ "same version. Revision numbers are ignored.", |
259 |
+ "type" : "choice", |
260 |
+ "choices" : true_y_or_n |
261 |
+ }, |
262 |
+ |
263 |
+ "--rebuild-if-unbuilt": { |
264 |
+ "help" : "Rebuild packages when dependencies that are " + \ |
265 |
+ "used at both build-time and run-time are built.", |
266 |
"type" : "choice", |
267 |
"choices" : true_y_or_n |
268 |
}, |
269 |
@@ -913,7 +933,7 @@ def parse_opts(tmpcmdline, silent=False): |
270 |
else: |
271 |
myoptions.binpkg_respect_use = None |
272 |
|
273 |
- if myoptions.complete_graph in true_y or myoptions.rebuild in true_y: |
274 |
+ if myoptions.complete_graph in true_y: |
275 |
myoptions.complete_graph = True |
276 |
else: |
277 |
myoptions.complete_graph = None |
278 |
@@ -989,10 +1009,23 @@ def parse_opts(tmpcmdline, silent=False): |
279 |
else: |
280 |
myoptions.quiet_build = None |
281 |
|
282 |
- if myoptions.rebuild in true_y: |
283 |
- myoptions.rebuild = True |
284 |
+ if myoptions.rebuild_if_new_ver in true_y: |
285 |
+ myoptions.rebuild_if_new_ver = True |
286 |
+ else: |
287 |
+ myoptions.rebuild_if_new_ver = None |
288 |
+ |
289 |
+ if myoptions.rebuild_if_new_rev in true_y: |
290 |
+ myoptions.rebuild_if_new_rev = True |
291 |
+ myoptions.rebuild_if_new_ver = None |
292 |
+ else: |
293 |
+ myoptions.rebuild_if_new_rev = None |
294 |
+ |
295 |
+ if myoptions.rebuild_if_unbuilt in true_y: |
296 |
+ myoptions.rebuild_if_unbuilt = True |
297 |
+ myoptions.rebuild_if_new_rev = None |
298 |
+ myoptions.rebuild_if_new_ver = None |
299 |
else: |
300 |
- myoptions.rebuild = None |
301 |
+ myoptions.rebuild_if_unbuilt = None |
302 |
|
303 |
if myoptions.rebuilt_binaries in true_y: |
304 |
myoptions.rebuilt_binaries = True |
305 |
|
306 |
diff --git a/pym/portage/tests/resolver/test_rebuild.py b/pym/portage/tests/resolver/test_rebuild.py |
307 |
index da2888c..1f4b6ae 100644 |
308 |
--- a/pym/portage/tests/resolver/test_rebuild.py |
309 |
+++ b/pym/portage/tests/resolver/test_rebuild.py |
310 |
@@ -15,6 +15,7 @@ class RebuildTestCase(TestCase): |
311 |
|
312 |
ebuilds = { |
313 |
"sys-libs/x-1": { }, |
314 |
+ "sys-libs/x-1-r1": { }, |
315 |
"sys-libs/x-2": { }, |
316 |
"sys-apps/a-1": { "DEPEND" : "sys-libs/x", "RDEPEND" : "sys-libs/x"}, |
317 |
"sys-apps/a-2": { "DEPEND" : "sys-libs/x", "RDEPEND" : "sys-libs/x"}, |
318 |
@@ -48,7 +49,7 @@ class RebuildTestCase(TestCase): |
319 |
test_cases = ( |
320 |
ResolverPlaygroundTestCase( |
321 |
["sys-libs/x"], |
322 |
- options = {"--rebuild" : True, |
323 |
+ options = {"--rebuild-if-unbuilt" : True, |
324 |
"--rebuild-exclude" : ["sys-apps/b"]}, |
325 |
mergelist = ['sys-libs/x-2', 'sys-apps/a-2', 'sys-apps/e-2'], |
326 |
ignore_mergelist_order = True, |
327 |
@@ -56,7 +57,7 @@ class RebuildTestCase(TestCase): |
328 |
|
329 |
ResolverPlaygroundTestCase( |
330 |
["sys-libs/x"], |
331 |
- options = {"--rebuild" : True}, |
332 |
+ options = {"--rebuild-if-unbuilt" : True}, |
333 |
mergelist = ['sys-libs/x-2', 'sys-apps/a-2', 'sys-apps/b-2', |
334 |
'sys-apps/e-2', 'sys-apps/g-2'], |
335 |
ignore_mergelist_order = True, |
336 |
@@ -64,7 +65,7 @@ class RebuildTestCase(TestCase): |
337 |
|
338 |
ResolverPlaygroundTestCase( |
339 |
["sys-libs/x"], |
340 |
- options = {"--rebuild" : True, |
341 |
+ options = {"--rebuild-if-unbuilt" : True, |
342 |
"--rebuild-ignore" : ["sys-libs/x"]}, |
343 |
mergelist = ['sys-libs/x-2'], |
344 |
ignore_mergelist_order = True, |
345 |
@@ -72,13 +73,43 @@ class RebuildTestCase(TestCase): |
346 |
|
347 |
ResolverPlaygroundTestCase( |
348 |
["sys-libs/x"], |
349 |
- options = {"--rebuild" : True, |
350 |
+ options = {"--rebuild-if-unbuilt" : True, |
351 |
"--rebuild-ignore" : ["sys-apps/b"]}, |
352 |
mergelist = ['sys-libs/x-2', 'sys-apps/a-2', 'sys-apps/b-2', |
353 |
'sys-apps/e-2'], |
354 |
ignore_mergelist_order = True, |
355 |
success = True), |
356 |
|
357 |
+ ResolverPlaygroundTestCase( |
358 |
+ ["=sys-libs/x-1-r1"], |
359 |
+ options = {"--rebuild-if-unbuilt" : True}, |
360 |
+ mergelist = ['sys-libs/x-1-r1', 'sys-apps/a-2', |
361 |
+ 'sys-apps/b-2', 'sys-apps/e-2', 'sys-apps/g-2'], |
362 |
+ ignore_mergelist_order = True, |
363 |
+ success = True), |
364 |
+ |
365 |
+ ResolverPlaygroundTestCase( |
366 |
+ ["=sys-libs/x-1-r1"], |
367 |
+ options = {"--rebuild-if-new-rev" : True}, |
368 |
+ mergelist = ['sys-libs/x-1-r1', 'sys-apps/a-2', |
369 |
+ 'sys-apps/b-2', 'sys-apps/e-2', 'sys-apps/g-2'], |
370 |
+ ignore_mergelist_order = True, |
371 |
+ success = True), |
372 |
+ |
373 |
+ ResolverPlaygroundTestCase( |
374 |
+ ["=sys-libs/x-1-r1"], |
375 |
+ options = {"--rebuild-if-new-ver" : True}, |
376 |
+ mergelist = ['sys-libs/x-1-r1'], |
377 |
+ ignore_mergelist_order = True, |
378 |
+ success = True), |
379 |
+ |
380 |
+ ResolverPlaygroundTestCase( |
381 |
+ ["sys-libs/x"], |
382 |
+ options = {"--rebuild-if-new-ver" : True}, |
383 |
+ mergelist = ['sys-libs/x-2', 'sys-apps/a-2', |
384 |
+ 'sys-apps/b-2', 'sys-apps/e-2', 'sys-apps/g-2'], |
385 |
+ ignore_mergelist_order = True, |
386 |
+ success = True), |
387 |
) |
388 |
|
389 |
playground = ResolverPlayground(ebuilds=ebuilds, |