commit: 4062c69dc27a816b377b3eb91dcb1c93b6f2cab0 Author: Brian Dolbec <dolsen <AT> gentoo <DOT> org> AuthorDate: Sun Jun 5 22:07:59 2016 +0000 Commit: Brian Dolbec <dolsen <AT> gentoo <DOT> org> CommitDate: Sun Jun 19 22:14:27 2016 +0000 URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=4062c69d
repoman: Move manifest generation to modules/commit/manifest.py .../manifest/manifests.py => commit/manifest.py} | 40 ++-------- .../pym/repoman/modules/scan/manifest/manifests.py | 87 +--------------------- repoman/pym/repoman/scanner.py | 6 +- 3 files changed, 13 insertions(+), 120 deletions(-) diff --git a/repoman/pym/repoman/modules/scan/manifest/manifests.py b/repoman/pym/repoman/modules/commit/manifest.py similarity index 72% copy from repoman/pym/repoman/modules/scan/manifest/manifests.py copy to repoman/pym/repoman/modules/commit/manifest.py index 2b8d7af..ce4c024 100644 --- a/repoman/pym/repoman/modules/scan/manifest/manifests.py +++ b/repoman/pym/repoman/modules/commit/manifest.py @@ -5,14 +5,13 @@ import sys # import our initialized portage instance from repoman._portage import portage -from repoman.modules.scan.scanbase import ScanBase from portage import os from portage.package.ebuild.digestgen import digestgen from portage.util import writemsg_level -class Manifests(ScanBase): +class Manifest(object): '''Creates as well as checks pkg Manifest entries/files''' def __init__(self, **kwargs): @@ -20,29 +19,22 @@ class Manifests(ScanBase): @param options: the run time cli options @param portdb: portdb instance - @param qatracker: QATracker instance @param repo_settings: repository settings instance ''' self.options = kwargs.get('options') self.portdb = kwargs.get('portdb') - self.qatracker = kwargs.get('qatracker') self.repoman_settings = kwargs.get('repo_settings').repoman_settings self.generated_manifest = False - def check(self, **kwargs): - '''Perform a changelog and untracked checks on the ebuild + def update_manifest(self, checkdir): + '''Perform a manifest generation for the pkg - @param xpkg: Package in which we check (object). - @param checkdirlist: list of files in the current package directory + @param checkdir: the current package directory @returns: dictionary ''' - checkdir = kwargs.get('checkdir') - xpkg = kwargs.get('xpkg') self.generated_manifest = False self.digest_only = self.options.mode != 'manifest-check' \ and self.options.digest == 'y' - if self.options.pretend: - return False if self.options.mode in ("manifest", 'commit', 'fix') or self.digest_only: failed = False self.auto_assumed = set() @@ -50,7 +42,7 @@ class Manifests(ScanBase): checkdir, self.repoman_settings, self.portdb) if self.options.mode == 'manifest' and self.options.force: portage._doebuild_manifest_exempt_depend += 1 - self.create_manifest(checkdir, fetchlist_dict) + self._create_manifest(checkdir, fetchlist_dict) self.repoman_settings["O"] = checkdir try: self.generated_manifest = digestgen( @@ -91,13 +83,9 @@ class Manifests(ScanBase): return True elif failed: sys.exit(1) - if not self.generated_manifest: - self.digest_check(xpkg, checkdir) - if self.options.mode == 'manifest-check': - return True return False - def create_manifest(self, checkdir, fetchlist_dict): + def _create_manifest(self, checkdir, fetchlist_dict): '''Creates a Manifest file @param checkdir: the directory to generate the Manifest in @@ -121,19 +109,3 @@ class Manifests(ScanBase): mf.write() finally: portage._doebuild_manifest_exempt_depend -= 1 - - def digest_check(self, xpkg, checkdir): - '''Check the manifest entries, report any Q/A errors - - @param xpkg: the cat/pkg name to check - @param checkdir: the directory path to check''' - 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) - - @property - def runInPkgs(self): - '''Package level scans''' - return (True, [self.check]) diff --git a/repoman/pym/repoman/modules/scan/manifest/manifests.py b/repoman/pym/repoman/modules/scan/manifest/manifests.py index 2b8d7af..dc2b338 100644 --- a/repoman/pym/repoman/modules/scan/manifest/manifests.py +++ b/repoman/pym/repoman/modules/scan/manifest/manifests.py @@ -1,15 +1,10 @@ # -*- coding:utf-8 -*- -import logging -import sys - # import our initialized portage instance from repoman._portage import portage from repoman.modules.scan.scanbase import ScanBase from portage import os -from portage.package.ebuild.digestgen import digestgen -from portage.util import writemsg_level class Manifests(ScanBase): @@ -27,101 +22,23 @@ class Manifests(ScanBase): self.portdb = kwargs.get('portdb') self.qatracker = kwargs.get('qatracker') self.repoman_settings = kwargs.get('repo_settings').repoman_settings - self.generated_manifest = False def check(self, **kwargs): '''Perform a changelog and untracked checks on the ebuild @param xpkg: Package in which we check (object). - @param checkdirlist: list of files in the current package directory + @param checkdir: the current package directory @returns: dictionary ''' checkdir = kwargs.get('checkdir') xpkg = kwargs.get('xpkg') - self.generated_manifest = False - self.digest_only = self.options.mode != 'manifest-check' \ - and self.options.digest == 'y' 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, self.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=self.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: - writemsg_level( - "Unable to generate manifest.", - level=logging.ERROR, noiselevel=-1) - 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)) - # continue, skip remaining main loop code - return True - elif failed: - sys.exit(1) - if not self.generated_manifest: - self.digest_check(xpkg, checkdir) + self.digest_check(xpkg, checkdir) if self.options.mode == 'manifest-check': return True return False - def create_manifest(self, checkdir, fetchlist_dict): - '''Creates a Manifest file - - @param checkdir: the directory to generate the Manifest in - @param fetchlist_dict: dictionary of files to fetch and/or include - in the manifest - ''' - 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 - def digest_check(self, xpkg, checkdir): '''Check the manifest entries, report any Q/A errors diff --git a/repoman/pym/repoman/scanner.py b/repoman/pym/repoman/scanner.py index 48d9001..f72af9c 100644 --- a/repoman/pym/repoman/scanner.py +++ b/repoman/pym/repoman/scanner.py @@ -12,6 +12,7 @@ from portage.output import green from portage.util.futures.extendedfutures import ExtendedFuture from repoman.metadata import get_metadata_xsd from repoman.modules.commit import repochecks +from repoman.modules.commit import manifest from repoman.profile import check_profiles, dev_profile_keywords, setup_profile from repoman.repos import repo_metadata from repoman.modules.scan.scan import scan @@ -280,12 +281,15 @@ class Scanner(object): if self.repolevel < 2: checkdir_relative = os.path.join(catdir, checkdir_relative) checkdir_relative = os.path.join(".", checkdir_relative) - checkdirlist = os.listdir(checkdir) # Run the status check if self.kwargs['checks']['ebuild_notadded']: self.vcs_settings.status.check(checkdir, checkdir_relative, xpkg) + manifester = manifest.Manifest(**self.kwargs) + manifester.update_manifest(checkdir) + checkdirlist = os.listdir(checkdir) + dynamic_data = { 'changelog_modified': False, 'checkdirlist': ExtendedFuture(checkdirlist),