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 = {