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
[gentoo-portage-dev] [PATCH] repoman: populate implicit IUSE for empty profile (bug 660982)
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() -- 2.13.6