commit: 691541feccdfcbf06004e4e545851337780c56e3 Author: Brian Dolbec <dolsen <AT> gentoo <DOT> org> AuthorDate: Sun Jan 3 19:11:22 2016 +0000 Commit: Brian Dolbec <dolsen <AT> gentoo <DOT> org> CommitDate: Sat Jan 30 07:50:17 2016 +0000 URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=691541fe
repoman: Create a new ArchChecks class plugin pym/repoman/modules/scan/arches/__init__.py | 24 +++++++++++ pym/repoman/modules/scan/arches/arches.py | 64 +++++++++++++++++++++++++++++ pym/repoman/scanner.py | 47 +-------------------- 3 files changed, 90 insertions(+), 45 deletions(-) diff --git a/pym/repoman/modules/scan/arches/__init__.py b/pym/repoman/modules/scan/arches/__init__.py new file mode 100644 index 0000000..d080c30 --- /dev/null +++ b/pym/repoman/modules/scan/arches/__init__.py @@ -0,0 +1,24 @@ +# Copyright 2015-2016 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 + +doc = """Arches plug-in module for repoman. +Performs archs checks on ebuilds.""" +__doc__ = doc[:] + + +module_spec = { + 'name': 'arches', + 'description': doc, + 'provides':{ + 'archs-module': { + 'name': "arches", + 'sourcefile': "arches", + 'class': "ArchChecks", + 'description': doc, + 'functions': ['check'], + 'func_desc': { + }, + }, + } +} + diff --git a/pym/repoman/modules/scan/arches/arches.py b/pym/repoman/modules/scan/arches/arches.py new file mode 100644 index 0000000..2c32028 --- /dev/null +++ b/pym/repoman/modules/scan/arches/arches.py @@ -0,0 +1,64 @@ +# -*- coding:utf-8 -*- + + +class ArchChecks(object): + + def __init__(self, **kwargs): + self.options = kwargs.get('options') + self.repo_settings = kwargs.get('repo_settings') + self.profiles = kwargs.get('profiles') + + def check(self, **kwargs): + ebuild = kwargs.get('ebuild') + if self.options.ignore_arches: + arches = [[ + self.repo_settings.repoman_settings["ARCH"], self.repo_settings.repoman_settings["ARCH"], + self.repo_settings.repoman_settings["ACCEPT_KEYWORDS"].split()]] + else: + arches = set() + for keyword in ebuild.keywords: + if keyword[0] == "-": + continue + elif keyword[0] == "~": + arch = keyword[1:] + if arch == "*": + for expanded_arch in self.profiles: + if expanded_arch == "**": + continue + arches.add( + (keyword, expanded_arch, ( + expanded_arch, "~" + expanded_arch))) + else: + arches.add((keyword, arch, (arch, keyword))) + else: + # For ebuilds with stable keywords, check if the + # dependencies are satisfiable for unstable + # configurations, since use.stable.mask is not + # applied for unstable configurations (see bug + # 563546). + if keyword == "*": + for expanded_arch in self.profiles: + if expanded_arch == "**": + continue + arches.add( + (keyword, expanded_arch, (expanded_arch,))) + arches.add( + (keyword, expanded_arch, + (expanded_arch, "~" + expanded_arch))) + else: + arches.add((keyword, keyword, (keyword,))) + arches.add((keyword, keyword, + (keyword, "~" + keyword))) + if not arches: + # Use an empty profile for checking dependencies of + # packages that have empty KEYWORDS. + arches.add(('**', '**', ('**',))) + return {'continue': False, 'arches': arches} + + @property + def runInPkgs(self): + return (False, []) + + @property + def runInEbuilds(self): + return (True, [self.check]) diff --git a/pym/repoman/scanner.py b/pym/repoman/scanner.py index f0a4bef..7a1433a 100644 --- a/pym/repoman/scanner.py +++ b/pym/repoman/scanner.py @@ -304,6 +304,7 @@ class Scanner(object): ('eapi', 'EAPIChecks'), ('ebuild_metadata', 'EbuildMetadata'), ('thirdpartymirrors', 'ThirdPartyMirrors'), ('description', 'DescriptionChecks'), (None, 'KeywordChecks'), + ('arches', 'ArchChecks'), ]: if mod[0]: mod_class = MODULE_CONTROLLER.get_class(mod[0]) @@ -354,50 +355,6 @@ class Scanner(object): self.liveeclasscheck.check( dynamic_data['pkg'], xpkg, dynamic_data['ebuild'], y_ebuild, dynamic_data['ebuild'].keywords, self.repo_metadata['pmaskdict']) - if self.options.ignore_arches: - arches = [[ - self.repo_settings.repoman_settings["ARCH"], self.repo_settings.repoman_settings["ARCH"], - self.repo_settings.repoman_settings["ACCEPT_KEYWORDS"].split()]] - else: - arches = set() - for keyword in dynamic_data['ebuild'].keywords: - if keyword[0] == "-": - continue - elif keyword[0] == "~": - arch = keyword[1:] - if arch == "*": - for expanded_arch in self.profiles: - if expanded_arch == "**": - continue - arches.add( - (keyword, expanded_arch, ( - expanded_arch, "~" + expanded_arch))) - else: - arches.add((keyword, arch, (arch, keyword))) - else: - # For ebuilds with stable keywords, check if the - # dependencies are satisfiable for unstable - # configurations, since use.stable.mask is not - # applied for unstable configurations (see bug - # 563546). - if keyword == "*": - for expanded_arch in self.profiles: - if expanded_arch == "**": - continue - arches.add( - (keyword, expanded_arch, (expanded_arch,))) - arches.add( - (keyword, expanded_arch, - (expanded_arch, "~" + expanded_arch))) - else: - arches.add((keyword, keyword, (keyword,))) - arches.add((keyword, keyword, - (keyword, "~" + keyword))) - if not arches: - # Use an empty profile for checking dependencies of - # packages that have empty KEYWORDS. - arches.add(('**', '**', ('**',))) - unknown_pkgs = set() baddepsyntax = False badlicsyntax = False @@ -554,7 +511,7 @@ class Scanner(object): continue relevant_profiles = [] - for keyword, arch, groups in arches: + for keyword, arch, groups in dynamic_data['arches']: if arch not in self.profiles: # A missing profile will create an error further down # during the KEYWORDS verification.