1 |
For the empty profile that's used to check dependencies of |
2 |
ebuilds that have empty KEYWORDS, populate implicit IUSE |
3 |
from all of the make.defaults files found in the relevant |
4 |
repositories (this should take less than 1 second on most |
5 |
hardware). Since the IUSE.missing check cannot be performed |
6 |
without implicit IUSE settings, this makes the IUSE.missing |
7 |
check work for ebuilds with empty KEYWORDS. |
8 |
|
9 |
Bug: https://bugs.gentoo.org/660982 |
10 |
--- |
11 |
pym/portage/dbapi/__init__.py | 10 +++----- |
12 |
repoman/pym/repoman/modules/scan/depend/profile.py | 30 +++++++++++++++++++++- |
13 |
2 files changed, 32 insertions(+), 8 deletions(-) |
14 |
|
15 |
diff --git a/pym/portage/dbapi/__init__.py b/pym/portage/dbapi/__init__.py |
16 |
index 61d301839..6fca6090c 100644 |
17 |
--- a/pym/portage/dbapi/__init__.py |
18 |
+++ b/pym/portage/dbapi/__init__.py |
19 |
@@ -219,17 +219,13 @@ class dbapi(object): |
20 |
def _repoman_iuse_implicit_cnstr(self, pkg, metadata): |
21 |
""" |
22 |
In repoman's version of _iuse_implicit_cnstr, account for modifications |
23 |
- of the self.settings reference between calls, and treat all flags as |
24 |
- valid for the empty profile because it does not have any implicit IUSE |
25 |
- settings. See bug 660982. |
26 |
+ of the self.settings reference between calls. |
27 |
""" |
28 |
eapi_attrs = _get_eapi_attrs(metadata["EAPI"]) |
29 |
if eapi_attrs.iuse_effective: |
30 |
- iuse_implicit_match = lambda flag: (True if not self.settings.profile_path |
31 |
- else self.settings._iuse_effective_match(flag)) |
32 |
+ iuse_implicit_match = lambda flag: self.settings._iuse_effective_match(flag) |
33 |
else: |
34 |
- iuse_implicit_match = lambda flag: (True if not self.settings.profile_path |
35 |
- else self.settings._iuse_implicit_match(flag)) |
36 |
+ iuse_implicit_match = lambda flag: self.settings._iuse_implicit_match(flag) |
37 |
return iuse_implicit_match |
38 |
|
39 |
def _iuse_implicit_cnstr(self, pkg, metadata): |
40 |
diff --git a/repoman/pym/repoman/modules/scan/depend/profile.py b/repoman/pym/repoman/modules/scan/depend/profile.py |
41 |
index 8e0a22f9c..233ed8e4b 100644 |
42 |
--- a/repoman/pym/repoman/modules/scan/depend/profile.py |
43 |
+++ b/repoman/pym/repoman/modules/scan/depend/profile.py |
44 |
@@ -2,6 +2,7 @@ |
45 |
|
46 |
|
47 |
import copy |
48 |
+import os |
49 |
from pprint import pformat |
50 |
|
51 |
from _emerge.Package import Package |
52 |
@@ -12,7 +13,8 @@ from repoman.modules.scan.scanbase import ScanBase |
53 |
from repoman.modules.scan.depend._depend_checks import _depend_checks |
54 |
from repoman.modules.scan.depend._gen_arches import _gen_arches |
55 |
from portage.dep import Atom |
56 |
- |
57 |
+from portage.package.ebuild.profile_iuse import iter_iuse_vars |
58 |
+from portage.util import getconfig |
59 |
|
60 |
def sort_key(item): |
61 |
return item[2].sub_path |
62 |
@@ -102,6 +104,10 @@ class ProfileDependsChecks(ScanBase): |
63 |
local_config=False, |
64 |
_unmatched_removal=self.options.unmatched_removal, |
65 |
env=self.env, repositories=self.repo_settings.repoman_settings.repositories) |
66 |
+ |
67 |
+ if not prof.abs_path: |
68 |
+ self._populate_implicit_iuse(dep_settings) |
69 |
+ |
70 |
dep_settings.categories = self.repo_settings.repoman_settings.categories |
71 |
if self.options.without_mask: |
72 |
dep_settings._mask_manager_obj = \ |
73 |
@@ -257,3 +263,25 @@ class ProfileDependsChecks(ScanBase): |
74 |
def runInEbuilds(self): |
75 |
'''Ebuild level scans''' |
76 |
return (True, [self.check]) |
77 |
+ |
78 |
+ @staticmethod |
79 |
+ def _populate_implicit_iuse(config): |
80 |
+ """ |
81 |
+ Populate implicit IUSE for the empty profile, see bug 660982. |
82 |
+ """ |
83 |
+ dest = config.configdict['defaults'] |
84 |
+ for repo in config.repositories: |
85 |
+ for parent_dir, dirs, files in os.walk(os.path.join(repo.location, 'profiles')): |
86 |
+ src = getconfig(os.path.join(parent_dir, 'make.defaults')) |
87 |
+ if not src: |
88 |
+ continue |
89 |
+ for k, v in iter_iuse_vars(src): |
90 |
+ v_before = dest.get(k) |
91 |
+ if v_before is not None: |
92 |
+ merged_values = set(v_before.split()) |
93 |
+ merged_values.update(v.split()) |
94 |
+ v = ' '.join(sorted(merged_values)) |
95 |
+ dest[k] = v |
96 |
+ |
97 |
+ config.regenerate() |
98 |
+ config._init_iuse() |
99 |
-- |
100 |
2.13.6 |