1 |
The --newrepo flag tells emerge to recompile a package if it is now |
2 |
being pulled from a different repository. |
3 |
|
4 |
BUG=chromium:200417 |
5 |
TEST=Verify ebuilds get pulled in when repo changes. |
6 |
TEST=New test cases. |
7 |
Change-Id: I8d5ff1cfc8c1d23e00c733b861547d3626bc2ece |
8 |
--- |
9 |
man/emerge.1 | 5 ++ |
10 |
pym/_emerge/create_depgraph_params.py | 1 + |
11 |
pym/_emerge/depgraph.py | 80 ++++++++++++++------------- |
12 |
pym/_emerge/help.py | 2 +- |
13 |
pym/_emerge/main.py | 1 + |
14 |
pym/portage/tests/emerge/test_simple.py | 1 + |
15 |
pym/portage/tests/resolver/test_multirepo.py | 82 +++++++++++++++++++++++++++- |
16 |
7 files changed, 131 insertions(+), 41 deletions(-) |
17 |
|
18 |
diff --git a/man/emerge.1 b/man/emerge.1 |
19 |
index 7b507fe..eacb77a 100644 |
20 |
--- a/man/emerge.1 |
21 |
+++ b/man/emerge.1 |
22 |
@@ -553,6 +553,11 @@ a list of packages with similar names when a package doesn't exist. |
23 |
The \fIEMERGE_DEFAULT_OPTS\fR variable may be used to disable this |
24 |
option by default. |
25 |
.TP |
26 |
+.BR "\-\-newrepo " |
27 |
+Tells emerge to recompile a package if it is now being pulled from a |
28 |
+different repository. This option also implies the |
29 |
+\fB\-\-selective\fR option. |
30 |
+.TP |
31 |
.BR "\-\-newuse " (\fB\-N\fR) |
32 |
Tells emerge to include installed packages where USE |
33 |
flags have changed since compilation. This option |
34 |
diff --git a/pym/_emerge/create_depgraph_params.py b/pym/_emerge/create_depgraph_params.py |
35 |
index 98a7646..f9accf0 100644 |
36 |
--- a/pym/_emerge/create_depgraph_params.py |
37 |
+++ b/pym/_emerge/create_depgraph_params.py |
38 |
@@ -46,6 +46,7 @@ def create_depgraph_params(myopts, myaction): |
39 |
myparams['rebuild_if_new_slot'] = rebuild_if_new_slot |
40 |
|
41 |
if "--update" in myopts or \ |
42 |
+ "--newrepo" in myopts or \ |
43 |
"--newuse" in myopts or \ |
44 |
"--reinstall" in myopts or \ |
45 |
"--noreplace" in myopts or \ |
46 |
diff --git a/pym/_emerge/depgraph.py b/pym/_emerge/depgraph.py |
47 |
index 2ed7aeb..b741c47 100644 |
48 |
--- a/pym/_emerge/depgraph.py |
49 |
+++ b/pym/_emerge/depgraph.py |
50 |
@@ -5389,54 +5389,56 @@ class depgraph(object): |
51 |
break |
52 |
# Compare built package to current config and |
53 |
# reject the built package if necessary. |
54 |
+ reinstall_use = ("--newuse" in self._frozen_config.myopts or \ |
55 |
+ "--reinstall" in self._frozen_config.myopts) |
56 |
+ respect_use = self._dynamic_config.myparams.get("binpkg_respect_use") in ("y", "auto") |
57 |
if built and not useoldpkg and \ |
58 |
(not installed or matched_packages) and \ |
59 |
not (installed and |
60 |
self._frozen_config.excluded_pkgs.findAtomForPackage(pkg, |
61 |
- modified_use=self._pkg_use_enabled(pkg))) and \ |
62 |
- ("--newuse" in self._frozen_config.myopts or \ |
63 |
- "--reinstall" in self._frozen_config.myopts or \ |
64 |
- (not installed and self._dynamic_config.myparams.get( |
65 |
- "binpkg_respect_use") in ("y", "auto"))): |
66 |
- iuses = pkg.iuse.all |
67 |
- old_use = self._pkg_use_enabled(pkg) |
68 |
- if myeb: |
69 |
- pkgsettings.setcpv(myeb) |
70 |
- else: |
71 |
- pkgsettings.setcpv(pkg) |
72 |
- now_use = pkgsettings["PORTAGE_USE"].split() |
73 |
- forced_flags = set() |
74 |
- forced_flags.update(pkgsettings.useforce) |
75 |
- forced_flags.update(pkgsettings.usemask) |
76 |
- cur_iuse = iuses |
77 |
- if myeb and not usepkgonly and not useoldpkg: |
78 |
- cur_iuse = myeb.iuse.all |
79 |
- reinstall_for_flags = self._reinstall_for_flags(pkg, |
80 |
- forced_flags, old_use, iuses, now_use, cur_iuse) |
81 |
- if reinstall_for_flags: |
82 |
- if not pkg.installed: |
83 |
- self._dynamic_config.ignored_binaries.setdefault(pkg, set()).update(reinstall_for_flags) |
84 |
+ modified_use=self._pkg_use_enabled(pkg))): |
85 |
+ if myeb and "--newrepo" in self._frozen_config.myopts and myeb.repo != pkg.repo: |
86 |
break |
87 |
+ elif reinstall_use or (not installed and respect_use): |
88 |
+ iuses = pkg.iuse.all |
89 |
+ old_use = self._pkg_use_enabled(pkg) |
90 |
+ if myeb: |
91 |
+ pkgsettings.setcpv(myeb) |
92 |
+ else: |
93 |
+ pkgsettings.setcpv(pkg) |
94 |
+ now_use = pkgsettings["PORTAGE_USE"].split() |
95 |
+ forced_flags = set() |
96 |
+ forced_flags.update(pkgsettings.useforce) |
97 |
+ forced_flags.update(pkgsettings.usemask) |
98 |
+ cur_iuse = iuses |
99 |
+ if myeb and not usepkgonly and not useoldpkg: |
100 |
+ cur_iuse = myeb.iuse.all |
101 |
+ reinstall_for_flags = self._reinstall_for_flags(pkg, |
102 |
+ forced_flags, old_use, iuses, now_use, cur_iuse) |
103 |
+ if reinstall_for_flags: |
104 |
+ if not pkg.installed: |
105 |
+ self._dynamic_config.ignored_binaries.setdefault(pkg, set()).update(reinstall_for_flags) |
106 |
+ break |
107 |
# Compare current config to installed package |
108 |
# and do not reinstall if possible. |
109 |
- if not installed and not useoldpkg and \ |
110 |
- ("--newuse" in self._frozen_config.myopts or \ |
111 |
- "--reinstall" in self._frozen_config.myopts) and \ |
112 |
- cpv in vardb.match(atom): |
113 |
- forced_flags = set() |
114 |
- forced_flags.update(pkg.use.force) |
115 |
- forced_flags.update(pkg.use.mask) |
116 |
+ if not installed and not useoldpkg and cpv in vardb.match(atom): |
117 |
inst_pkg = vardb.match_pkgs('=' + pkg.cpv)[0] |
118 |
- old_use = inst_pkg.use.enabled |
119 |
- old_iuse = inst_pkg.iuse.all |
120 |
- cur_use = self._pkg_use_enabled(pkg) |
121 |
- cur_iuse = pkg.iuse.all |
122 |
- reinstall_for_flags = \ |
123 |
- self._reinstall_for_flags(pkg, |
124 |
- forced_flags, old_use, old_iuse, |
125 |
- cur_use, cur_iuse) |
126 |
- if reinstall_for_flags: |
127 |
+ if "--newrepo" in self._frozen_config.myopts and pkg.repo != inst_pkg.repo: |
128 |
reinstall = True |
129 |
+ elif reinstall_use: |
130 |
+ forced_flags = set() |
131 |
+ forced_flags.update(pkg.use.force) |
132 |
+ forced_flags.update(pkg.use.mask) |
133 |
+ old_use = inst_pkg.use.enabled |
134 |
+ old_iuse = inst_pkg.iuse.all |
135 |
+ cur_use = self._pkg_use_enabled(pkg) |
136 |
+ cur_iuse = pkg.iuse.all |
137 |
+ reinstall_for_flags = \ |
138 |
+ self._reinstall_for_flags(pkg, |
139 |
+ forced_flags, old_use, old_iuse, |
140 |
+ cur_use, cur_iuse) |
141 |
+ if reinstall_for_flags: |
142 |
+ reinstall = True |
143 |
if reinstall_atoms.findAtomForPackage(pkg, \ |
144 |
modified_use=self._pkg_use_enabled(pkg)): |
145 |
reinstall = True |
146 |
diff --git a/pym/_emerge/help.py b/pym/_emerge/help.py |
147 |
index 52cfd00..ab4e88f 100644 |
148 |
--- a/pym/_emerge/help.py |
149 |
+++ b/pym/_emerge/help.py |
150 |
@@ -17,7 +17,7 @@ def help(): |
151 |
print(" [ " + green("--color")+" < " + turquoise("y") + " | "+ turquoise("n")+" > ] [ "+green("--columns")+" ]") |
152 |
print(" [ "+green("--complete-graph")+" ] [ "+green("--deep")+" ]") |
153 |
print(" [ "+green("--jobs") + " " + turquoise("JOBS")+" ] [ "+green("--keep-going")+" ] [ " + green("--load-average")+" " + turquoise("LOAD") + " ]") |
154 |
- print(" [ "+green("--newuse")+" ] [ "+green("--noconfmem")+" ] [ "+green("--nospinner")+" ]") |
155 |
+ print(" [ "+green("--newrepo")+" ] [ "+green("--newuse")+" ] [ "+green("--noconfmem")+" ] [ "+green("--nospinner")+" ]") |
156 |
print(" [ "+green("--oneshot")+" ] [ "+green("--onlydeps")+" ] [ "+ green("--quiet-build")+" [ " + turquoise("y") + " | "+ turquoise("n")+" ] ]") |
157 |
print(" [ "+green("--reinstall ")+turquoise("changed-use")+" ] [ " + green("--with-bdeps")+" < " + turquoise("y") + " | "+ turquoise("n")+" > ]") |
158 |
print(bold("Actions:")+" [ "+green("--depclean")+" | "+green("--list-sets")+" | "+green("--search")+" | "+green("--sync")+" | "+green("--version")+" ]") |
159 |
diff --git a/pym/_emerge/main.py b/pym/_emerge/main.py |
160 |
index da223a6..6225fc9 100644 |
161 |
--- a/pym/_emerge/main.py |
162 |
+++ b/pym/_emerge/main.py |
163 |
@@ -36,6 +36,7 @@ options=[ |
164 |
"--fetchonly", "--fetch-all-uri", |
165 |
"--ignore-default-opts", |
166 |
"--noconfmem", |
167 |
+"--newrepo", |
168 |
"--newuse", |
169 |
"--nodeps", "--noreplace", |
170 |
"--nospinner", "--oneshot", |
171 |
diff --git a/pym/portage/tests/emerge/test_simple.py b/pym/portage/tests/emerge/test_simple.py |
172 |
index d3bb866..bf0af8b 100644 |
173 |
--- a/pym/portage/tests/emerge/test_simple.py |
174 |
+++ b/pym/portage/tests/emerge/test_simple.py |
175 |
@@ -247,6 +247,7 @@ pkg_preinst() { |
176 |
ebuild_cmd + (test_ebuild, "manifest", "clean", "package", "merge"), |
177 |
emerge_cmd + ("--pretend", "--tree", "--complete-graph", "dev-libs/A"), |
178 |
emerge_cmd + ("-p", "dev-libs/B"), |
179 |
+ emerge_cmd + ("-p", "--newrepo", "dev-libs/B"), |
180 |
emerge_cmd + ("-B", "dev-libs/B",), |
181 |
emerge_cmd + ("--oneshot", "--usepkg", "dev-libs/B",), |
182 |
|
183 |
diff --git a/pym/portage/tests/resolver/test_multirepo.py b/pym/portage/tests/resolver/test_multirepo.py |
184 |
index 8d65b2c..5c3ef7e 100644 |
185 |
--- a/pym/portage/tests/resolver/test_multirepo.py |
186 |
+++ b/pym/portage/tests/resolver/test_multirepo.py |
187 |
@@ -37,11 +37,20 @@ class MultirepoTestCase(TestCase): |
188 |
|
189 |
"dev-libs/I-1::repo2": { "SLOT" : "1"}, |
190 |
"dev-libs/I-2::repo2": { "SLOT" : "2"}, |
191 |
+ |
192 |
+ "dev-libs/K-1::repo2": { }, |
193 |
} |
194 |
|
195 |
installed = { |
196 |
"dev-libs/H-1": { "RDEPEND" : "|| ( dev-libs/I:2 dev-libs/I:1 )"}, |
197 |
"dev-libs/I-2::repo1": {"SLOT" : "2"}, |
198 |
+ "dev-libs/K-1::repo1": { }, |
199 |
+ } |
200 |
+ |
201 |
+ binpkgs = { |
202 |
+ "dev-libs/C-1::repo2": { }, |
203 |
+ "dev-libs/I-2::repo1": {"SLOT" : "2"}, |
204 |
+ "dev-libs/K-1::repo2": { }, |
205 |
} |
206 |
|
207 |
sets = { |
208 |
@@ -96,6 +105,68 @@ class MultirepoTestCase(TestCase): |
209 |
check_repo_names = True, |
210 |
mergelist = ["dev-libs/D-1::repo2"]), |
211 |
|
212 |
+ #--usepkg: don't reinstall on new repo without --newrepo |
213 |
+ ResolverPlaygroundTestCase( |
214 |
+ ["dev-libs/C"], |
215 |
+ options = {"--usepkg": True, "--selective": True}, |
216 |
+ success = True, |
217 |
+ check_repo_names = True, |
218 |
+ mergelist = ["[binary]dev-libs/C-1::repo2"]), |
219 |
+ |
220 |
+ #--usepkgonly: don't reinstall on new repo without --newrepo |
221 |
+ ResolverPlaygroundTestCase( |
222 |
+ ["dev-libs/C"], |
223 |
+ options = {"--usepkgonly": True, "--selective": True}, |
224 |
+ success = True, |
225 |
+ check_repo_names = True, |
226 |
+ mergelist = ["[binary]dev-libs/C-1::repo2"]), |
227 |
+ |
228 |
+ #--newrepo: pick ebuild if binpkg/ebuild have different repo |
229 |
+ ResolverPlaygroundTestCase( |
230 |
+ ["dev-libs/C"], |
231 |
+ options = {"--usepkg": True, "--newrepo": True, "--selective": True}, |
232 |
+ success = True, |
233 |
+ check_repo_names = True, |
234 |
+ mergelist = ["dev-libs/C-1::repo1"]), |
235 |
+ |
236 |
+ #--newrepo --usepkgonly: ebuild is ignored |
237 |
+ ResolverPlaygroundTestCase( |
238 |
+ ["dev-libs/C"], |
239 |
+ options = {"--usepkgonly": True, "--newrepo": True, "--selective": True}, |
240 |
+ success = True, |
241 |
+ check_repo_names = True, |
242 |
+ mergelist = ["[binary]dev-libs/C-1::repo2"]), |
243 |
+ |
244 |
+ #--newrepo: pick ebuild if binpkg/ebuild have different repo |
245 |
+ ResolverPlaygroundTestCase( |
246 |
+ ["dev-libs/I"], |
247 |
+ options = {"--usepkg": True, "--newrepo": True, "--selective": True}, |
248 |
+ success = True, |
249 |
+ check_repo_names = True, |
250 |
+ mergelist = ["dev-libs/I-2::repo2"]), |
251 |
+ |
252 |
+ #--newrepo --usepkgonly: if binpkg matches installed, do nothing |
253 |
+ ResolverPlaygroundTestCase( |
254 |
+ ["dev-libs/I"], |
255 |
+ options = {"--usepkgonly": True, "--newrepo": True, "--selective": True}, |
256 |
+ success = True, |
257 |
+ mergelist = []), |
258 |
+ |
259 |
+ #--newrepo --usepkgonly: reinstall if binpkg has new repo. |
260 |
+ ResolverPlaygroundTestCase( |
261 |
+ ["dev-libs/K"], |
262 |
+ options = {"--usepkgonly": True, "--newrepo": True, "--selective": True}, |
263 |
+ success = True, |
264 |
+ check_repo_names = True, |
265 |
+ mergelist = ["[binary]dev-libs/K-1::repo2"]), |
266 |
+ |
267 |
+ #--usepkgonly: don't reinstall on new repo without --newrepo. |
268 |
+ ResolverPlaygroundTestCase( |
269 |
+ ["dev-libs/K"], |
270 |
+ options = {"--usepkgonly": True, "--selective": True}, |
271 |
+ success = True, |
272 |
+ mergelist = []), |
273 |
+ |
274 |
#Atoms with slots |
275 |
ResolverPlaygroundTestCase( |
276 |
["dev-libs/E"], |
277 |
@@ -137,6 +208,15 @@ class MultirepoTestCase(TestCase): |
278 |
success = True, |
279 |
mergelist = []), |
280 |
|
281 |
+ # Dependency on installed dev-libs/I-2 ebuild should trigger reinstall |
282 |
+ # when --newrepo flag is used. |
283 |
+ ResolverPlaygroundTestCase( |
284 |
+ ["dev-libs/H"], |
285 |
+ options = {"--update": True, "--deep": True, "--newrepo": True}, |
286 |
+ success = True, |
287 |
+ check_repo_names = True, |
288 |
+ mergelist = ["dev-libs/I-2::repo2"]), |
289 |
+ |
290 |
# Check interaction between repo priority and unsatisfied |
291 |
# REQUIRED_USE, for bug #350254. |
292 |
ResolverPlaygroundTestCase( |
293 |
@@ -147,7 +227,7 @@ class MultirepoTestCase(TestCase): |
294 |
) |
295 |
|
296 |
playground = ResolverPlayground(ebuilds=ebuilds, |
297 |
- installed=installed, sets=sets) |
298 |
+ binpkgs=binpkgs, installed=installed, sets=sets) |
299 |
try: |
300 |
for test_case in test_cases: |
301 |
playground.run_TestCase(test_case) |
302 |
-- |
303 |
1.8.0.2 |