Gentoo Archives: gentoo-portage-dev

From: Zac Medico <zmedico@g.o>
To: gentoo-portage-dev@l.g.o
Cc: Zac Medico <zmedico@g.o>
Subject: [gentoo-portage-dev] [PATCH] repoman: populate implicit IUSE for empty profile (bug 660982)
Date: Sun, 15 Jul 2018 23:02:16
Message-Id: 20180715230203.10678-1-zmedico@gentoo.org
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

Replies