Gentoo Archives: gentoo-portage-dev

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