Gentoo Archives: gentoo-commits

From: Zac Medico <zmedico@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/portage:master commit in: man/, pym/portage/tests/resolver/, pym/_emerge/
Date: Wed, 04 May 2011 17:06:15
Message-Id: e4297ca1075342ec89e089802cd25ae0817f3d5b.zmedico@gentoo
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,