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