* [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/checks/ebuilds/
@ 2014-05-30 13:03 Brian Dolbec
0 siblings, 0 replies; 34+ messages in thread
From: Brian Dolbec @ 2014-05-30 13:03 UTC (permalink / raw
To: gentoo-commits
commit: c74159c33da8945c45b98974274d3db17b882b44
Author: Brian Dolbec <dolsen <AT> gentoo <DOT> org>
AuthorDate: Tue May 27 17:33:12 2014 +0000
Commit: Brian Dolbec <brian.dolbec <AT> gmail <DOT> com>
CommitDate: Tue May 27 17:47:48 2014 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=c74159c3
repoman/main.py: Create checks/ebuilds/manifests.py and Manifests class
This moves manifest checks and creation to it's own class
---
pym/repoman/checks/ebuilds/manifests.py | 91 +++++++++++++++++++++++++++++++++
pym/repoman/main.py | 76 +++------------------------
2 files changed, 99 insertions(+), 68 deletions(-)
diff --git a/pym/repoman/checks/ebuilds/manifests.py b/pym/repoman/checks/ebuilds/manifests.py
new file mode 100644
index 0000000..53c3136
--- /dev/null
+++ b/pym/repoman/checks/ebuilds/manifests.py
@@ -0,0 +1,91 @@
+
+import logging
+import sys
+
+import portage
+from portage import os
+from portage.package.ebuild.digestgen import digestgen
+from portage.util import writemsg_level
+
+
+class Manifests(object):
+
+
+ def __init__(self, options, repoman_settings):
+ self.options = options
+ self.repoman_settings = repoman_settings
+
+ self.digest_only = options.mode != 'manifest-check' and options.digest == 'y'
+ self.generated_manifest = False
+
+
+ def run(self, checkdir, portdb):
+ if self.options.pretend:
+ return False
+ if self.options.mode in ("manifest", 'commit', 'fix') or self.digest_only:
+ failed = False
+ self.auto_assumed = set()
+ fetchlist_dict = portage.FetchlistDict(
+ checkdir, self.repoman_settings, portdb)
+ if self.options.mode == 'manifest' and self.options.force:
+ portage._doebuild_manifest_exempt_depend += 1
+ self.create_manifest(checkdir, fetchlist_dict)
+ self.repoman_settings["O"] = checkdir
+ try:
+ self.generated_manifest = digestgen(
+ mysettings=self.repoman_settings, myportdb=portdb)
+ except portage.exception.PermissionDenied as e:
+ self.generated_manifest = False
+ writemsg_level(
+ "!!! Permission denied: '%s'\n" % (e,),
+ level=logging.ERROR, noiselevel=-1)
+
+ if not self.generated_manifest:
+ print("Unable to generate manifest.")
+ failed = True
+
+ if self.options.mode == "manifest":
+ if not failed and self.options.force and self.auto_assumed and \
+ 'assume-digests' in self.repoman_settings.features:
+ # Show which digests were assumed despite the --force option
+ # being given. This output will already have been shown by
+ # digestgen() if assume-digests is not enabled, so only show
+ # it here if assume-digests is enabled.
+ pkgs = list(fetchlist_dict)
+ pkgs.sort()
+ portage.writemsg_stdout(
+ " digest.assumed %s" %
+ portage.output.colorize(
+ "WARN", str(len(self.auto_assumed)).rjust(18)) + "\n")
+ for cpv in pkgs:
+ fetchmap = fetchlist_dict[cpv]
+ pf = portage.catsplit(cpv)[1]
+ for distfile in sorted(fetchmap):
+ if distfile in self.auto_assumed:
+ portage.writemsg_stdout(
+ " %s::%s\n" % (pf, distfile))
+
+ return True # continue, skip remaining loop code
+ elif failed:
+ sys.exit(1)
+ return False # stay in the loop
+
+
+ def create_manifest(self, checkdir, fetchlist_dict):
+ try:
+ distdir = self.repoman_settings['DISTDIR']
+ mf = self.repoman_settings.repositories.get_repo_for_location(
+ os.path.dirname(os.path.dirname(checkdir)))
+ mf = mf.load_manifest(
+ checkdir, distdir, fetchlist_dict=fetchlist_dict)
+ mf.create(
+ requiredDistfiles=None, assumeDistHashesAlways=True)
+ for distfiles in fetchlist_dict.values():
+ for distfile in distfiles:
+ if os.path.isfile(os.path.join(distdir, distfile)):
+ mf.fhashdict['DIST'].pop(distfile, None)
+ else:
+ self.auto_assumed.add(distfile)
+ mf.write()
+ finally:
+ portage._doebuild_manifest_exempt_depend -= 1
diff --git a/pym/repoman/main.py b/pym/repoman/main.py
index 9e2ba76..46cdefd 100755
--- a/pym/repoman/main.py
+++ b/pym/repoman/main.py
@@ -66,6 +66,7 @@ from portage.eapi import eapi_has_iuse_defaults, eapi_has_required_use
from repoman.argparser import parse_args
from repoman.checks.ebuilds.checks import run_checks, checks_init
from repoman.checks.ebuilds.thirdpartymirrors import ThirdPartyMirrors
+from repoman.checks.ebuilds.manifests import Manifests
from repoman.checks.herds.herdbase import make_herd_base
from repoman.ebuild import Ebuild
from repoman.errors import err
@@ -334,76 +335,15 @@ for x in effective_scanlist:
if repolevel < 2:
checkdir_relative = os.path.join(catdir, checkdir_relative)
checkdir_relative = os.path.join(".", checkdir_relative)
- generated_manifest = False
-
- do_manifest = options.mode == "manifest"
- do_digest_only = options.mode != 'manifest-check' and options.digest == 'y'
- do_commit_or_fix = options.mode in ('commit', 'fix')
- do_something = not options.pretend
-
- if do_manifest or do_digest_only or do_commit_or_fix and do_something:
- auto_assumed = set()
- fetchlist_dict = portage.FetchlistDict(
- checkdir, repoman_settings, portdb)
- if options.mode == 'manifest' and options.force:
- portage._doebuild_manifest_exempt_depend += 1
- try:
- distdir = repoman_settings['DISTDIR']
- mf = repoman_settings.repositories.get_repo_for_location(
- os.path.dirname(os.path.dirname(checkdir)))
- mf = mf.load_manifest(
- checkdir, distdir, fetchlist_dict=fetchlist_dict)
- mf.create(
- requiredDistfiles=None, assumeDistHashesAlways=True)
- for distfiles in fetchlist_dict.values():
- for distfile in distfiles:
- if os.path.isfile(os.path.join(distdir, distfile)):
- mf.fhashdict['DIST'].pop(distfile, None)
- else:
- auto_assumed.add(distfile)
- mf.write()
- finally:
- portage._doebuild_manifest_exempt_depend -= 1
- repoman_settings["O"] = checkdir
- try:
- generated_manifest = digestgen(
- mysettings=repoman_settings, myportdb=portdb)
- except portage.exception.PermissionDenied as e:
- generated_manifest = False
- writemsg_level(
- "!!! Permission denied: '%s'\n" % (e,),
- level=logging.ERROR, noiselevel=-1)
-
- if not generated_manifest:
- print("Unable to generate manifest.")
- dofail = 1
-
- if options.mode == "manifest":
- if not dofail and options.force and auto_assumed and \
- 'assume-digests' in repoman_settings.features:
- # Show which digests were assumed despite the --force option
- # being given. This output will already have been shown by
- # digestgen() if assume-digests is not enabled, so only show
- # it here if assume-digests is enabled.
- pkgs = list(fetchlist_dict)
- pkgs.sort()
- portage.writemsg_stdout(
- " digest.assumed %s" %
- portage.output.colorize(
- "WARN", str(len(auto_assumed)).rjust(18)) + "\n")
- for cpv in pkgs:
- fetchmap = fetchlist_dict[cpv]
- pf = portage.catsplit(cpv)[1]
- for distfile in sorted(fetchmap):
- if distfile in auto_assumed:
- portage.writemsg_stdout(
- " %s::%s\n" % (pf, distfile))
- continue
- elif dofail:
- sys.exit(1)
+#####################
+ manifester = Manifests(options, repoman_settings)
+ skip = manifester.run(checkdir, portdb)
+ if skip:
+ continue
+######################
- if not generated_manifest:
+ if not manifester.generated_manifest:
repoman_settings['O'] = checkdir
repoman_settings['PORTAGE_QUIET'] = '1'
if not portage.digestcheck([], repoman_settings, strict=1):
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/checks/ebuilds/
@ 2014-05-30 13:03 Brian Dolbec
0 siblings, 0 replies; 34+ messages in thread
From: Brian Dolbec @ 2014-05-30 13:03 UTC (permalink / raw
To: gentoo-commits
commit: 750404bb3e8ab5bccdf9d653e8587610fd034e89
Author: Brian Dolbec <dolsen <AT> gentoo <DOT> org>
AuthorDate: Tue May 27 07:13:32 2014 +0000
Commit: Brian Dolbec <brian.dolbec <AT> gmail <DOT> com>
CommitDate: Tue May 27 07:13:32 2014 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=750404bb
repoman/main.py: Break out a new ebuild check, ThirdPartyMirrors
Consolodate the code from 2 locations into one class.
---
pym/repoman/checks/ebuilds/thirdpartymirrors.py | 40 +++++++++++++++++++++++++
pym/repoman/main.py | 32 +++++---------------
2 files changed, 47 insertions(+), 25 deletions(-)
diff --git a/pym/repoman/checks/ebuilds/thirdpartymirrors.py b/pym/repoman/checks/ebuilds/thirdpartymirrors.py
new file mode 100644
index 0000000..976a62c
--- /dev/null
+++ b/pym/repoman/checks/ebuilds/thirdpartymirrors.py
@@ -0,0 +1,40 @@
+
+import portage
+
+
+class ThirdPartyMirrors(object):
+
+ def __init__(self, repoman_settings):
+ # Build a regex from thirdpartymirrors for the SRC_URI.mirror check.
+ self.thirdpartymirrors = {}
+ for k, v in repoman_settings.thirdpartymirrors().items():
+ for v in v:
+ if not v.endswith("/"):
+ v += "/"
+ self.thirdpartymirrors[v] = k
+ self.stats = 0
+ self.fails = []
+
+
+ def check(self, myaux, relative_path):
+ # reset our stats in case this is a repeat run
+ self.stats = 0
+ self.fails = []
+ # Check that URIs don't reference a server from thirdpartymirrors.
+ for uri in portage.dep.use_reduce(
+ myaux["SRC_URI"], matchall=True, is_src_uri=True,
+ eapi=myaux["EAPI"], flat=True):
+ contains_mirror = False
+ for mirror, mirror_alias in self.thirdpartymirrors.items():
+ if uri.startswith(mirror):
+ contains_mirror = True
+ break
+ if not contains_mirror:
+ continue
+
+ new_uri = "mirror://%s/%s" % (mirror_alias, uri[len(mirror):])
+ self.stats += 1
+ self.fails.append(
+ "%s: '%s' found in thirdpartymirrors, use '%s'" %
+ (relative_path, mirror, new_uri))
+ return
diff --git a/pym/repoman/main.py b/pym/repoman/main.py
index 49ad79d..158323e 100755
--- a/pym/repoman/main.py
+++ b/pym/repoman/main.py
@@ -65,6 +65,7 @@ from portage.eapi import eapi_has_iuse_defaults, eapi_has_required_use
from repoman.argparser import parse_args
from repoman.checks.ebuilds.checks import run_checks, checks_init
+from repoman.checks.ebuilds.thirdpartymirrors import ThirdPartyMirrors
from repoman.checks.herds.herdbase import make_herd_base
from repoman.errors import err
from repoman.metadata import (metadata_xml_encoding, metadata_doctype_name,
@@ -303,14 +304,6 @@ if options.include_arches:
check_ebuild_notadded = not \
(vcs_settings.vcs == "svn" and repolevel < 3 and options.mode != "commit")
-# Build a regex from thirdpartymirrors for the SRC_URI.mirror check.
-thirdpartymirrors = {}
-for k, v in repoman_settings.thirdpartymirrors().items():
- for v in v:
- if not v.endswith("/"):
- v += "/"
- thirdpartymirrors[v] = k
-
try:
herd_base = make_herd_base(
os.path.join(repoman_settings["PORTDIR"], "metadata/herds.xml"))
@@ -887,23 +880,12 @@ for x in effective_scanlist:
(relative_path, k, m.start() + 1))
if not src_uri_error:
- # Check that URIs don't reference a server from thirdpartymirrors.
- for uri in portage.dep.use_reduce(
- myaux["SRC_URI"], matchall=True, is_src_uri=True, eapi=eapi, flat=True):
- contains_mirror = False
- for mirror, mirror_alias in thirdpartymirrors.items():
- if uri.startswith(mirror):
- contains_mirror = True
- break
- if not contains_mirror:
- continue
-
- new_uri = "mirror://%s/%s" % (mirror_alias, uri[len(mirror):])
- stats["SRC_URI.mirror"] += 1
- fails["SRC_URI.mirror"].append(
- "%s: '%s' found in thirdpartymirrors, use '%s'" %
- (relative_path, mirror, new_uri))
-
+ #######################
+ thirdparty = ThirdPartyMirrors(repoman_settings)
+ thirdparty.check(myaux, relative_path)
+ stats["SRC_URI.mirror"] = thirdparty.stats
+ fails["SRC_URI.mirror"] = thirdparty.fails
+ #######################
if myaux.get("PROVIDE"):
stats["virtual.oldstyle"] += 1
fails["virtual.oldstyle"].append(relative_path)
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/checks/ebuilds/
@ 2014-06-02 1:10 Brian Dolbec
0 siblings, 0 replies; 34+ messages in thread
From: Brian Dolbec @ 2014-06-02 1:10 UTC (permalink / raw
To: gentoo-commits
commit: 7b48d08d50a9da5514190abc3c70a30372bd7c5d
Author: Brian Dolbec <dolsen <AT> gentoo <DOT> org>
AuthorDate: Mon Jun 2 01:00:05 2014 +0000
Commit: Brian Dolbec <brian.dolbec <AT> gmail <DOT> com>
CommitDate: Mon Jun 2 01:00:05 2014 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=7b48d08d
repoman/main.py: Create IsEbuild class and check
Split the code from main.py into checks/ebuilds/isebuild.py.
---
pym/repoman/checks/ebuilds/isebuild.py | 70 ++++++++++++++++++++++++++++++++++
pym/repoman/main.py | 50 +++++-------------------
2 files changed, 79 insertions(+), 41 deletions(-)
diff --git a/pym/repoman/checks/ebuilds/isebuild.py b/pym/repoman/checks/ebuilds/isebuild.py
new file mode 100644
index 0000000..2369ea6
--- /dev/null
+++ b/pym/repoman/checks/ebuilds/isebuild.py
@@ -0,0 +1,70 @@
+
+import stat
+
+from _emerge.Package import Package
+from _emerge.RootConfig import RootConfig
+
+import portage
+from portage import os
+
+from repoman.qa_data import no_exec, allvars
+
+
+class IsEbuild(object):
+
+
+ def __init__(self, repoman_settings, repo_settings, portdb, qatracker):
+ ''''''
+ self.portdb = portdb
+ self.qatracker = qatracker
+ self.root_config = RootConfig(repoman_settings,
+ repo_settings.trees[repo_settings.root], None)
+
+
+ def check(self, checkdirlist, checkdir, xpkg):
+ self.continue_ = False
+ ebuildlist = []
+ pkgs = {}
+ allvalid = True
+ for y in checkdirlist:
+ file_is_ebuild = y.endswith(".ebuild")
+ file_should_be_non_executable = y in no_exec or file_is_ebuild
+
+ if file_should_be_non_executable:
+ file_is_executable = stat.S_IMODE(
+ os.stat(os.path.join(checkdir, y)).st_mode) & 0o111
+
+ if file_is_executable:
+ self.qatracker.add_error("file.executable", os.path.join(checkdir, y))
+ if file_is_ebuild:
+ pf = y[:-7]
+ ebuildlist.append(pf)
+ catdir = xpkg.split("/")[0]
+ cpv = "%s/%s" % (catdir, pf)
+ try:
+ myaux = dict(zip(allvars, self.portdb.aux_get(cpv, allvars)))
+ except KeyError:
+ allvalid = False
+ self.qatracker.add_error("ebuild.syntax", os.path.join(xpkg, y))
+ continue
+ except IOError:
+ allvalid = False
+ self.qatracker.add_error("ebuild.output", os.path.join(xpkg, y))
+ continue
+ if not portage.eapi_is_supported(myaux["EAPI"]):
+ allvalid = False
+ self.qatracker.add_error("EAPI.unsupported", os.path.join(xpkg, y))
+ continue
+ pkgs[pf] = Package(
+ cpv=cpv, metadata=myaux, root_config=self.root_config,
+ type_name="ebuild")
+
+ if len(pkgs) != len(ebuildlist):
+ # If we can't access all the metadata then it's totally unsafe to
+ # commit since there's no way to generate a correct Manifest.
+ # Do not try to do any more QA checks on this package since missing
+ # metadata leads to false positives for several checks, and false
+ # positives confuse users.
+ self.continue_ = True
+
+ return pkgs, allvalid
diff --git a/pym/repoman/main.py b/pym/repoman/main.py
index 3a1ff7a..6a7ada7 100755
--- a/pym/repoman/main.py
+++ b/pym/repoman/main.py
@@ -11,7 +11,6 @@ import io
import logging
import re
import signal
-import stat
import subprocess
import sys
import tempfile
@@ -45,7 +44,6 @@ from portage import os
from portage import _encodings
from portage import _unicode_encode
from _emerge.Package import Package
-from _emerge.RootConfig import RootConfig
from _emerge.userquery import userquery
import portage.checksum
import portage.const
@@ -65,6 +63,7 @@ from portage.eapi import eapi_has_iuse_defaults, eapi_has_required_use
from repoman.argparser import parse_args
from repoman.checks.ebuilds.checks import run_checks, checks_init
+from repoman.checks.ebuilds.isebuild import IsEbuild
from repoman.checks.ebuilds.thirdpartymirrors import ThirdPartyMirrors
from repoman.checks.ebuilds.manifests import Manifests
from repoman.checks.herds.herdbase import make_herd_base
@@ -75,7 +74,7 @@ from repoman.metadata import (metadata_xml_encoding, metadata_doctype_name,
from repoman.modules import commit
from repoman.profile import check_profiles, dev_keywords, setup_profile
from repoman.qa_data import (format_qa_output, format_qa_output_column, qahelp,
- qawarnings, qacats, no_exec, allvars, max_desc_len, missingvars,
+ qawarnings, qacats, max_desc_len, missingvars,
ruby_deprecated, suspect_virtual, suspect_rdepend, valid_restrict)
from qa_tracker import QATracker
from repoman.repos import has_global_mask, RepoSettings, repo_metadata
@@ -206,7 +205,6 @@ repoman_settings.categories = frozenset(
categories = repoman_settings.categories
portdb.settings = repoman_settings
-root_config = RootConfig(repoman_settings, repo_settings.trees[repo_settings.root], None)
# We really only need to cache the metadata that's necessary for visibility
# filtering. Anything else can be discarded to reduce memory consumption.
portdb._aux_cache_keys.clear()
@@ -351,44 +349,11 @@ for xpkg in effective_scanlist:
continue
checkdirlist = os.listdir(checkdir)
- ebuildlist = []
- pkgs = {}
- allvalid = True
- for y in checkdirlist:
- file_is_ebuild = y.endswith(".ebuild")
- file_should_be_non_executable = y in no_exec or file_is_ebuild
-
- if file_should_be_non_executable:
- file_is_executable = stat.S_IMODE(
- os.stat(os.path.join(checkdir, y)).st_mode) & 0o111
-
- if file_is_executable:
- qatracker.add_error("file.executable", os.path.join(checkdir, y))
- if file_is_ebuild:
- pf = y[:-7]
- ebuildlist.append(pf)
- cpv = "%s/%s" % (catdir, pf)
- try:
- myaux = dict(zip(allvars, portdb.aux_get(cpv, allvars)))
- except KeyError:
- allvalid = False
- qatracker.add_error("ebuild.syntax", os.path.join(xpkg, y))
- continue
- except IOError:
- allvalid = False
- qatracker.add_error("ebuild.output", os.path.join(xpkg, y))
- continue
- if not portage.eapi_is_supported(myaux["EAPI"]):
- allvalid = False
- qatracker.add_error("EAPI.unsupported", os.path.join(xpkg, y))
- continue
- pkgs[pf] = Package(
- cpv=cpv, metadata=myaux, root_config=root_config,
- type_name="ebuild")
- slot_keywords = {}
-
- if len(pkgs) != len(ebuildlist):
+######################
+ is_ebuild = IsEbuild(repoman_settings, repo_settings, portdb, qatracker)
+ pkgs, allvalid = is_ebuild.check(checkdirlist, checkdir, xpkg)
+ if is_ebuild.continue_:
# If we can't access all the metadata then it's totally unsafe to
# commit since there's no way to generate a correct Manifest.
# Do not try to do any more QA checks on this package since missing
@@ -396,6 +361,9 @@ for xpkg in effective_scanlist:
# positives confuse users.
can_force = False
continue
+######################
+
+ slot_keywords = {}
# Sort ebuilds in ascending order for the KEYWORDS.dropped check.
ebuildlist = sorted(pkgs.values())
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/checks/ebuilds/
@ 2014-06-02 3:35 Brian Dolbec
0 siblings, 0 replies; 34+ messages in thread
From: Brian Dolbec @ 2014-06-02 3:35 UTC (permalink / raw
To: gentoo-commits
commit: b808cf28d451235f53d38d70d04a30838dce07a7
Author: Brian Dolbec <dolsen <AT> gentoo <DOT> org>
AuthorDate: Mon Jun 2 01:48:31 2014 +0000
Commit: Brian Dolbec <brian.dolbec <AT> gmail <DOT> com>
CommitDate: Mon Jun 2 01:48:31 2014 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=b808cf28
Repoman Manifests: Move some additional code to manifests.py
Move the digest check to the Manifests class.
Optimize usage to use the new qatracker system.
---
pym/repoman/checks/ebuilds/manifests.py | 20 +++++++++++++++-----
pym/repoman/main.py | 14 ++++----------
2 files changed, 19 insertions(+), 15 deletions(-)
diff --git a/pym/repoman/checks/ebuilds/manifests.py b/pym/repoman/checks/ebuilds/manifests.py
index 53c3136..c9eda54 100644
--- a/pym/repoman/checks/ebuilds/manifests.py
+++ b/pym/repoman/checks/ebuilds/manifests.py
@@ -11,8 +11,9 @@ from portage.util import writemsg_level
class Manifests(object):
- def __init__(self, options, repoman_settings):
+ def __init__(self, options, qatracker, repoman_settings):
self.options = options
+ self.qatracker = qatracker
self.repoman_settings = repoman_settings
self.digest_only = options.mode != 'manifest-check' and options.digest == 'y'
@@ -41,7 +42,8 @@ class Manifests(object):
level=logging.ERROR, noiselevel=-1)
if not self.generated_manifest:
- print("Unable to generate manifest.")
+ writemsg_level("Unable to generate manifest.",
+ level=logging.ERROR, noiselevel=-1)
failed = True
if self.options.mode == "manifest":
@@ -64,11 +66,11 @@ class Manifests(object):
if distfile in self.auto_assumed:
portage.writemsg_stdout(
" %s::%s\n" % (pf, distfile))
-
- return True # continue, skip remaining loop code
+ # continue, skip remaining main loop code
+ return True
elif failed:
sys.exit(1)
- return False # stay in the loop
+ return False
def create_manifest(self, checkdir, fetchlist_dict):
@@ -89,3 +91,11 @@ class Manifests(object):
mf.write()
finally:
portage._doebuild_manifest_exempt_depend -= 1
+
+
+ def digest_check(self, checkdir):
+ self.repoman_settings['O'] = checkdir
+ self.repoman_settings['PORTAGE_QUIET'] = '1'
+ if not portage.digestcheck([], self.repoman_settings, strict=1):
+ self.qatracker.add_error("manifest.bad", os.path.join(xpkg, 'Manifest'))
+ self.repoman_settings.pop('PORTAGE_QUIET', None)
diff --git a/pym/repoman/main.py b/pym/repoman/main.py
index af7c52b..1649c9f 100755
--- a/pym/repoman/main.py
+++ b/pym/repoman/main.py
@@ -326,18 +326,12 @@ for xpkg in effective_scanlist:
checkdir_relative = os.path.join(".", checkdir_relative)
#####################
- manifester = Manifests(options, repoman_settings)
- continue_ = manifester.run(checkdir, portdb)
- if continue_:
+ manifester = Manifests(options, qatracker, repoman_settings)
+ if manifester.run(checkdir, portdb):
continue
-######################
-
if not manifester.generated_manifest:
- repoman_settings['O'] = checkdir
- repoman_settings['PORTAGE_QUIET'] = '1'
- if not portage.digestcheck([], repoman_settings, strict=1):
- qatracker.add_error("manifest.bad", os.path.join(xpkg, 'Manifest'))
- repoman_settings.pop('PORTAGE_QUIET', None)
+ manifester.digest_check(checkdir)
+######################
if options.mode == 'manifest-check':
continue
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/checks/ebuilds/
@ 2014-06-02 6:05 Brian Dolbec
0 siblings, 0 replies; 34+ messages in thread
From: Brian Dolbec @ 2014-06-02 6:05 UTC (permalink / raw
To: gentoo-commits
commit: fc8b6617dfc742e683af929de7ad6d8ab70d9dc6
Author: Brian Dolbec <dolsen <AT> gentoo <DOT> org>
AuthorDate: Mon Jun 2 05:31:45 2014 +0000
Commit: Brian Dolbec <brian.dolbec <AT> gmail <DOT> com>
CommitDate: Mon Jun 2 05:31:45 2014 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=fc8b6617
repoman/main.py: Create FetchChecks class
Create the new class in checks/ebuilds/fetches.py.
---
pym/repoman/checks/ebuilds/fetches.py | 132 ++++++++++++++++++++++++++++++++++
pym/repoman/main.py | 96 ++-----------------------
2 files changed, 139 insertions(+), 89 deletions(-)
diff --git a/pym/repoman/checks/ebuilds/fetches.py b/pym/repoman/checks/ebuilds/fetches.py
new file mode 100644
index 0000000..3d59339
--- /dev/null
+++ b/pym/repoman/checks/ebuilds/fetches.py
@@ -0,0 +1,132 @@
+
+'''fetches.py
+Performs the src_uri fetchlist and files checks
+'''
+
+from stat import S_ISDIR
+
+import portage
+from portage import os
+
+
+class FetchChecks(object):
+ '''Performs checks on the files needed for the ebuild'''
+
+ def __init__(self, qatracker, repoman_settings, repo_settings, portdb,
+ vcs_settings, vcs_new_changed):
+ '''
+ @param qatracker: QATracker instance
+ @param repoman_settings: settings instance
+ @param repo_settings: repository settings instance
+ @param portdb: portdb instance
+ '''
+ self.portdb = portdb
+ self.qatracker = qatracker
+ self.repo_settings = repo_settings
+ self.repoman_settings = repoman_settings
+ self.vcs_settings = vcs_settings
+ self.vcs_new_changed = vcs_new_changed
+ self._digests = None
+
+
+ def check(self, xpkg, checkdir, checkdir_relative):
+ '''Checks the ebuild sources and files for errors
+
+ @param xpkg: the pacakge being checked
+ @param checkdir: string, directory path
+ @param checkdir_relative: repolevel determined path
+ '''
+ self.checkdir = checkdir
+ fetchlist_dict = portage.FetchlistDict(checkdir, self.repoman_settings, self.portdb)
+ myfiles_all = []
+ self.src_uri_error = False
+ for mykey in fetchlist_dict:
+ try:
+ myfiles_all.extend(fetchlist_dict[mykey])
+ except portage.exception.InvalidDependString as e:
+ self.src_uri_error = True
+ try:
+ self.portdb.aux_get(mykey, ["SRC_URI"])
+ except KeyError:
+ # This will be reported as an "ebuild.syntax" error.
+ pass
+ else:
+ self.qatracker.add_error("SRC_URI.syntax",
+ "%s.ebuild SRC_URI: %s" % (mykey, e))
+ del fetchlist_dict
+ if not self.src_uri_error:
+ # This test can produce false positives if SRC_URI could not
+ # be parsed for one or more ebuilds. There's no point in
+ # producing a false error here since the root cause will
+ # produce a valid error elsewhere, such as "SRC_URI.syntax"
+ # or "ebuild.sytax".
+ myfiles_all = set(myfiles_all)
+ for entry in self.digests:
+ if entry not in myfiles_all:
+ self.qatracker.add_error("digest.unused", checkdir + "::" + entry)
+ for entry in myfiles_all:
+ if entry not in self.digests:
+ self.qatracker.add_error("digest.missing", checkdir + "::" + entry)
+ del myfiles_all
+
+ if os.path.exists(checkdir + "/files"):
+ filesdirlist = os.listdir(checkdir + "/files")
+
+ # Recurse through files directory, use filesdirlist as a stack;
+ # appending directories as needed,
+ # so people can't hide > 20k files in a subdirectory.
+ while filesdirlist:
+ y = filesdirlist.pop(0)
+ relative_path = os.path.join(xpkg, "files", y)
+ full_path = os.path.join(self.repo_settings.repodir, relative_path)
+ try:
+ mystat = os.stat(full_path)
+ except OSError as oe:
+ if oe.errno == 2:
+ # don't worry about it. it likely was removed via fix above.
+ continue
+ else:
+ raise oe
+ if S_ISDIR(mystat.st_mode):
+ # !!! VCS "portability" alert! Need some function isVcsDir() or alike !!!
+ if y == "CVS" or y == ".svn":
+ continue
+ for z in os.listdir(checkdir + "/files/" + y):
+ if z == "CVS" or z == ".svn":
+ continue
+ filesdirlist.append(y + "/" + z)
+ # Current policy is no files over 20 KiB, these are the checks.
+ # File size between 20 KiB and 60 KiB causes a warning,
+ # while file size over 60 KiB causes an error.
+ elif mystat.st_size > 61440:
+ self.qatracker.add_error("file.size.fatal",
+ "(%d KiB) %s/files/%s" % (mystat.st_size // 1024, xpkg, y))
+ elif mystat.st_size > 20480:
+ self.qatracker.add_error("file.size",
+ "(%d KiB) %s/files/%s" % (mystat.st_size // 1024, xpkg, y))
+
+ index = self.repo_settings.repo_config.find_invalid_path_char(y)
+ if index != -1:
+ y_relative = os.path.join(checkdir_relative, "files", y)
+ if self.vcs_settings.vcs is not None and not self.vcs_new_changed(y_relative):
+ # If the file isn't in the VCS new or changed set, then
+ # assume that it's an irrelevant temporary file (Manifest
+ # entries are not generated for file names containing
+ # prohibited characters). See bug #406877.
+ index = -1
+ if index != -1:
+ self.qatracker.add_error("file.name",
+ "%s/files/%s: char '%s'" % (checkdir, y, y[index]))
+
+
+ @property
+ def digests(self):
+ '''Property function, returns the saved digests or
+ loads them for the test'''
+ if not self._digests:
+ mf = self.repoman_settings.repositories.get_repo_for_location(
+ os.path.dirname(os.path.dirname(self.checkdir)))
+ mf = mf.load_manifest(self.checkdir, self.repoman_settings["DISTDIR"])
+ self._digests = mf.getTypeDigests("DIST")
+ del mf
+ return self._digests
diff --git a/pym/repoman/main.py b/pym/repoman/main.py
index d80cf59..ffb9929 100755
--- a/pym/repoman/main.py
+++ b/pym/repoman/main.py
@@ -16,7 +16,6 @@ import sys
import tempfile
import platform
from itertools import chain
-from stat import S_ISDIR
from os import path as osp
pym_path = osp.join(osp.dirname(osp.dirname(osp.realpath(__file__)))) #, "pym")
@@ -47,6 +46,7 @@ from portage.eapi import eapi_has_iuse_defaults, eapi_has_required_use
from repoman.argparser import parse_args
from repoman.checks.ebuilds.checks import run_checks, checks_init
+from repoman.checks.ebuilds.fetches import FetchChecks
from repoman.checks.ebuilds.isebuild import IsEbuild
from repoman.checks.ebuilds.thirdpartymirrors import ThirdPartyMirrors
from repoman.checks.ebuilds.manifests import Manifests
@@ -369,93 +369,11 @@ for xpkg in effective_scanlist:
status_check.check(check_ebuild_notadded)
eadded.extend(status_check.eadded)
###############
-
- mf = repoman_settings.repositories.get_repo_for_location(
- os.path.dirname(os.path.dirname(checkdir)))
- mf = mf.load_manifest(checkdir, repoman_settings["DISTDIR"])
- mydigests = mf.getTypeDigests("DIST")
-
- fetchlist_dict = portage.FetchlistDict(checkdir, repoman_settings, portdb)
- myfiles_all = []
- src_uri_error = False
- for mykey in fetchlist_dict:
- try:
- myfiles_all.extend(fetchlist_dict[mykey])
- except portage.exception.InvalidDependString as e:
- src_uri_error = True
- try:
- portdb.aux_get(mykey, ["SRC_URI"])
- except KeyError:
- # This will be reported as an "ebuild.syntax" error.
- pass
- else:
- qatracker.add_error("SRC_URI.syntax",
- "%s.ebuild SRC_URI: %s" % (mykey, e))
- del fetchlist_dict
- if not src_uri_error:
- # This test can produce false positives if SRC_URI could not
- # be parsed for one or more ebuilds. There's no point in
- # producing a false error here since the root cause will
- # produce a valid error elsewhere, such as "SRC_URI.syntax"
- # or "ebuild.sytax".
- myfiles_all = set(myfiles_all)
- for entry in mydigests:
- if entry not in myfiles_all:
- qatracker.add_error("digest.unused", checkdir + "::" + entry)
- for entry in myfiles_all:
- if entry not in mydigests:
- qatracker.add_error("digest.missing", checkdir + "::" + entry)
- del myfiles_all
-
- if os.path.exists(checkdir + "/files"):
- filesdirlist = os.listdir(checkdir + "/files")
-
- # Recurse through files directory, use filesdirlist as a stack;
- # appending directories as needed,
- # so people can't hide > 20k files in a subdirectory.
- while filesdirlist:
- y = filesdirlist.pop(0)
- relative_path = os.path.join(xpkg, "files", y)
- full_path = os.path.join(repo_settings.repodir, relative_path)
- try:
- mystat = os.stat(full_path)
- except OSError as oe:
- if oe.errno == 2:
- # don't worry about it. it likely was removed via fix above.
- continue
- else:
- raise oe
- if S_ISDIR(mystat.st_mode):
- # !!! VCS "portability" alert! Need some function isVcsDir() or alike !!!
- if y == "CVS" or y == ".svn":
- continue
- for z in os.listdir(checkdir + "/files/" + y):
- if z == "CVS" or z == ".svn":
- continue
- filesdirlist.append(y + "/" + z)
- # Current policy is no files over 20 KiB, these are the checks.
- # File size between 20 KiB and 60 KiB causes a warning,
- # while file size over 60 KiB causes an error.
- elif mystat.st_size > 61440:
- qatracker.add_error("file.size.fatal",
- "(%d KiB) %s/files/%s" % (mystat.st_size // 1024, xpkg, y))
- elif mystat.st_size > 20480:
- qatracker.add_error("file.size",
- "(%d KiB) %s/files/%s" % (mystat.st_size // 1024, xpkg, y))
-
- index = repo_settings.repo_config.find_invalid_path_char(y)
- if index != -1:
- y_relative = os.path.join(checkdir_relative, "files", y)
- if vcs_settings.vcs is not None and not vcs_new_changed(y_relative):
- # If the file isn't in the VCS new or changed set, then
- # assume that it's an irrelevant temporary file (Manifest
- # entries are not generated for file names containing
- # prohibited characters). See bug #406877.
- index = -1
- if index != -1:
- qatracker.add_error("file.name",
- "%s/files/%s: char '%s'" % (checkdir, y, y[index]))
- del mydigests
+#################
+ fetchcheck = FetchChecks(qatracker, repoman_settings, repo_settings, portdb,
+ vcs_settings, vcs_new_changed)
+ fetchcheck.check(xpkg, checkdir, checkdir_relative)
+#################
if check_changelog and "ChangeLog" not in checkdirlist:
qatracker.add_error("changelog.missing", xpkg + "/ChangeLog")
@@ -535,7 +453,7 @@ for xpkg in effective_scanlist:
"character at position %s" %
(ebuild.relative_path, k, m.start() + 1))
- if not src_uri_error:
+ if not fetchcheck.src_uri_error:
#######################
thirdparty = ThirdPartyMirrors(repoman_settings, qatracker)
thirdparty.check(myaux, ebuild.relative_path)
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/checks/ebuilds/
@ 2014-06-02 6:44 Brian Dolbec
0 siblings, 0 replies; 34+ messages in thread
From: Brian Dolbec @ 2014-06-02 6:44 UTC (permalink / raw
To: gentoo-commits
commit: 71ed484f67919a13f97bfa4e0e9a251119df0c99
Author: Brian Dolbec <dolsen <AT> gentoo <DOT> org>
AuthorDate: Mon Jun 2 06:43:19 2014 +0000
Commit: Brian Dolbec <brian.dolbec <AT> gmail <DOT> com>
CommitDate: Mon Jun 2 06:43:19 2014 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=71ed484f
repoman/main.py: Split out some small ebuild checks functions
Create new checks/ebuilds/misc.py file
Add bad_split_check().
Add pkg_invalid().
---
pym/repoman/checks/ebuilds/misc.py | 54 ++++++++++++++++++++++++++++++++++++++
pym/repoman/main.py | 29 ++++----------------
2 files changed, 59 insertions(+), 24 deletions(-)
diff --git a/pym/repoman/checks/ebuilds/misc.py b/pym/repoman/checks/ebuilds/misc.py
new file mode 100644
index 0000000..c1edd2c
--- /dev/null
+++ b/pym/repoman/checks/ebuilds/misc.py
@@ -0,0 +1,54 @@
+
+'''repoman/checks/ebuilds/misc.py
+Miscelaneous ebuild check functions'''
+
+import re
+
+import portage
+
+
+pv_toolong_re = re.compile(r'[0-9]{19,}')
+
+
+def bad_split_check(xpkg, y_ebuild, pkgdir, qatracker):
+ '''Checks for bad category/package splits.
+
+ @param xpkg: the pacakge being checked
+ @param y_ebuild: string of the ebuild name being tested
+ @param pkgdir: string: path
+ @param qatracker: QATracker instance
+ '''
+ myesplit = portage.pkgsplit(y_ebuild)
+
+ is_bad_split = myesplit is None or myesplit[0] != xpkg.split("/")[-1]
+
+ if is_bad_split:
+ is_pv_toolong = pv_toolong_re.search(myesplit[1])
+ is_pv_toolong2 = pv_toolong_re.search(myesplit[2])
+
+ if is_pv_toolong or is_pv_toolong2:
+ qatracker.add_error("ebuild.invalidname",
+ xpkg + "/" + y_ebuild + ".ebuild")
+ return True
+ elif myesplit[0] != pkgdir:
+ print(pkgdir, myesplit[0])
+ qatracker.add_error("ebuild.namenomatch",
+ xpkg + "/" + y_ebuild + ".ebuild")
+ return True
+ return False
+
+
+def pkg_invalid(pkg, qatracker):
+ '''Checks for invalid packages
+
+ @param pkg: _emerge.Package instance
+ @param qatracker: QATracker instance
+ @return boolean:
+ '''
+ if pkg.invalid:
+ for k, msgs in pkg.invalid.items():
+ for msg in msgs:
+ qatracker.add_error(k,
+ "%s: %s" % (ebuild.relative_path, msg))
+ return True
+ return False
diff --git a/pym/repoman/main.py b/pym/repoman/main.py
index 9db52c0..c680752 100755
--- a/pym/repoman/main.py
+++ b/pym/repoman/main.py
@@ -51,6 +51,7 @@ from repoman.checks.ebuilds.fetches import FetchChecks
from repoman.checks.ebuilds.isebuild import IsEbuild
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.ebuild import Ebuild
from repoman.errors import err
@@ -76,8 +77,6 @@ util.initialize_logger()
commitmessage = None
-pv_toolong_re = re.compile(r'[0-9]{19,}')
-
bad = create_color_func("BAD")
live_eclasses = portage.const.LIVE_ECLASSES
@@ -368,32 +367,14 @@ for xpkg in effective_scanlist:
# ebuild not added to vcs
qatracker.add_error("ebuild.notadded",
xpkg + "/" + y_ebuild + ".ebuild")
- myesplit = portage.pkgsplit(y_ebuild)
-
- is_bad_split = myesplit is None or myesplit[0] != xpkg.split("/")[-1]
-
- if is_bad_split:
- is_pv_toolong = pv_toolong_re.search(myesplit[1])
- is_pv_toolong2 = pv_toolong_re.search(myesplit[2])
- if is_pv_toolong or is_pv_toolong2:
- qatracker.add_error("ebuild.invalidname",
- xpkg + "/" + y_ebuild + ".ebuild")
- continue
- elif myesplit[0] != pkgdir:
- print(pkgdir, myesplit[0])
- qatracker.add_error("ebuild.namenomatch",
- xpkg + "/" + y_ebuild + ".ebuild")
+##################
+ if bad_split_check(xpkg, y_ebuild, pkgdir, qatracker):
continue
-
+###################
pkg = pkgs[y_ebuild]
-
- if pkg.invalid:
+ if pkg_invalid(pkg, qatracker):
allvalid = False
- for k, msgs in pkg.invalid.items():
- for msg in msgs:
- qatracker.add_error(k,
- "%s: %s" % (ebuild.relative_path, msg))
continue
myaux = pkg._metadata
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/checks/ebuilds/
@ 2014-06-03 11:16 Tom Wijsman
0 siblings, 0 replies; 34+ messages in thread
From: Tom Wijsman @ 2014-06-03 11:16 UTC (permalink / raw
To: gentoo-commits
commit: 7593143201d5566724a1c8ed875c4ab9f6296b99
Author: Tom Wijsman <tomwij <AT> gentoo <DOT> org>
AuthorDate: Tue Jun 3 11:15:10 2014 +0000
Commit: Tom Wijsman <tomwij <AT> gentoo <DOT> org>
CommitDate: Tue Jun 3 11:15:10 2014 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=75931432
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 b1b676c..c698265 100755
--- a/pym/repoman/main.py
+++ b/pym/repoman/main.py
@@ -37,7 +37,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
@@ -48,6 +47,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
@@ -360,7 +360,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
@@ -617,32 +617,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"]
@@ -706,21 +687,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
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/checks/ebuilds/
@ 2014-06-03 19:33 Brian Dolbec
0 siblings, 0 replies; 34+ messages in thread
From: Brian Dolbec @ 2014-06-03 19:33 UTC (permalink / raw
To: gentoo-commits
commit: d7ebf107b68630eef02eaa4f74f69252854e31bb
Author: Brian Dolbec <dolsen <AT> gentoo <DOT> org>
AuthorDate: Tue Jun 3 19:20:43 2014 +0000
Commit: Brian Dolbec <brian.dolbec <AT> gmail <DOT> com>
CommitDate: Tue Jun 3 19:20:43 2014 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=d7ebf107
Repoman: Refactor PkgMetadata and XmlLint classes for variable data passed in
Move all non-consistent data to be passed in via the check functions.
Initialize XmlLint once in the PkgMetadata class __init__().
---
pym/repoman/_xml.py | 33 ++++++++++++++++++++++---------
pym/repoman/checks/ebuilds/pkgmetadata.py | 12 +++++------
2 files changed, 30 insertions(+), 15 deletions(-)
diff --git a/pym/repoman/_xml.py b/pym/repoman/_xml.py
index b97c027..d5b5a5e 100644
--- a/pym/repoman/_xml.py
+++ b/pym/repoman/_xml.py
@@ -14,6 +14,8 @@ from repoman._subprocess import repoman_getstatusoutput
class _XMLParser(xml.etree.ElementTree.XMLParser):
+
+
def __init__(self, data, **kwargs):
xml.etree.ElementTree.XMLParser.__init__(self, **kwargs)
self._portage_data = data
@@ -25,11 +27,13 @@ class _XMLParser(xml.etree.ElementTree.XMLParser):
self.parser.StartDoctypeDeclHandler = \
self._portage_StartDoctypeDeclHandler
+
def _portage_XmlDeclHandler(self, version, encoding, standalone):
if self._base_XmlDeclHandler is not None:
self._base_XmlDeclHandler(version, encoding, standalone)
self._portage_data["XML_DECLARATION"] = (version, encoding, standalone)
+
def _portage_StartDoctypeDeclHandler(
self, doctypeName, systemId, publicId, has_internal_subset):
if self._base_StartDoctypeDeclHandler is not None:
@@ -49,33 +53,44 @@ class _MetadataTreeBuilder(xml.etree.ElementTree.TreeBuilder):
class XmlLint(object):
- def __init__(self, options, repolevel, repoman_settings):
+ def __init__(self, options, repoman_settings):
self.metadata_dtd = os.path.join(repoman_settings["DISTDIR"], 'metadata.dtd')
+ self.options = options
+ self.repoman_settings = repoman_settings
self._is_capable = False
self.binary = None
- self._check_capable(options, repolevel, repoman_settings)
+ self._check_capable()
+
- def _check_capable(self, options, repolevel, repoman_settings):
- if options.mode == "manifest":
+ def _check_capable(self):
+ if self.options.mode == "manifest":
return
self.binary = find_binary('xmllint')
if not self.binary:
print(red("!!! xmllint not found. Can't check metadata.xml.\n"))
- if options.xml_parse or repolevel == 3:
- print("%s sorry, xmllint is needed. failing\n" % red("!!!"))
- sys.exit(1)
else:
- if not fetch_metadata_dtd(self.metadata_dtd, repoman_settings):
+ if not fetch_metadata_dtd(self.metadata_dtd, self.repoman_settings):
sys.exit(1)
# this can be problematic if xmllint changes their output
self._is_capable = True
+
@property
def capable(self):
return self._is_capable
- def check(self, checkdir):
+
+ def check(self, checkdir, repolevel):
+ '''Runs checks on the package metadata.xml file
+
+ @param checkdir: string, path
+ @param repolevel: integer
+ @return boolean, False == bad metadata
+ '''
if not self.capable:
+ if self.options.xml_parse or repolevel == 3:
+ print("%s sorry, xmllint is needed. failing\n" % red("!!!"))
+ sys.exit(1)
return True
# xmlint can produce garbage output even on success, so only dump
# the ouput when it fails.
diff --git a/pym/repoman/checks/ebuilds/pkgmetadata.py b/pym/repoman/checks/ebuilds/pkgmetadata.py
index 0778696..674d32f 100644
--- a/pym/repoman/checks/ebuilds/pkgmetadata.py
+++ b/pym/repoman/checks/ebuilds/pkgmetadata.py
@@ -38,27 +38,28 @@ from repoman._xml import _XMLParser, _MetadataTreeBuilder, XmlLint
class PkgMetadata(object):
'''Package metadata.xml checks'''
- def __init__(self, options, qatracker, repolevel, repoman_settings):
+ def __init__(self, options, qatracker, repoman_settings):
'''PkgMetadata init function
@param options: ArgumentParser.parse_known_args(argv[1:]) options
@param qatracker: QATracker instance
- @param repolevel: integer
@param repoman_settings: settings instance
'''
self.options = options
self.qatracker = qatracker
- self.repolevel = repolevel
self.repoman_settings = repoman_settings
self.musedict = {}
+ self.xmllint = XmlLint(self.options, self.repoman_settings)
+
- def check(self, xpkg, checkdir, checkdirlist):
+ def check(self, xpkg, checkdir, checkdirlist, repolevel):
'''Performs the checks on the metadata.xml for the package
@param xpkg: the pacakge being checked
@param checkdir: string, directory path
@param checkdirlist: list of checkdir's
+ @param repolevel: integer
'''
self.musedict = {}
@@ -165,8 +166,7 @@ class PkgMetadata(object):
# Only carry out if in package directory or check forced
if not metadata_bad:
- xmllint = XmlLint(self.options, self.repolevel, self.repoman_settings)
- if not xmllint.check(checkdir):
+ if not self.xmllint.check(checkdir, repolevel):
self.qatracker.add_error("metadata.bad", xpkg + "/metadata.xml")
del metadata_bad
return
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/checks/ebuilds/
@ 2014-06-04 9:18 Tom Wijsman
0 siblings, 0 replies; 34+ messages in thread
From: Tom Wijsman @ 2014-06-04 9:18 UTC (permalink / raw
To: gentoo-commits
commit: 916886782e5a4123d95ce50e2593d9c2bb114995
Author: Tom Wijsman <tomwij <AT> gentoo <DOT> org>
AuthorDate: Wed Jun 4 09:17:12 2014 +0000
Commit: Tom Wijsman <tomwij <AT> gentoo <DOT> org>
CommitDate: Wed Jun 4 09:17:12 2014 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=91688678
repoman/main.py: Split KEYWORDS checks to checks/ebuilds/keywords.py
---
pym/repoman/checks/ebuilds/keywords.py | 67 ++++++++++++++++++++++++++++++++++
pym/repoman/main.py | 32 ++++------------
2 files changed, 75 insertions(+), 24 deletions(-)
diff --git a/pym/repoman/checks/ebuilds/keywords.py b/pym/repoman/checks/ebuilds/keywords.py
new file mode 100644
index 0000000..29de0db
--- /dev/null
+++ b/pym/repoman/checks/ebuilds/keywords.py
@@ -0,0 +1,67 @@
+
+'''keywords.py
+Perform KEYWORDS related checks
+'''
+
+
+class KeywordChecks(object):
+ '''Perform checks on the KEYWORDS of an ebuild'''
+
+ def __init__(self, qatracker):
+ '''
+ @param qatracker: QATracker instance
+ '''
+ self.qatracker = qatracker
+ self.slot_keywords = {}
+
+ def prepare(self):
+ '''Prepare the checks for the next package.'''
+ self.slot_keywords = {}
+
+ def check(
+ self, pkg, package, ebuild, y_ebuild, keywords, ebuild_archs, changed,
+ live_ebuild):
+ '''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 keywords: All the keywords (including -...) of the ebuild.
+ @param ebuild_archs: Just the architectures (no prefixes) of the ebuild.
+ @param changed: Changes instance
+ @param slot_keywords: A dictionary of keywords per slot.
+ @param live_ebuild: A boolean that determines if this is a live ebuild.
+ '''
+ self._checkAddedWithStableKeywords(
+ package, ebuild, y_ebuild, keywords, changed)
+ self._checkForDroppedKeywords(
+ pkg, ebuild, ebuild_archs, live_ebuild)
+
+ self.slot_keywords[pkg.slot].update(ebuild_archs)
+
+ def _checkAddedWithStableKeywords(
+ self, package, ebuild, y_ebuild, keywords, changed):
+ catdir, pkgdir = package.split("/")
+
+ is_stable = lambda kw: not kw.startswith("~") and not kw.startswith("-")
+ stable_keywords = list(filter(is_stable, keywords))
+ if stable_keywords:
+ if ebuild.ebuild_path in changed.new_ebuilds and catdir != "virtual":
+ stable_keywords.sort()
+ self.qatracker.add_error(
+ "KEYWORDS.stable",
+ "%s/%s.ebuild added with stable keywords: %s" %
+ (package, y_ebuild, " ".join(stable_keywords)))
+
+ def _checkForDroppedKeywords(
+ self, pkg, ebuild, ebuild_archs, live_ebuild):
+ previous_keywords = self.slot_keywords.get(pkg.slot)
+ if previous_keywords is None:
+ self.slot_keywords[pkg.slot] = set()
+ elif ebuild_archs and "*" not in ebuild_archs and not live_ebuild:
+ dropped_keywords = previous_keywords.difference(ebuild_archs)
+ if dropped_keywords:
+ self.qatracker.add_error("KEYWORDS.dropped",
+ "%s: %s" %
+ (ebuild.relative_path, " ".join(sorted(dropped_keywords))))
\ No newline at end of file
diff --git a/pym/repoman/main.py b/pym/repoman/main.py
index b347369..62c1509 100755
--- a/pym/repoman/main.py
+++ b/pym/repoman/main.py
@@ -42,6 +42,7 @@ from repoman.argparser import parse_args
from repoman.checks.directories.files import FileChecks
from repoman.checks.ebuilds.checks import run_checks, checks_init
from repoman.checks.ebuilds.fetches import FetchChecks
+from repoman.checks.ebuilds.keywords import KeywordChecks
from repoman.checks.ebuilds.isebuild import IsEbuild
from repoman.checks.ebuilds.thirdpartymirrors import ThirdPartyMirrors
from repoman.checks.ebuilds.manifests import Manifests
@@ -274,7 +275,7 @@ fetchcheck = FetchChecks(qatracker, repoman_settings, repo_settings, portdb,
pkgmeta = PkgMetadata(options, qatracker, repoman_settings)
thirdparty = ThirdPartyMirrors(repoman_settings, qatracker)
use_flag_checks = USEFlagChecks(qatracker, uselist)
-
+keywordcheck = KeywordChecks(qatracker)
for xpkg in effective_scanlist:
# ebuilds and digests added to cvs respectively.
@@ -315,7 +316,7 @@ for xpkg in effective_scanlist:
continue
######################
- slot_keywords = {}
+ keywordcheck.prepare()
# Sort ebuilds in ascending order for the KEYWORDS.dropped check.
ebuildlist = sorted(pkgs.values())
@@ -425,32 +426,15 @@ for xpkg in effective_scanlist:
(ebuild.relative_path, len(myaux['DESCRIPTION']), max_desc_len))
keywords = myaux["KEYWORDS"].split()
- stable_keywords = []
- for keyword in keywords:
- if not keyword.startswith("~") and \
- not keyword.startswith("-"):
- stable_keywords.append(keyword)
- if stable_keywords:
- if ebuild.ebuild_path in changed.new_ebuilds and catdir != "virtual":
- stable_keywords.sort()
- qatracker.add_error("KEYWORDS.stable",
- "%s/%s.ebuild added with stable keywords: %s" %
- (xpkg, y_ebuild, " ".join(stable_keywords)))
ebuild_archs = set(
kw.lstrip("~") for kw in keywords if not kw.startswith("-"))
- previous_keywords = slot_keywords.get(pkg.slot)
- if previous_keywords is None:
- slot_keywords[pkg.slot] = set()
- elif ebuild_archs and "*" not in ebuild_archs and not live_ebuild:
- dropped_keywords = previous_keywords.difference(ebuild_archs)
- if dropped_keywords:
- qatracker.add_error("KEYWORDS.dropped",
- "%s: %s" %
- (ebuild.relative_path, " ".join(sorted(dropped_keywords))))
-
- slot_keywords[pkg.slot].update(ebuild_archs)
+ #######################
+ keywordcheck.check(
+ pkg, xpkg, ebuild, y_ebuild, keywords, ebuild_archs, changed,
+ live_ebuild)
+ #######################
# KEYWORDS="-*" is a stupid replacement for package.mask
# and screws general KEYWORDS semantics
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/checks/ebuilds/
@ 2014-06-04 14:18 Tom Wijsman
0 siblings, 0 replies; 34+ messages in thread
From: Tom Wijsman @ 2014-06-04 14:18 UTC (permalink / raw
To: gentoo-commits
commit: 86498a4b2fcedd7c9d461da1114a347d5df997de
Author: Tom Wijsman <tomwij <AT> gentoo <DOT> org>
AuthorDate: Wed Jun 4 14:17:49 2014 +0000
Commit: Tom Wijsman <tomwij <AT> gentoo <DOT> org>
CommitDate: Wed Jun 4 14:17:49 2014 +0000
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=86498a4b
repoman/main.py: More KEYWORDS checks to checks/ebuilds/keywords.py
---
pym/repoman/checks/ebuilds/keywords.py | 64 ++++++++++++++++++++++++++++++----
pym/repoman/main.py | 32 +----------------
2 files changed, 59 insertions(+), 37 deletions(-)
diff --git a/pym/repoman/checks/ebuilds/keywords.py b/pym/repoman/checks/ebuilds/keywords.py
index 29de0db..bec7a1d 100644
--- a/pym/repoman/checks/ebuilds/keywords.py
+++ b/pym/repoman/checks/ebuilds/keywords.py
@@ -20,7 +20,7 @@ class KeywordChecks(object):
def check(
self, pkg, package, ebuild, y_ebuild, keywords, ebuild_archs, changed,
- live_ebuild):
+ live_ebuild, kwlist, profiles):
'''Perform the check.
@param pkg: Package in which we check (object).
@@ -32,20 +32,31 @@ class KeywordChecks(object):
@param changed: Changes instance
@param slot_keywords: A dictionary of keywords per slot.
@param live_ebuild: A boolean that determines if this is a live ebuild.
+ @param kwlist: A list of all global keywords.
+ @param profiles: A list of all profiles.
'''
self._checkAddedWithStableKeywords(
package, ebuild, y_ebuild, keywords, changed)
+
self._checkForDroppedKeywords(
pkg, ebuild, ebuild_archs, live_ebuild)
+ self._checkForInvalidKeywords(
+ pkg, package, y_ebuild, kwlist, profiles)
+
+ self._checkForMaskLikeKeywords(
+ package, y_ebuild, keywords, kwlist)
+
self.slot_keywords[pkg.slot].update(ebuild_archs)
+ def _isKeywordStable(self, keyword):
+ return not keyword.startswith("~") and not keyword.startswith("-")
+
def _checkAddedWithStableKeywords(
self, package, ebuild, y_ebuild, keywords, changed):
catdir, pkgdir = package.split("/")
- is_stable = lambda kw: not kw.startswith("~") and not kw.startswith("-")
- stable_keywords = list(filter(is_stable, keywords))
+ stable_keywords = list(filter(self._isKeywordStable, keywords))
if stable_keywords:
if ebuild.ebuild_path in changed.new_ebuilds and catdir != "virtual":
stable_keywords.sort()
@@ -62,6 +73,47 @@ class KeywordChecks(object):
elif ebuild_archs and "*" not in ebuild_archs and not live_ebuild:
dropped_keywords = previous_keywords.difference(ebuild_archs)
if dropped_keywords:
- self.qatracker.add_error("KEYWORDS.dropped",
- "%s: %s" %
- (ebuild.relative_path, " ".join(sorted(dropped_keywords))))
\ No newline at end of file
+ self.qatracker.add_error(
+ "KEYWORDS.dropped", "%s: %s" % (
+ ebuild.relative_path,
+ " ".join(sorted(dropped_keywords))))
+
+ def _checkForInvalidKeywords(
+ self, pkg, package, y_ebuild, kwlist, profiles):
+ myuse = pkg._metadata["KEYWORDS"].split()
+
+ for mykey in myuse:
+ if mykey not in ("-*", "*", "~*"):
+ myskey = mykey
+
+ if not self._isKeywordStable(myskey[:1]):
+ myskey = myskey[1:]
+
+ if myskey not in kwlist:
+ self.qatracker.add_error(
+ "KEYWORDS.invalid",
+ "%s/%s.ebuild: %s" % (
+ package, y_ebuild, mykey))
+ elif myskey not in profiles:
+ self.qatracker.add_error(
+ "KEYWORDS.invalid",
+ "%s/%s.ebuild: %s (profile invalid)" % (
+ package, y_ebuild, mykey))
+
+ def _checkForMaskLikeKeywords(
+ self, package, y_ebuild, keywords, kwlist):
+
+ # KEYWORDS="-*" is a stupid replacement for package.mask
+ # and screws general KEYWORDS semantics
+ if "-*" in keywords:
+ haskeyword = False
+
+ for kw in keywords:
+ if kw[0] == "~":
+ kw = kw[1:]
+ if kw in kwlist:
+ haskeyword = True
+
+ if not haskeyword:
+ self.qatracker.add_error(
+ "KEYWORDS.stupid", package + "/" + y_ebuild + ".ebuild")
diff --git a/pym/repoman/main.py b/pym/repoman/main.py
index 5762abd..649fc84 100755
--- a/pym/repoman/main.py
+++ b/pym/repoman/main.py
@@ -440,22 +440,9 @@ for xpkg in effective_scanlist:
#######################
keywordcheck.check(
pkg, xpkg, ebuild, y_ebuild, keywords, ebuild_archs, changed,
- live_ebuild)
+ live_ebuild, kwlist, profiles)
#######################
- # KEYWORDS="-*" is a stupid replacement for package.mask
- # and screws general KEYWORDS semantics
- if "-*" in keywords:
- haskeyword = False
- for kw in keywords:
- if kw[0] == "~":
- kw = kw[1:]
- if kw in kwlist:
- haskeyword = True
- if not haskeyword:
- qatracker.add_error("KEYWORDS.stupid",
- xpkg + "/" + y_ebuild + ".ebuild")
-
if live_ebuild and repo_settings.repo_config.name == "gentoo":
#######################
liveeclasscheck.check(
@@ -622,23 +609,6 @@ for xpkg in effective_scanlist:
qatracker.add_error("LICENSE.deprecated",
"%s: %s" % (ebuild.relative_path, lic))
- # keyword checks
- myuse = myaux["KEYWORDS"].split()
- for mykey in myuse:
- if mykey not in ("-*", "*", "~*"):
- myskey = mykey
- if myskey[:1] == "-":
- myskey = myskey[1:]
- if myskey[:1] == "~":
- myskey = myskey[1:]
- if myskey not in kwlist:
- qatracker.add_error("KEYWORDS.invalid",
- "%s/%s.ebuild: %s" % (xpkg, y_ebuild, mykey))
- elif myskey not in profiles:
- qatracker.add_error("KEYWORDS.invalid",
- "%s/%s.ebuild: %s (profile invalid)"
- % (xpkg, y_ebuild, mykey))
-
# restrict checks
myrestrict = None
try:
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/checks/ebuilds/
@ 2014-10-01 23:02 Brian Dolbec
0 siblings, 0 replies; 34+ messages in thread
From: Brian Dolbec @ 2014-10-01 23:02 UTC (permalink / raw
To: gentoo-commits
commit: c925718100adf9048b36e99d0a5816fcb87012c6
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: Wed Oct 1 22:58:13 2014 +0000
URL: http://sources.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=c9257181
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
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/checks/ebuilds/
@ 2014-10-01 23:02 Brian Dolbec
0 siblings, 0 replies; 34+ messages in thread
From: Brian Dolbec @ 2014-10-01 23:02 UTC (permalink / raw
To: gentoo-commits
commit: 3a5cad45548f3acc695226ea78e2c0a4577149c3
Author: Brian Dolbec <dolsen <AT> gentoo <DOT> org>
AuthorDate: Tue Jun 3 19:20:43 2014 +0000
Commit: Brian Dolbec <brian.dolbec <AT> gmail <DOT> com>
CommitDate: Wed Oct 1 22:58:13 2014 +0000
URL: http://sources.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=3a5cad45
Repoman: Refactor PkgMetadata and XmlLint classes for variable data passed in
Move all non-consistent data to be passed in via the check functions.
Initialize XmlLint once in the PkgMetadata class __init__().
---
pym/repoman/_xml.py | 33 ++++++++++++++++++++++---------
pym/repoman/checks/ebuilds/pkgmetadata.py | 12 +++++------
2 files changed, 30 insertions(+), 15 deletions(-)
diff --git a/pym/repoman/_xml.py b/pym/repoman/_xml.py
index b97c027..d5b5a5e 100644
--- a/pym/repoman/_xml.py
+++ b/pym/repoman/_xml.py
@@ -14,6 +14,8 @@ from repoman._subprocess import repoman_getstatusoutput
class _XMLParser(xml.etree.ElementTree.XMLParser):
+
+
def __init__(self, data, **kwargs):
xml.etree.ElementTree.XMLParser.__init__(self, **kwargs)
self._portage_data = data
@@ -25,11 +27,13 @@ class _XMLParser(xml.etree.ElementTree.XMLParser):
self.parser.StartDoctypeDeclHandler = \
self._portage_StartDoctypeDeclHandler
+
def _portage_XmlDeclHandler(self, version, encoding, standalone):
if self._base_XmlDeclHandler is not None:
self._base_XmlDeclHandler(version, encoding, standalone)
self._portage_data["XML_DECLARATION"] = (version, encoding, standalone)
+
def _portage_StartDoctypeDeclHandler(
self, doctypeName, systemId, publicId, has_internal_subset):
if self._base_StartDoctypeDeclHandler is not None:
@@ -49,33 +53,44 @@ class _MetadataTreeBuilder(xml.etree.ElementTree.TreeBuilder):
class XmlLint(object):
- def __init__(self, options, repolevel, repoman_settings):
+ def __init__(self, options, repoman_settings):
self.metadata_dtd = os.path.join(repoman_settings["DISTDIR"], 'metadata.dtd')
+ self.options = options
+ self.repoman_settings = repoman_settings
self._is_capable = False
self.binary = None
- self._check_capable(options, repolevel, repoman_settings)
+ self._check_capable()
+
- def _check_capable(self, options, repolevel, repoman_settings):
- if options.mode == "manifest":
+ def _check_capable(self):
+ if self.options.mode == "manifest":
return
self.binary = find_binary('xmllint')
if not self.binary:
print(red("!!! xmllint not found. Can't check metadata.xml.\n"))
- if options.xml_parse or repolevel == 3:
- print("%s sorry, xmllint is needed. failing\n" % red("!!!"))
- sys.exit(1)
else:
- if not fetch_metadata_dtd(self.metadata_dtd, repoman_settings):
+ if not fetch_metadata_dtd(self.metadata_dtd, self.repoman_settings):
sys.exit(1)
# this can be problematic if xmllint changes their output
self._is_capable = True
+
@property
def capable(self):
return self._is_capable
- def check(self, checkdir):
+
+ def check(self, checkdir, repolevel):
+ '''Runs checks on the package metadata.xml file
+
+ @param checkdir: string, path
+ @param repolevel: integer
+ @return boolean, False == bad metadata
+ '''
if not self.capable:
+ if self.options.xml_parse or repolevel == 3:
+ print("%s sorry, xmllint is needed. failing\n" % red("!!!"))
+ sys.exit(1)
return True
# xmlint can produce garbage output even on success, so only dump
# the ouput when it fails.
diff --git a/pym/repoman/checks/ebuilds/pkgmetadata.py b/pym/repoman/checks/ebuilds/pkgmetadata.py
index 0778696..674d32f 100644
--- a/pym/repoman/checks/ebuilds/pkgmetadata.py
+++ b/pym/repoman/checks/ebuilds/pkgmetadata.py
@@ -38,27 +38,28 @@ from repoman._xml import _XMLParser, _MetadataTreeBuilder, XmlLint
class PkgMetadata(object):
'''Package metadata.xml checks'''
- def __init__(self, options, qatracker, repolevel, repoman_settings):
+ def __init__(self, options, qatracker, repoman_settings):
'''PkgMetadata init function
@param options: ArgumentParser.parse_known_args(argv[1:]) options
@param qatracker: QATracker instance
- @param repolevel: integer
@param repoman_settings: settings instance
'''
self.options = options
self.qatracker = qatracker
- self.repolevel = repolevel
self.repoman_settings = repoman_settings
self.musedict = {}
+ self.xmllint = XmlLint(self.options, self.repoman_settings)
+
- def check(self, xpkg, checkdir, checkdirlist):
+ def check(self, xpkg, checkdir, checkdirlist, repolevel):
'''Performs the checks on the metadata.xml for the package
@param xpkg: the pacakge being checked
@param checkdir: string, directory path
@param checkdirlist: list of checkdir's
+ @param repolevel: integer
'''
self.musedict = {}
@@ -165,8 +166,7 @@ class PkgMetadata(object):
# Only carry out if in package directory or check forced
if not metadata_bad:
- xmllint = XmlLint(self.options, self.repolevel, self.repoman_settings)
- if not xmllint.check(checkdir):
+ if not self.xmllint.check(checkdir, repolevel):
self.qatracker.add_error("metadata.bad", xpkg + "/metadata.xml")
del metadata_bad
return
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/checks/ebuilds/
@ 2014-10-01 23:46 Brian Dolbec
0 siblings, 0 replies; 34+ messages in thread
From: Brian Dolbec @ 2014-10-01 23:46 UTC (permalink / raw
To: gentoo-commits
commit: 6df89d303139784089ebf5a6fecfc560a9f7ec1d
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: Wed Oct 1 23:45:33 2014 +0000
URL: http://sources.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=6df89d30
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
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/checks/ebuilds/
@ 2014-10-01 23:46 Brian Dolbec
0 siblings, 0 replies; 34+ messages in thread
From: Brian Dolbec @ 2014-10-01 23:46 UTC (permalink / raw
To: gentoo-commits
commit: 7dc0305c383403bb643d8e9cba967064c87aa1c6
Author: Brian Dolbec <dolsen <AT> gentoo <DOT> org>
AuthorDate: Tue Jun 3 19:20:43 2014 +0000
Commit: Brian Dolbec <brian.dolbec <AT> gmail <DOT> com>
CommitDate: Wed Oct 1 23:45:33 2014 +0000
URL: http://sources.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=7dc0305c
Repoman: Refactor PkgMetadata and XmlLint classes for variable data passed in
Move all non-consistent data to be passed in via the check functions.
Initialize XmlLint once in the PkgMetadata class __init__().
---
pym/repoman/_xml.py | 33 ++++++++++++++++++++++---------
pym/repoman/checks/ebuilds/pkgmetadata.py | 12 +++++------
2 files changed, 30 insertions(+), 15 deletions(-)
diff --git a/pym/repoman/_xml.py b/pym/repoman/_xml.py
index b97c027..d5b5a5e 100644
--- a/pym/repoman/_xml.py
+++ b/pym/repoman/_xml.py
@@ -14,6 +14,8 @@ from repoman._subprocess import repoman_getstatusoutput
class _XMLParser(xml.etree.ElementTree.XMLParser):
+
+
def __init__(self, data, **kwargs):
xml.etree.ElementTree.XMLParser.__init__(self, **kwargs)
self._portage_data = data
@@ -25,11 +27,13 @@ class _XMLParser(xml.etree.ElementTree.XMLParser):
self.parser.StartDoctypeDeclHandler = \
self._portage_StartDoctypeDeclHandler
+
def _portage_XmlDeclHandler(self, version, encoding, standalone):
if self._base_XmlDeclHandler is not None:
self._base_XmlDeclHandler(version, encoding, standalone)
self._portage_data["XML_DECLARATION"] = (version, encoding, standalone)
+
def _portage_StartDoctypeDeclHandler(
self, doctypeName, systemId, publicId, has_internal_subset):
if self._base_StartDoctypeDeclHandler is not None:
@@ -49,33 +53,44 @@ class _MetadataTreeBuilder(xml.etree.ElementTree.TreeBuilder):
class XmlLint(object):
- def __init__(self, options, repolevel, repoman_settings):
+ def __init__(self, options, repoman_settings):
self.metadata_dtd = os.path.join(repoman_settings["DISTDIR"], 'metadata.dtd')
+ self.options = options
+ self.repoman_settings = repoman_settings
self._is_capable = False
self.binary = None
- self._check_capable(options, repolevel, repoman_settings)
+ self._check_capable()
+
- def _check_capable(self, options, repolevel, repoman_settings):
- if options.mode == "manifest":
+ def _check_capable(self):
+ if self.options.mode == "manifest":
return
self.binary = find_binary('xmllint')
if not self.binary:
print(red("!!! xmllint not found. Can't check metadata.xml.\n"))
- if options.xml_parse or repolevel == 3:
- print("%s sorry, xmllint is needed. failing\n" % red("!!!"))
- sys.exit(1)
else:
- if not fetch_metadata_dtd(self.metadata_dtd, repoman_settings):
+ if not fetch_metadata_dtd(self.metadata_dtd, self.repoman_settings):
sys.exit(1)
# this can be problematic if xmllint changes their output
self._is_capable = True
+
@property
def capable(self):
return self._is_capable
- def check(self, checkdir):
+
+ def check(self, checkdir, repolevel):
+ '''Runs checks on the package metadata.xml file
+
+ @param checkdir: string, path
+ @param repolevel: integer
+ @return boolean, False == bad metadata
+ '''
if not self.capable:
+ if self.options.xml_parse or repolevel == 3:
+ print("%s sorry, xmllint is needed. failing\n" % red("!!!"))
+ sys.exit(1)
return True
# xmlint can produce garbage output even on success, so only dump
# the ouput when it fails.
diff --git a/pym/repoman/checks/ebuilds/pkgmetadata.py b/pym/repoman/checks/ebuilds/pkgmetadata.py
index 0778696..674d32f 100644
--- a/pym/repoman/checks/ebuilds/pkgmetadata.py
+++ b/pym/repoman/checks/ebuilds/pkgmetadata.py
@@ -38,27 +38,28 @@ from repoman._xml import _XMLParser, _MetadataTreeBuilder, XmlLint
class PkgMetadata(object):
'''Package metadata.xml checks'''
- def __init__(self, options, qatracker, repolevel, repoman_settings):
+ def __init__(self, options, qatracker, repoman_settings):
'''PkgMetadata init function
@param options: ArgumentParser.parse_known_args(argv[1:]) options
@param qatracker: QATracker instance
- @param repolevel: integer
@param repoman_settings: settings instance
'''
self.options = options
self.qatracker = qatracker
- self.repolevel = repolevel
self.repoman_settings = repoman_settings
self.musedict = {}
+ self.xmllint = XmlLint(self.options, self.repoman_settings)
+
- def check(self, xpkg, checkdir, checkdirlist):
+ def check(self, xpkg, checkdir, checkdirlist, repolevel):
'''Performs the checks on the metadata.xml for the package
@param xpkg: the pacakge being checked
@param checkdir: string, directory path
@param checkdirlist: list of checkdir's
+ @param repolevel: integer
'''
self.musedict = {}
@@ -165,8 +166,7 @@ class PkgMetadata(object):
# Only carry out if in package directory or check forced
if not metadata_bad:
- xmllint = XmlLint(self.options, self.repolevel, self.repoman_settings)
- if not xmllint.check(checkdir):
+ if not self.xmllint.check(checkdir, repolevel):
self.qatracker.add_error("metadata.bad", xpkg + "/metadata.xml")
del metadata_bad
return
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/checks/ebuilds/
@ 2014-10-01 23:46 Brian Dolbec
0 siblings, 0 replies; 34+ messages in thread
From: Brian Dolbec @ 2014-10-01 23:46 UTC (permalink / raw
To: gentoo-commits
commit: 3488df72f0af643234e5d05b519334e169822e0d
Author: Tom Wijsman <tomwij <AT> gentoo <DOT> org>
AuthorDate: Wed Jun 4 09:17:12 2014 +0000
Commit: Brian Dolbec <brian.dolbec <AT> gmail <DOT> com>
CommitDate: Wed Oct 1 23:45:34 2014 +0000
URL: http://sources.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=3488df72
repoman/main.py: Split KEYWORDS checks to checks/ebuilds/keywords.py
---
pym/repoman/checks/ebuilds/keywords.py | 67 ++++++++++++++++++++++++++++++++++
pym/repoman/main.py | 32 ++++------------
2 files changed, 75 insertions(+), 24 deletions(-)
diff --git a/pym/repoman/checks/ebuilds/keywords.py b/pym/repoman/checks/ebuilds/keywords.py
new file mode 100644
index 0000000..29de0db
--- /dev/null
+++ b/pym/repoman/checks/ebuilds/keywords.py
@@ -0,0 +1,67 @@
+
+'''keywords.py
+Perform KEYWORDS related checks
+'''
+
+
+class KeywordChecks(object):
+ '''Perform checks on the KEYWORDS of an ebuild'''
+
+ def __init__(self, qatracker):
+ '''
+ @param qatracker: QATracker instance
+ '''
+ self.qatracker = qatracker
+ self.slot_keywords = {}
+
+ def prepare(self):
+ '''Prepare the checks for the next package.'''
+ self.slot_keywords = {}
+
+ def check(
+ self, pkg, package, ebuild, y_ebuild, keywords, ebuild_archs, changed,
+ live_ebuild):
+ '''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 keywords: All the keywords (including -...) of the ebuild.
+ @param ebuild_archs: Just the architectures (no prefixes) of the ebuild.
+ @param changed: Changes instance
+ @param slot_keywords: A dictionary of keywords per slot.
+ @param live_ebuild: A boolean that determines if this is a live ebuild.
+ '''
+ self._checkAddedWithStableKeywords(
+ package, ebuild, y_ebuild, keywords, changed)
+ self._checkForDroppedKeywords(
+ pkg, ebuild, ebuild_archs, live_ebuild)
+
+ self.slot_keywords[pkg.slot].update(ebuild_archs)
+
+ def _checkAddedWithStableKeywords(
+ self, package, ebuild, y_ebuild, keywords, changed):
+ catdir, pkgdir = package.split("/")
+
+ is_stable = lambda kw: not kw.startswith("~") and not kw.startswith("-")
+ stable_keywords = list(filter(is_stable, keywords))
+ if stable_keywords:
+ if ebuild.ebuild_path in changed.new_ebuilds and catdir != "virtual":
+ stable_keywords.sort()
+ self.qatracker.add_error(
+ "KEYWORDS.stable",
+ "%s/%s.ebuild added with stable keywords: %s" %
+ (package, y_ebuild, " ".join(stable_keywords)))
+
+ def _checkForDroppedKeywords(
+ self, pkg, ebuild, ebuild_archs, live_ebuild):
+ previous_keywords = self.slot_keywords.get(pkg.slot)
+ if previous_keywords is None:
+ self.slot_keywords[pkg.slot] = set()
+ elif ebuild_archs and "*" not in ebuild_archs and not live_ebuild:
+ dropped_keywords = previous_keywords.difference(ebuild_archs)
+ if dropped_keywords:
+ self.qatracker.add_error("KEYWORDS.dropped",
+ "%s: %s" %
+ (ebuild.relative_path, " ".join(sorted(dropped_keywords))))
\ No newline at end of file
diff --git a/pym/repoman/main.py b/pym/repoman/main.py
index 8a1a043..05d9a14 100755
--- a/pym/repoman/main.py
+++ b/pym/repoman/main.py
@@ -49,6 +49,7 @@ from repoman.argparser import parse_args
from repoman.checks.directories.files import FileChecks
from repoman.checks.ebuilds.checks import run_checks, checks_init
from repoman.checks.ebuilds.fetches import FetchChecks
+from repoman.checks.ebuilds.keywords import KeywordChecks
from repoman.checks.ebuilds.isebuild import IsEbuild
from repoman.checks.ebuilds.thirdpartymirrors import ThirdPartyMirrors
from repoman.checks.ebuilds.manifests import Manifests
@@ -281,7 +282,7 @@ fetchcheck = FetchChecks(qatracker, repoman_settings, repo_settings, portdb,
pkgmeta = PkgMetadata(options, qatracker, repoman_settings)
thirdparty = ThirdPartyMirrors(repoman_settings, qatracker)
use_flag_checks = USEFlagChecks(qatracker, uselist)
-
+keywordcheck = KeywordChecks(qatracker)
for xpkg in effective_scanlist:
# ebuilds and digests added to cvs respectively.
@@ -322,7 +323,7 @@ for xpkg in effective_scanlist:
continue
######################
- slot_keywords = {}
+ keywordcheck.prepare()
# Sort ebuilds in ascending order for the KEYWORDS.dropped check.
ebuildlist = sorted(pkgs.values())
@@ -427,32 +428,15 @@ for xpkg in effective_scanlist:
(ebuild.relative_path, len(myaux['DESCRIPTION']), max_desc_len))
keywords = myaux["KEYWORDS"].split()
- stable_keywords = []
- for keyword in keywords:
- if not keyword.startswith("~") and \
- not keyword.startswith("-"):
- stable_keywords.append(keyword)
- if stable_keywords:
- if ebuild.ebuild_path in changed.new_ebuilds and catdir != "virtual":
- stable_keywords.sort()
- qatracker.add_error("KEYWORDS.stable",
- "%s/%s.ebuild added with stable keywords: %s" %
- (xpkg, y_ebuild, " ".join(stable_keywords)))
ebuild_archs = set(
kw.lstrip("~") for kw in keywords if not kw.startswith("-"))
- previous_keywords = slot_keywords.get(pkg.slot)
- if previous_keywords is None:
- slot_keywords[pkg.slot] = set()
- elif ebuild_archs and "*" not in ebuild_archs and not live_ebuild:
- dropped_keywords = previous_keywords.difference(ebuild_archs)
- if dropped_keywords:
- qatracker.add_error("KEYWORDS.dropped",
- "%s: %s" %
- (ebuild.relative_path, " ".join(sorted(dropped_keywords))))
-
- slot_keywords[pkg.slot].update(ebuild_archs)
+ #######################
+ keywordcheck.check(
+ pkg, xpkg, ebuild, y_ebuild, keywords, ebuild_archs, changed,
+ live_ebuild)
+ #######################
# KEYWORDS="-*" is a stupid replacement for package.mask
# and screws general KEYWORDS semantics
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/checks/ebuilds/
@ 2014-11-17 0:55 Brian Dolbec
0 siblings, 0 replies; 34+ messages in thread
From: Brian Dolbec @ 2014-11-17 0:55 UTC (permalink / raw
To: gentoo-commits
commit: 177a5b647a326784e2274476feaf5a6bd6596075
Author: Tom Wijsman <tomwij <AT> gentoo <DOT> org>
AuthorDate: Wed Jun 4 14:17:49 2014 +0000
Commit: Brian Dolbec <brian.dolbec <AT> gmail <DOT> com>
CommitDate: Mon Nov 17 00:53:14 2014 +0000
URL: http://sources.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=177a5b64
repoman/main.py: More KEYWORDS checks to checks/ebuilds/keywords.py
---
pym/repoman/checks/ebuilds/keywords.py | 64 ++++++++++++++++++++++++++++++----
pym/repoman/main.py | 32 +----------------
2 files changed, 59 insertions(+), 37 deletions(-)
diff --git a/pym/repoman/checks/ebuilds/keywords.py b/pym/repoman/checks/ebuilds/keywords.py
index 29de0db..bec7a1d 100644
--- a/pym/repoman/checks/ebuilds/keywords.py
+++ b/pym/repoman/checks/ebuilds/keywords.py
@@ -20,7 +20,7 @@ class KeywordChecks(object):
def check(
self, pkg, package, ebuild, y_ebuild, keywords, ebuild_archs, changed,
- live_ebuild):
+ live_ebuild, kwlist, profiles):
'''Perform the check.
@param pkg: Package in which we check (object).
@@ -32,20 +32,31 @@ class KeywordChecks(object):
@param changed: Changes instance
@param slot_keywords: A dictionary of keywords per slot.
@param live_ebuild: A boolean that determines if this is a live ebuild.
+ @param kwlist: A list of all global keywords.
+ @param profiles: A list of all profiles.
'''
self._checkAddedWithStableKeywords(
package, ebuild, y_ebuild, keywords, changed)
+
self._checkForDroppedKeywords(
pkg, ebuild, ebuild_archs, live_ebuild)
+ self._checkForInvalidKeywords(
+ pkg, package, y_ebuild, kwlist, profiles)
+
+ self._checkForMaskLikeKeywords(
+ package, y_ebuild, keywords, kwlist)
+
self.slot_keywords[pkg.slot].update(ebuild_archs)
+ def _isKeywordStable(self, keyword):
+ return not keyword.startswith("~") and not keyword.startswith("-")
+
def _checkAddedWithStableKeywords(
self, package, ebuild, y_ebuild, keywords, changed):
catdir, pkgdir = package.split("/")
- is_stable = lambda kw: not kw.startswith("~") and not kw.startswith("-")
- stable_keywords = list(filter(is_stable, keywords))
+ stable_keywords = list(filter(self._isKeywordStable, keywords))
if stable_keywords:
if ebuild.ebuild_path in changed.new_ebuilds and catdir != "virtual":
stable_keywords.sort()
@@ -62,6 +73,47 @@ class KeywordChecks(object):
elif ebuild_archs and "*" not in ebuild_archs and not live_ebuild:
dropped_keywords = previous_keywords.difference(ebuild_archs)
if dropped_keywords:
- self.qatracker.add_error("KEYWORDS.dropped",
- "%s: %s" %
- (ebuild.relative_path, " ".join(sorted(dropped_keywords))))
\ No newline at end of file
+ self.qatracker.add_error(
+ "KEYWORDS.dropped", "%s: %s" % (
+ ebuild.relative_path,
+ " ".join(sorted(dropped_keywords))))
+
+ def _checkForInvalidKeywords(
+ self, pkg, package, y_ebuild, kwlist, profiles):
+ myuse = pkg._metadata["KEYWORDS"].split()
+
+ for mykey in myuse:
+ if mykey not in ("-*", "*", "~*"):
+ myskey = mykey
+
+ if not self._isKeywordStable(myskey[:1]):
+ myskey = myskey[1:]
+
+ if myskey not in kwlist:
+ self.qatracker.add_error(
+ "KEYWORDS.invalid",
+ "%s/%s.ebuild: %s" % (
+ package, y_ebuild, mykey))
+ elif myskey not in profiles:
+ self.qatracker.add_error(
+ "KEYWORDS.invalid",
+ "%s/%s.ebuild: %s (profile invalid)" % (
+ package, y_ebuild, mykey))
+
+ def _checkForMaskLikeKeywords(
+ self, package, y_ebuild, keywords, kwlist):
+
+ # KEYWORDS="-*" is a stupid replacement for package.mask
+ # and screws general KEYWORDS semantics
+ if "-*" in keywords:
+ haskeyword = False
+
+ for kw in keywords:
+ if kw[0] == "~":
+ kw = kw[1:]
+ if kw in kwlist:
+ haskeyword = True
+
+ if not haskeyword:
+ self.qatracker.add_error(
+ "KEYWORDS.stupid", package + "/" + y_ebuild + ".ebuild")
diff --git a/pym/repoman/main.py b/pym/repoman/main.py
index 1107c63..e338d82 100755
--- a/pym/repoman/main.py
+++ b/pym/repoman/main.py
@@ -442,22 +442,9 @@ for xpkg in effective_scanlist:
#######################
keywordcheck.check(
pkg, xpkg, ebuild, y_ebuild, keywords, ebuild_archs, changed,
- live_ebuild)
+ live_ebuild, kwlist, profiles)
#######################
- # KEYWORDS="-*" is a stupid replacement for package.mask
- # and screws general KEYWORDS semantics
- if "-*" in keywords:
- haskeyword = False
- for kw in keywords:
- if kw[0] == "~":
- kw = kw[1:]
- if kw in kwlist:
- haskeyword = True
- if not haskeyword:
- qatracker.add_error("KEYWORDS.stupid",
- xpkg + "/" + y_ebuild + ".ebuild")
-
if live_ebuild and repo_settings.repo_config.name == "gentoo":
#######################
liveeclasscheck.check(
@@ -631,23 +618,6 @@ for xpkg in effective_scanlist:
qatracker.add_error("LICENSE.deprecated",
"%s: %s" % (ebuild.relative_path, lic))
- # keyword checks
- myuse = myaux["KEYWORDS"].split()
- for mykey in myuse:
- if mykey not in ("-*", "*", "~*"):
- myskey = mykey
- if myskey[:1] == "-":
- myskey = myskey[1:]
- if myskey[:1] == "~":
- myskey = myskey[1:]
- if myskey not in kwlist:
- qatracker.add_error("KEYWORDS.invalid",
- "%s/%s.ebuild: %s" % (xpkg, y_ebuild, mykey))
- elif myskey not in profiles:
- qatracker.add_error("KEYWORDS.invalid",
- "%s/%s.ebuild: %s (profile invalid)"
- % (xpkg, y_ebuild, mykey))
-
# restrict checks
myrestrict = None
try:
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/checks/ebuilds/
@ 2014-11-17 0:55 Brian Dolbec
0 siblings, 0 replies; 34+ messages in thread
From: Brian Dolbec @ 2014-11-17 0:55 UTC (permalink / raw
To: gentoo-commits
commit: 5c827bb7cf9a0b1de5e1ff6640b408486b4e0a8b
Author: Tom Wijsman <tomwij <AT> gentoo <DOT> org>
AuthorDate: Wed Jun 4 09:17:12 2014 +0000
Commit: Brian Dolbec <brian.dolbec <AT> gmail <DOT> com>
CommitDate: Mon Nov 17 00:53:14 2014 +0000
URL: http://sources.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=5c827bb7
repoman/main.py: Split KEYWORDS checks to checks/ebuilds/keywords.py
---
pym/repoman/checks/ebuilds/keywords.py | 67 ++++++++++++++++++++++++++++++++++
pym/repoman/main.py | 32 ++++------------
2 files changed, 75 insertions(+), 24 deletions(-)
diff --git a/pym/repoman/checks/ebuilds/keywords.py b/pym/repoman/checks/ebuilds/keywords.py
new file mode 100644
index 0000000..29de0db
--- /dev/null
+++ b/pym/repoman/checks/ebuilds/keywords.py
@@ -0,0 +1,67 @@
+
+'''keywords.py
+Perform KEYWORDS related checks
+'''
+
+
+class KeywordChecks(object):
+ '''Perform checks on the KEYWORDS of an ebuild'''
+
+ def __init__(self, qatracker):
+ '''
+ @param qatracker: QATracker instance
+ '''
+ self.qatracker = qatracker
+ self.slot_keywords = {}
+
+ def prepare(self):
+ '''Prepare the checks for the next package.'''
+ self.slot_keywords = {}
+
+ def check(
+ self, pkg, package, ebuild, y_ebuild, keywords, ebuild_archs, changed,
+ live_ebuild):
+ '''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 keywords: All the keywords (including -...) of the ebuild.
+ @param ebuild_archs: Just the architectures (no prefixes) of the ebuild.
+ @param changed: Changes instance
+ @param slot_keywords: A dictionary of keywords per slot.
+ @param live_ebuild: A boolean that determines if this is a live ebuild.
+ '''
+ self._checkAddedWithStableKeywords(
+ package, ebuild, y_ebuild, keywords, changed)
+ self._checkForDroppedKeywords(
+ pkg, ebuild, ebuild_archs, live_ebuild)
+
+ self.slot_keywords[pkg.slot].update(ebuild_archs)
+
+ def _checkAddedWithStableKeywords(
+ self, package, ebuild, y_ebuild, keywords, changed):
+ catdir, pkgdir = package.split("/")
+
+ is_stable = lambda kw: not kw.startswith("~") and not kw.startswith("-")
+ stable_keywords = list(filter(is_stable, keywords))
+ if stable_keywords:
+ if ebuild.ebuild_path in changed.new_ebuilds and catdir != "virtual":
+ stable_keywords.sort()
+ self.qatracker.add_error(
+ "KEYWORDS.stable",
+ "%s/%s.ebuild added with stable keywords: %s" %
+ (package, y_ebuild, " ".join(stable_keywords)))
+
+ def _checkForDroppedKeywords(
+ self, pkg, ebuild, ebuild_archs, live_ebuild):
+ previous_keywords = self.slot_keywords.get(pkg.slot)
+ if previous_keywords is None:
+ self.slot_keywords[pkg.slot] = set()
+ elif ebuild_archs and "*" not in ebuild_archs and not live_ebuild:
+ dropped_keywords = previous_keywords.difference(ebuild_archs)
+ if dropped_keywords:
+ self.qatracker.add_error("KEYWORDS.dropped",
+ "%s: %s" %
+ (ebuild.relative_path, " ".join(sorted(dropped_keywords))))
\ No newline at end of file
diff --git a/pym/repoman/main.py b/pym/repoman/main.py
index 8a1a043..05d9a14 100755
--- a/pym/repoman/main.py
+++ b/pym/repoman/main.py
@@ -49,6 +49,7 @@ from repoman.argparser import parse_args
from repoman.checks.directories.files import FileChecks
from repoman.checks.ebuilds.checks import run_checks, checks_init
from repoman.checks.ebuilds.fetches import FetchChecks
+from repoman.checks.ebuilds.keywords import KeywordChecks
from repoman.checks.ebuilds.isebuild import IsEbuild
from repoman.checks.ebuilds.thirdpartymirrors import ThirdPartyMirrors
from repoman.checks.ebuilds.manifests import Manifests
@@ -281,7 +282,7 @@ fetchcheck = FetchChecks(qatracker, repoman_settings, repo_settings, portdb,
pkgmeta = PkgMetadata(options, qatracker, repoman_settings)
thirdparty = ThirdPartyMirrors(repoman_settings, qatracker)
use_flag_checks = USEFlagChecks(qatracker, uselist)
-
+keywordcheck = KeywordChecks(qatracker)
for xpkg in effective_scanlist:
# ebuilds and digests added to cvs respectively.
@@ -322,7 +323,7 @@ for xpkg in effective_scanlist:
continue
######################
- slot_keywords = {}
+ keywordcheck.prepare()
# Sort ebuilds in ascending order for the KEYWORDS.dropped check.
ebuildlist = sorted(pkgs.values())
@@ -427,32 +428,15 @@ for xpkg in effective_scanlist:
(ebuild.relative_path, len(myaux['DESCRIPTION']), max_desc_len))
keywords = myaux["KEYWORDS"].split()
- stable_keywords = []
- for keyword in keywords:
- if not keyword.startswith("~") and \
- not keyword.startswith("-"):
- stable_keywords.append(keyword)
- if stable_keywords:
- if ebuild.ebuild_path in changed.new_ebuilds and catdir != "virtual":
- stable_keywords.sort()
- qatracker.add_error("KEYWORDS.stable",
- "%s/%s.ebuild added with stable keywords: %s" %
- (xpkg, y_ebuild, " ".join(stable_keywords)))
ebuild_archs = set(
kw.lstrip("~") for kw in keywords if not kw.startswith("-"))
- previous_keywords = slot_keywords.get(pkg.slot)
- if previous_keywords is None:
- slot_keywords[pkg.slot] = set()
- elif ebuild_archs and "*" not in ebuild_archs and not live_ebuild:
- dropped_keywords = previous_keywords.difference(ebuild_archs)
- if dropped_keywords:
- qatracker.add_error("KEYWORDS.dropped",
- "%s: %s" %
- (ebuild.relative_path, " ".join(sorted(dropped_keywords))))
-
- slot_keywords[pkg.slot].update(ebuild_archs)
+ #######################
+ keywordcheck.check(
+ pkg, xpkg, ebuild, y_ebuild, keywords, ebuild_archs, changed,
+ live_ebuild)
+ #######################
# KEYWORDS="-*" is a stupid replacement for package.mask
# and screws general KEYWORDS semantics
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/checks/ebuilds/
@ 2014-11-17 0:55 Brian Dolbec
0 siblings, 0 replies; 34+ messages in thread
From: Brian Dolbec @ 2014-11-17 0:55 UTC (permalink / raw
To: gentoo-commits
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
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/checks/ebuilds/
@ 2015-08-10 13:44 Brian Dolbec
0 siblings, 0 replies; 34+ messages in thread
From: Brian Dolbec @ 2015-08-10 13:44 UTC (permalink / raw
To: gentoo-commits
commit: 39cc82a67ac407818c3255c2ce625d37b00a5a26
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: Tue Jul 21 05:47:26 2015 +0000
URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=39cc82a6
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 662b627..d1f2b40 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
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/checks/ebuilds/
@ 2015-08-10 13:44 Brian Dolbec
0 siblings, 0 replies; 34+ messages in thread
From: Brian Dolbec @ 2015-08-10 13:44 UTC (permalink / raw
To: gentoo-commits
commit: 449eac5ad48c485e58665d781bd9fc621dc2184b
Author: Brian Dolbec <dolsen <AT> gentoo <DOT> org>
AuthorDate: Tue Jun 3 19:20:43 2014 +0000
Commit: Brian Dolbec <dolsen <AT> gentoo <DOT> org>
CommitDate: Tue Jul 21 05:47:28 2015 +0000
URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=449eac5a
Repoman: Refactor PkgMetadata and XmlLint classes for variable data passed in
Move all non-consistent data to be passed in via the check functions.
Initialize XmlLint once in the PkgMetadata class __init__().
pym/repoman/_xml.py | 33 ++++++++++++++++++++++---------
pym/repoman/checks/ebuilds/pkgmetadata.py | 12 +++++------
2 files changed, 30 insertions(+), 15 deletions(-)
diff --git a/pym/repoman/_xml.py b/pym/repoman/_xml.py
index b97c027..d5b5a5e 100644
--- a/pym/repoman/_xml.py
+++ b/pym/repoman/_xml.py
@@ -14,6 +14,8 @@ from repoman._subprocess import repoman_getstatusoutput
class _XMLParser(xml.etree.ElementTree.XMLParser):
+
+
def __init__(self, data, **kwargs):
xml.etree.ElementTree.XMLParser.__init__(self, **kwargs)
self._portage_data = data
@@ -25,11 +27,13 @@ class _XMLParser(xml.etree.ElementTree.XMLParser):
self.parser.StartDoctypeDeclHandler = \
self._portage_StartDoctypeDeclHandler
+
def _portage_XmlDeclHandler(self, version, encoding, standalone):
if self._base_XmlDeclHandler is not None:
self._base_XmlDeclHandler(version, encoding, standalone)
self._portage_data["XML_DECLARATION"] = (version, encoding, standalone)
+
def _portage_StartDoctypeDeclHandler(
self, doctypeName, systemId, publicId, has_internal_subset):
if self._base_StartDoctypeDeclHandler is not None:
@@ -49,33 +53,44 @@ class _MetadataTreeBuilder(xml.etree.ElementTree.TreeBuilder):
class XmlLint(object):
- def __init__(self, options, repolevel, repoman_settings):
+ def __init__(self, options, repoman_settings):
self.metadata_dtd = os.path.join(repoman_settings["DISTDIR"], 'metadata.dtd')
+ self.options = options
+ self.repoman_settings = repoman_settings
self._is_capable = False
self.binary = None
- self._check_capable(options, repolevel, repoman_settings)
+ self._check_capable()
+
- def _check_capable(self, options, repolevel, repoman_settings):
- if options.mode == "manifest":
+ def _check_capable(self):
+ if self.options.mode == "manifest":
return
self.binary = find_binary('xmllint')
if not self.binary:
print(red("!!! xmllint not found. Can't check metadata.xml.\n"))
- if options.xml_parse or repolevel == 3:
- print("%s sorry, xmllint is needed. failing\n" % red("!!!"))
- sys.exit(1)
else:
- if not fetch_metadata_dtd(self.metadata_dtd, repoman_settings):
+ if not fetch_metadata_dtd(self.metadata_dtd, self.repoman_settings):
sys.exit(1)
# this can be problematic if xmllint changes their output
self._is_capable = True
+
@property
def capable(self):
return self._is_capable
- def check(self, checkdir):
+
+ def check(self, checkdir, repolevel):
+ '''Runs checks on the package metadata.xml file
+
+ @param checkdir: string, path
+ @param repolevel: integer
+ @return boolean, False == bad metadata
+ '''
if not self.capable:
+ if self.options.xml_parse or repolevel == 3:
+ print("%s sorry, xmllint is needed. failing\n" % red("!!!"))
+ sys.exit(1)
return True
# xmlint can produce garbage output even on success, so only dump
# the ouput when it fails.
diff --git a/pym/repoman/checks/ebuilds/pkgmetadata.py b/pym/repoman/checks/ebuilds/pkgmetadata.py
index 0778696..674d32f 100644
--- a/pym/repoman/checks/ebuilds/pkgmetadata.py
+++ b/pym/repoman/checks/ebuilds/pkgmetadata.py
@@ -38,27 +38,28 @@ from repoman._xml import _XMLParser, _MetadataTreeBuilder, XmlLint
class PkgMetadata(object):
'''Package metadata.xml checks'''
- def __init__(self, options, qatracker, repolevel, repoman_settings):
+ def __init__(self, options, qatracker, repoman_settings):
'''PkgMetadata init function
@param options: ArgumentParser.parse_known_args(argv[1:]) options
@param qatracker: QATracker instance
- @param repolevel: integer
@param repoman_settings: settings instance
'''
self.options = options
self.qatracker = qatracker
- self.repolevel = repolevel
self.repoman_settings = repoman_settings
self.musedict = {}
+ self.xmllint = XmlLint(self.options, self.repoman_settings)
+
- def check(self, xpkg, checkdir, checkdirlist):
+ def check(self, xpkg, checkdir, checkdirlist, repolevel):
'''Performs the checks on the metadata.xml for the package
@param xpkg: the pacakge being checked
@param checkdir: string, directory path
@param checkdirlist: list of checkdir's
+ @param repolevel: integer
'''
self.musedict = {}
@@ -165,8 +166,7 @@ class PkgMetadata(object):
# Only carry out if in package directory or check forced
if not metadata_bad:
- xmllint = XmlLint(self.options, self.repolevel, self.repoman_settings)
- if not xmllint.check(checkdir):
+ if not self.xmllint.check(checkdir, repolevel):
self.qatracker.add_error("metadata.bad", xpkg + "/metadata.xml")
del metadata_bad
return
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/checks/ebuilds/
@ 2015-08-10 13:44 Brian Dolbec
0 siblings, 0 replies; 34+ messages in thread
From: Brian Dolbec @ 2015-08-10 13:44 UTC (permalink / raw
To: gentoo-commits
commit: d4677d5fcb9b89bc02f07779fdcf6c5017dc5881
Author: Tom Wijsman <tomwij <AT> gentoo <DOT> org>
AuthorDate: Wed Jun 4 14:17:49 2014 +0000
Commit: Brian Dolbec <dolsen <AT> gentoo <DOT> org>
CommitDate: Tue Jul 21 05:47:29 2015 +0000
URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=d4677d5f
repoman/main.py: More KEYWORDS checks to checks/ebuilds/keywords.py
pym/repoman/checks/ebuilds/keywords.py | 64 ++++++++++++++++++++++++++++++----
pym/repoman/main.py | 32 +----------------
2 files changed, 59 insertions(+), 37 deletions(-)
diff --git a/pym/repoman/checks/ebuilds/keywords.py b/pym/repoman/checks/ebuilds/keywords.py
index b724269..235c751 100644
--- a/pym/repoman/checks/ebuilds/keywords.py
+++ b/pym/repoman/checks/ebuilds/keywords.py
@@ -21,7 +21,7 @@ class KeywordChecks(object):
def check(
self, pkg, package, ebuild, y_ebuild, keywords, ebuild_archs, changed,
- live_ebuild):
+ live_ebuild, kwlist, profiles):
'''Perform the check.
@param pkg: Package in which we check (object).
@@ -33,21 +33,32 @@ class KeywordChecks(object):
@param changed: Changes instance
@param slot_keywords: A dictionary of keywords per slot.
@param live_ebuild: A boolean that determines if this is a live ebuild.
+ @param kwlist: A list of all global keywords.
+ @param profiles: A list of all profiles.
'''
if not self.options.straight_to_stable:
self._checkAddedWithStableKeywords(
package, ebuild, y_ebuild, keywords, changed)
+
self._checkForDroppedKeywords(
pkg, ebuild, ebuild_archs, live_ebuild)
+ self._checkForInvalidKeywords(
+ pkg, package, y_ebuild, kwlist, profiles)
+
+ self._checkForMaskLikeKeywords(
+ package, y_ebuild, keywords, kwlist)
+
self.slot_keywords[pkg.slot].update(ebuild_archs)
+ def _isKeywordStable(self, keyword):
+ return not keyword.startswith("~") and not keyword.startswith("-")
+
def _checkAddedWithStableKeywords(
self, package, ebuild, y_ebuild, keywords, changed):
catdir, pkgdir = package.split("/")
- is_stable = lambda kw: not kw.startswith("~") and not kw.startswith("-")
- stable_keywords = list(filter(is_stable, keywords))
+ stable_keywords = list(filter(self._isKeywordStable, keywords))
if stable_keywords:
if ebuild.ebuild_path in changed.new_ebuilds and catdir != "virtual":
stable_keywords.sort()
@@ -64,6 +75,47 @@ class KeywordChecks(object):
elif ebuild_archs and "*" not in ebuild_archs and not live_ebuild:
dropped_keywords = previous_keywords.difference(ebuild_archs)
if dropped_keywords:
- self.qatracker.add_error("KEYWORDS.dropped",
- "%s: %s" %
- (ebuild.relative_path, " ".join(sorted(dropped_keywords))))
+ self.qatracker.add_error(
+ "KEYWORDS.dropped", "%s: %s" % (
+ ebuild.relative_path,
+ " ".join(sorted(dropped_keywords))))
+
+ def _checkForInvalidKeywords(
+ self, pkg, package, y_ebuild, kwlist, profiles):
+ myuse = pkg._metadata["KEYWORDS"].split()
+
+ for mykey in myuse:
+ if mykey not in ("-*", "*", "~*"):
+ myskey = mykey
+
+ if not self._isKeywordStable(myskey[:1]):
+ myskey = myskey[1:]
+
+ if myskey not in kwlist:
+ self.qatracker.add_error(
+ "KEYWORDS.invalid",
+ "%s/%s.ebuild: %s" % (
+ package, y_ebuild, mykey))
+ elif myskey not in profiles:
+ self.qatracker.add_error(
+ "KEYWORDS.invalid",
+ "%s/%s.ebuild: %s (profile invalid)" % (
+ package, y_ebuild, mykey))
+
+ def _checkForMaskLikeKeywords(
+ self, package, y_ebuild, keywords, kwlist):
+
+ # KEYWORDS="-*" is a stupid replacement for package.mask
+ # and screws general KEYWORDS semantics
+ if "-*" in keywords:
+ haskeyword = False
+
+ for kw in keywords:
+ if kw[0] == "~":
+ kw = kw[1:]
+ if kw in kwlist:
+ haskeyword = True
+
+ if not haskeyword:
+ self.qatracker.add_error(
+ "KEYWORDS.stupid", package + "/" + y_ebuild + ".ebuild")
diff --git a/pym/repoman/main.py b/pym/repoman/main.py
index 8b9e73d..ab908e0 100755
--- a/pym/repoman/main.py
+++ b/pym/repoman/main.py
@@ -445,22 +445,9 @@ for xpkg in effective_scanlist:
#######################
keywordcheck.check(
pkg, xpkg, ebuild, y_ebuild, keywords, ebuild_archs, changed,
- live_ebuild)
+ live_ebuild, kwlist, profiles)
#######################
- # KEYWORDS="-*" is a stupid replacement for package.mask
- # and screws general KEYWORDS semantics
- if "-*" in keywords:
- haskeyword = False
- for kw in keywords:
- if kw[0] == "~":
- kw = kw[1:]
- if kw in kwlist:
- haskeyword = True
- if not haskeyword:
- qatracker.add_error("KEYWORDS.stupid",
- xpkg + "/" + y_ebuild + ".ebuild")
-
if live_ebuild and repo_settings.repo_config.name == "gentoo":
#######################
liveeclasscheck.check(
@@ -637,23 +624,6 @@ for xpkg in effective_scanlist:
qatracker.add_error("LICENSE.deprecated",
"%s: %s" % (ebuild.relative_path, lic))
- # keyword checks
- myuse = myaux["KEYWORDS"].split()
- for mykey in myuse:
- if mykey not in ("-*", "*", "~*"):
- myskey = mykey
- if myskey[:1] == "-":
- myskey = myskey[1:]
- if myskey[:1] == "~":
- myskey = myskey[1:]
- if myskey not in kwlist:
- qatracker.add_error("KEYWORDS.invalid",
- "%s/%s.ebuild: %s" % (xpkg, y_ebuild, mykey))
- elif myskey not in profiles:
- qatracker.add_error("KEYWORDS.invalid",
- "%s/%s.ebuild: %s (profile invalid)"
- % (xpkg, y_ebuild, mykey))
-
# restrict checks
myrestrict = None
try:
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/checks/ebuilds/
@ 2015-08-10 14:45 Michał Górny
0 siblings, 0 replies; 34+ messages in thread
From: Michał Górny @ 2015-08-10 14:45 UTC (permalink / raw
To: gentoo-commits
commit: c589f72b468e24964c4d0f5a78094c8e18972a63
Author: Tom Wijsman <tomwij <AT> gentoo <DOT> org>
AuthorDate: Wed Jun 4 14:17:49 2014 +0000
Commit: Michał Górny <mgorny <AT> gentoo <DOT> org>
CommitDate: Mon Aug 10 14:45:20 2015 +0000
URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=c589f72b
repoman/main.py: More KEYWORDS checks to checks/ebuilds/keywords.py
pym/repoman/checks/ebuilds/keywords.py | 64 ++++++++++++++++++++++++++++++----
pym/repoman/main.py | 32 +----------------
2 files changed, 59 insertions(+), 37 deletions(-)
diff --git a/pym/repoman/checks/ebuilds/keywords.py b/pym/repoman/checks/ebuilds/keywords.py
index b724269..235c751 100644
--- a/pym/repoman/checks/ebuilds/keywords.py
+++ b/pym/repoman/checks/ebuilds/keywords.py
@@ -21,7 +21,7 @@ class KeywordChecks(object):
def check(
self, pkg, package, ebuild, y_ebuild, keywords, ebuild_archs, changed,
- live_ebuild):
+ live_ebuild, kwlist, profiles):
'''Perform the check.
@param pkg: Package in which we check (object).
@@ -33,21 +33,32 @@ class KeywordChecks(object):
@param changed: Changes instance
@param slot_keywords: A dictionary of keywords per slot.
@param live_ebuild: A boolean that determines if this is a live ebuild.
+ @param kwlist: A list of all global keywords.
+ @param profiles: A list of all profiles.
'''
if not self.options.straight_to_stable:
self._checkAddedWithStableKeywords(
package, ebuild, y_ebuild, keywords, changed)
+
self._checkForDroppedKeywords(
pkg, ebuild, ebuild_archs, live_ebuild)
+ self._checkForInvalidKeywords(
+ pkg, package, y_ebuild, kwlist, profiles)
+
+ self._checkForMaskLikeKeywords(
+ package, y_ebuild, keywords, kwlist)
+
self.slot_keywords[pkg.slot].update(ebuild_archs)
+ def _isKeywordStable(self, keyword):
+ return not keyword.startswith("~") and not keyword.startswith("-")
+
def _checkAddedWithStableKeywords(
self, package, ebuild, y_ebuild, keywords, changed):
catdir, pkgdir = package.split("/")
- is_stable = lambda kw: not kw.startswith("~") and not kw.startswith("-")
- stable_keywords = list(filter(is_stable, keywords))
+ stable_keywords = list(filter(self._isKeywordStable, keywords))
if stable_keywords:
if ebuild.ebuild_path in changed.new_ebuilds and catdir != "virtual":
stable_keywords.sort()
@@ -64,6 +75,47 @@ class KeywordChecks(object):
elif ebuild_archs and "*" not in ebuild_archs and not live_ebuild:
dropped_keywords = previous_keywords.difference(ebuild_archs)
if dropped_keywords:
- self.qatracker.add_error("KEYWORDS.dropped",
- "%s: %s" %
- (ebuild.relative_path, " ".join(sorted(dropped_keywords))))
+ self.qatracker.add_error(
+ "KEYWORDS.dropped", "%s: %s" % (
+ ebuild.relative_path,
+ " ".join(sorted(dropped_keywords))))
+
+ def _checkForInvalidKeywords(
+ self, pkg, package, y_ebuild, kwlist, profiles):
+ myuse = pkg._metadata["KEYWORDS"].split()
+
+ for mykey in myuse:
+ if mykey not in ("-*", "*", "~*"):
+ myskey = mykey
+
+ if not self._isKeywordStable(myskey[:1]):
+ myskey = myskey[1:]
+
+ if myskey not in kwlist:
+ self.qatracker.add_error(
+ "KEYWORDS.invalid",
+ "%s/%s.ebuild: %s" % (
+ package, y_ebuild, mykey))
+ elif myskey not in profiles:
+ self.qatracker.add_error(
+ "KEYWORDS.invalid",
+ "%s/%s.ebuild: %s (profile invalid)" % (
+ package, y_ebuild, mykey))
+
+ def _checkForMaskLikeKeywords(
+ self, package, y_ebuild, keywords, kwlist):
+
+ # KEYWORDS="-*" is a stupid replacement for package.mask
+ # and screws general KEYWORDS semantics
+ if "-*" in keywords:
+ haskeyword = False
+
+ for kw in keywords:
+ if kw[0] == "~":
+ kw = kw[1:]
+ if kw in kwlist:
+ haskeyword = True
+
+ if not haskeyword:
+ self.qatracker.add_error(
+ "KEYWORDS.stupid", package + "/" + y_ebuild + ".ebuild")
diff --git a/pym/repoman/main.py b/pym/repoman/main.py
index bcd2174..d6532f9 100755
--- a/pym/repoman/main.py
+++ b/pym/repoman/main.py
@@ -445,22 +445,9 @@ for xpkg in effective_scanlist:
#######################
keywordcheck.check(
pkg, xpkg, ebuild, y_ebuild, keywords, ebuild_archs, changed,
- live_ebuild)
+ live_ebuild, kwlist, profiles)
#######################
- # KEYWORDS="-*" is a stupid replacement for package.mask
- # and screws general KEYWORDS semantics
- if "-*" in keywords:
- haskeyword = False
- for kw in keywords:
- if kw[0] == "~":
- kw = kw[1:]
- if kw in kwlist:
- haskeyword = True
- if not haskeyword:
- qatracker.add_error("KEYWORDS.stupid",
- xpkg + "/" + y_ebuild + ".ebuild")
-
if live_ebuild and repo_settings.repo_config.name == "gentoo":
#######################
liveeclasscheck.check(
@@ -637,23 +624,6 @@ for xpkg in effective_scanlist:
qatracker.add_error("LICENSE.deprecated",
"%s: %s" % (ebuild.relative_path, lic))
- # keyword checks
- myuse = myaux["KEYWORDS"].split()
- for mykey in myuse:
- if mykey not in ("-*", "*", "~*"):
- myskey = mykey
- if myskey[:1] == "-":
- myskey = myskey[1:]
- if myskey[:1] == "~":
- myskey = myskey[1:]
- if myskey not in kwlist:
- qatracker.add_error("KEYWORDS.invalid",
- "%s/%s.ebuild: %s" % (xpkg, y_ebuild, mykey))
- elif myskey not in profiles:
- qatracker.add_error("KEYWORDS.invalid",
- "%s/%s.ebuild: %s (profile invalid)"
- % (xpkg, y_ebuild, mykey))
-
# restrict checks
myrestrict = None
try:
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/checks/ebuilds/
@ 2015-08-11 23:54 Brian Dolbec
0 siblings, 0 replies; 34+ messages in thread
From: Brian Dolbec @ 2015-08-11 23:54 UTC (permalink / raw
To: gentoo-commits
commit: febac24f8e7fa55d46d9afd8d88c72f8952c512a
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: Tue Aug 11 23:52:52 2015 +0000
URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=febac24f
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
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/checks/ebuilds/
@ 2015-08-11 23:54 Brian Dolbec
0 siblings, 0 replies; 34+ messages in thread
From: Brian Dolbec @ 2015-08-11 23:54 UTC (permalink / raw
To: gentoo-commits
commit: c7923fcab6f9ce5ee29afd87e1baad5975312223
Author: Tom Wijsman <tomwij <AT> gentoo <DOT> org>
AuthorDate: Wed Jun 4 14:17:49 2014 +0000
Commit: Brian Dolbec <dolsen <AT> gentoo <DOT> org>
CommitDate: Tue Aug 11 23:52:55 2015 +0000
URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=c7923fca
repoman/main.py: More KEYWORDS checks to checks/ebuilds/keywords.py
pym/repoman/checks/ebuilds/keywords.py | 64 ++++++++++++++++++++++++++++++----
pym/repoman/main.py | 32 +----------------
2 files changed, 59 insertions(+), 37 deletions(-)
diff --git a/pym/repoman/checks/ebuilds/keywords.py b/pym/repoman/checks/ebuilds/keywords.py
index b724269..235c751 100644
--- a/pym/repoman/checks/ebuilds/keywords.py
+++ b/pym/repoman/checks/ebuilds/keywords.py
@@ -21,7 +21,7 @@ class KeywordChecks(object):
def check(
self, pkg, package, ebuild, y_ebuild, keywords, ebuild_archs, changed,
- live_ebuild):
+ live_ebuild, kwlist, profiles):
'''Perform the check.
@param pkg: Package in which we check (object).
@@ -33,21 +33,32 @@ class KeywordChecks(object):
@param changed: Changes instance
@param slot_keywords: A dictionary of keywords per slot.
@param live_ebuild: A boolean that determines if this is a live ebuild.
+ @param kwlist: A list of all global keywords.
+ @param profiles: A list of all profiles.
'''
if not self.options.straight_to_stable:
self._checkAddedWithStableKeywords(
package, ebuild, y_ebuild, keywords, changed)
+
self._checkForDroppedKeywords(
pkg, ebuild, ebuild_archs, live_ebuild)
+ self._checkForInvalidKeywords(
+ pkg, package, y_ebuild, kwlist, profiles)
+
+ self._checkForMaskLikeKeywords(
+ package, y_ebuild, keywords, kwlist)
+
self.slot_keywords[pkg.slot].update(ebuild_archs)
+ def _isKeywordStable(self, keyword):
+ return not keyword.startswith("~") and not keyword.startswith("-")
+
def _checkAddedWithStableKeywords(
self, package, ebuild, y_ebuild, keywords, changed):
catdir, pkgdir = package.split("/")
- is_stable = lambda kw: not kw.startswith("~") and not kw.startswith("-")
- stable_keywords = list(filter(is_stable, keywords))
+ stable_keywords = list(filter(self._isKeywordStable, keywords))
if stable_keywords:
if ebuild.ebuild_path in changed.new_ebuilds and catdir != "virtual":
stable_keywords.sort()
@@ -64,6 +75,47 @@ class KeywordChecks(object):
elif ebuild_archs and "*" not in ebuild_archs and not live_ebuild:
dropped_keywords = previous_keywords.difference(ebuild_archs)
if dropped_keywords:
- self.qatracker.add_error("KEYWORDS.dropped",
- "%s: %s" %
- (ebuild.relative_path, " ".join(sorted(dropped_keywords))))
+ self.qatracker.add_error(
+ "KEYWORDS.dropped", "%s: %s" % (
+ ebuild.relative_path,
+ " ".join(sorted(dropped_keywords))))
+
+ def _checkForInvalidKeywords(
+ self, pkg, package, y_ebuild, kwlist, profiles):
+ myuse = pkg._metadata["KEYWORDS"].split()
+
+ for mykey in myuse:
+ if mykey not in ("-*", "*", "~*"):
+ myskey = mykey
+
+ if not self._isKeywordStable(myskey[:1]):
+ myskey = myskey[1:]
+
+ if myskey not in kwlist:
+ self.qatracker.add_error(
+ "KEYWORDS.invalid",
+ "%s/%s.ebuild: %s" % (
+ package, y_ebuild, mykey))
+ elif myskey not in profiles:
+ self.qatracker.add_error(
+ "KEYWORDS.invalid",
+ "%s/%s.ebuild: %s (profile invalid)" % (
+ package, y_ebuild, mykey))
+
+ def _checkForMaskLikeKeywords(
+ self, package, y_ebuild, keywords, kwlist):
+
+ # KEYWORDS="-*" is a stupid replacement for package.mask
+ # and screws general KEYWORDS semantics
+ if "-*" in keywords:
+ haskeyword = False
+
+ for kw in keywords:
+ if kw[0] == "~":
+ kw = kw[1:]
+ if kw in kwlist:
+ haskeyword = True
+
+ if not haskeyword:
+ self.qatracker.add_error(
+ "KEYWORDS.stupid", package + "/" + y_ebuild + ".ebuild")
diff --git a/pym/repoman/main.py b/pym/repoman/main.py
index bcd2174..d6532f9 100755
--- a/pym/repoman/main.py
+++ b/pym/repoman/main.py
@@ -445,22 +445,9 @@ for xpkg in effective_scanlist:
#######################
keywordcheck.check(
pkg, xpkg, ebuild, y_ebuild, keywords, ebuild_archs, changed,
- live_ebuild)
+ live_ebuild, kwlist, profiles)
#######################
- # KEYWORDS="-*" is a stupid replacement for package.mask
- # and screws general KEYWORDS semantics
- if "-*" in keywords:
- haskeyword = False
- for kw in keywords:
- if kw[0] == "~":
- kw = kw[1:]
- if kw in kwlist:
- haskeyword = True
- if not haskeyword:
- qatracker.add_error("KEYWORDS.stupid",
- xpkg + "/" + y_ebuild + ".ebuild")
-
if live_ebuild and repo_settings.repo_config.name == "gentoo":
#######################
liveeclasscheck.check(
@@ -637,23 +624,6 @@ for xpkg in effective_scanlist:
qatracker.add_error("LICENSE.deprecated",
"%s: %s" % (ebuild.relative_path, lic))
- # keyword checks
- myuse = myaux["KEYWORDS"].split()
- for mykey in myuse:
- if mykey not in ("-*", "*", "~*"):
- myskey = mykey
- if myskey[:1] == "-":
- myskey = myskey[1:]
- if myskey[:1] == "~":
- myskey = myskey[1:]
- if myskey not in kwlist:
- qatracker.add_error("KEYWORDS.invalid",
- "%s/%s.ebuild: %s" % (xpkg, y_ebuild, mykey))
- elif myskey not in profiles:
- qatracker.add_error("KEYWORDS.invalid",
- "%s/%s.ebuild: %s (profile invalid)"
- % (xpkg, y_ebuild, mykey))
-
# restrict checks
myrestrict = None
try:
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/checks/ebuilds/
@ 2015-09-05 21:48 Brian Dolbec
0 siblings, 0 replies; 34+ messages in thread
From: Brian Dolbec @ 2015-09-05 21:48 UTC (permalink / raw
To: gentoo-commits
commit: 36fe5b2808a6c174e9025152293b0738cc9fd16a
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:47:35 2015 +0000
URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=36fe5b28
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 34e9067..a5214d8 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
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/checks/ebuilds/
@ 2015-09-05 21:48 Brian Dolbec
0 siblings, 0 replies; 34+ messages in thread
From: Brian Dolbec @ 2015-09-05 21:48 UTC (permalink / raw
To: gentoo-commits
commit: 6bd98ee4b60bb581cf535f666dbde4bf1fe6fce5
Author: Brian Dolbec <dolsen <AT> gentoo <DOT> org>
AuthorDate: Tue Jun 3 19:20:43 2014 +0000
Commit: Brian Dolbec <dolsen <AT> gentoo <DOT> org>
CommitDate: Sat Sep 5 21:47:36 2015 +0000
URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=6bd98ee4
Repoman: Refactor PkgMetadata and XmlLint classes for variable data passed in
Move all non-consistent data to be passed in via the check functions.
Initialize XmlLint once in the PkgMetadata class __init__().
pym/repoman/_xml.py | 33 ++++++++++++++++++++++---------
pym/repoman/checks/ebuilds/pkgmetadata.py | 12 +++++------
2 files changed, 30 insertions(+), 15 deletions(-)
diff --git a/pym/repoman/_xml.py b/pym/repoman/_xml.py
index b97c027..d5b5a5e 100644
--- a/pym/repoman/_xml.py
+++ b/pym/repoman/_xml.py
@@ -14,6 +14,8 @@ from repoman._subprocess import repoman_getstatusoutput
class _XMLParser(xml.etree.ElementTree.XMLParser):
+
+
def __init__(self, data, **kwargs):
xml.etree.ElementTree.XMLParser.__init__(self, **kwargs)
self._portage_data = data
@@ -25,11 +27,13 @@ class _XMLParser(xml.etree.ElementTree.XMLParser):
self.parser.StartDoctypeDeclHandler = \
self._portage_StartDoctypeDeclHandler
+
def _portage_XmlDeclHandler(self, version, encoding, standalone):
if self._base_XmlDeclHandler is not None:
self._base_XmlDeclHandler(version, encoding, standalone)
self._portage_data["XML_DECLARATION"] = (version, encoding, standalone)
+
def _portage_StartDoctypeDeclHandler(
self, doctypeName, systemId, publicId, has_internal_subset):
if self._base_StartDoctypeDeclHandler is not None:
@@ -49,33 +53,44 @@ class _MetadataTreeBuilder(xml.etree.ElementTree.TreeBuilder):
class XmlLint(object):
- def __init__(self, options, repolevel, repoman_settings):
+ def __init__(self, options, repoman_settings):
self.metadata_dtd = os.path.join(repoman_settings["DISTDIR"], 'metadata.dtd')
+ self.options = options
+ self.repoman_settings = repoman_settings
self._is_capable = False
self.binary = None
- self._check_capable(options, repolevel, repoman_settings)
+ self._check_capable()
+
- def _check_capable(self, options, repolevel, repoman_settings):
- if options.mode == "manifest":
+ def _check_capable(self):
+ if self.options.mode == "manifest":
return
self.binary = find_binary('xmllint')
if not self.binary:
print(red("!!! xmllint not found. Can't check metadata.xml.\n"))
- if options.xml_parse or repolevel == 3:
- print("%s sorry, xmllint is needed. failing\n" % red("!!!"))
- sys.exit(1)
else:
- if not fetch_metadata_dtd(self.metadata_dtd, repoman_settings):
+ if not fetch_metadata_dtd(self.metadata_dtd, self.repoman_settings):
sys.exit(1)
# this can be problematic if xmllint changes their output
self._is_capable = True
+
@property
def capable(self):
return self._is_capable
- def check(self, checkdir):
+
+ def check(self, checkdir, repolevel):
+ '''Runs checks on the package metadata.xml file
+
+ @param checkdir: string, path
+ @param repolevel: integer
+ @return boolean, False == bad metadata
+ '''
if not self.capable:
+ if self.options.xml_parse or repolevel == 3:
+ print("%s sorry, xmllint is needed. failing\n" % red("!!!"))
+ sys.exit(1)
return True
# xmlint can produce garbage output even on success, so only dump
# the ouput when it fails.
diff --git a/pym/repoman/checks/ebuilds/pkgmetadata.py b/pym/repoman/checks/ebuilds/pkgmetadata.py
index 0778696..674d32f 100644
--- a/pym/repoman/checks/ebuilds/pkgmetadata.py
+++ b/pym/repoman/checks/ebuilds/pkgmetadata.py
@@ -38,27 +38,28 @@ from repoman._xml import _XMLParser, _MetadataTreeBuilder, XmlLint
class PkgMetadata(object):
'''Package metadata.xml checks'''
- def __init__(self, options, qatracker, repolevel, repoman_settings):
+ def __init__(self, options, qatracker, repoman_settings):
'''PkgMetadata init function
@param options: ArgumentParser.parse_known_args(argv[1:]) options
@param qatracker: QATracker instance
- @param repolevel: integer
@param repoman_settings: settings instance
'''
self.options = options
self.qatracker = qatracker
- self.repolevel = repolevel
self.repoman_settings = repoman_settings
self.musedict = {}
+ self.xmllint = XmlLint(self.options, self.repoman_settings)
+
- def check(self, xpkg, checkdir, checkdirlist):
+ def check(self, xpkg, checkdir, checkdirlist, repolevel):
'''Performs the checks on the metadata.xml for the package
@param xpkg: the pacakge being checked
@param checkdir: string, directory path
@param checkdirlist: list of checkdir's
+ @param repolevel: integer
'''
self.musedict = {}
@@ -165,8 +166,7 @@ class PkgMetadata(object):
# Only carry out if in package directory or check forced
if not metadata_bad:
- xmllint = XmlLint(self.options, self.repolevel, self.repoman_settings)
- if not xmllint.check(checkdir):
+ if not self.xmllint.check(checkdir, repolevel):
self.qatracker.add_error("metadata.bad", xpkg + "/metadata.xml")
del metadata_bad
return
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/checks/ebuilds/
@ 2015-09-05 21:48 Brian Dolbec
0 siblings, 0 replies; 34+ messages in thread
From: Brian Dolbec @ 2015-09-05 21:48 UTC (permalink / raw
To: gentoo-commits
commit: 0d1ae797f9dae8ffcc3cb4bccf2c31f3303ddf0b
Author: Tom Wijsman <tomwij <AT> gentoo <DOT> org>
AuthorDate: Wed Jun 4 14:17:49 2014 +0000
Commit: Brian Dolbec <dolsen <AT> gentoo <DOT> org>
CommitDate: Sat Sep 5 21:47:37 2015 +0000
URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=0d1ae797
repoman/main.py: More KEYWORDS checks to checks/ebuilds/keywords.py
pym/repoman/checks/ebuilds/keywords.py | 64 ++++++++++++++++++++++++++++++----
pym/repoman/main.py | 32 +----------------
2 files changed, 59 insertions(+), 37 deletions(-)
diff --git a/pym/repoman/checks/ebuilds/keywords.py b/pym/repoman/checks/ebuilds/keywords.py
index b724269..235c751 100644
--- a/pym/repoman/checks/ebuilds/keywords.py
+++ b/pym/repoman/checks/ebuilds/keywords.py
@@ -21,7 +21,7 @@ class KeywordChecks(object):
def check(
self, pkg, package, ebuild, y_ebuild, keywords, ebuild_archs, changed,
- live_ebuild):
+ live_ebuild, kwlist, profiles):
'''Perform the check.
@param pkg: Package in which we check (object).
@@ -33,21 +33,32 @@ class KeywordChecks(object):
@param changed: Changes instance
@param slot_keywords: A dictionary of keywords per slot.
@param live_ebuild: A boolean that determines if this is a live ebuild.
+ @param kwlist: A list of all global keywords.
+ @param profiles: A list of all profiles.
'''
if not self.options.straight_to_stable:
self._checkAddedWithStableKeywords(
package, ebuild, y_ebuild, keywords, changed)
+
self._checkForDroppedKeywords(
pkg, ebuild, ebuild_archs, live_ebuild)
+ self._checkForInvalidKeywords(
+ pkg, package, y_ebuild, kwlist, profiles)
+
+ self._checkForMaskLikeKeywords(
+ package, y_ebuild, keywords, kwlist)
+
self.slot_keywords[pkg.slot].update(ebuild_archs)
+ def _isKeywordStable(self, keyword):
+ return not keyword.startswith("~") and not keyword.startswith("-")
+
def _checkAddedWithStableKeywords(
self, package, ebuild, y_ebuild, keywords, changed):
catdir, pkgdir = package.split("/")
- is_stable = lambda kw: not kw.startswith("~") and not kw.startswith("-")
- stable_keywords = list(filter(is_stable, keywords))
+ stable_keywords = list(filter(self._isKeywordStable, keywords))
if stable_keywords:
if ebuild.ebuild_path in changed.new_ebuilds and catdir != "virtual":
stable_keywords.sort()
@@ -64,6 +75,47 @@ class KeywordChecks(object):
elif ebuild_archs and "*" not in ebuild_archs and not live_ebuild:
dropped_keywords = previous_keywords.difference(ebuild_archs)
if dropped_keywords:
- self.qatracker.add_error("KEYWORDS.dropped",
- "%s: %s" %
- (ebuild.relative_path, " ".join(sorted(dropped_keywords))))
+ self.qatracker.add_error(
+ "KEYWORDS.dropped", "%s: %s" % (
+ ebuild.relative_path,
+ " ".join(sorted(dropped_keywords))))
+
+ def _checkForInvalidKeywords(
+ self, pkg, package, y_ebuild, kwlist, profiles):
+ myuse = pkg._metadata["KEYWORDS"].split()
+
+ for mykey in myuse:
+ if mykey not in ("-*", "*", "~*"):
+ myskey = mykey
+
+ if not self._isKeywordStable(myskey[:1]):
+ myskey = myskey[1:]
+
+ if myskey not in kwlist:
+ self.qatracker.add_error(
+ "KEYWORDS.invalid",
+ "%s/%s.ebuild: %s" % (
+ package, y_ebuild, mykey))
+ elif myskey not in profiles:
+ self.qatracker.add_error(
+ "KEYWORDS.invalid",
+ "%s/%s.ebuild: %s (profile invalid)" % (
+ package, y_ebuild, mykey))
+
+ def _checkForMaskLikeKeywords(
+ self, package, y_ebuild, keywords, kwlist):
+
+ # KEYWORDS="-*" is a stupid replacement for package.mask
+ # and screws general KEYWORDS semantics
+ if "-*" in keywords:
+ haskeyword = False
+
+ for kw in keywords:
+ if kw[0] == "~":
+ kw = kw[1:]
+ if kw in kwlist:
+ haskeyword = True
+
+ if not haskeyword:
+ self.qatracker.add_error(
+ "KEYWORDS.stupid", package + "/" + y_ebuild + ".ebuild")
diff --git a/pym/repoman/main.py b/pym/repoman/main.py
index 7795f2f..db76d52 100755
--- a/pym/repoman/main.py
+++ b/pym/repoman/main.py
@@ -445,22 +445,9 @@ for xpkg in effective_scanlist:
#######################
keywordcheck.check(
pkg, xpkg, ebuild, y_ebuild, keywords, ebuild_archs, changed,
- live_ebuild)
+ live_ebuild, kwlist, profiles)
#######################
- # KEYWORDS="-*" is a stupid replacement for package.mask
- # and screws general KEYWORDS semantics
- if "-*" in keywords:
- haskeyword = False
- for kw in keywords:
- if kw[0] == "~":
- kw = kw[1:]
- if kw in kwlist:
- haskeyword = True
- if not haskeyword:
- qatracker.add_error("KEYWORDS.stupid",
- xpkg + "/" + y_ebuild + ".ebuild")
-
if live_ebuild and repo_settings.repo_config.name == "gentoo":
#######################
liveeclasscheck.check(
@@ -637,23 +624,6 @@ for xpkg in effective_scanlist:
qatracker.add_error("LICENSE.deprecated",
"%s: %s" % (ebuild.relative_path, lic))
- # keyword checks
- myuse = myaux["KEYWORDS"].split()
- for mykey in myuse:
- if mykey not in ("-*", "*", "~*"):
- myskey = mykey
- if myskey[:1] == "-":
- myskey = myskey[1:]
- if myskey[:1] == "~":
- myskey = myskey[1:]
- if myskey not in kwlist:
- qatracker.add_error("KEYWORDS.invalid",
- "%s/%s.ebuild: %s" % (xpkg, y_ebuild, mykey))
- elif myskey not in profiles:
- qatracker.add_error("KEYWORDS.invalid",
- "%s/%s.ebuild: %s (profile invalid)"
- % (xpkg, y_ebuild, mykey))
-
# restrict checks
myrestrict = None
try:
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/checks/ebuilds/
@ 2015-09-17 3:08 Brian Dolbec
0 siblings, 0 replies; 34+ messages in thread
From: Brian Dolbec @ 2015-09-17 3:08 UTC (permalink / raw
To: gentoo-commits
commit: c3defe18576100debd545bd3bcb78f1d14d90146
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: Thu Sep 17 03:06:46 2015 +0000
URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=c3defe18
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 34e9067..a5214d8 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
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/checks/ebuilds/
@ 2015-09-17 3:08 Brian Dolbec
0 siblings, 0 replies; 34+ messages in thread
From: Brian Dolbec @ 2015-09-17 3:08 UTC (permalink / raw
To: gentoo-commits
commit: d63aaac5ca2573ed8e00e21fe6c8730b0e34d979
Author: Tom Wijsman <tomwij <AT> gentoo <DOT> org>
AuthorDate: Wed Jun 4 14:17:49 2014 +0000
Commit: Brian Dolbec <dolsen <AT> gentoo <DOT> org>
CommitDate: Thu Sep 17 03:06:48 2015 +0000
URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=d63aaac5
repoman/main.py: More KEYWORDS checks to checks/ebuilds/keywords.py
pym/repoman/checks/ebuilds/keywords.py | 64 ++++++++++++++++++++++++++++++----
pym/repoman/main.py | 32 +----------------
2 files changed, 59 insertions(+), 37 deletions(-)
diff --git a/pym/repoman/checks/ebuilds/keywords.py b/pym/repoman/checks/ebuilds/keywords.py
index b724269..235c751 100644
--- a/pym/repoman/checks/ebuilds/keywords.py
+++ b/pym/repoman/checks/ebuilds/keywords.py
@@ -21,7 +21,7 @@ class KeywordChecks(object):
def check(
self, pkg, package, ebuild, y_ebuild, keywords, ebuild_archs, changed,
- live_ebuild):
+ live_ebuild, kwlist, profiles):
'''Perform the check.
@param pkg: Package in which we check (object).
@@ -33,21 +33,32 @@ class KeywordChecks(object):
@param changed: Changes instance
@param slot_keywords: A dictionary of keywords per slot.
@param live_ebuild: A boolean that determines if this is a live ebuild.
+ @param kwlist: A list of all global keywords.
+ @param profiles: A list of all profiles.
'''
if not self.options.straight_to_stable:
self._checkAddedWithStableKeywords(
package, ebuild, y_ebuild, keywords, changed)
+
self._checkForDroppedKeywords(
pkg, ebuild, ebuild_archs, live_ebuild)
+ self._checkForInvalidKeywords(
+ pkg, package, y_ebuild, kwlist, profiles)
+
+ self._checkForMaskLikeKeywords(
+ package, y_ebuild, keywords, kwlist)
+
self.slot_keywords[pkg.slot].update(ebuild_archs)
+ def _isKeywordStable(self, keyword):
+ return not keyword.startswith("~") and not keyword.startswith("-")
+
def _checkAddedWithStableKeywords(
self, package, ebuild, y_ebuild, keywords, changed):
catdir, pkgdir = package.split("/")
- is_stable = lambda kw: not kw.startswith("~") and not kw.startswith("-")
- stable_keywords = list(filter(is_stable, keywords))
+ stable_keywords = list(filter(self._isKeywordStable, keywords))
if stable_keywords:
if ebuild.ebuild_path in changed.new_ebuilds and catdir != "virtual":
stable_keywords.sort()
@@ -64,6 +75,47 @@ class KeywordChecks(object):
elif ebuild_archs and "*" not in ebuild_archs and not live_ebuild:
dropped_keywords = previous_keywords.difference(ebuild_archs)
if dropped_keywords:
- self.qatracker.add_error("KEYWORDS.dropped",
- "%s: %s" %
- (ebuild.relative_path, " ".join(sorted(dropped_keywords))))
+ self.qatracker.add_error(
+ "KEYWORDS.dropped", "%s: %s" % (
+ ebuild.relative_path,
+ " ".join(sorted(dropped_keywords))))
+
+ def _checkForInvalidKeywords(
+ self, pkg, package, y_ebuild, kwlist, profiles):
+ myuse = pkg._metadata["KEYWORDS"].split()
+
+ for mykey in myuse:
+ if mykey not in ("-*", "*", "~*"):
+ myskey = mykey
+
+ if not self._isKeywordStable(myskey[:1]):
+ myskey = myskey[1:]
+
+ if myskey not in kwlist:
+ self.qatracker.add_error(
+ "KEYWORDS.invalid",
+ "%s/%s.ebuild: %s" % (
+ package, y_ebuild, mykey))
+ elif myskey not in profiles:
+ self.qatracker.add_error(
+ "KEYWORDS.invalid",
+ "%s/%s.ebuild: %s (profile invalid)" % (
+ package, y_ebuild, mykey))
+
+ def _checkForMaskLikeKeywords(
+ self, package, y_ebuild, keywords, kwlist):
+
+ # KEYWORDS="-*" is a stupid replacement for package.mask
+ # and screws general KEYWORDS semantics
+ if "-*" in keywords:
+ haskeyword = False
+
+ for kw in keywords:
+ if kw[0] == "~":
+ kw = kw[1:]
+ if kw in kwlist:
+ haskeyword = True
+
+ if not haskeyword:
+ self.qatracker.add_error(
+ "KEYWORDS.stupid", package + "/" + y_ebuild + ".ebuild")
diff --git a/pym/repoman/main.py b/pym/repoman/main.py
index 7795f2f..db76d52 100755
--- a/pym/repoman/main.py
+++ b/pym/repoman/main.py
@@ -445,22 +445,9 @@ for xpkg in effective_scanlist:
#######################
keywordcheck.check(
pkg, xpkg, ebuild, y_ebuild, keywords, ebuild_archs, changed,
- live_ebuild)
+ live_ebuild, kwlist, profiles)
#######################
- # KEYWORDS="-*" is a stupid replacement for package.mask
- # and screws general KEYWORDS semantics
- if "-*" in keywords:
- haskeyword = False
- for kw in keywords:
- if kw[0] == "~":
- kw = kw[1:]
- if kw in kwlist:
- haskeyword = True
- if not haskeyword:
- qatracker.add_error("KEYWORDS.stupid",
- xpkg + "/" + y_ebuild + ".ebuild")
-
if live_ebuild and repo_settings.repo_config.name == "gentoo":
#######################
liveeclasscheck.check(
@@ -637,23 +624,6 @@ for xpkg in effective_scanlist:
qatracker.add_error("LICENSE.deprecated",
"%s: %s" % (ebuild.relative_path, lic))
- # keyword checks
- myuse = myaux["KEYWORDS"].split()
- for mykey in myuse:
- if mykey not in ("-*", "*", "~*"):
- myskey = mykey
- if myskey[:1] == "-":
- myskey = myskey[1:]
- if myskey[:1] == "~":
- myskey = myskey[1:]
- if myskey not in kwlist:
- qatracker.add_error("KEYWORDS.invalid",
- "%s/%s.ebuild: %s" % (xpkg, y_ebuild, mykey))
- elif myskey not in profiles:
- qatracker.add_error("KEYWORDS.invalid",
- "%s/%s.ebuild: %s (profile invalid)"
- % (xpkg, y_ebuild, mykey))
-
# restrict checks
myrestrict = None
try:
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/checks/ebuilds/
@ 2015-09-17 3:08 Brian Dolbec
0 siblings, 0 replies; 34+ messages in thread
From: Brian Dolbec @ 2015-09-17 3:08 UTC (permalink / raw
To: gentoo-commits
commit: aa7f136978e5791cef265c5da82b8cdc9d2055c3
Author: Brian Dolbec <dolsen <AT> gentoo <DOT> org>
AuthorDate: Tue Jun 3 19:20:43 2014 +0000
Commit: Brian Dolbec <dolsen <AT> gentoo <DOT> org>
CommitDate: Thu Sep 17 03:06:47 2015 +0000
URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=aa7f1369
Repoman: Refactor PkgMetadata and XmlLint classes for variable data passed in
Move all non-consistent data to be passed in via the check functions.
Initialize XmlLint once in the PkgMetadata class __init__().
pym/repoman/_xml.py | 33 ++++++++++++++++++++++---------
pym/repoman/checks/ebuilds/pkgmetadata.py | 12 +++++------
2 files changed, 30 insertions(+), 15 deletions(-)
diff --git a/pym/repoman/_xml.py b/pym/repoman/_xml.py
index b97c027..d5b5a5e 100644
--- a/pym/repoman/_xml.py
+++ b/pym/repoman/_xml.py
@@ -14,6 +14,8 @@ from repoman._subprocess import repoman_getstatusoutput
class _XMLParser(xml.etree.ElementTree.XMLParser):
+
+
def __init__(self, data, **kwargs):
xml.etree.ElementTree.XMLParser.__init__(self, **kwargs)
self._portage_data = data
@@ -25,11 +27,13 @@ class _XMLParser(xml.etree.ElementTree.XMLParser):
self.parser.StartDoctypeDeclHandler = \
self._portage_StartDoctypeDeclHandler
+
def _portage_XmlDeclHandler(self, version, encoding, standalone):
if self._base_XmlDeclHandler is not None:
self._base_XmlDeclHandler(version, encoding, standalone)
self._portage_data["XML_DECLARATION"] = (version, encoding, standalone)
+
def _portage_StartDoctypeDeclHandler(
self, doctypeName, systemId, publicId, has_internal_subset):
if self._base_StartDoctypeDeclHandler is not None:
@@ -49,33 +53,44 @@ class _MetadataTreeBuilder(xml.etree.ElementTree.TreeBuilder):
class XmlLint(object):
- def __init__(self, options, repolevel, repoman_settings):
+ def __init__(self, options, repoman_settings):
self.metadata_dtd = os.path.join(repoman_settings["DISTDIR"], 'metadata.dtd')
+ self.options = options
+ self.repoman_settings = repoman_settings
self._is_capable = False
self.binary = None
- self._check_capable(options, repolevel, repoman_settings)
+ self._check_capable()
+
- def _check_capable(self, options, repolevel, repoman_settings):
- if options.mode == "manifest":
+ def _check_capable(self):
+ if self.options.mode == "manifest":
return
self.binary = find_binary('xmllint')
if not self.binary:
print(red("!!! xmllint not found. Can't check metadata.xml.\n"))
- if options.xml_parse or repolevel == 3:
- print("%s sorry, xmllint is needed. failing\n" % red("!!!"))
- sys.exit(1)
else:
- if not fetch_metadata_dtd(self.metadata_dtd, repoman_settings):
+ if not fetch_metadata_dtd(self.metadata_dtd, self.repoman_settings):
sys.exit(1)
# this can be problematic if xmllint changes their output
self._is_capable = True
+
@property
def capable(self):
return self._is_capable
- def check(self, checkdir):
+
+ def check(self, checkdir, repolevel):
+ '''Runs checks on the package metadata.xml file
+
+ @param checkdir: string, path
+ @param repolevel: integer
+ @return boolean, False == bad metadata
+ '''
if not self.capable:
+ if self.options.xml_parse or repolevel == 3:
+ print("%s sorry, xmllint is needed. failing\n" % red("!!!"))
+ sys.exit(1)
return True
# xmlint can produce garbage output even on success, so only dump
# the ouput when it fails.
diff --git a/pym/repoman/checks/ebuilds/pkgmetadata.py b/pym/repoman/checks/ebuilds/pkgmetadata.py
index 0778696..674d32f 100644
--- a/pym/repoman/checks/ebuilds/pkgmetadata.py
+++ b/pym/repoman/checks/ebuilds/pkgmetadata.py
@@ -38,27 +38,28 @@ from repoman._xml import _XMLParser, _MetadataTreeBuilder, XmlLint
class PkgMetadata(object):
'''Package metadata.xml checks'''
- def __init__(self, options, qatracker, repolevel, repoman_settings):
+ def __init__(self, options, qatracker, repoman_settings):
'''PkgMetadata init function
@param options: ArgumentParser.parse_known_args(argv[1:]) options
@param qatracker: QATracker instance
- @param repolevel: integer
@param repoman_settings: settings instance
'''
self.options = options
self.qatracker = qatracker
- self.repolevel = repolevel
self.repoman_settings = repoman_settings
self.musedict = {}
+ self.xmllint = XmlLint(self.options, self.repoman_settings)
+
- def check(self, xpkg, checkdir, checkdirlist):
+ def check(self, xpkg, checkdir, checkdirlist, repolevel):
'''Performs the checks on the metadata.xml for the package
@param xpkg: the pacakge being checked
@param checkdir: string, directory path
@param checkdirlist: list of checkdir's
+ @param repolevel: integer
'''
self.musedict = {}
@@ -165,8 +166,7 @@ class PkgMetadata(object):
# Only carry out if in package directory or check forced
if not metadata_bad:
- xmllint = XmlLint(self.options, self.repolevel, self.repoman_settings)
- if not xmllint.check(checkdir):
+ if not self.xmllint.check(checkdir, repolevel):
self.qatracker.add_error("metadata.bad", xpkg + "/metadata.xml")
del metadata_bad
return
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/checks/ebuilds/
@ 2015-09-17 4:51 Brian Dolbec
0 siblings, 0 replies; 34+ messages in thread
From: Brian Dolbec @ 2015-09-17 4:51 UTC (permalink / raw
To: gentoo-commits
commit: 41d11470db9553ed525d412f987fe967d7c57cad
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: Thu Sep 17 04:41:24 2015 +0000
URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=41d11470
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 c45af26..132f2f7 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
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/checks/ebuilds/
@ 2015-09-17 4:51 Brian Dolbec
0 siblings, 0 replies; 34+ messages in thread
From: Brian Dolbec @ 2015-09-17 4:51 UTC (permalink / raw
To: gentoo-commits
commit: 33eb07b788baef1e063c4157d903cb14762a7518
Author: Brian Dolbec <dolsen <AT> gentoo <DOT> org>
AuthorDate: Tue Jun 3 19:20:43 2014 +0000
Commit: Brian Dolbec <dolsen <AT> gentoo <DOT> org>
CommitDate: Thu Sep 17 04:41:25 2015 +0000
URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=33eb07b7
Repoman: Refactor PkgMetadata and XmlLint classes for variable data passed in
Move all non-consistent data to be passed in via the check functions.
Initialize XmlLint once in the PkgMetadata class __init__().
pym/repoman/_xml.py | 33 ++++++++++++++++++++++---------
pym/repoman/checks/ebuilds/pkgmetadata.py | 12 +++++------
2 files changed, 30 insertions(+), 15 deletions(-)
diff --git a/pym/repoman/_xml.py b/pym/repoman/_xml.py
index b97c027..d5b5a5e 100644
--- a/pym/repoman/_xml.py
+++ b/pym/repoman/_xml.py
@@ -14,6 +14,8 @@ from repoman._subprocess import repoman_getstatusoutput
class _XMLParser(xml.etree.ElementTree.XMLParser):
+
+
def __init__(self, data, **kwargs):
xml.etree.ElementTree.XMLParser.__init__(self, **kwargs)
self._portage_data = data
@@ -25,11 +27,13 @@ class _XMLParser(xml.etree.ElementTree.XMLParser):
self.parser.StartDoctypeDeclHandler = \
self._portage_StartDoctypeDeclHandler
+
def _portage_XmlDeclHandler(self, version, encoding, standalone):
if self._base_XmlDeclHandler is not None:
self._base_XmlDeclHandler(version, encoding, standalone)
self._portage_data["XML_DECLARATION"] = (version, encoding, standalone)
+
def _portage_StartDoctypeDeclHandler(
self, doctypeName, systemId, publicId, has_internal_subset):
if self._base_StartDoctypeDeclHandler is not None:
@@ -49,33 +53,44 @@ class _MetadataTreeBuilder(xml.etree.ElementTree.TreeBuilder):
class XmlLint(object):
- def __init__(self, options, repolevel, repoman_settings):
+ def __init__(self, options, repoman_settings):
self.metadata_dtd = os.path.join(repoman_settings["DISTDIR"], 'metadata.dtd')
+ self.options = options
+ self.repoman_settings = repoman_settings
self._is_capable = False
self.binary = None
- self._check_capable(options, repolevel, repoman_settings)
+ self._check_capable()
+
- def _check_capable(self, options, repolevel, repoman_settings):
- if options.mode == "manifest":
+ def _check_capable(self):
+ if self.options.mode == "manifest":
return
self.binary = find_binary('xmllint')
if not self.binary:
print(red("!!! xmllint not found. Can't check metadata.xml.\n"))
- if options.xml_parse or repolevel == 3:
- print("%s sorry, xmllint is needed. failing\n" % red("!!!"))
- sys.exit(1)
else:
- if not fetch_metadata_dtd(self.metadata_dtd, repoman_settings):
+ if not fetch_metadata_dtd(self.metadata_dtd, self.repoman_settings):
sys.exit(1)
# this can be problematic if xmllint changes their output
self._is_capable = True
+
@property
def capable(self):
return self._is_capable
- def check(self, checkdir):
+
+ def check(self, checkdir, repolevel):
+ '''Runs checks on the package metadata.xml file
+
+ @param checkdir: string, path
+ @param repolevel: integer
+ @return boolean, False == bad metadata
+ '''
if not self.capable:
+ if self.options.xml_parse or repolevel == 3:
+ print("%s sorry, xmllint is needed. failing\n" % red("!!!"))
+ sys.exit(1)
return True
# xmlint can produce garbage output even on success, so only dump
# the ouput when it fails.
diff --git a/pym/repoman/checks/ebuilds/pkgmetadata.py b/pym/repoman/checks/ebuilds/pkgmetadata.py
index 0778696..674d32f 100644
--- a/pym/repoman/checks/ebuilds/pkgmetadata.py
+++ b/pym/repoman/checks/ebuilds/pkgmetadata.py
@@ -38,27 +38,28 @@ from repoman._xml import _XMLParser, _MetadataTreeBuilder, XmlLint
class PkgMetadata(object):
'''Package metadata.xml checks'''
- def __init__(self, options, qatracker, repolevel, repoman_settings):
+ def __init__(self, options, qatracker, repoman_settings):
'''PkgMetadata init function
@param options: ArgumentParser.parse_known_args(argv[1:]) options
@param qatracker: QATracker instance
- @param repolevel: integer
@param repoman_settings: settings instance
'''
self.options = options
self.qatracker = qatracker
- self.repolevel = repolevel
self.repoman_settings = repoman_settings
self.musedict = {}
+ self.xmllint = XmlLint(self.options, self.repoman_settings)
+
- def check(self, xpkg, checkdir, checkdirlist):
+ def check(self, xpkg, checkdir, checkdirlist, repolevel):
'''Performs the checks on the metadata.xml for the package
@param xpkg: the pacakge being checked
@param checkdir: string, directory path
@param checkdirlist: list of checkdir's
+ @param repolevel: integer
'''
self.musedict = {}
@@ -165,8 +166,7 @@ class PkgMetadata(object):
# Only carry out if in package directory or check forced
if not metadata_bad:
- xmllint = XmlLint(self.options, self.repolevel, self.repoman_settings)
- if not xmllint.check(checkdir):
+ if not self.xmllint.check(checkdir, repolevel):
self.qatracker.add_error("metadata.bad", xpkg + "/metadata.xml")
del metadata_bad
return
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/checks/ebuilds/
@ 2015-09-17 4:51 Brian Dolbec
0 siblings, 0 replies; 34+ messages in thread
From: Brian Dolbec @ 2015-09-17 4:51 UTC (permalink / raw
To: gentoo-commits
commit: 0983c08bedbda4efd645e29624f093ae4167c346
Author: Tom Wijsman <tomwij <AT> gentoo <DOT> org>
AuthorDate: Wed Jun 4 14:17:49 2014 +0000
Commit: Brian Dolbec <dolsen <AT> gentoo <DOT> org>
CommitDate: Thu Sep 17 04:41:27 2015 +0000
URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=0983c08b
repoman/main.py: More KEYWORDS checks to checks/ebuilds/keywords.py
pym/repoman/checks/ebuilds/keywords.py | 64 ++++++++++++++++++++++++++++++----
pym/repoman/main.py | 32 +----------------
2 files changed, 59 insertions(+), 37 deletions(-)
diff --git a/pym/repoman/checks/ebuilds/keywords.py b/pym/repoman/checks/ebuilds/keywords.py
index b724269..235c751 100644
--- a/pym/repoman/checks/ebuilds/keywords.py
+++ b/pym/repoman/checks/ebuilds/keywords.py
@@ -21,7 +21,7 @@ class KeywordChecks(object):
def check(
self, pkg, package, ebuild, y_ebuild, keywords, ebuild_archs, changed,
- live_ebuild):
+ live_ebuild, kwlist, profiles):
'''Perform the check.
@param pkg: Package in which we check (object).
@@ -33,21 +33,32 @@ class KeywordChecks(object):
@param changed: Changes instance
@param slot_keywords: A dictionary of keywords per slot.
@param live_ebuild: A boolean that determines if this is a live ebuild.
+ @param kwlist: A list of all global keywords.
+ @param profiles: A list of all profiles.
'''
if not self.options.straight_to_stable:
self._checkAddedWithStableKeywords(
package, ebuild, y_ebuild, keywords, changed)
+
self._checkForDroppedKeywords(
pkg, ebuild, ebuild_archs, live_ebuild)
+ self._checkForInvalidKeywords(
+ pkg, package, y_ebuild, kwlist, profiles)
+
+ self._checkForMaskLikeKeywords(
+ package, y_ebuild, keywords, kwlist)
+
self.slot_keywords[pkg.slot].update(ebuild_archs)
+ def _isKeywordStable(self, keyword):
+ return not keyword.startswith("~") and not keyword.startswith("-")
+
def _checkAddedWithStableKeywords(
self, package, ebuild, y_ebuild, keywords, changed):
catdir, pkgdir = package.split("/")
- is_stable = lambda kw: not kw.startswith("~") and not kw.startswith("-")
- stable_keywords = list(filter(is_stable, keywords))
+ stable_keywords = list(filter(self._isKeywordStable, keywords))
if stable_keywords:
if ebuild.ebuild_path in changed.new_ebuilds and catdir != "virtual":
stable_keywords.sort()
@@ -64,6 +75,47 @@ class KeywordChecks(object):
elif ebuild_archs and "*" not in ebuild_archs and not live_ebuild:
dropped_keywords = previous_keywords.difference(ebuild_archs)
if dropped_keywords:
- self.qatracker.add_error("KEYWORDS.dropped",
- "%s: %s" %
- (ebuild.relative_path, " ".join(sorted(dropped_keywords))))
+ self.qatracker.add_error(
+ "KEYWORDS.dropped", "%s: %s" % (
+ ebuild.relative_path,
+ " ".join(sorted(dropped_keywords))))
+
+ def _checkForInvalidKeywords(
+ self, pkg, package, y_ebuild, kwlist, profiles):
+ myuse = pkg._metadata["KEYWORDS"].split()
+
+ for mykey in myuse:
+ if mykey not in ("-*", "*", "~*"):
+ myskey = mykey
+
+ if not self._isKeywordStable(myskey[:1]):
+ myskey = myskey[1:]
+
+ if myskey not in kwlist:
+ self.qatracker.add_error(
+ "KEYWORDS.invalid",
+ "%s/%s.ebuild: %s" % (
+ package, y_ebuild, mykey))
+ elif myskey not in profiles:
+ self.qatracker.add_error(
+ "KEYWORDS.invalid",
+ "%s/%s.ebuild: %s (profile invalid)" % (
+ package, y_ebuild, mykey))
+
+ def _checkForMaskLikeKeywords(
+ self, package, y_ebuild, keywords, kwlist):
+
+ # KEYWORDS="-*" is a stupid replacement for package.mask
+ # and screws general KEYWORDS semantics
+ if "-*" in keywords:
+ haskeyword = False
+
+ for kw in keywords:
+ if kw[0] == "~":
+ kw = kw[1:]
+ if kw in kwlist:
+ haskeyword = True
+
+ if not haskeyword:
+ self.qatracker.add_error(
+ "KEYWORDS.stupid", package + "/" + y_ebuild + ".ebuild")
diff --git a/pym/repoman/main.py b/pym/repoman/main.py
index 4ded687..ea54ec4 100755
--- a/pym/repoman/main.py
+++ b/pym/repoman/main.py
@@ -445,22 +445,9 @@ for xpkg in effective_scanlist:
#######################
keywordcheck.check(
pkg, xpkg, ebuild, y_ebuild, keywords, ebuild_archs, changed,
- live_ebuild)
+ live_ebuild, kwlist, profiles)
#######################
- # KEYWORDS="-*" is a stupid replacement for package.mask
- # and screws general KEYWORDS semantics
- if "-*" in keywords:
- haskeyword = False
- for kw in keywords:
- if kw[0] == "~":
- kw = kw[1:]
- if kw in kwlist:
- haskeyword = True
- if not haskeyword:
- qatracker.add_error("KEYWORDS.stupid",
- xpkg + "/" + y_ebuild + ".ebuild")
-
if live_ebuild and repo_settings.repo_config.name == "gentoo":
#######################
liveeclasscheck.check(
@@ -637,23 +624,6 @@ for xpkg in effective_scanlist:
qatracker.add_error("LICENSE.deprecated",
"%s: %s" % (ebuild.relative_path, lic))
- # keyword checks
- myuse = myaux["KEYWORDS"].split()
- for mykey in myuse:
- if mykey not in ("-*", "*", "~*"):
- myskey = mykey
- if myskey[:1] == "-":
- myskey = myskey[1:]
- if myskey[:1] == "~":
- myskey = myskey[1:]
- if myskey not in kwlist:
- qatracker.add_error("KEYWORDS.invalid",
- "%s/%s.ebuild: %s" % (xpkg, y_ebuild, mykey))
- elif myskey not in profiles:
- qatracker.add_error("KEYWORDS.invalid",
- "%s/%s.ebuild: %s (profile invalid)"
- % (xpkg, y_ebuild, mykey))
-
# restrict checks
myrestrict = None
try:
^ permalink raw reply related [flat|nested] 34+ messages in thread
* [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/checks/ebuilds/
@ 2015-09-20 2:06 Brian Dolbec
0 siblings, 0 replies; 34+ messages in thread
From: Brian Dolbec @ 2015-09-20 2:06 UTC (permalink / raw
To: gentoo-commits
commit: c0d5f1a033ba73a3557be7daab1a488c3b9984c8
Author: Tom Wijsman <tomwij <AT> gentoo <DOT> org>
AuthorDate: Wed Jun 4 14:17:49 2014 +0000
Commit: Brian Dolbec <dolsen <AT> gentoo <DOT> org>
CommitDate: Sun Sep 20 01:54:07 2015 +0000
URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=c0d5f1a0
repoman/main.py: More KEYWORDS checks to checks/ebuilds/keywords.py
pym/repoman/checks/ebuilds/keywords.py | 64 ++++++++++++++++++++++++++++++----
pym/repoman/main.py | 32 +----------------
2 files changed, 59 insertions(+), 37 deletions(-)
diff --git a/pym/repoman/checks/ebuilds/keywords.py b/pym/repoman/checks/ebuilds/keywords.py
index b724269..235c751 100644
--- a/pym/repoman/checks/ebuilds/keywords.py
+++ b/pym/repoman/checks/ebuilds/keywords.py
@@ -21,7 +21,7 @@ class KeywordChecks(object):
def check(
self, pkg, package, ebuild, y_ebuild, keywords, ebuild_archs, changed,
- live_ebuild):
+ live_ebuild, kwlist, profiles):
'''Perform the check.
@param pkg: Package in which we check (object).
@@ -33,21 +33,32 @@ class KeywordChecks(object):
@param changed: Changes instance
@param slot_keywords: A dictionary of keywords per slot.
@param live_ebuild: A boolean that determines if this is a live ebuild.
+ @param kwlist: A list of all global keywords.
+ @param profiles: A list of all profiles.
'''
if not self.options.straight_to_stable:
self._checkAddedWithStableKeywords(
package, ebuild, y_ebuild, keywords, changed)
+
self._checkForDroppedKeywords(
pkg, ebuild, ebuild_archs, live_ebuild)
+ self._checkForInvalidKeywords(
+ pkg, package, y_ebuild, kwlist, profiles)
+
+ self._checkForMaskLikeKeywords(
+ package, y_ebuild, keywords, kwlist)
+
self.slot_keywords[pkg.slot].update(ebuild_archs)
+ def _isKeywordStable(self, keyword):
+ return not keyword.startswith("~") and not keyword.startswith("-")
+
def _checkAddedWithStableKeywords(
self, package, ebuild, y_ebuild, keywords, changed):
catdir, pkgdir = package.split("/")
- is_stable = lambda kw: not kw.startswith("~") and not kw.startswith("-")
- stable_keywords = list(filter(is_stable, keywords))
+ stable_keywords = list(filter(self._isKeywordStable, keywords))
if stable_keywords:
if ebuild.ebuild_path in changed.new_ebuilds and catdir != "virtual":
stable_keywords.sort()
@@ -64,6 +75,47 @@ class KeywordChecks(object):
elif ebuild_archs and "*" not in ebuild_archs and not live_ebuild:
dropped_keywords = previous_keywords.difference(ebuild_archs)
if dropped_keywords:
- self.qatracker.add_error("KEYWORDS.dropped",
- "%s: %s" %
- (ebuild.relative_path, " ".join(sorted(dropped_keywords))))
+ self.qatracker.add_error(
+ "KEYWORDS.dropped", "%s: %s" % (
+ ebuild.relative_path,
+ " ".join(sorted(dropped_keywords))))
+
+ def _checkForInvalidKeywords(
+ self, pkg, package, y_ebuild, kwlist, profiles):
+ myuse = pkg._metadata["KEYWORDS"].split()
+
+ for mykey in myuse:
+ if mykey not in ("-*", "*", "~*"):
+ myskey = mykey
+
+ if not self._isKeywordStable(myskey[:1]):
+ myskey = myskey[1:]
+
+ if myskey not in kwlist:
+ self.qatracker.add_error(
+ "KEYWORDS.invalid",
+ "%s/%s.ebuild: %s" % (
+ package, y_ebuild, mykey))
+ elif myskey not in profiles:
+ self.qatracker.add_error(
+ "KEYWORDS.invalid",
+ "%s/%s.ebuild: %s (profile invalid)" % (
+ package, y_ebuild, mykey))
+
+ def _checkForMaskLikeKeywords(
+ self, package, y_ebuild, keywords, kwlist):
+
+ # KEYWORDS="-*" is a stupid replacement for package.mask
+ # and screws general KEYWORDS semantics
+ if "-*" in keywords:
+ haskeyword = False
+
+ for kw in keywords:
+ if kw[0] == "~":
+ kw = kw[1:]
+ if kw in kwlist:
+ haskeyword = True
+
+ if not haskeyword:
+ self.qatracker.add_error(
+ "KEYWORDS.stupid", package + "/" + y_ebuild + ".ebuild")
diff --git a/pym/repoman/main.py b/pym/repoman/main.py
index 4ded687..ea54ec4 100755
--- a/pym/repoman/main.py
+++ b/pym/repoman/main.py
@@ -445,22 +445,9 @@ for xpkg in effective_scanlist:
#######################
keywordcheck.check(
pkg, xpkg, ebuild, y_ebuild, keywords, ebuild_archs, changed,
- live_ebuild)
+ live_ebuild, kwlist, profiles)
#######################
- # KEYWORDS="-*" is a stupid replacement for package.mask
- # and screws general KEYWORDS semantics
- if "-*" in keywords:
- haskeyword = False
- for kw in keywords:
- if kw[0] == "~":
- kw = kw[1:]
- if kw in kwlist:
- haskeyword = True
- if not haskeyword:
- qatracker.add_error("KEYWORDS.stupid",
- xpkg + "/" + y_ebuild + ".ebuild")
-
if live_ebuild and repo_settings.repo_config.name == "gentoo":
#######################
liveeclasscheck.check(
@@ -637,23 +624,6 @@ for xpkg in effective_scanlist:
qatracker.add_error("LICENSE.deprecated",
"%s: %s" % (ebuild.relative_path, lic))
- # keyword checks
- myuse = myaux["KEYWORDS"].split()
- for mykey in myuse:
- if mykey not in ("-*", "*", "~*"):
- myskey = mykey
- if myskey[:1] == "-":
- myskey = myskey[1:]
- if myskey[:1] == "~":
- myskey = myskey[1:]
- if myskey not in kwlist:
- qatracker.add_error("KEYWORDS.invalid",
- "%s/%s.ebuild: %s" % (xpkg, y_ebuild, mykey))
- elif myskey not in profiles:
- qatracker.add_error("KEYWORDS.invalid",
- "%s/%s.ebuild: %s (profile invalid)"
- % (xpkg, y_ebuild, mykey))
-
# restrict checks
myrestrict = None
try:
^ permalink raw reply related [flat|nested] 34+ messages in thread
end of thread, other threads:[~2015-09-20 2:06 UTC | newest]
Thread overview: 34+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-08-11 23:54 [gentoo-commits] proj/portage:repoman commit in: pym/repoman/, pym/repoman/checks/ebuilds/ Brian Dolbec
-- strict thread matches above, loose matches on Subject: below --
2015-09-20 2:06 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-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-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
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox