1 |
From: "Wolfgang E. Sanyer" <WolfgangESanyer@×××××.com> |
2 |
|
3 |
Reviewed-by: Matt Turner <mattst88@g.o> |
4 |
Signed-off-by: Wolfgang E. Sanyer <WolfgangESanyer@×××××.com> |
5 |
--- |
6 |
lib/portage/eapi.py | 155 ++++++++++++++++++++------------------------ |
7 |
1 file changed, 72 insertions(+), 83 deletions(-) |
8 |
|
9 |
diff --git a/lib/portage/eapi.py b/lib/portage/eapi.py |
10 |
index 56e64620a..efcc6c2a0 100644 |
11 |
--- a/lib/portage/eapi.py |
12 |
+++ b/lib/portage/eapi.py |
13 |
@@ -2,12 +2,10 @@ |
14 |
# Distributed under the terms of the GNU General Public License v2 |
15 |
|
16 |
import collections |
17 |
-import operator |
18 |
-import types |
19 |
- |
20 |
-from portage import eapi_is_supported |
21 |
+from functools import lru_cache |
22 |
|
23 |
|
24 |
+@lru_cache(None) |
25 |
def eapi_has_iuse_defaults(eapi): |
26 |
if eapi is None: |
27 |
return True |
28 |
@@ -15,6 +13,7 @@ def eapi_has_iuse_defaults(eapi): |
29 |
return eapi != "0" |
30 |
|
31 |
|
32 |
+@lru_cache(None) |
33 |
def eapi_has_iuse_effective(eapi): |
34 |
if eapi is None: |
35 |
return False |
36 |
@@ -22,6 +21,7 @@ def eapi_has_iuse_effective(eapi): |
37 |
return eapi not in ("0", "1", "2", "3", "4", "4-python", "4-slot-abi") |
38 |
|
39 |
|
40 |
+@lru_cache(None) |
41 |
def eapi_has_slot_deps(eapi): |
42 |
if eapi is None: |
43 |
return True |
44 |
@@ -29,6 +29,7 @@ def eapi_has_slot_deps(eapi): |
45 |
return eapi != "0" |
46 |
|
47 |
|
48 |
+@lru_cache(None) |
49 |
def eapi_has_slot_operator(eapi): |
50 |
if eapi is None: |
51 |
return True |
52 |
@@ -36,6 +37,7 @@ def eapi_has_slot_operator(eapi): |
53 |
return eapi not in ("0", "1", "2", "3", "4", "4-python") |
54 |
|
55 |
|
56 |
+@lru_cache(None) |
57 |
def eapi_has_src_uri_arrows(eapi): |
58 |
if eapi is None: |
59 |
return True |
60 |
@@ -43,6 +45,7 @@ def eapi_has_src_uri_arrows(eapi): |
61 |
return eapi not in ("0", "1") |
62 |
|
63 |
|
64 |
+@lru_cache(None) |
65 |
def eapi_has_selective_src_uri_restriction(eapi): |
66 |
if eapi is None: |
67 |
return True |
68 |
@@ -62,6 +65,7 @@ def eapi_has_selective_src_uri_restriction(eapi): |
69 |
) |
70 |
|
71 |
|
72 |
+@lru_cache(None) |
73 |
def eapi_has_use_deps(eapi): |
74 |
if eapi is None: |
75 |
return True |
76 |
@@ -69,6 +73,7 @@ def eapi_has_use_deps(eapi): |
77 |
return eapi not in ("0", "1") |
78 |
|
79 |
|
80 |
+@lru_cache(None) |
81 |
def eapi_has_strong_blocks(eapi): |
82 |
if eapi is None: |
83 |
return True |
84 |
@@ -76,10 +81,12 @@ def eapi_has_strong_blocks(eapi): |
85 |
return eapi not in ("0", "1") |
86 |
|
87 |
|
88 |
+@lru_cache(None) |
89 |
def eapi_has_src_prepare_and_src_configure(eapi): |
90 |
return eapi not in ("0", "1") |
91 |
|
92 |
|
93 |
+@lru_cache(None) |
94 |
def eapi_supports_prefix(eapi): |
95 |
if eapi is None: |
96 |
return True |
97 |
@@ -87,6 +94,7 @@ def eapi_supports_prefix(eapi): |
98 |
return eapi not in ("0", "1", "2") |
99 |
|
100 |
|
101 |
+@lru_cache(None) |
102 |
def eapi_exports_AA(eapi): |
103 |
if eapi is None: |
104 |
return False |
105 |
@@ -94,6 +102,7 @@ def eapi_exports_AA(eapi): |
106 |
return eapi in ("0", "1", "2", "3") |
107 |
|
108 |
|
109 |
+@lru_cache(None) |
110 |
def eapi_exports_KV(eapi): |
111 |
if eapi is None: |
112 |
return False |
113 |
@@ -101,6 +110,7 @@ def eapi_exports_KV(eapi): |
114 |
return eapi in ("0", "1", "2", "3") |
115 |
|
116 |
|
117 |
+@lru_cache(None) |
118 |
def eapi_exports_merge_type(eapi): |
119 |
if eapi is None: |
120 |
return True |
121 |
@@ -108,6 +118,7 @@ def eapi_exports_merge_type(eapi): |
122 |
return eapi not in ("0", "1", "2", "3") |
123 |
|
124 |
|
125 |
+@lru_cache(None) |
126 |
def eapi_exports_replace_vars(eapi): |
127 |
if eapi is None: |
128 |
return True |
129 |
@@ -115,6 +126,7 @@ def eapi_exports_replace_vars(eapi): |
130 |
return eapi not in ("0", "1", "2", "3") |
131 |
|
132 |
|
133 |
+@lru_cache(None) |
134 |
def eapi_exports_EBUILD_PHASE_FUNC(eapi): |
135 |
if eapi is None: |
136 |
return True |
137 |
@@ -122,6 +134,7 @@ def eapi_exports_EBUILD_PHASE_FUNC(eapi): |
138 |
return eapi not in ("0", "1", "2", "3", "4", "4-python", "4-slot-abi") |
139 |
|
140 |
|
141 |
+@lru_cache(None) |
142 |
def eapi_exports_PORTDIR(eapi): |
143 |
if eapi is None: |
144 |
return True |
145 |
@@ -140,6 +153,7 @@ def eapi_exports_PORTDIR(eapi): |
146 |
) |
147 |
|
148 |
|
149 |
+@lru_cache(None) |
150 |
def eapi_exports_ECLASSDIR(eapi): |
151 |
if eapi is None: |
152 |
return False |
153 |
@@ -158,22 +172,27 @@ def eapi_exports_ECLASSDIR(eapi): |
154 |
) |
155 |
|
156 |
|
157 |
+@lru_cache(None) |
158 |
def eapi_exports_REPOSITORY(eapi): |
159 |
return eapi in ("4-python", "5-progress") |
160 |
|
161 |
|
162 |
+@lru_cache(None) |
163 |
def eapi_has_pkg_pretend(eapi): |
164 |
return eapi not in ("0", "1", "2", "3") |
165 |
|
166 |
|
167 |
+@lru_cache(None) |
168 |
def eapi_has_implicit_rdepend(eapi): |
169 |
return eapi in ("0", "1", "2", "3") |
170 |
|
171 |
|
172 |
+@lru_cache(None) |
173 |
def eapi_has_dosed_dohard(eapi): |
174 |
return eapi in ("0", "1", "2", "3") |
175 |
|
176 |
|
177 |
+@lru_cache(None) |
178 |
def eapi_has_required_use(eapi): |
179 |
if eapi is None: |
180 |
return True |
181 |
@@ -181,6 +200,7 @@ def eapi_has_required_use(eapi): |
182 |
return eapi not in ("0", "1", "2", "3") |
183 |
|
184 |
|
185 |
+@lru_cache(None) |
186 |
def eapi_has_required_use_at_most_one_of(eapi): |
187 |
if eapi is None: |
188 |
return True |
189 |
@@ -188,6 +208,7 @@ def eapi_has_required_use_at_most_one_of(eapi): |
190 |
return eapi not in ("0", "1", "2", "3", "4", "4-python", "4-slot-abi") |
191 |
|
192 |
|
193 |
+@lru_cache(None) |
194 |
def eapi_has_use_dep_defaults(eapi): |
195 |
if eapi is None: |
196 |
return True |
197 |
@@ -195,6 +216,7 @@ def eapi_has_use_dep_defaults(eapi): |
198 |
return eapi not in ("0", "1", "2", "3") |
199 |
|
200 |
|
201 |
+@lru_cache(None) |
202 |
def eapi_requires_posixish_locale(eapi): |
203 |
if eapi is None: |
204 |
return False |
205 |
@@ -212,6 +234,7 @@ def eapi_requires_posixish_locale(eapi): |
206 |
) |
207 |
|
208 |
|
209 |
+@lru_cache(None) |
210 |
def eapi_has_repo_deps(eapi): |
211 |
if eapi is None: |
212 |
return True |
213 |
@@ -219,6 +242,7 @@ def eapi_has_repo_deps(eapi): |
214 |
return eapi in ("4-python", "5-progress") |
215 |
|
216 |
|
217 |
+@lru_cache(None) |
218 |
def eapi_allows_dots_in_PN(eapi): |
219 |
if eapi is None: |
220 |
return True |
221 |
@@ -226,6 +250,7 @@ def eapi_allows_dots_in_PN(eapi): |
222 |
return eapi in ("4-python", "5-progress") |
223 |
|
224 |
|
225 |
+@lru_cache(None) |
226 |
def eapi_allows_dots_in_use_flags(eapi): |
227 |
if eapi is None: |
228 |
return True |
229 |
@@ -233,22 +258,27 @@ def eapi_allows_dots_in_use_flags(eapi): |
230 |
return eapi in ("4-python", "5-progress") |
231 |
|
232 |
|
233 |
+@lru_cache(None) |
234 |
def eapi_supports_stable_use_forcing_and_masking(eapi): |
235 |
return eapi not in ("0", "1", "2", "3", "4", "4-python", "4-slot-abi") |
236 |
|
237 |
|
238 |
+@lru_cache(None) |
239 |
def eapi_allows_directories_on_profile_level_and_repository_level(eapi): |
240 |
return eapi not in ("0", "1", "2", "3", "4", "4-slot-abi", "5", "6") |
241 |
|
242 |
|
243 |
+@lru_cache(None) |
244 |
def eapi_has_use_aliases(eapi): |
245 |
return eapi in ("4-python", "5-progress") |
246 |
|
247 |
|
248 |
+@lru_cache(None) |
249 |
def eapi_has_automatic_unpack_dependencies(eapi): |
250 |
return eapi in ("5-progress",) |
251 |
|
252 |
|
253 |
+@lru_cache(None) |
254 |
def eapi_allows_package_provided(eapi): |
255 |
if eapi is None: |
256 |
return True |
257 |
@@ -267,6 +297,7 @@ def eapi_allows_package_provided(eapi): |
258 |
) |
259 |
|
260 |
|
261 |
+@lru_cache(None) |
262 |
def eapi_has_bdepend(eapi): |
263 |
if eapi is None: |
264 |
return False |
265 |
@@ -285,6 +316,7 @@ def eapi_has_bdepend(eapi): |
266 |
) |
267 |
|
268 |
|
269 |
+@lru_cache(None) |
270 |
def eapi_has_idepend(eapi): |
271 |
if eapi is None: |
272 |
return False |
273 |
@@ -304,6 +336,7 @@ def eapi_has_idepend(eapi): |
274 |
) |
275 |
|
276 |
|
277 |
+@lru_cache(None) |
278 |
def eapi_empty_groups_always_true(eapi): |
279 |
if eapi is None: |
280 |
return False |
281 |
@@ -322,6 +355,7 @@ def eapi_empty_groups_always_true(eapi): |
282 |
) |
283 |
|
284 |
|
285 |
+@lru_cache(None) |
286 |
def eapi_path_variables_end_with_trailing_slash(eapi): |
287 |
if eapi is None: |
288 |
return False |
289 |
@@ -340,6 +374,7 @@ def eapi_path_variables_end_with_trailing_slash(eapi): |
290 |
) |
291 |
|
292 |
|
293 |
+@lru_cache(None) |
294 |
def eapi_has_broot(eapi): |
295 |
if eapi is None: |
296 |
return True |
297 |
@@ -358,6 +393,7 @@ def eapi_has_broot(eapi): |
298 |
) |
299 |
|
300 |
|
301 |
+@lru_cache(None) |
302 |
def eapi_has_sysroot(eapi): |
303 |
if eapi is None: |
304 |
return True |
305 |
@@ -423,43 +459,7 @@ _eapi_attr_func_prefixes = ( |
306 |
) |
307 |
|
308 |
|
309 |
-def _eapi_func_decorator(func, attr_getter): |
310 |
- def wrapper(eapi): |
311 |
- return attr_getter(_get_eapi_attrs(eapi)) |
312 |
- |
313 |
- wrapper.func = func |
314 |
- wrapper.__doc__ = func.__doc__ |
315 |
- return wrapper |
316 |
- |
317 |
- |
318 |
-def _decorate_eapi_funcs(): |
319 |
- """ |
320 |
- Decorate eapi_* functions so that they use _get_eapi_attrs(eapi) |
321 |
- to cache results. |
322 |
- """ |
323 |
- decorated = {} |
324 |
- for k, v in globals().items(): |
325 |
- if not ( |
326 |
- isinstance(v, types.FunctionType) and k.startswith(_eapi_attr_func_prefixes) |
327 |
- ): |
328 |
- continue |
329 |
- for prefix in _eapi_attr_func_prefixes: |
330 |
- if k.startswith(prefix): |
331 |
- attr_name = k[len(prefix) :] |
332 |
- if hasattr(_eapi_attrs, attr_name): |
333 |
- decorated[k] = _eapi_func_decorator( |
334 |
- v, operator.attrgetter(attr_name) |
335 |
- ) |
336 |
- break |
337 |
- globals().update(decorated) |
338 |
- |
339 |
- |
340 |
-_decorate_eapi_funcs() |
341 |
- |
342 |
- |
343 |
-_eapi_attrs_cache = {} |
344 |
- |
345 |
- |
346 |
+@lru_cache(None) |
347 |
def _get_eapi_attrs(eapi): |
348 |
""" |
349 |
When eapi is None then validation is not as strict, since we want the |
350 |
@@ -468,49 +468,38 @@ def _get_eapi_attrs(eapi): |
351 |
be helpful for handling of corrupt EAPI metadata in essential functions |
352 |
such as pkgsplit. |
353 |
""" |
354 |
- eapi_attrs = _eapi_attrs_cache.get(eapi) |
355 |
- if eapi_attrs is not None: |
356 |
- return eapi_attrs |
357 |
- |
358 |
- orig_eapi = eapi |
359 |
- if eapi is not None and not eapi_is_supported(eapi): |
360 |
- eapi = None |
361 |
- |
362 |
- eapi_attrs = _eapi_attrs( |
363 |
- allows_package_provided=eapi_allows_package_provided.func(eapi), |
364 |
- bdepend=eapi_has_bdepend.func(eapi), |
365 |
- broot=eapi_has_broot.func(eapi), |
366 |
- dots_in_PN=eapi_allows_dots_in_PN.func(eapi), |
367 |
- dots_in_use_flags=eapi_allows_dots_in_use_flags.func(eapi), |
368 |
- empty_groups_always_true=eapi_empty_groups_always_true.func(eapi), |
369 |
- exports_AA=eapi_exports_AA.func(eapi), |
370 |
- exports_EBUILD_PHASE_FUNC=eapi_exports_EBUILD_PHASE_FUNC.func(eapi), |
371 |
- exports_ECLASSDIR=eapi_exports_ECLASSDIR.func(eapi), |
372 |
- exports_KV=eapi_exports_KV.func(eapi), |
373 |
- exports_merge_type=eapi_exports_merge_type.func(eapi), |
374 |
- exports_PORTDIR=eapi_exports_PORTDIR.func(eapi), |
375 |
- exports_replace_vars=eapi_exports_replace_vars.func(eapi), |
376 |
+ return _eapi_attrs( |
377 |
+ allows_package_provided=eapi_allows_package_provided(eapi), |
378 |
+ bdepend=eapi_has_bdepend(eapi), |
379 |
+ broot=eapi_has_broot(eapi), |
380 |
+ dots_in_PN=eapi_allows_dots_in_PN(eapi), |
381 |
+ dots_in_use_flags=eapi_allows_dots_in_use_flags(eapi), |
382 |
+ empty_groups_always_true=eapi_empty_groups_always_true(eapi), |
383 |
+ exports_AA=eapi_exports_AA(eapi), |
384 |
+ exports_EBUILD_PHASE_FUNC=eapi_exports_EBUILD_PHASE_FUNC(eapi), |
385 |
+ exports_ECLASSDIR=eapi_exports_ECLASSDIR(eapi), |
386 |
+ exports_KV=eapi_exports_KV(eapi), |
387 |
+ exports_merge_type=eapi_exports_merge_type(eapi), |
388 |
+ exports_PORTDIR=eapi_exports_PORTDIR(eapi), |
389 |
+ exports_replace_vars=eapi_exports_replace_vars(eapi), |
390 |
feature_flag_test=False, |
391 |
- idepend=eapi_has_idepend.func(eapi), |
392 |
- iuse_defaults=eapi_has_iuse_defaults.func(eapi), |
393 |
- iuse_effective=eapi_has_iuse_effective.func(eapi), |
394 |
- path_variables_end_with_trailing_slash=eapi_path_variables_end_with_trailing_slash.func( |
395 |
+ idepend=eapi_has_idepend(eapi), |
396 |
+ iuse_defaults=eapi_has_iuse_defaults(eapi), |
397 |
+ iuse_effective=eapi_has_iuse_effective(eapi), |
398 |
+ path_variables_end_with_trailing_slash=eapi_path_variables_end_with_trailing_slash( |
399 |
eapi |
400 |
), |
401 |
- posixish_locale=eapi_requires_posixish_locale.func(eapi), |
402 |
- prefix=eapi_supports_prefix.func(eapi), |
403 |
- repo_deps=eapi_has_repo_deps.func(eapi), |
404 |
- required_use=eapi_has_required_use.func(eapi), |
405 |
- required_use_at_most_one_of=eapi_has_required_use_at_most_one_of.func(eapi), |
406 |
- selective_src_uri_restriction=eapi_has_selective_src_uri_restriction.func(eapi), |
407 |
- slot_deps=eapi_has_slot_deps.func(eapi), |
408 |
- slot_operator=eapi_has_slot_operator.func(eapi), |
409 |
- src_uri_arrows=eapi_has_src_uri_arrows.func(eapi), |
410 |
- strong_blocks=eapi_has_strong_blocks.func(eapi), |
411 |
- sysroot=eapi_has_sysroot.func(eapi), |
412 |
- use_deps=eapi_has_use_deps.func(eapi), |
413 |
- use_dep_defaults=eapi_has_use_dep_defaults.func(eapi), |
414 |
+ posixish_locale=eapi_requires_posixish_locale(eapi), |
415 |
+ prefix=eapi_supports_prefix(eapi), |
416 |
+ repo_deps=eapi_has_repo_deps(eapi), |
417 |
+ required_use=eapi_has_required_use(eapi), |
418 |
+ required_use_at_most_one_of=eapi_has_required_use_at_most_one_of(eapi), |
419 |
+ selective_src_uri_restriction=eapi_has_selective_src_uri_restriction(eapi), |
420 |
+ slot_deps=eapi_has_slot_deps(eapi), |
421 |
+ slot_operator=eapi_has_slot_operator(eapi), |
422 |
+ src_uri_arrows=eapi_has_src_uri_arrows(eapi), |
423 |
+ strong_blocks=eapi_has_strong_blocks(eapi), |
424 |
+ sysroot=eapi_has_sysroot(eapi), |
425 |
+ use_deps=eapi_has_use_deps(eapi), |
426 |
+ use_dep_defaults=eapi_has_use_dep_defaults(eapi), |
427 |
) |
428 |
- |
429 |
- _eapi_attrs_cache[orig_eapi] = eapi_attrs |
430 |
- return eapi_attrs |
431 |
-- |
432 |
2.34.1 |