Gentoo Archives: gentoo-portage-dev

From: David James <davidjames@××××××.com>
To: gentoo-portage-dev@l.g.o
Cc: David James <davidjames@××××××.com>
Subject: [gentoo-portage-dev] [PATCH] Implement --newrepo flag.
Date: Mon, 17 Feb 2014 17:54:29
Message-Id: 1392659555-1167-1-git-send-email-davidjames@google.com
In Reply to: Re: [gentoo-portage-dev] [PATCH] Implement --newrepo flag. by Brian Dolbec
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

Replies

Subject Author
Re: [gentoo-portage-dev] [PATCH] Implement --newrepo flag. Sebastian Luther <SebastianLuther@×××.de>