Gentoo Archives: gentoo-portage-dev

From: Zac Medico <zmedico@g.o>
To: gentoo-portage-dev@l.g.o
Cc: Zac Medico <zmedico@g.o>
Subject: [gentoo-portage-dev] [PATCH] repoman: fix KeyError during manifest generation (bug 585388)
Date: Mon, 20 Jun 2016 10:28:46
Message-Id: 1466418503-12657-1-git-send-email-zmedico@gentoo.org
1 Fix Scanner not to override portdbapi._aux_cache_keys when generating
2 manifests, since spawn_nofetch requires additional keys.
3
4 Fixes: 87e32d4863f3 ("repoman: fix KeyError...during manifest generation (bug 569942)")
5 X-Gentoo-Bug: 585388
6 X-Gentoo-Bug-url: https://bugs.gentoo.org/show_bug.cgi?id=585388
7 ---
8 repoman/pym/repoman/modules/commit/manifest.py | 91 +++++++++++++-------------
9 repoman/pym/repoman/scanner.py | 12 +++-
10 2 files changed, 53 insertions(+), 50 deletions(-)
11
12 diff --git a/repoman/pym/repoman/modules/commit/manifest.py b/repoman/pym/repoman/modules/commit/manifest.py
13 index 475dae4..b338a5b 100644
14 --- a/repoman/pym/repoman/modules/commit/manifest.py
15 +++ b/repoman/pym/repoman/modules/commit/manifest.py
16 @@ -33,55 +33,52 @@ class Manifest(object):
17 @returns: dictionary
18 '''
19 self.generated_manifest = False
20 - self.digest_only = self.options.mode != 'manifest-check' \
21 - and self.options.digest == 'y'
22 - if self.options.mode in ("manifest", 'commit', 'fix') or self.digest_only:
23 - failed = False
24 - self.auto_assumed = set()
25 - fetchlist_dict = portage.FetchlistDict(
26 - checkdir, self.repoman_settings, self.portdb)
27 - if self.options.mode == 'manifest' and self.options.force:
28 - self._discard_dist_digests(checkdir, fetchlist_dict)
29 - self.repoman_settings["O"] = checkdir
30 - try:
31 - self.generated_manifest = digestgen(
32 - mysettings=self.repoman_settings, myportdb=self.portdb)
33 - except portage.exception.PermissionDenied as e:
34 - self.generated_manifest = False
35 - writemsg_level(
36 - "!!! Permission denied: '%s'\n" % (e,),
37 - level=logging.ERROR, noiselevel=-1)
38 + failed = False
39 + self.auto_assumed = set()
40 + fetchlist_dict = portage.FetchlistDict(
41 + checkdir, self.repoman_settings, self.portdb)
42 + if self.options.mode == 'manifest' and self.options.force:
43 + self._discard_dist_digests(checkdir, fetchlist_dict)
44 + self.repoman_settings["O"] = checkdir
45 + try:
46 + self.generated_manifest = digestgen(
47 + mysettings=self.repoman_settings, myportdb=self.portdb)
48 + except portage.exception.PermissionDenied as e:
49 + self.generated_manifest = False
50 + writemsg_level(
51 + "!!! Permission denied: '%s'\n" % (e,),
52 + level=logging.ERROR, noiselevel=-1)
53
54 - if not self.generated_manifest:
55 - writemsg_level(
56 - "Unable to generate manifest.",
57 - level=logging.ERROR, noiselevel=-1)
58 - failed = True
59 + if not self.generated_manifest:
60 + writemsg_level(
61 + "Unable to generate manifest.",
62 + level=logging.ERROR, noiselevel=-1)
63 + failed = True
64
65 - if self.options.mode == "manifest":
66 - if not failed and self.options.force and self.auto_assumed and \
67 - 'assume-digests' in self.repoman_settings.features:
68 - # Show which digests were assumed despite the --force option
69 - # being given. This output will already have been shown by
70 - # digestgen() if assume-digests is not enabled, so only show
71 - # it here if assume-digests is enabled.
72 - pkgs = list(fetchlist_dict)
73 - pkgs.sort()
74 - portage.writemsg_stdout(
75 - " digest.assumed %s" %
76 - portage.output.colorize(
77 - "WARN", str(len(self.auto_assumed)).rjust(18)) + "\n")
78 - for cpv in pkgs:
79 - fetchmap = fetchlist_dict[cpv]
80 - pf = portage.catsplit(cpv)[1]
81 - for distfile in sorted(fetchmap):
82 - if distfile in self.auto_assumed:
83 - portage.writemsg_stdout(
84 - " %s::%s\n" % (pf, distfile))
85 - # continue, skip remaining main loop code
86 - return True
87 - elif failed:
88 - sys.exit(1)
89 + if self.options.mode == "manifest":
90 + if not failed and self.options.force and self.auto_assumed and \
91 + 'assume-digests' in self.repoman_settings.features:
92 + # Show which digests were assumed despite the --force option
93 + # being given. This output will already have been shown by
94 + # digestgen() if assume-digests is not enabled, so only show
95 + # it here if assume-digests is enabled.
96 + pkgs = list(fetchlist_dict)
97 + pkgs.sort()
98 + portage.writemsg_stdout(
99 + " digest.assumed %s" %
100 + portage.output.colorize(
101 + "WARN", str(len(self.auto_assumed)).rjust(18)) + "\n")
102 + for cpv in pkgs:
103 + fetchmap = fetchlist_dict[cpv]
104 + pf = portage.catsplit(cpv)[1]
105 + for distfile in sorted(fetchmap):
106 + if distfile in self.auto_assumed:
107 + portage.writemsg_stdout(
108 + " %s::%s\n" % (pf, distfile))
109 + # continue, skip remaining main loop code
110 + return True
111 + elif failed:
112 + sys.exit(1)
113 return False
114
115 def _discard_dist_digests(self, checkdir, fetchlist_dict):
116 diff --git a/repoman/pym/repoman/scanner.py b/repoman/pym/repoman/scanner.py
117 index f72af9c..d7cd81f 100644
118 --- a/repoman/pym/repoman/scanner.py
119 +++ b/repoman/pym/repoman/scanner.py
120 @@ -60,9 +60,15 @@ class Scanner(object):
121
122 self.portdb = repo_settings.portdb
123 self.portdb.settings = self.repo_settings.repoman_settings
124 +
125 + digest_only = self.options.mode != 'manifest-check' \
126 + and self.options.digest == 'y'
127 + self.generate_manifest = digest_only or self.options.mode in \
128 + ("manifest", 'commit', 'fix')
129 +
130 # We really only need to cache the metadata that's necessary for visibility
131 # filtering. Anything else can be discarded to reduce memory consumption.
132 - if self.options.mode != "manifest" and self.options.digest != "y":
133 + if not self.generate_manifest:
134 # Don't do this when generating manifests, since that uses
135 # additional keys if spawn_nofetch is called (RESTRICT and
136 # DEFINED_PHASES).
137 @@ -286,8 +292,8 @@ class Scanner(object):
138 if self.kwargs['checks']['ebuild_notadded']:
139 self.vcs_settings.status.check(checkdir, checkdir_relative, xpkg)
140
141 - manifester = manifest.Manifest(**self.kwargs)
142 - manifester.update_manifest(checkdir)
143 + if self.generate_manifest:
144 + manifest.Manifest(**self.kwargs).update_manifest(checkdir)
145 checkdirlist = os.listdir(checkdir)
146
147 dynamic_data = {
148 --
149 2.7.4

Replies