public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Brian Dolbec" <brian.dolbec@gmail.com>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/checks/ebuilds/
Date: Mon, 17 Nov 2014 00:55:25 +0000 (UTC)	[thread overview]
Message-ID: <1416185593.8e3db8774af398521ad69ad4e7a44ab75f1b4654.dol-sen@gentoo> (raw)

commit:     8e3db8774af398521ad69ad4e7a44ab75f1b4654
Author:     Tom Wijsman <tomwij <AT> gentoo <DOT> org>
AuthorDate: Tue Jun  3 11:15:10 2014 +0000
Commit:     Brian Dolbec <brian.dolbec <AT> gmail <DOT> com>
CommitDate: Mon Nov 17 00:53:13 2014 +0000
URL:        http://sources.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=8e3db877

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 fcd4c19..5f21e7a 100755
--- a/pym/repoman/main.py
+++ b/pym/repoman/main.py
@@ -44,7 +44,6 @@ from portage.output import (
 from portage.output import ConsoleStyleFile, StyleWriter
 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
@@ -55,6 +54,7 @@ from repoman.checks.ebuilds.thirdpartymirrors import ThirdPartyMirrors
 from repoman.checks.ebuilds.manifests import Manifests
 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
@@ -367,7 +367,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
 
@@ -626,32 +626,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"]
@@ -715,21 +696,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
 


             reply	other threads:[~2014-11-17  0:55 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-11-17  0:55 Brian Dolbec [this message]
  -- strict thread matches above, loose matches on Subject: below --
2015-09-20  2:06 [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/checks/ebuilds/ Brian Dolbec
2015-09-17  4:51 Brian Dolbec
2015-09-17  4:51 Brian Dolbec
2015-09-17  4:51 Brian Dolbec
2015-09-17  3:08 Brian Dolbec
2015-09-17  3:08 Brian Dolbec
2015-09-17  3:08 Brian Dolbec
2015-09-05 21:48 Brian Dolbec
2015-09-05 21:48 Brian Dolbec
2015-09-05 21:48 Brian Dolbec
2015-08-11 23:54 Brian Dolbec
2015-08-11 23:54 Brian Dolbec
2015-08-10 14:45 Michał Górny
2015-08-10 13:44 Brian Dolbec
2015-08-10 13:44 Brian Dolbec
2015-08-10 13:44 Brian Dolbec
2014-11-17  0:55 Brian Dolbec
2014-11-17  0:55 Brian Dolbec
2014-10-01 23:46 Brian Dolbec
2014-10-01 23:46 Brian Dolbec
2014-10-01 23:46 Brian Dolbec
2014-10-01 23:02 Brian Dolbec
2014-10-01 23:02 Brian Dolbec
2014-06-04 14:18 Tom Wijsman
2014-06-04  9:18 Tom Wijsman
2014-06-03 19:33 Brian Dolbec
2014-06-03 11:16 Tom Wijsman
2014-06-02  6:44 Brian Dolbec
2014-06-02  6:05 Brian Dolbec
2014-06-02  3:35 Brian Dolbec
2014-06-02  1:10 Brian Dolbec
2014-05-30 13:03 Brian Dolbec
2014-05-30 13:03 Brian Dolbec

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1416185593.8e3db8774af398521ad69ad4e7a44ab75f1b4654.dol-sen@gentoo \
    --to=brian.dolbec@gmail.com \
    --cc=gentoo-commits@lists.gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox