commit: 1e94e75c15a2f402ba3c9e47bbea60a5d20066f9 Author: Tom Wijsman <tomwij <AT> gentoo <DOT> org> AuthorDate: Tue Jun 3 11:15:10 2014 +0000 Commit: Brian Dolbec <dolsen <AT> gentoo <DOT> org> CommitDate: Sat Sep 5 21:26:57 2015 +0000 URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=1e94e75c
repoman/main.py: Split USE flag checks to checks/ebuilds/use_flags.py pym/repoman/checks/ebuilds/misc.py | 2 +- pym/repoman/checks/ebuilds/use_flags.py | 85 +++++++++++++++++++++++++++++++++ pym/repoman/main.py | 52 ++++---------------- 3 files changed, 95 insertions(+), 44 deletions(-) diff --git a/pym/repoman/checks/ebuilds/misc.py b/pym/repoman/checks/ebuilds/misc.py index 3bf61f0..744784a 100644 --- a/pym/repoman/checks/ebuilds/misc.py +++ b/pym/repoman/checks/ebuilds/misc.py @@ -39,7 +39,7 @@ def bad_split_check(xpkg, y_ebuild, pkgdir, qatracker): return False -def pkg_invalid(pkg, qatracker): +def pkg_invalid(pkg, qatracker, ebuild): '''Checks for invalid packages @param pkg: _emerge.Package instance diff --git a/pym/repoman/checks/ebuilds/use_flags.py b/pym/repoman/checks/ebuilds/use_flags.py new file mode 100644 index 0000000..bc09ed7 --- /dev/null +++ b/pym/repoman/checks/ebuilds/use_flags.py @@ -0,0 +1,85 @@ + +'''use_flags.py +Performs USE flag related checks +''' + +# import our centrally initialized portage instance +from repoman._portage import portage + +from portage import eapi +from portage.eapi import eapi_has_iuse_defaults, eapi_has_required_use + + +class USEFlagChecks(object): + '''Performs checks on USE flags listed in the ebuilds and metadata.xml''' + + def __init__(self, qatracker, globalUseFlags): + ''' + @param qatracker: QATracker instance + @param globalUseFlags: Global USE flags + ''' + self.qatracker = qatracker + self.useFlags = [] + self.defaultUseFlags = [] + self.usedUseFlags = set() + self.globalUseFlags = globalUseFlags + + def check(self, pkg, package, ebuild, y_ebuild, localUseFlags): + '''Perform the check. + + @param pkg: Package in which we check (object). + @param package: Package in which we check (string). + @param ebuild: Ebuild which we check (object). + @param y_ebuild: Ebuild which we check (string). + @param localUseFlags: Local USE flags of the package + ''' + self._checkGlobal(pkg) + self._checkMetadata(package, ebuild, y_ebuild, localUseFlags) + self._checkRequiredUSE(pkg, ebuild) + + def getUsedUseFlags(self): + '''Get the USE flags that this check has seen''' + return self.usedUseFlags + + def _checkGlobal(self, pkg): + for myflag in pkg._metadata["IUSE"].split(): + flag_name = myflag.lstrip("+-") + self.usedUseFlags.add(flag_name) + if myflag != flag_name: + self.defaultUseFlags.append(myflag) + if flag_name not in self.globalUseFlags: + self.useFlags.append(flag_name) + + def _checkMetadata(self, package, ebuild, y_ebuild, localUseFlags): + for mypos in range(len(self.useFlags) - 1, -1, -1): + if self.useFlags[mypos] and (self.useFlags[mypos] in localUseFlags): + del self.useFlags[mypos] + + if self.defaultUseFlags and not eapi_has_iuse_defaults(eapi): + for myflag in self.defaultUseFlags: + self.qatracker.add_error( + 'EAPI.incompatible', "%s: IUSE defaults" + " not supported with EAPI='%s': '%s'" % ( + ebuild.relative_path, eapi, myflag)) + + for mypos in range(len(self.useFlags)): + self.qatracker.add_error( + "IUSE.invalid", + "%s/%s.ebuild: %s" % (package, y_ebuild, self.useFlags[mypos])) + + def _checkRequiredUSE(self, pkg, ebuild): + required_use = pkg._metadata["REQUIRED_USE"] + if required_use: + if not eapi_has_required_use(eapi): + self.qatracker.add_error( + 'EAPI.incompatible', "%s: REQUIRED_USE" + " not supported with EAPI='%s'" + % (ebuild.relative_path, eapi,)) + try: + portage.dep.check_required_use( + required_use, (), pkg.iuse.is_valid_flag, eapi=eapi) + except portage.exception.InvalidDependString as e: + self.qatracker.add_error( + "REQUIRED_USE.syntax", + "%s: REQUIRED_USE: %s" % (ebuild.relative_path, e)) + del e diff --git a/pym/repoman/main.py b/pym/repoman/main.py index 90c0c14..95af4d4 100755 --- a/pym/repoman/main.py +++ b/pym/repoman/main.py @@ -46,7 +46,6 @@ from portage.output import ConsoleStyleFile, StyleWriter from portage.util import formatter from portage.util import writemsg_level from portage.package.ebuild.digestgen import digestgen -from portage.eapi import eapi_has_iuse_defaults, eapi_has_required_use from repoman.argparser import parse_args from repoman.checks.directories.files import FileChecks @@ -58,6 +57,7 @@ from repoman.checks.ebuilds.manifests import Manifests from repoman.check_missingslot import check_missingslot from repoman.checks.ebuilds.misc import bad_split_check, pkg_invalid from repoman.checks.ebuilds.pkgmetadata import PkgMetadata +from repoman.checks.ebuilds.use_flags import USEFlagChecks from repoman.ebuild import Ebuild from repoman.errors import err from repoman.modules.commit import repochecks @@ -370,7 +370,7 @@ for xpkg in effective_scanlist: continue ################### pkg = pkgs[y_ebuild] - if pkg_invalid(pkg, qatracker): + if pkg_invalid(pkg, qatracker, ebuild): allvalid = False continue @@ -633,32 +633,13 @@ for xpkg in effective_scanlist: badlicsyntax = badlicsyntax > 0 badprovsyntax = badprovsyntax > 0 - # uselist checks - global - myuse = [] - default_use = [] - for myflag in myaux["IUSE"].split(): - flag_name = myflag.lstrip("+-") - used_useflags.add(flag_name) - if myflag != flag_name: - default_use.append(myflag) - if flag_name not in uselist: - myuse.append(flag_name) - - # uselist checks - metadata - for mypos in range(len(myuse) - 1, -1, -1): - if myuse[mypos] and (myuse[mypos] in muselist): - del myuse[mypos] - - if default_use and not eapi_has_iuse_defaults(eapi): - for myflag in default_use: - qatracker.add_error('EAPI.incompatible', - "%s: IUSE defaults" - " not supported with EAPI='%s': '%s'" % - (ebuild.relative_path, eapi, myflag)) - - for mypos in range(len(myuse)): - qatracker.add_error("IUSE.invalid", - xpkg + "/" + y_ebuild + ".ebuild: %s" % myuse[mypos]) + ################# + use_flag_checks = USEFlagChecks(qatracker, uselist) + use_flag_checks.check(pkg, xpkg, ebuild, y_ebuild, muselist) + + ebuild_used_useflags = use_flag_checks.getUsedUseFlags() + used_useflags = used_useflags.union(ebuild_used_useflags) + ################# # Check for outdated RUBY targets old_ruby_eclasses = ["ruby-ng", "ruby-fakegem", "ruby"] @@ -722,21 +703,6 @@ for xpkg in effective_scanlist: for mybad in mybadrestrict: qatracker.add_error("RESTRICT.invalid", xpkg + "/" + y_ebuild + ".ebuild: %s" % mybad) - # REQUIRED_USE check - required_use = myaux["REQUIRED_USE"] - if required_use: - if not eapi_has_required_use(eapi): - qatracker.add_error('EAPI.incompatible', - "%s: REQUIRED_USE" - " not supported with EAPI='%s'" - % (ebuild.relative_path, eapi,)) - try: - portage.dep.check_required_use( - required_use, (), pkg.iuse.is_valid_flag, eapi=eapi) - except portage.exception.InvalidDependString as e: - qatracker.add_error("REQUIRED_USE.syntax", - "%s: REQUIRED_USE: %s" % (ebuild.relative_path, e)) - del e # Syntax Checks