* [gentoo-commits] proj/portage:master commit in: pym/repoman/modules/scan/metadata/, pym/repoman/modules/scan/depend/, ...
@ 2016-04-29 17:24 Brian Dolbec
0 siblings, 0 replies; only message in thread
From: Brian Dolbec @ 2016-04-29 17:24 UTC (permalink / raw
To: gentoo-commits
commit: 836cc3ffc55376348315577958e7212fefa38a2a
Author: Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Mon Apr 25 16:50:59 2016 +0000
Commit: Brian Dolbec <dolsen <AT> gentoo <DOT> org>
CommitDate: Mon Apr 25 16:58:53 2016 +0000
URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=836cc3ff
ProfileDependsChecks: encapsulate DependChecks and LicenseChecks
pym/repoman/modules/scan/depend/__init__.py | 38 +-----
pym/repoman/modules/scan/depend/_depend_checks.py | 150 ++++++++++++++++++++
pym/repoman/modules/scan/depend/depend.py | 158 ----------------------
pym/repoman/modules/scan/depend/profile.py | 17 ++-
pym/repoman/modules/scan/metadata/__init__.py | 17 ---
pym/repoman/modules/scan/metadata/license.py | 54 --------
pym/repoman/scanner.py | 4 +-
7 files changed, 167 insertions(+), 271 deletions(-)
diff --git a/pym/repoman/modules/scan/depend/__init__.py b/pym/repoman/modules/scan/depend/__init__.py
index 01bd116..6d12286 100644
--- a/pym/repoman/modules/scan/depend/__init__.py
+++ b/pym/repoman/modules/scan/depend/__init__.py
@@ -10,24 +10,6 @@ module_spec = {
'name': 'depend',
'description': doc,
'provides':{
- 'depend-module': {
- 'name': "depend",
- 'sourcefile': "depend",
- 'class': "DependChecks",
- 'description': doc,
- 'functions': ['check'],
- 'func_desc': {
- },
- 'mod_kwargs': ['qatracker', 'portdb'
- ],
- 'func_kwargs': {
- 'baddepsyntax': ('Future', False),
- 'badlicsyntax': ('Future', False),
- 'ebuild': (None, None),
- 'pkg': (None, None),
- 'unknown_pkgs': ('Future', 'UNSET'),
- },
- },
'profile-module': {
'name': "profile",
'sourcefile': "profile",
@@ -37,30 +19,12 @@ module_spec = {
'func_desc': {
},
'mod_kwargs': ['qatracker', 'portdb', 'profiles', 'options',
- 'repo_settings', 'include_arches', 'caches',
+ 'repo_metadata', 'repo_settings', 'include_arches', 'caches',
'repoman_incrementals', 'env', 'have', 'dev_keywords'
],
'func_kwargs': {
- 'baddepsyntax': (None, None),
'ebuild': (None, None),
'pkg': (None, None),
- 'unknown_pkgs': (None, None),
- },
- },
- 'unknown-module': {
- 'name': "unknown",
- 'sourcefile': "unknown",
- 'class': "DependUnknown",
- 'description': doc,
- 'functions': ['check'],
- 'func_desc': {
- },
- 'mod_kwargs': ['qatracker',
- ],
- 'func_kwargs': {
- 'baddepsyntax': (None, None),
- 'ebuild': (None, None),
- 'unknown_pkgs': ('Future', 'UNSET'),
},
},
}
diff --git a/pym/repoman/modules/scan/depend/_depend_checks.py b/pym/repoman/modules/scan/depend/_depend_checks.py
new file mode 100644
index 0000000..4e1d216
--- /dev/null
+++ b/pym/repoman/modules/scan/depend/_depend_checks.py
@@ -0,0 +1,150 @@
+# -*- coding:utf-8 -*-
+
+
+from _emerge.Package import Package
+
+from repoman.check_missingslot import check_missingslot
+# import our initialized portage instance
+from repoman._portage import portage
+from repoman.qa_data import suspect_virtual, suspect_rdepend
+
+
+def _depend_checks(ebuild, pkg, portdb, qatracker, repo_metadata):
+ '''Checks the ebuild dependencies for errors
+
+ @param pkg: Package in which we check (object).
+ @param ebuild: Ebuild which we check (object).
+ @param portdb: portdb instance
+ @param qatracker: QATracker instance
+ @param repo_metadata: dictionary of various repository items.
+ @returns: (unknown_pkgs, badlicsyntax)
+ '''
+
+ unknown_pkgs = set()
+
+ inherited_java_eclass = "java-pkg-2" in ebuild.inherited or \
+ "java-pkg-opt-2" in ebuild.inherited,
+ inherited_wxwidgets_eclass = "wxwidgets" in ebuild.inherited
+ # operator_tokens = set(["||", "(", ")"])
+ type_list, badsyntax = [], []
+ for mytype in Package._dep_keys + ("LICENSE", "PROPERTIES", "PROVIDE"):
+ mydepstr = ebuild.metadata[mytype]
+
+ buildtime = mytype in Package._buildtime_keys
+ runtime = mytype in Package._runtime_keys
+ token_class = None
+ if mytype.endswith("DEPEND"):
+ token_class = portage.dep.Atom
+
+ try:
+ atoms = portage.dep.use_reduce(
+ mydepstr, matchall=1, flat=True,
+ is_valid_flag=pkg.iuse.is_valid_flag, token_class=token_class)
+ except portage.exception.InvalidDependString as e:
+ atoms = None
+ badsyntax.append(str(e))
+
+ if atoms and mytype.endswith("DEPEND"):
+ if runtime and \
+ "test?" in mydepstr.split():
+ qatracker.add_error(
+ mytype + '.suspect',
+ "%s: 'test?' USE conditional in %s" %
+ (ebuild.relative_path, mytype))
+
+ for atom in atoms:
+ if atom == "||":
+ continue
+
+ is_blocker = atom.blocker
+
+ # Skip dependency.unknown for blockers, so that we
+ # don't encourage people to remove necessary blockers,
+ # as discussed in bug 382407. We use atom.without_use
+ # due to bug 525376.
+ if not is_blocker and \
+ not portdb.xmatch("match-all", atom.without_use) and \
+ not atom.cp.startswith("virtual/"):
+ unknown_pkgs.add((mytype, atom.unevaluated_atom))
+
+ if pkg.category != "virtual":
+ if not is_blocker and \
+ atom.cp in suspect_virtual:
+ qatracker.add_error(
+ 'virtual.suspect', ebuild.relative_path +
+ ": %s: consider using '%s' instead of '%s'" %
+ (mytype, suspect_virtual[atom.cp], atom))
+ if not is_blocker and \
+ atom.cp.startswith("perl-core/"):
+ qatracker.add_error('dependency.perlcore',
+ ebuild.relative_path +
+ ": %s: please use '%s' instead of '%s'" %
+ (mytype,
+ atom.replace("perl-core/","virtual/perl-"),
+ atom))
+
+ if buildtime and \
+ not is_blocker and \
+ not inherited_java_eclass and \
+ atom.cp == "virtual/jdk":
+ qatracker.add_error(
+ 'java.eclassesnotused', ebuild.relative_path)
+ elif buildtime and \
+ not is_blocker and \
+ not inherited_wxwidgets_eclass and \
+ atom.cp == "x11-libs/wxGTK":
+ qatracker.add_error(
+ 'wxwidgets.eclassnotused',
+ "%s: %ss on x11-libs/wxGTK without inheriting"
+ " wxwidgets.eclass" % (ebuild.relative_path, mytype))
+ elif runtime:
+ if not is_blocker and \
+ atom.cp in suspect_rdepend:
+ qatracker.add_error(
+ mytype + '.suspect',
+ ebuild.relative_path + ": '%s'" % atom)
+
+ if atom.operator == "~" and \
+ portage.versions.catpkgsplit(atom.cpv)[3] != "r0":
+ qacat = 'dependency.badtilde'
+ qatracker.add_error(
+ qacat, "%s: %s uses the ~ operator"
+ " with a non-zero revision: '%s'" %
+ (ebuild.relative_path, mytype, atom))
+
+ check_missingslot(atom, mytype, ebuild.eapi, portdb, qatracker,
+ ebuild.relative_path, ebuild.metadata)
+
+ type_list.extend([mytype] * (len(badsyntax) - len(type_list)))
+
+ for m, b in zip(type_list, badsyntax):
+ if m.endswith("DEPEND"):
+ qacat = "dependency.syntax"
+ else:
+ qacat = m + ".syntax"
+ qatracker.add_error(
+ qacat, "%s: %s: %s" % (ebuild.relative_path, m, b))
+
+ # data required for some other tests
+ badlicsyntax = len([z for z in type_list if z == "LICENSE"])
+ badprovsyntax = len([z for z in type_list if z == "PROVIDE"])
+ baddepsyntax = len(type_list) != badlicsyntax + badprovsyntax
+ badlicsyntax = badlicsyntax > 0
+ #badprovsyntax = badprovsyntax > 0
+
+ # Parse the LICENSE variable, remove USE conditions and flatten it.
+ licenses = portage.dep.use_reduce(
+ ebuild.metadata["LICENSE"], matchall=1, flat=True)
+
+ # Check each entry to ensure that it exists in ${PORTDIR}/licenses/.
+ for lic in licenses:
+ # Need to check for "||" manually as no portage
+ # function will remove it without removing values.
+ if lic not in repo_metadata['liclist'] and lic != "||":
+ qatracker.add_error("LICENSE.invalid",
+ "%s: %s" % (ebuild.relative_path, lic))
+ elif lic in repo_metadata['lic_deprecated']:
+ qatracker.add_error("LICENSE.deprecated",
+ "%s: %s" % (ebuild.relative_path, lic))
+
+ return unknown_pkgs, baddepsyntax
diff --git a/pym/repoman/modules/scan/depend/depend.py b/pym/repoman/modules/scan/depend/depend.py
deleted file mode 100644
index 44a21e9..0000000
--- a/pym/repoman/modules/scan/depend/depend.py
+++ /dev/null
@@ -1,158 +0,0 @@
-# -*- coding:utf-8 -*-
-
-
-from _emerge.Package import Package
-
-from repoman.check_missingslot import check_missingslot
-# import our initialized portage instance
-from repoman._portage import portage
-from repoman.modules.scan.scanbase import ScanBase
-from repoman.qa_data import suspect_virtual, suspect_rdepend
-
-
-class DependChecks(ScanBase):
- '''Perform dependency checks'''
-
- def __init__(self, **kwargs):
- '''
- @param portdb: portdb instance
- @param qatracker: QATracker instance
- '''
- self.qatracker = kwargs.get('qatracker')
- self.portdb = kwargs.get('portdb')
-
- def check(self, **kwargs):
- '''Checks the ebuild dependencies for errors
-
- @param pkg: Package in which we check (object).
- @param ebuild: Ebuild which we check (object).
- @returns: boolean
- '''
- ebuild = kwargs.get('ebuild').get()
- pkg = kwargs.get('pkg').get()
-
- unknown_pkgs = set()
-
- inherited_java_eclass = "java-pkg-2" in ebuild.inherited or \
- "java-pkg-opt-2" in ebuild.inherited,
- inherited_wxwidgets_eclass = "wxwidgets" in ebuild.inherited
- # operator_tokens = set(["||", "(", ")"])
- type_list, badsyntax = [], []
- for mytype in Package._dep_keys + ("LICENSE", "PROPERTIES", "PROVIDE"):
- mydepstr = ebuild.metadata[mytype]
-
- buildtime = mytype in Package._buildtime_keys
- runtime = mytype in Package._runtime_keys
- token_class = None
- if mytype.endswith("DEPEND"):
- token_class = portage.dep.Atom
-
- try:
- atoms = portage.dep.use_reduce(
- mydepstr, matchall=1, flat=True,
- is_valid_flag=pkg.iuse.is_valid_flag, token_class=token_class)
- except portage.exception.InvalidDependString as e:
- atoms = None
- badsyntax.append(str(e))
-
- if atoms and mytype.endswith("DEPEND"):
- if runtime and \
- "test?" in mydepstr.split():
- self.qatracker.add_error(
- mytype + '.suspect',
- "%s: 'test?' USE conditional in %s" %
- (ebuild.relative_path, mytype))
-
- for atom in atoms:
- if atom == "||":
- continue
-
- is_blocker = atom.blocker
-
- # Skip dependency.unknown for blockers, so that we
- # don't encourage people to remove necessary blockers,
- # as discussed in bug 382407. We use atom.without_use
- # due to bug 525376.
- if not is_blocker and \
- not self.portdb.xmatch("match-all", atom.without_use) and \
- not atom.cp.startswith("virtual/"):
- unknown_pkgs.add((mytype, atom.unevaluated_atom))
-
- if kwargs.get('catdir') != "virtual":
- if not is_blocker and \
- atom.cp in suspect_virtual:
- self.qatracker.add_error(
- 'virtual.suspect', ebuild.relative_path +
- ": %s: consider using '%s' instead of '%s'" %
- (mytype, suspect_virtual[atom.cp], atom))
- if not is_blocker and \
- atom.cp.startswith("perl-core/"):
- self.qatracker.add_error('dependency.perlcore',
- ebuild.relative_path +
- ": %s: please use '%s' instead of '%s'" %
- (mytype,
- atom.replace("perl-core/","virtual/perl-"),
- atom))
-
- if buildtime and \
- not is_blocker and \
- not inherited_java_eclass and \
- atom.cp == "virtual/jdk":
- self.qatracker.add_error(
- 'java.eclassesnotused', ebuild.relative_path)
- elif buildtime and \
- not is_blocker and \
- not inherited_wxwidgets_eclass and \
- atom.cp == "x11-libs/wxGTK":
- self.qatracker.add_error(
- 'wxwidgets.eclassnotused',
- "%s: %ss on x11-libs/wxGTK without inheriting"
- " wxwidgets.eclass" % (ebuild.relative_path, mytype))
- elif runtime:
- if not is_blocker and \
- atom.cp in suspect_rdepend:
- self.qatracker.add_error(
- mytype + '.suspect',
- ebuild.relative_path + ": '%s'" % atom)
-
- if atom.operator == "~" and \
- portage.versions.catpkgsplit(atom.cpv)[3] != "r0":
- qacat = 'dependency.badtilde'
- self.qatracker.add_error(
- qacat, "%s: %s uses the ~ operator"
- " with a non-zero revision: '%s'" %
- (ebuild.relative_path, mytype, atom))
-
- check_missingslot(atom, mytype, ebuild.eapi, self.portdb, self.qatracker,
- ebuild.relative_path, ebuild.metadata)
-
- type_list.extend([mytype] * (len(badsyntax) - len(type_list)))
-
- for m, b in zip(type_list, badsyntax):
- if m.endswith("DEPEND"):
- qacat = "dependency.syntax"
- else:
- qacat = m + ".syntax"
- self.qatracker.add_error(
- qacat, "%s: %s: %s" % (ebuild.relative_path, m, b))
-
- # data required for some other tests
- badlicsyntax = len([z for z in type_list if z == "LICENSE"])
- badprovsyntax = len([z for z in type_list if z == "PROVIDE"])
- baddepsyntax = len(type_list) != badlicsyntax + badprovsyntax
- badlicsyntax = badlicsyntax > 0
- #badprovsyntax = badprovsyntax > 0
-
- # update the dynamic data
- dyn_unknown = kwargs.get('unknown_pkgs')
- dyn_unknown.set(unknown_pkgs)
- dyn_badlicsyntax = kwargs.get('badlicsyntax')
- dyn_badlicsyntax.set(badlicsyntax, ignore_InvalidState=True)
- dyn_baddepsyntax = kwargs.get('baddepsyntax')
- dyn_baddepsyntax.set(baddepsyntax, ignore_InvalidState=True)
- return False
-
- @property
- def runInEbuilds(self):
- '''Ebuild level scans'''
- return (True, [self.check])
diff --git a/pym/repoman/modules/scan/depend/profile.py b/pym/repoman/modules/scan/depend/profile.py
index 0388374..5b32f66 100644
--- a/pym/repoman/modules/scan/depend/profile.py
+++ b/pym/repoman/modules/scan/depend/profile.py
@@ -9,6 +9,7 @@ from _emerge.Package import Package
# import our initialized portage instance
from repoman._portage import portage
from repoman.modules.scan.scanbase import ScanBase
+from repoman.modules.scan.depend._depend_checks import _depend_checks
from repoman.modules.scan.depend._gen_arches import _gen_arches
from portage.dep import Atom
@@ -34,6 +35,7 @@ class ProfileDependsChecks(ScanBase):
@param env: the environment
@param have: dictionary instance
@param dev_keywords: developer profile keywords
+ @param repo_metadata: dictionary of various repository items.
'''
self.qatracker = kwargs.get('qatracker')
self.portdb = kwargs.get('portdb')
@@ -46,6 +48,7 @@ class ProfileDependsChecks(ScanBase):
self.env = kwargs.get('env')
self.have = kwargs.get('have')
self.dev_keywords = kwargs.get('dev_keywords')
+ self.repo_metadata = kwargs.get('repo_metadata')
def check(self, **kwargs):
'''Perform profile dependant dependancy checks
@@ -59,8 +62,8 @@ class ProfileDependsChecks(ScanBase):
'''
ebuild = kwargs.get('ebuild').get()
pkg = kwargs.get('pkg').get()
- baddepsyntax = kwargs.get('baddepsyntax').get()
- unknown_pkgs = kwargs.get('unknown_pkgs').get()
+ unknown_pkgs, baddepsyntax = _depend_checks(
+ ebuild, pkg, self.portdb, self.qatracker, self.repo_metadata)
relevant_profiles = []
for keyword, arch, groups in _gen_arches(ebuild, self.options,
@@ -226,6 +229,16 @@ class ProfileDependsChecks(ScanBase):
"%s: %s: %s(%s)\n%s"
% (ebuild.relative_path, mytype, keyword,
prof, pformat(atoms, indent=6)))
+
+ if not baddepsyntax and unknown_pkgs:
+ type_map = {}
+ for mytype, atom in unknown_pkgs:
+ type_map.setdefault(mytype, set()).add(atom)
+ for mytype, atoms in type_map.items():
+ self.qatracker.add_error(
+ "dependency.unknown", "%s: %s: %s"
+ % (ebuild.relative_path, mytype, ", ".join(sorted(atoms))))
+
return False
@property
diff --git a/pym/repoman/modules/scan/metadata/__init__.py b/pym/repoman/modules/scan/metadata/__init__.py
index 1a6c0ed..c297676 100644
--- a/pym/repoman/modules/scan/metadata/__init__.py
+++ b/pym/repoman/modules/scan/metadata/__init__.py
@@ -61,23 +61,6 @@ module_spec = {
'pkg': ('Future', 'UNSET'),
},
},
- 'license-metadata': {
- 'name': "license",
- 'sourcefile': "license",
- 'class': "LicenseChecks",
- 'description': doc,
- 'functions': ['check'],
- 'func_desc': {
- },
- 'mod_kwargs': ['qatracker', 'repo_metadata',
- ],
- 'func_kwargs': {
- 'badlicsyntax': (None, None),
- 'ebuild': (None, None),
- 'xpkg': (None, None),
- 'y_ebuild': (None, None),
- },
- },
'restrict-metadata': {
'name': "restrict",
'sourcefile': "restrict",
diff --git a/pym/repoman/modules/scan/metadata/license.py b/pym/repoman/modules/scan/metadata/license.py
deleted file mode 100644
index 4a67c70..0000000
--- a/pym/repoman/modules/scan/metadata/license.py
+++ /dev/null
@@ -1,54 +0,0 @@
-
-'''license.py
-Perform checks on the LICENSE variable.
-'''
-
-# import our initialized portage instance
-from repoman._portage import portage
-from repoman.modules.scan.scanbase import ScanBase
-
-
-class LicenseChecks(ScanBase):
- '''Perform checks on the LICENSE variable.'''
-
- def __init__(self, **kwargs):
- '''
- @param qatracker: QATracker instance
- @param repo_metadata: dictionary of various repository items.
- '''
- self.qatracker = kwargs.get('qatracker')
- self.repo_metadata = kwargs.get('repo_metadata')
-
- def check(self, **kwargs):
- '''
- @param xpkg: Package in which we check (string).
- @param ebuild: Ebuild which we check (object).
- @param y_ebuild: Ebuild which we check (string).
- '''
- xpkg = kwargs.get('xpkg')
- ebuild = kwargs.get('ebuild').get()
- y_ebuild = kwargs.get('y_ebuild')
- if not kwargs.get('badlicsyntax').get():
- # Parse the LICENSE variable, remove USE conditions and flatten it.
- licenses = portage.dep.use_reduce(
- ebuild.metadata["LICENSE"], matchall=1, flat=True)
-
- # Check each entry to ensure that it exists in ${PORTDIR}/licenses/.
- for lic in licenses:
- # Need to check for "||" manually as no portage
- # function will remove it without removing values.
- if lic not in self.repo_metadata['liclist'] and lic != "||":
- self.qatracker.add_error("LICENSE.invalid",
- "%s/%s.ebuild: %s" % (xpkg, y_ebuild, lic))
- elif lic in self.repo_metadata['lic_deprecated']:
- self.qatracker.add_error("LICENSE.deprecated",
- "%s: %s" % (ebuild.relative_path, lic))
- return False
-
- @property
- def runInPkgs(self):
- return (False, [])
-
- @property
- def runInEbuilds(self):
- return (True, [self.check])
diff --git a/pym/repoman/scanner.py b/pym/repoman/scanner.py
index 2224fa3..f6dcc1b 100644
--- a/pym/repoman/scanner.py
+++ b/pym/repoman/scanner.py
@@ -380,13 +380,11 @@ class Scanner(object):
('thirdpartymirrors', 'ThirdPartyMirrors'),
('description', 'DescriptionChecks'),
('keywords', 'KeywordChecks'),
- ('depend', 'DependChecks'),
('use_flags', 'USEFlagChecks'), ('ruby', 'RubyEclassChecks'),
- ('license', 'LicenseChecks'), ('restrict', 'RestrictChecks'),
+ ('restrict', 'RestrictChecks'),
('mtime', 'MtimeChecks'), ('multicheck', 'MultiCheck'),
# Options.is_forced() is used to bypass further checks
('options', 'Options'), ('profile', 'ProfileDependsChecks'),
- ('unknown', 'DependUnknown'),
]:
if mod[0] and mod[1] not in self.modules:
mod_class = MODULE_CONTROLLER.get_class(mod[0])
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2016-04-29 17:25 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-04-29 17:24 [gentoo-commits] proj/portage:master commit in: pym/repoman/modules/scan/metadata/, pym/repoman/modules/scan/depend/, Brian Dolbec
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox