On Sun, 15 Jul 2018 16:02:03 -0700
Zac Medico <zmed...@gentoo.org> 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

Reply via email to