Re: [gentoo-portage-dev] [PATCH] repoman: populate implicit IUSE for empty profile (bug 660982)
On 07/31/2018 08:42 AM, Brian Dolbec wrote: > On Sun, 15 Jul 2018 16:02:03 -0700 > Zac Medico wrote: > >> For the empty profile that's used to check dependencies of >> ebuilds that have empty KEYWORDS, populate implicit IUSE >> from all of the make.defaults files found in the relevant >> repositories (this should take less than 1 second on most >> hardware). Since the IUSE.missing check cannot be performed >> without implicit IUSE settings, this makes the IUSE.missing >> check work for ebuilds with empty KEYWORDS. >> >> Bug: https://bugs.gentoo.org/660982 >> --- >> pym/portage/dbapi/__init__.py | 10 +++- >> repoman/pym/repoman/modules/scan/depend/profile.py | 30 >> +- 2 files changed, 32 insertions(+), 8 >> deletions(-) >> >> diff --git a/pym/portage/dbapi/__init__.py >> b/pym/portage/dbapi/__init__.py index 61d301839..6fca6090c 100644 >> --- a/pym/portage/dbapi/__init__.py >> +++ b/pym/portage/dbapi/__init__.py >> @@ -219,17 +219,13 @@ class dbapi(object): >> def _repoman_iuse_implicit_cnstr(self, pkg, metadata): >> """ >> In repoman's version of _iuse_implicit_cnstr, >> account for modifications >> -of the self.settings reference between calls, and >> treat all flags as >> -valid for the empty profile because it does not have >> any implicit IUSE >> -settings. See bug 660982. >> +of the self.settings reference between calls. >> """ >> eapi_attrs = _get_eapi_attrs(metadata["EAPI"]) >> if eapi_attrs.iuse_effective: >> -iuse_implicit_match = lambda flag: (True if >> not self.settings.profile_path >> -else >> self.settings._iuse_effective_match(flag)) >> +iuse_implicit_match = lambda flag: >> self.settings._iuse_effective_match(flag) else: >> -iuse_implicit_match = lambda flag: (True if >> not self.settings.profile_path >> -else >> self.settings._iuse_implicit_match(flag)) >> +iuse_implicit_match = lambda flag: >> self.settings._iuse_implicit_match(flag) return iuse_implicit_match >> >> def _iuse_implicit_cnstr(self, pkg, metadata): >> diff --git a/repoman/pym/repoman/modules/scan/depend/profile.py >> b/repoman/pym/repoman/modules/scan/depend/profile.py index >> 8e0a22f9c..233ed8e4b 100644 --- >> a/repoman/pym/repoman/modules/scan/depend/profile.py +++ >> b/repoman/pym/repoman/modules/scan/depend/profile.py @@ -2,6 +2,7 @@ >> >> >> import copy >> +import os >> from pprint import pformat >> >> from _emerge.Package import Package >> @@ -12,7 +13,8 @@ from repoman.modules.scan.scanbase import ScanBase >> from repoman.modules.scan.depend._depend_checks import _depend_checks >> from repoman.modules.scan.depend._gen_arches import _gen_arches >> from portage.dep import Atom >> - >> +from portage.package.ebuild.profile_iuse import iter_iuse_vars >> +from portage.util import getconfig >> >> def sort_key(item): >> return item[2].sub_path >> @@ -102,6 +104,10 @@ class ProfileDependsChecks(ScanBase): >> local_config=False, >> >> _unmatched_removal=self.options.unmatched_removal, >> env=self.env, >> repositories=self.repo_settings.repoman_settings.repositories) + >> +if not prof.abs_path: >> + >> self._populate_implicit_iuse(dep_settings) + >> dep_settings.categories = >> self.repo_settings.repoman_settings.categories if >> self.options.without_mask: dep_settings._mask_manager_obj = \ >> @@ -257,3 +263,25 @@ class ProfileDependsChecks(ScanBase): >> def runInEbuilds(self): >> '''Ebuild level scans''' >> return (True, [self.check]) >> + >> +@staticmethod >> +def _populate_implicit_iuse(config): >> +""" >> +Populate implicit IUSE for the empty profile, see >> bug 660982. >> +""" >> +dest = config.configdict['defaults'] >> +for repo in config.repositories: >> +for parent_dir, dirs, files in >> os.walk(os.path.join(repo.location, 'profiles')): >> +src = >> getconfig(os.path.join(parent_dir, 'make.defaults')) >> +if not src: >> +continue >> +for k, v in iter_iuse_vars(src): >> +v_before = dest.get(k) >> +if v_before is not None: >> +merged_values = >> set(v_before.split()) >> + >> merged_values.update(v.split()) >> +v = ' >> '.join(sorted(merged_values)) >> +dest[k] = v >> + >> +config.regenerate()
Re: [gentoo-portage-dev] [PATCH] repoman: populate implicit IUSE for empty profile (bug 660982)
On Sun, 15 Jul 2018 16:02:03 -0700 Zac Medico wrote: > For the empty profile that's used to check dependencies of > ebuilds that have empty KEYWORDS, populate implicit IUSE > from all of the make.defaults files found in the relevant > repositories (this should take less than 1 second on most > hardware). Since the IUSE.missing check cannot be performed > without implicit IUSE settings, this makes the IUSE.missing > check work for ebuilds with empty KEYWORDS. > > Bug: https://bugs.gentoo.org/660982 > --- > pym/portage/dbapi/__init__.py | 10 +++- > repoman/pym/repoman/modules/scan/depend/profile.py | 30 > +- 2 files changed, 32 insertions(+), 8 > deletions(-) > > diff --git a/pym/portage/dbapi/__init__.py > b/pym/portage/dbapi/__init__.py index 61d301839..6fca6090c 100644 > --- a/pym/portage/dbapi/__init__.py > +++ b/pym/portage/dbapi/__init__.py > @@ -219,17 +219,13 @@ class dbapi(object): > def _repoman_iuse_implicit_cnstr(self, pkg, metadata): > """ > In repoman's version of _iuse_implicit_cnstr, > account for modifications > - of the self.settings reference between calls, and > treat all flags as > - valid for the empty profile because it does not have > any implicit IUSE > - settings. See bug 660982. > + of the self.settings reference between calls. > """ > eapi_attrs = _get_eapi_attrs(metadata["EAPI"]) > if eapi_attrs.iuse_effective: > - iuse_implicit_match = lambda flag: (True if > not self.settings.profile_path > - else > self.settings._iuse_effective_match(flag)) > + iuse_implicit_match = lambda flag: > self.settings._iuse_effective_match(flag) else: > - iuse_implicit_match = lambda flag: (True if > not self.settings.profile_path > - else > self.settings._iuse_implicit_match(flag)) > + iuse_implicit_match = lambda flag: > self.settings._iuse_implicit_match(flag) return iuse_implicit_match > > def _iuse_implicit_cnstr(self, pkg, metadata): > diff --git a/repoman/pym/repoman/modules/scan/depend/profile.py > b/repoman/pym/repoman/modules/scan/depend/profile.py index > 8e0a22f9c..233ed8e4b 100644 --- > a/repoman/pym/repoman/modules/scan/depend/profile.py +++ > b/repoman/pym/repoman/modules/scan/depend/profile.py @@ -2,6 +2,7 @@ > > > import copy > +import os > from pprint import pformat > > from _emerge.Package import Package > @@ -12,7 +13,8 @@ from repoman.modules.scan.scanbase import ScanBase > from repoman.modules.scan.depend._depend_checks import _depend_checks > from repoman.modules.scan.depend._gen_arches import _gen_arches > from portage.dep import Atom > - > +from portage.package.ebuild.profile_iuse import iter_iuse_vars > +from portage.util import getconfig > > def sort_key(item): > return item[2].sub_path > @@ -102,6 +104,10 @@ class ProfileDependsChecks(ScanBase): > local_config=False, > > _unmatched_removal=self.options.unmatched_removal, > env=self.env, > repositories=self.repo_settings.repoman_settings.repositories) + > + if not prof.abs_path: > + > self._populate_implicit_iuse(dep_settings) + > dep_settings.categories = > self.repo_settings.repoman_settings.categories if > self.options.without_mask: dep_settings._mask_manager_obj = \ > @@ -257,3 +263,25 @@ class ProfileDependsChecks(ScanBase): > def runInEbuilds(self): > '''Ebuild level scans''' > return (True, [self.check]) > + > + @staticmethod > + def _populate_implicit_iuse(config): > + """ > + Populate implicit IUSE for the empty profile, see > bug 660982. > + """ > + dest = config.configdict['defaults'] > + for repo in config.repositories: > + for parent_dir, dirs, files in > os.walk(os.path.join(repo.location, 'profiles')): > + src = > getconfig(os.path.join(parent_dir, 'make.defaults')) > + if not src: > + continue > + for k, v in iter_iuse_vars(src): > + v_before = dest.get(k) > + if v_before is not None: > + merged_values = > set(v_before.split()) > + > merged_values.update(v.split()) > + v = ' > '.join(sorted(merged_values)) > + dest[k] = v > + > + config.regenerate() > + config._init_iuse() looks good