commit:     4de81f973a9edfcac9ef2f02759d87c43bf86560
Author:     Zac Medico <zmedico <AT> gentoo <DOT> org>
AuthorDate: Mon Jun 20 10:14:38 2016 +0000
Commit:     Zac Medico <zmedico <AT> gentoo <DOT> org>
CommitDate: Mon Jun 20 17:51:29 2016 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=4de81f97

repoman: fix KeyError during manifest generation (bug 585388)

Fix Scanner not to override portdbapi._aux_cache_keys when generating
manifests, since spawn_nofetch requires additional keys.

Fixes: 87e32d4863f3 ("repoman: fix KeyError...during manifest generation (bug 
569942)")
X-Gentoo-Bug: 585388
X-Gentoo-Bug-url: https://bugs.gentoo.org/show_bug.cgi?id=585388
Acked-by: Brian Dolbec <dolsen <AT> gentoo.org>

 repoman/pym/repoman/modules/commit/manifest.py | 91 +++++++++++++-------------
 repoman/pym/repoman/scanner.py                 | 12 +++-
 2 files changed, 53 insertions(+), 50 deletions(-)

diff --git a/repoman/pym/repoman/modules/commit/manifest.py 
b/repoman/pym/repoman/modules/commit/manifest.py
index 475dae4..b338a5b 100644
--- a/repoman/pym/repoman/modules/commit/manifest.py
+++ b/repoman/pym/repoman/modules/commit/manifest.py
@@ -33,55 +33,52 @@ class Manifest(object):
                @returns: dictionary
                '''
                self.generated_manifest = False
-               self.digest_only = self.options.mode != 'manifest-check' \
-                       and self.options.digest == 'y'
-               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:
-                               self._discard_dist_digests(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)
+               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:
+                       self._discard_dist_digests(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 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 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)
                return False
 
        def _discard_dist_digests(self, checkdir, fetchlist_dict):

diff --git a/repoman/pym/repoman/scanner.py b/repoman/pym/repoman/scanner.py
index f72af9c..d7cd81f 100644
--- a/repoman/pym/repoman/scanner.py
+++ b/repoman/pym/repoman/scanner.py
@@ -60,9 +60,15 @@ class Scanner(object):
 
                self.portdb = repo_settings.portdb
                self.portdb.settings = self.repo_settings.repoman_settings
+
+               digest_only = self.options.mode != 'manifest-check' \
+                       and self.options.digest == 'y'
+               self.generate_manifest = digest_only or self.options.mode in \
+                       ("manifest", 'commit', 'fix')
+
                # We really only need to cache the metadata that's necessary 
for visibility
                # filtering. Anything else can be discarded to reduce memory 
consumption.
-               if self.options.mode != "manifest" and self.options.digest != 
"y":
+               if not self.generate_manifest:
                        # Don't do this when generating manifests, since that 
uses
                        # additional keys if spawn_nofetch is called (RESTRICT 
and
                        # DEFINED_PHASES).
@@ -286,8 +292,8 @@ class Scanner(object):
                        if self.kwargs['checks']['ebuild_notadded']:
                                self.vcs_settings.status.check(checkdir, 
checkdir_relative, xpkg)
 
-                       manifester = manifest.Manifest(**self.kwargs)
-                       manifester.update_manifest(checkdir)
+                       if self.generate_manifest:
+                               
manifest.Manifest(**self.kwargs).update_manifest(checkdir)
                        checkdirlist = os.listdir(checkdir)
 
                        dynamic_data = {

Reply via email to