Gentoo Archives: gentoo-commits

From: Brian Dolbec <dolsen@g.o>
To: gentoo-commits@l.g.o
Subject: [gentoo-commits] proj/portage:master commit in: pym/repoman/modules/scan/arches/, pym/repoman/modules/scan/, ...
Date: Fri, 29 Apr 2016 17:24:53
Message-Id: 1461598133.aea571e7b772f4c1cf23399dc6e685a123d6982f.dolsen@gentoo
1 commit: aea571e7b772f4c1cf23399dc6e685a123d6982f
2 Author: Brian Dolbec <dolsen <AT> gentoo <DOT> org>
3 AuthorDate: Mon Apr 18 07:25:17 2016 +0000
4 Commit: Brian Dolbec <dolsen <AT> gentoo <DOT> org>
5 CommitDate: Mon Apr 25 15:28:53 2016 +0000
6 URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=aea571e7
7
8 WIP: repoman: convert all modules to the new data transfer system
9
10 Use Future instances for all non-pointer type variables modified by the modules.
11 Create set_result_pass() and set_result_raise() in ScanBase to reduce code duplication.
12 Create a get_result() in ScanBase which returns either a result or an unset_value rather
13 than raise an InvalidStateError.
14
15 pym/repoman/modules/scan/arches/arches.py | 7 +++-
16 pym/repoman/modules/scan/depend/__init__.py | 8 ++--
17 pym/repoman/modules/scan/depend/depend.py | 19 ++++++---
18 pym/repoman/modules/scan/depend/unknown.py | 10 ++---
19 pym/repoman/modules/scan/directories/files.py | 2 +-
20 pym/repoman/modules/scan/directories/mtime.py | 6 +--
21 pym/repoman/modules/scan/eapi/eapi.py | 4 +-
22 pym/repoman/modules/scan/ebuild/__init__.py | 2 +-
23 pym/repoman/modules/scan/ebuild/ebuild.py | 31 +++++++++------
24 pym/repoman/modules/scan/ebuild/isebuild.py | 28 +++++--------
25 pym/repoman/modules/scan/ebuild/multicheck.py | 4 +-
26 pym/repoman/modules/scan/eclasses/live.py | 16 ++++----
27 pym/repoman/modules/scan/eclasses/ruby.py | 6 +--
28 pym/repoman/modules/scan/fetch/fetches.py | 4 +-
29 pym/repoman/modules/scan/keywords/keywords.py | 8 ++--
30 pym/repoman/modules/scan/manifest/manifests.py | 6 +--
31 pym/repoman/modules/scan/metadata/__init__.py | 2 +-
32 pym/repoman/modules/scan/metadata/description.py | 6 +--
33 .../modules/scan/metadata/ebuild_metadata.py | 16 ++++----
34 pym/repoman/modules/scan/metadata/license.py | 6 +--
35 pym/repoman/modules/scan/metadata/pkgmetadata.py | 12 +++++-
36 pym/repoman/modules/scan/metadata/restrict.py | 4 +-
37 pym/repoman/modules/scan/metadata/unused.py | 9 ++---
38 .../modules/scan/mirrors/thirdpartymirrors.py | 8 ++--
39 pym/repoman/modules/scan/options/options.py | 4 +-
40 pym/repoman/modules/scan/scanbase.py | 38 +++++++++++++++++-
41 pym/repoman/modules/scan/status/vcsstatus.py | 6 ++-
42 pym/repoman/modules/scan/use/use_flags.py | 15 ++++---
43 pym/repoman/scanner.py | 46 ++++++++++++++++------
44 29 files changed, 207 insertions(+), 126 deletions(-)
45
46 diff --git a/pym/repoman/modules/scan/arches/arches.py b/pym/repoman/modules/scan/arches/arches.py
47 index 90ec04d..8bc7a24 100644
48 --- a/pym/repoman/modules/scan/arches/arches.py
49 +++ b/pym/repoman/modules/scan/arches/arches.py
50 @@ -23,7 +23,7 @@ class ArchChecks(ScanBase):
51 @param ebuild: Ebuild which we check (object).
52 @returns: dictionary, including arches set
53 '''
54 - ebuild = kwargs.get('ebuild')
55 + ebuild = kwargs.get('ebuild').result()
56 if self.options.ignore_arches:
57 arches = [[
58 self.repo_settings.repoman_settings["ARCH"], self.repo_settings.repoman_settings["ARCH"],
59 @@ -67,7 +67,10 @@ class ArchChecks(ScanBase):
60 # Use an empty profile for checking dependencies of
61 # packages that have empty KEYWORDS.
62 arches.add(('**', '**', ('**',)))
63 - return {'continue': False, 'arches': arches}
64 + # update the dynamic data
65 + dyn_arches = kwargs.get('arches')
66 + dyn_arches.update(arches)
67 + return False
68
69 @property
70 def runInEbuilds(self):
71
72 diff --git a/pym/repoman/modules/scan/depend/__init__.py b/pym/repoman/modules/scan/depend/__init__.py
73 index a2b8534..735604d 100644
74 --- a/pym/repoman/modules/scan/depend/__init__.py
75 +++ b/pym/repoman/modules/scan/depend/__init__.py
76 @@ -21,7 +21,7 @@ module_spec = {
77 'mod_kwargs': ['qatracker', 'portdb'
78 ],
79 'func_kwargs': {'ebuild': None, 'pkg': None, 'unknown_pkgs': 'set',
80 - 'type_list': [], 'badlicsyntax': 'Future',
81 + 'type_list': 'list', 'badlicsyntax': 'Future',
82 'baddepsyntax': 'Future',
83 },
84 },
85 @@ -37,8 +37,8 @@ module_spec = {
86 'repo_settings', 'include_arches', 'caches',
87 'repoman_incrementals', 'env', 'have', 'dev_keywords'
88 ],
89 - 'func_kwargs': {'arches': 'set', 'ebuild': None, 'pkg': None,
90 - 'unknown_pkgs': 'set', 'baddepsyntax': 'Future',
91 + 'func_kwargs': {'arches': None, 'ebuild': None, 'pkg': None,
92 + 'unknown_pkgs': None, 'baddepsyntax': None,
93 },
94 },
95 'unknown-module': {
96 @@ -52,7 +52,7 @@ module_spec = {
97 'mod_kwargs': ['qatracker',
98 ],
99 'func_kwargs': {'ebuild': None, 'unknown_pkgs': 'set',
100 - 'baddepsyntax': 'Future',
101 + 'baddepsyntax': None,
102 },
103 },
104 }
105
106 diff --git a/pym/repoman/modules/scan/depend/depend.py b/pym/repoman/modules/scan/depend/depend.py
107 index eaafc95..0efe5de 100644
108 --- a/pym/repoman/modules/scan/depend/depend.py
109 +++ b/pym/repoman/modules/scan/depend/depend.py
110 @@ -26,11 +26,10 @@ class DependChecks(ScanBase):
111
112 @param pkg: Package in which we check (object).
113 @param ebuild: Ebuild which we check (object).
114 - @returns: dictionary including {unknown_pkgs, type_list,
115 - badlicsyntax, baddepsyntax}
116 + @returns: boolean
117 '''
118 - ebuild = kwargs.get('ebuild')
119 - pkg = kwargs.get('pkg')
120 + ebuild = kwargs.get('ebuild').result()
121 + pkg = kwargs.get('pkg').result()
122
123 unknown_pkgs = set()
124
125 @@ -144,8 +143,16 @@ class DependChecks(ScanBase):
126 badlicsyntax = badlicsyntax > 0
127 #badprovsyntax = badprovsyntax > 0
128
129 - return {'continue': False, 'unknown_pkgs': unknown_pkgs, 'type_list': type_list,
130 - 'badlicsyntax': badlicsyntax, 'baddepsyntax': baddepsyntax}
131 + # update the dynamic data
132 + dyn_unknown = kwargs.get('unknown_pkgs')
133 + dyn_unknown.update(unknown_pkgs)
134 + dyn_type_list = kwargs.get('type_list')
135 + dyn_type_list.extend(type_list)
136 + self.set_result_pass([
137 + (kwargs.get('badlicsyntax'), badlicsyntax),
138 + (kwargs.get('baddepsyntax'), baddepsyntax),
139 + ])
140 + return False
141
142 @property
143 def runInEbuilds(self):
144
145 diff --git a/pym/repoman/modules/scan/depend/unknown.py b/pym/repoman/modules/scan/depend/unknown.py
146 index 3aa7c79..9e8f7f8 100644
147 --- a/pym/repoman/modules/scan/depend/unknown.py
148 +++ b/pym/repoman/modules/scan/depend/unknown.py
149 @@ -16,13 +16,13 @@ class DependUnknown(ScanBase):
150 def check(self, **kwargs):
151 '''Perform unknown dependancy checks
152
153 - @param ebuild: Ebuild which we check (object).
154 - @param baddepsyntax: boolean
155 + @param ebuild: Future.result == Ebuild which we check (object).
156 + @param baddepsyntax: Future.result == boolean
157 @param unknown_pkgs: set of tuples (type, atom.unevaluated_atom)
158 @returns: dictionary
159 '''
160 - ebuild = kwargs.get('ebuild')
161 - baddepsyntax = kwargs.get('baddepsyntax')
162 + ebuild = kwargs.get('ebuild').result()
163 + baddepsyntax = self.get_result(kwargs.get('baddepsyntax'), False)
164 unknown_pkgs = kwargs.get('unknown_pkgs')
165
166 if not baddepsyntax and unknown_pkgs:
167 @@ -33,7 +33,7 @@ class DependUnknown(ScanBase):
168 self.qatracker.add_error(
169 "dependency.unknown", "%s: %s: %s"
170 % (ebuild.relative_path, mytype, ", ".join(sorted(atoms))))
171 - return {'continue': False}
172 + return False
173
174 @property
175 def runInEbuilds(self):
176
177 diff --git a/pym/repoman/modules/scan/directories/files.py b/pym/repoman/modules/scan/directories/files.py
178 index a394658..94a0791 100644
179 --- a/pym/repoman/modules/scan/directories/files.py
180 +++ b/pym/repoman/modules/scan/directories/files.py
181 @@ -86,7 +86,7 @@ class FileChecks(ScanBase):
182 finally:
183 if f is not None:
184 f.close()
185 - return {'continue': False}
186 + return False
187
188 @property
189 def runInPkgs(self):
190
191 diff --git a/pym/repoman/modules/scan/directories/mtime.py b/pym/repoman/modules/scan/directories/mtime.py
192 index 56a7f05..6c667df 100644
193 --- a/pym/repoman/modules/scan/directories/mtime.py
194 +++ b/pym/repoman/modules/scan/directories/mtime.py
195 @@ -15,14 +15,14 @@ class MtimeChecks(ScanBase):
196 @param changed: dictionary instance
197 @returns: dictionary
198 '''
199 - ebuild = kwargs.get('ebuild')
200 + ebuild = kwargs.get('ebuild').result()
201 changed = kwargs.get('changed')
202 - pkg = kwargs.get('pkg')
203 + pkg = kwargs.get('pkg').result()
204 if not self.vcs_settings.vcs_preserves_mtime:
205 if ebuild.ebuild_path not in changed.new_ebuilds and \
206 ebuild.ebuild_path not in changed.ebuilds:
207 pkg.mtime = None
208 - return {'continue': False}
209 + return False
210
211 @property
212 def runInEbuilds(self):
213
214 diff --git a/pym/repoman/modules/scan/eapi/eapi.py b/pym/repoman/modules/scan/eapi/eapi.py
215 index fad1c18..18bab3d 100644
216 --- a/pym/repoman/modules/scan/eapi/eapi.py
217 +++ b/pym/repoman/modules/scan/eapi/eapi.py
218 @@ -23,11 +23,11 @@ class EAPIChecks(ScanBase):
219 @param ebuild: Ebuild which we check (object).
220 @returns: dictionary
221 '''
222 - ebuild = kwargs.get('ebuild')
223 + ebuild = kwargs.get('ebuild').result()
224
225 if not self._checkBanned(ebuild):
226 self._checkDeprecated(ebuild)
227 - return {'continue': False}
228 + return False
229
230 def _checkBanned(self, ebuild):
231 if self.repo_settings.repo_config.eapi_is_banned(ebuild.eapi):
232
233 diff --git a/pym/repoman/modules/scan/ebuild/__init__.py b/pym/repoman/modules/scan/ebuild/__init__.py
234 index eb9098c..ea21ece 100644
235 --- a/pym/repoman/modules/scan/ebuild/__init__.py
236 +++ b/pym/repoman/modules/scan/ebuild/__init__.py
237 @@ -21,7 +21,7 @@ module_spec = {
238 'mod_kwargs': ['portdb', 'qatracker', 'repo_settings'
239 ],
240 'func_kwargs': {'checkdirlist': 'list', 'checkdir': None, 'xpkg': None,
241 - 'validity_fuse': None, 'can_force': 'Future', 'pkgs': 'dict',
242 + 'validity_fuse': None, 'can_force': None, 'pkgs': 'dict',
243 },
244 },
245 'ebuild-module': {
246
247 diff --git a/pym/repoman/modules/scan/ebuild/ebuild.py b/pym/repoman/modules/scan/ebuild/ebuild.py
248 index 67eee3f..b015985 100644
249 --- a/pym/repoman/modules/scan/ebuild/ebuild.py
250 +++ b/pym/repoman/modules/scan/ebuild/ebuild.py
251 @@ -8,7 +8,6 @@ from repoman.modules.scan.scanbase import ScanBase
252 # import our initialized portage instance
253 from repoman._portage import portage
254 from portage import os
255 -from portage.util.futures import InvalidStateError
256
257 pv_toolong_re = re.compile(r'[0-9]{19,}')
258
259 @@ -86,7 +85,9 @@ class Ebuild(ScanBase):
260 # ebuild not added to vcs
261 self.qatracker.add_error(
262 "ebuild.notadded", self.xpkg + "/" + self.y_ebuild + ".ebuild")
263 - return {'continue': False, 'ebuild': self}
264 + # update the dynamic data
265 + self.set_result_raise([('ebuild', self)])
266 + return False
267
268 def set_pkg_data(self, **kwargs):
269 '''Sets some classwide data needed for some of the checks
270 @@ -100,7 +101,7 @@ class Ebuild(ScanBase):
271 self.inherited = self.pkg.inherited
272 self.keywords = self.metadata["KEYWORDS"].split()
273 self.archs = set(kw.lstrip("~") for kw in self.keywords if not kw.startswith("-"))
274 - return {'continue': False}
275 + return False
276
277 def bad_split_check(self, **kwargs):
278 '''Checks for bad category/package splits.
279 @@ -117,13 +118,13 @@ class Ebuild(ScanBase):
280 if is_pv_toolong or is_pv_toolong2:
281 self.qatracker.add_error(
282 "ebuild.invalidname", self.xpkg + "/" + self.y_ebuild + ".ebuild")
283 - return {'continue': True}
284 + return True
285 elif myesplit[0] != pkgdir:
286 print(pkgdir, myesplit[0])
287 self.qatracker.add_error(
288 "ebuild.namenomatch", self.xpkg + "/" + self.y_ebuild + ".ebuild")
289 - return {'continue': True}
290 - return {'continue': False}
291 + return True
292 + return False
293
294 def pkg_invalid(self, **kwargs):
295 '''Sets some pkg info and checks for invalid packages
296 @@ -136,12 +137,18 @@ class Ebuild(ScanBase):
297 for k, msgs in self.pkg.invalid.items():
298 for msg in msgs:
299 self.qatracker.add_error(k, "%s: %s" % (self.relative_path, msg))
300 - try:
301 - fuse.set_result(False)
302 - except InvalidStateError:
303 - pass
304 - return {'continue': True, 'pkg': self.pkg}
305 - return {'continue': False, 'pkg': self.pkg}
306 + # update the dynamic data
307 + self.set_result_pass([
308 + (fuse, False),])
309 + self.set_result_raise([
310 + (kwargs.get('pkg'), self.pkg),
311 + ])
312 + return True
313 + # update the dynamic data
314 + self.set_result_raise([
315 + (kwargs.get('pkg'), self.pkg),
316 + ])
317 + return False
318
319 @property
320 def runInEbuilds(self):
321
322 diff --git a/pym/repoman/modules/scan/ebuild/isebuild.py b/pym/repoman/modules/scan/ebuild/isebuild.py
323 index a8870c7..3e288a3 100644
324 --- a/pym/repoman/modules/scan/ebuild/isebuild.py
325 +++ b/pym/repoman/modules/scan/ebuild/isebuild.py
326 @@ -9,7 +9,6 @@ from _emerge.RootConfig import RootConfig
327 from repoman._portage import portage
328
329 from portage import os
330 -from portage.util.futures import InvalidStateError
331
332 from repoman.qa_data import no_exec, allvars
333 from repoman.modules.scan.scanbase import ScanBase
334 @@ -65,24 +64,15 @@ class IsEbuild(ScanBase):
335 try:
336 myaux = dict(zip(allvars, self.portdb.aux_get(cpv, allvars)))
337 except KeyError:
338 - try:
339 - fuse.set_result(False)
340 - except InvalidStateError:
341 - pass
342 + self.set_result_pass([(fuse, False)])
343 self.qatracker.add_error("ebuild.syntax", os.path.join(xpkg, y))
344 continue
345 except IOError:
346 - try:
347 - fuse.set_result(False)
348 - except InvalidStateError:
349 - pass
350 + self.set_result_pass([(fuse, False)])
351 self.qatracker.add_error("ebuild.output", os.path.join(xpkg, y))
352 continue
353 if not portage.eapi_is_supported(myaux["EAPI"]):
354 - try:
355 - fuse.set_result(False)
356 - except InvalidStateError:
357 - pass
358 + self.set_result_pass([(fuse, False)])
359 self.qatracker.add_error("EAPI.unsupported", os.path.join(xpkg, y))
360 continue
361 pkgs[pf] = Package(
362 @@ -96,12 +86,12 @@ class IsEbuild(ScanBase):
363 # metadata leads to false positives for several checks, and false
364 # positives confuse users.
365 self.continue_ = True
366 - try:
367 - fuse.set_result(False)
368 - except InvalidStateError:
369 - pass
370 -
371 - return {'continue': self.continue_, 'pkgs': pkgs}
372 + self.set_result_pass([(can_force, False)])
373 + # set our updated data
374 + self.set_result_raise([
375 + (kwargs.get('pkgs'), pkgs),
376 + ])
377 + return self.continue_
378
379 @property
380 def runInPkgs(self):
381
382 diff --git a/pym/repoman/modules/scan/ebuild/multicheck.py b/pym/repoman/modules/scan/ebuild/multicheck.py
383 index 1d68227..ed7556d 100644
384 --- a/pym/repoman/modules/scan/ebuild/multicheck.py
385 +++ b/pym/repoman/modules/scan/ebuild/multicheck.py
386 @@ -31,8 +31,8 @@ class MultiCheck(ScanBase):
387 @param ebuild: Ebuild which we check (object).
388 @returns: dictionary
389 '''
390 - ebuild = kwargs.get('ebuild')
391 - pkg = kwargs.get('pkg')
392 + ebuild = kwargs.get('ebuild').result()
393 + pkg = kwargs.get('pkg').result()
394 try:
395 # All ebuilds should have utf_8 encoding.
396 f = io.open(
397
398 diff --git a/pym/repoman/modules/scan/eclasses/live.py b/pym/repoman/modules/scan/eclasses/live.py
399 index 81953af..e5bb7dc 100644
400 --- a/pym/repoman/modules/scan/eclasses/live.py
401 +++ b/pym/repoman/modules/scan/eclasses/live.py
402 @@ -25,9 +25,11 @@ class LiveEclassChecks(ScanBase):
403
404 @returns: dictionary, including {live_ebuild}
405 '''
406 - return {'continue': False,
407 - 'live_ebuild': LIVE_ECLASSES.intersection(
408 - kwargs.get('ebuild').inherited)}
409 + # update the dynamic data
410 + dyn_live = kwargs.get('live_ebuild')
411 + dyn_live.update(LIVE_ECLASSES.intersection(
412 + kwargs.get('ebuild').inherited))
413 + return False
414
415 def check(self, **kwargs):
416 '''Ebuilds that inherit a "Live" eclass (darcs, subversion, git, cvs,
417 @@ -41,15 +43,15 @@ class LiveEclassChecks(ScanBase):
418 @param global_pmaskdict: A global dictionary of all the masks.
419 @returns: dictionary
420 '''
421 - pkg = kwargs.get("pkg")
422 + pkg = kwargs.get("pkg").result()
423 package = kwargs.get('xpkg')
424 - ebuild = kwargs.get('ebuild')
425 + ebuild = kwargs.get('ebuild').result()
426 y_ebuild = kwargs.get('y_ebuild')
427 keywords = ebuild.keywords
428
429 if not (kwargs.get('live_ebuild') and
430 self.repo_settings.repo_config.name == "gentoo"):
431 - return {'continue': False}
432 + return False
433
434 is_stable = lambda kw: not kw.startswith("~") and not kw.startswith("-")
435 bad_stable_keywords = list(filter(is_stable, keywords))
436 @@ -62,7 +64,7 @@ class LiveEclassChecks(ScanBase):
437 good_keywords_exist = len(bad_stable_keywords) < len(keywords)
438 if good_keywords_exist and not self._has_global_mask(pkg, self.pmaskdict):
439 self.qatracker.add_error("LIVEVCS.unmasked", ebuild.relative_path)
440 - return {'continue': False}
441 + return False
442
443 @staticmethod
444 def _has_global_mask(pkg, global_pmaskdict):
445
446 diff --git a/pym/repoman/modules/scan/eclasses/ruby.py b/pym/repoman/modules/scan/eclasses/ruby.py
447 index aa2232a..92b9649 100644
448 --- a/pym/repoman/modules/scan/eclasses/ruby.py
449 +++ b/pym/repoman/modules/scan/eclasses/ruby.py
450 @@ -25,8 +25,8 @@ class RubyEclassChecks(ScanBase):
451 @param ebuild: Ebuild which we check (object).
452 @returns: dictionary
453 '''
454 - pkg = kwargs.get('pkg')
455 - ebuild = kwargs.get('ebuild')
456 + pkg = kwargs.get('pkg').result()
457 + ebuild = kwargs.get('ebuild').result()
458 is_inherited = lambda eclass: eclass in pkg.inherited
459 is_old_ruby_eclass_inherited = filter(
460 is_inherited, self.old_ruby_eclasses)
461 @@ -40,7 +40,7 @@ class RubyEclassChecks(ScanBase):
462 "IUSE.rubydeprecated",
463 (ebuild.relative_path + ": Deprecated ruby target: %s")
464 % myruby)
465 - return {'continue': False}
466 + return False
467
468 @property
469 def runInEbuilds(self):
470
471 diff --git a/pym/repoman/modules/scan/fetch/fetches.py b/pym/repoman/modules/scan/fetch/fetches.py
472 index 6bdcf23..f6adece 100644
473 --- a/pym/repoman/modules/scan/fetch/fetches.py
474 +++ b/pym/repoman/modules/scan/fetch/fetches.py
475 @@ -130,7 +130,9 @@ class FetchChecks(ScanBase):
476 self.qatracker.add_error(
477 "file.name",
478 "%s/files/%s: char '%s'" % (checkdir, y, y[index]))
479 - return {'continue': False, 'src_uri_error': self._src_uri_error}
480 + # update the dynamic data
481 + self.set_result_pass([(kwargs.get('src_uri_error'), self._src_uri_error)])
482 + return False
483
484 def digests(self, checkdir):
485 '''Returns the freshly loaded digests
486
487 diff --git a/pym/repoman/modules/scan/keywords/keywords.py b/pym/repoman/modules/scan/keywords/keywords.py
488 index 196feb4..ec48bb6 100644
489 --- a/pym/repoman/modules/scan/keywords/keywords.py
490 +++ b/pym/repoman/modules/scan/keywords/keywords.py
491 @@ -26,7 +26,7 @@ class KeywordChecks(ScanBase):
492 def prepare(self, **kwargs):
493 '''Prepare the checks for the next package.'''
494 self.slot_keywords = {}
495 - return {'continue': False}
496 + return False
497
498 def check(self, **kwargs):
499 '''Perform the check.
500 @@ -40,9 +40,9 @@ class KeywordChecks(ScanBase):
501 @param live_ebuild: A boolean that determines if this is a live ebuild.
502 @returns: dictionary
503 '''
504 - pkg = kwargs.get('pkg')
505 + pkg = kwargs.get('pkg').result()
506 xpkg =kwargs.get('xpkg')
507 - ebuild = kwargs.get('ebuild')
508 + ebuild = kwargs.get('ebuild').result()
509 y_ebuild = kwargs.get('y_ebuild')
510 changed = kwargs.get('changed')
511 live_ebuild = kwargs.get('live_ebuild')
512 @@ -57,7 +57,7 @@ class KeywordChecks(ScanBase):
513 self._checkForMaskLikeKeywords(xpkg, y_ebuild, ebuild.keywords)
514
515 self.slot_keywords[pkg.slot].update(ebuild.archs)
516 - return {'continue': False}
517 + return False
518
519 @staticmethod
520 def _isKeywordStable(keyword):
521
522 diff --git a/pym/repoman/modules/scan/manifest/manifests.py b/pym/repoman/modules/scan/manifest/manifests.py
523 index 6f44f8d..2b8d7af 100644
524 --- a/pym/repoman/modules/scan/manifest/manifests.py
525 +++ b/pym/repoman/modules/scan/manifest/manifests.py
526 @@ -88,14 +88,14 @@ class Manifests(ScanBase):
527 portage.writemsg_stdout(
528 " %s::%s\n" % (pf, distfile))
529 # continue, skip remaining main loop code
530 - return {'continue': True}
531 + return True
532 elif failed:
533 sys.exit(1)
534 if not self.generated_manifest:
535 self.digest_check(xpkg, checkdir)
536 if self.options.mode == 'manifest-check':
537 - return {'continue': True}
538 - return {'continue': False}
539 + return True
540 + return False
541
542 def create_manifest(self, checkdir, fetchlist_dict):
543 '''Creates a Manifest file
544
545 diff --git a/pym/repoman/modules/scan/metadata/__init__.py b/pym/repoman/modules/scan/metadata/__init__.py
546 index 1e690bf..af9771b 100644
547 --- a/pym/repoman/modules/scan/metadata/__init__.py
548 +++ b/pym/repoman/modules/scan/metadata/__init__.py
549 @@ -21,7 +21,7 @@ module_spec = {
550 'mod_kwargs': ['repo_settings', 'qatracker', 'options', 'metadata_dtd',
551 ],
552 'func_kwargs': {'xpkg': None, 'checkdir': None, 'checkdirlist': None,
553 - 'repolevel': None, 'muselist': 'set',
554 + 'repolevel': None, 'muselist': 'Future',
555 },
556 },
557 'ebuild-metadata': {
558
559 diff --git a/pym/repoman/modules/scan/metadata/description.py b/pym/repoman/modules/scan/metadata/description.py
560 index 8059888..8bce8d8 100644
561 --- a/pym/repoman/modules/scan/metadata/description.py
562 +++ b/pym/repoman/modules/scan/metadata/description.py
563 @@ -21,8 +21,8 @@ class DescriptionChecks(ScanBase):
564 @param pkg: Package in which we check (object).
565 @param ebuild: Ebuild which we check (object).
566 '''
567 - ebuild = kwargs.get('ebuild')
568 - pkg = kwargs.get('pkg')
569 + ebuild = kwargs.get('ebuild').result()
570 + pkg = kwargs.get('pkg').result()
571 # 14 is the length of DESCRIPTION=""
572 if len(pkg._metadata['DESCRIPTION']) > max_desc_len:
573 self.qatracker.add_error(
574 @@ -30,7 +30,7 @@ class DescriptionChecks(ScanBase):
575 "%s: DESCRIPTION is %d characters (max %d)" %
576 (ebuild.relative_path, len(
577 pkg._metadata['DESCRIPTION']), max_desc_len))
578 - return {'continue': False}
579 + return False
580
581 @property
582 def runInPkgs(self):
583
584 diff --git a/pym/repoman/modules/scan/metadata/ebuild_metadata.py b/pym/repoman/modules/scan/metadata/ebuild_metadata.py
585 index ca748de..38b13d5 100644
586 --- a/pym/repoman/modules/scan/metadata/ebuild_metadata.py
587 +++ b/pym/repoman/modules/scan/metadata/ebuild_metadata.py
588 @@ -20,7 +20,7 @@ class EbuildMetadata(ScanBase):
589 self.qatracker = kwargs.get('qatracker')
590
591 def invalidchar(self, **kwargs):
592 - ebuild = kwargs.get('ebuild')
593 + ebuild = kwargs.get('ebuild').result()
594 for k, v in ebuild.metadata.items():
595 if not isinstance(v, basestring):
596 continue
597 @@ -31,10 +31,10 @@ class EbuildMetadata(ScanBase):
598 "%s: %s variable contains non-ASCII "
599 "character at position %s" %
600 (ebuild.relative_path, k, m.start() + 1))
601 - return {'continue': False}
602 + return False
603
604 def missing(self, **kwargs):
605 - ebuild = kwargs.get('ebuild')
606 + ebuild = kwargs.get('ebuild').result()
607 for pos, missing_var in enumerate(missingvars):
608 if not ebuild.metadata.get(missing_var):
609 if kwargs.get('catdir') == "virtual" and \
610 @@ -45,22 +45,22 @@ class EbuildMetadata(ScanBase):
611 myqakey = missingvars[pos] + ".missing"
612 self.qatracker.add_error(myqakey, '%s/%s.ebuild'
613 % (kwargs.get('xpkg'), kwargs.get('y_ebuild')))
614 - return {'continue': False}
615 + return False
616
617 def old_virtual(self, **kwargs):
618 - ebuild = kwargs.get('ebuild')
619 + ebuild = kwargs.get('ebuild').result()
620 if ebuild.metadata.get("PROVIDE"):
621 self.qatracker.add_error("virtual.oldstyle", ebuild.relative_path)
622 - return {'continue': False}
623 + return False
624
625 def virtual(self, **kwargs):
626 - ebuild = kwargs.get('ebuild')
627 + ebuild = kwargs.get('ebuild').result()
628 if kwargs.get('catdir') == "virtual":
629 for var in ("HOMEPAGE", "LICENSE"):
630 if ebuild.metadata.get(var):
631 myqakey = var + ".virtual"
632 self.qatracker.add_error(myqakey, ebuild.relative_path)
633 - return {'continue': False}
634 + return False
635
636 @property
637 def runInPkgs(self):
638
639 diff --git a/pym/repoman/modules/scan/metadata/license.py b/pym/repoman/modules/scan/metadata/license.py
640 index cccc998..b08834a 100644
641 --- a/pym/repoman/modules/scan/metadata/license.py
642 +++ b/pym/repoman/modules/scan/metadata/license.py
643 @@ -26,9 +26,9 @@ class LicenseChecks(ScanBase):
644 @param y_ebuild: Ebuild which we check (string).
645 '''
646 xpkg = kwargs.get('xpkg')
647 - ebuild = kwargs.get('ebuild')
648 + ebuild = kwargs.get('ebuild').result()
649 y_ebuild = kwargs.get('y_ebuild')
650 - if not kwargs.get('badlicsyntax'):
651 + if not self.get_result(kwargs.get('badlicsyntax'), False):
652 # Parse the LICENSE variable, remove USE conditions and flatten it.
653 licenses = portage.dep.use_reduce(
654 ebuild.metadata["LICENSE"], matchall=1, flat=True)
655 @@ -43,7 +43,7 @@ class LicenseChecks(ScanBase):
656 elif lic in self.repo_metadata['lic_deprecated']:
657 self.qatracker.add_error("LICENSE.deprecated",
658 "%s: %s" % (ebuild.relative_path, lic))
659 - return {'continue': False}
660 + return False
661
662 @property
663 def runInPkgs(self):
664
665 diff --git a/pym/repoman/modules/scan/metadata/pkgmetadata.py b/pym/repoman/modules/scan/metadata/pkgmetadata.py
666 index 030cbca..242c923 100644
667 --- a/pym/repoman/modules/scan/metadata/pkgmetadata.py
668 +++ b/pym/repoman/modules/scan/metadata/pkgmetadata.py
669 @@ -73,7 +73,11 @@ class PkgMetadata(ScanBase):
670
671 self.musedict = {}
672 if self.options.mode in ['manifest']:
673 - return {'continue': False, 'muselist': frozenset(self.musedict)}
674 + # update the dynamic data
675 + self.set_result_raise([
676 + (kwargs.get('muselist'), frozenset(self.musedict))
677 + ])
678 + return False
679
680 # metadata.xml file check
681 if "metadata.xml" not in checkdirlist:
682 @@ -184,7 +188,11 @@ class PkgMetadata(ScanBase):
683 if not self.xmllint.check(checkdir, repolevel):
684 self.qatracker.add_error("metadata.bad", xpkg + "/metadata.xml")
685 del metadata_bad
686 - return {'continue': False, 'muselist': frozenset(self.musedict)}
687 + # update the dynamic data
688 + self.set_result_raise([
689 + (kwargs.get('muselist'), frozenset(self.musedict))
690 + ])
691 + return False
692
693 @property
694 def runInPkgs(self):
695
696 diff --git a/pym/repoman/modules/scan/metadata/restrict.py b/pym/repoman/modules/scan/metadata/restrict.py
697 index 25bf56e..044cc2a 100644
698 --- a/pym/repoman/modules/scan/metadata/restrict.py
699 +++ b/pym/repoman/modules/scan/metadata/restrict.py
700 @@ -21,7 +21,7 @@ class RestrictChecks(ScanBase):
701
702 def check(self, **kwargs):
703 xpkg = kwargs.get('xpkg')
704 - ebuild = kwargs.get('ebuild')
705 + ebuild = kwargs.get('ebuild').result()
706 y_ebuild = kwargs.get('y_ebuild')
707 myrestrict = None
708
709 @@ -41,7 +41,7 @@ class RestrictChecks(ScanBase):
710 for mybad in mybadrestrict:
711 self.qatracker.add_error("RESTRICT.invalid",
712 "%s/%s.ebuild: %s" % (xpkg, y_ebuild, mybad))
713 - return {'continue': False}
714 + return False
715
716 @property
717 def runInPkgs(self):
718
719 diff --git a/pym/repoman/modules/scan/metadata/unused.py b/pym/repoman/modules/scan/metadata/unused.py
720 index a6ff589..0184d78 100644
721 --- a/pym/repoman/modules/scan/metadata/unused.py
722 +++ b/pym/repoman/modules/scan/metadata/unused.py
723 @@ -23,12 +23,9 @@ class UnusedCheck(ScanBase):
724 @param validity_future: Future instance
725 '''
726 xpkg = kwargs.get('xpkg')
727 - muselist = kwargs.get('muselist')
728 + muselist = kwargs.get('muselist').result()
729 used_useflags = kwargs.get('used_useflags')
730 - try:
731 - valid_state = kwargs['validity_future'].result()
732 - except InvalidStateError:
733 - valid_state = True
734 + valid_state = self.get_result(kwargs['validity_future'], True)
735 # check if there are unused local USE-descriptions in metadata.xml
736 # (unless there are any invalids, to avoid noise)
737 if valid_state:
738 @@ -37,7 +34,7 @@ class UnusedCheck(ScanBase):
739 "metadata.warning",
740 "%s/metadata.xml: unused local USE-description: '%s'"
741 % (xpkg, myflag))
742 - return {'continue': False}
743 + return False
744
745 @property
746 def runInFinal(self):
747
748 diff --git a/pym/repoman/modules/scan/mirrors/thirdpartymirrors.py b/pym/repoman/modules/scan/mirrors/thirdpartymirrors.py
749 index f467ea4..8e3d250 100644
750 --- a/pym/repoman/modules/scan/mirrors/thirdpartymirrors.py
751 +++ b/pym/repoman/modules/scan/mirrors/thirdpartymirrors.py
752 @@ -33,9 +33,9 @@ class ThirdPartyMirrors(ScanBase):
753 @param src_uri_error: boolean
754 @returns: dictionary
755 '''
756 - ebuild = kwargs.get('ebuild')
757 - if kwargs.get('src_uri_error'):
758 - return {'continue': True}
759 + ebuild = kwargs.get('ebuild').result()
760 + if self.get_result(kwargs.get('src_uri_error'), False):
761 + return True
762 for uri in portage.dep.use_reduce(
763 ebuild.metadata["SRC_URI"], matchall=True, is_src_uri=True,
764 eapi=ebuild.eapi, flat=True):
765 @@ -52,7 +52,7 @@ class ThirdPartyMirrors(ScanBase):
766 "SRC_URI.mirror",
767 "%s: '%s' found in thirdpartymirrors, use '%s'" % (
768 ebuild.relative_path, mirror, new_uri))
769 - return {'continue': False}
770 + return False
771
772 @property
773 def runInEbuilds(self):
774
775 diff --git a/pym/repoman/modules/scan/options/options.py b/pym/repoman/modules/scan/options/options.py
776 index 2fabdba..443f01b 100644
777 --- a/pym/repoman/modules/scan/options/options.py
778 +++ b/pym/repoman/modules/scan/options/options.py
779 @@ -20,8 +20,8 @@ class Options(ScanBase):
780 # The dep_check() calls are the most expensive QA test. If --force
781 # is enabled, there's no point in wasting time on these since the
782 # user is intent on forcing the commit anyway.
783 - return {'continue': True}
784 - return {'continue': False}
785 + return True
786 + return False
787
788 @property
789 def runInEbuilds(self):
790
791 diff --git a/pym/repoman/modules/scan/scanbase.py b/pym/repoman/modules/scan/scanbase.py
792 index 9821c57..740092e 100644
793 --- a/pym/repoman/modules/scan/scanbase.py
794 +++ b/pym/repoman/modules/scan/scanbase.py
795 @@ -1,5 +1,7 @@
796 # -*- coding:utf-8 -*-
797
798 +from portage.util.futures import InvalidStateError
799 +
800
801 class ScanBase(object):
802 '''Skeleton class for performing a scan for one or more items
803 @@ -30,9 +32,43 @@ class ScanBase(object):
804 # The continue attribute will default to False if not returned.
805 # This will allow the loop to continue with the next check in the list.
806 # Include any additional dynamic data that needs to be added or updated.
807 - return {'continue': False}
808 + return False # used as a continue True/False value
809 """
810
811 + @staticmethod
812 + def set_result_pass(items):
813 + '''Set Future instance results, pass on InvalidStateError
814 +
815 + @param items: iterable of key, value tuples
816 + '''
817 + for key, value in items:
818 + try:
819 + key.set_result(value)
820 + except InvalidStateError:
821 + pass
822 +
823 + @staticmethod
824 + def set_result_raise(items):
825 + '''Set Future instance results, raises an exception on InvalidStateError
826 +
827 + @param items: iterable of key, value tuples
828 + '''
829 + for key, value in items:
830 + key.set_result(value)
831 +
832 + def get_result(self, future, unset_value=None):
833 + '''Returns a Future result, or the unset value passed in
834 +
835 + @param future: The Future instance being queried
836 + @param unset_value:
837 + @returns: Future result
838 + '''
839 + try:
840 + result = future.result()
841 + except InvalidStateError:
842 + result = unset_value
843 + return result
844 +
845 @property
846 def runInPkgs(self):
847 '''Package level scans'''
848
849 diff --git a/pym/repoman/modules/scan/status/vcsstatus.py b/pym/repoman/modules/scan/status/vcsstatus.py
850 index cf2298e..cadc5c0 100644
851 --- a/pym/repoman/modules/scan/status/vcsstatus.py
852 +++ b/pym/repoman/modules/scan/status/vcsstatus.py
853 @@ -31,7 +31,11 @@ class VCSStatus(ScanBase):
854 xpkg = kwargs.get('xpkg')
855 if self.check_not_added:
856 self.vcs_settings.status.check(checkdir, checkdir_relative, xpkg)
857 - return {'continue': False, 'eadded': self.vcs_settings.status.eadded}
858 + # update the dynamic data
859 + self.set_result_pass([
860 + (kwargs.get('eadded'), self.vcs_settings.status.eadded),
861 + ])
862 + return False
863
864 @property
865 def runInPkgs(self):
866
867 diff --git a/pym/repoman/modules/scan/use/use_flags.py b/pym/repoman/modules/scan/use/use_flags.py
868 index b76ed70..70f7583 100644
869 --- a/pym/repoman/modules/scan/use/use_flags.py
870 +++ b/pym/repoman/modules/scan/use/use_flags.py
871 @@ -38,11 +38,11 @@ class USEFlagChecks(ScanBase):
872 @param muselist: Local USE flags of the package
873 @returns: dictionary, including {ebuild_UsedUseFlags, used_useflags}
874 '''
875 - pkg = kwargs.get('pkg')
876 + pkg = kwargs.get('pkg').result()
877 package = kwargs.get('xpkg')
878 - ebuild = kwargs.get('ebuild')
879 + ebuild = kwargs.get('ebuild').result()
880 y_ebuild = kwargs.get('y_ebuild')
881 - localUseFlags = kwargs.get('muselist')
882 + localUseFlags = kwargs.get('muselist').result()
883 # reset state variables for the run
884 self.useFlags = []
885 self.defaultUseFlags = []
886 @@ -50,9 +50,14 @@ class USEFlagChecks(ScanBase):
887 self._checkGlobal(pkg)
888 self._checkMetadata(package, ebuild, y_ebuild, localUseFlags)
889 self._checkRequiredUSE(pkg, ebuild)
890 + # update the dynamic data
891 used_useflags = kwargs.get('used_useflags').union(self.usedUseFlags)
892 - return {'continue': False, 'ebuild_UsedUseFlags': self.usedUseFlags,
893 - 'used_useflags': used_useflags}
894 + dyn_ebuild_used = kwargs.get('ebuild_UsedUseFlags')
895 + dyn_ebuild_used.update(self.usedUseFlags)
896 + dyn_used = kwargs.get('used_useflags')
897 + dyn_used.update(used_useflags)
898 + return False
899 +
900
901 def _checkGlobal(self, pkg):
902 for myflag in pkg._metadata["IUSE"].split():
903
904 diff --git a/pym/repoman/scanner.py b/pym/repoman/scanner.py
905 index 5ac519e..3d2c69c 100644
906 --- a/pym/repoman/scanner.py
907 +++ b/pym/repoman/scanner.py
908 @@ -28,6 +28,8 @@ MODULE_NAMES = MODULE_CONTROLLER.module_names[:]
909 # initial development debug info
910 logging.debug("module_names: %s", MODULE_NAMES)
911
912 +DATA_TYPES = {'dict': dict, 'Future': Future, 'list': list, 'set': set}
913 +
914
915 class Scanner(object):
916 '''Primary scan class. Operates all the small Q/A tests and checks'''
917 @@ -177,6 +179,9 @@ class Scanner(object):
918 chain(self.changed.changed, self.changed.new, self.changed.removed),
919 self.repolevel, self.reposplit, self.categories))
920
921 + self.pkgs = None
922 + self.eadded = False
923 +
924 # Create our kwargs dict here to initialize the plugins with
925 self.kwargs = {
926 "repo_settings": self.repo_settings,
927 @@ -215,6 +220,28 @@ class Scanner(object):
928 kwargs[key] = self.kwargs[key]
929 return kwargs
930
931 + @staticmethod
932 + def set_func_kwargs(mod, dynamic_data=None):
933 + '''Updates the dynamic_data dictionary with any new key, value pairs.
934 + Creates a limited set of kwargs to pass to the modulefunctions to run
935 +
936 + @param mod: module name string
937 + @param dynamic_data: dictionary structure
938 + @returns: dictionary
939 + '''
940 + func_kwargs = MODULE_CONTROLLER.modules[mod]['func_kwargs']
941 + # determine new keys
942 + required = set(func_kwargs.viewkeys())
943 + exist = set(dynamic_data.viewkeys())
944 + new = exist.difference(required)
945 + # update dynamic_data with initialized entries
946 + for key in new:
947 + dynamic_data[key] = DATA_TYPES[func_kwargs['key']]()
948 + kwargs = {}
949 + for key in required:
950 + kwargs[key] = dynamic_data[key]
951 + return kwargs
952 +
953 def scan_pkgs(self, can_force):
954 for xpkg in self.effective_scanlist:
955 xpkg_continue = False
956 @@ -252,8 +279,8 @@ class Scanner(object):
957 do_it, functions = self.modules[mod].runInPkgs
958 if do_it:
959 for func in functions:
960 - rdata = func(**dynamic_data)
961 - if rdata.get('continue', False):
962 + _continue = func(**self.set_func_kwargs(mod, dynamic_data))
963 + if _continue:
964 # If we can't access all the metadata then it's totally unsafe to
965 # commit since there's no way to generate a correct Manifest.
966 # Do not try to do any more QA checks on this package since missing
967 @@ -261,7 +288,6 @@ class Scanner(object):
968 # positives confuse users.
969 xpkg_continue = True
970 break
971 - dynamic_data.update(rdata)
972
973 if xpkg_continue:
974 continue
975 @@ -313,8 +339,8 @@ class Scanner(object):
976 if do_it:
977 for func in functions:
978 logging.debug("\tRunning function: %s", func)
979 - rdata = func(**dynamic_data)
980 - if rdata.get('continue', False):
981 + _continue = func(**self.set_func_kwargs(mod, dynamic_data))
982 + if _continue:
983 # If we can't access all the metadata then it's totally unsafe to
984 # commit since there's no way to generate a correct Manifest.
985 # Do not try to do any more QA checks on this package since missing
986 @@ -323,9 +349,6 @@ class Scanner(object):
987 y_ebuild_continue = True
988 # logging.debug("\t>>> Continuing")
989 break
990 - # logging.debug("rdata: %s", rdata)
991 - dynamic_data.update(rdata)
992 - # logging.debug("dynamic_data: %s", dynamic_data)
993
994 if y_ebuild_continue:
995 continue
996 @@ -347,14 +370,11 @@ class Scanner(object):
997 if do_it:
998 for func in functions:
999 logging.debug("\tRunning function: %s", func)
1000 - rdata = func(**dynamic_data)
1001 - if rdata.get('continue', False):
1002 + _continue = func(**self.set_func_kwargs(mod, dynamic_data))
1003 + if _continue:
1004 xpkg_complete = True
1005 # logging.debug("\t>>> Continuing")
1006 break
1007 - # logging.debug("rdata: %s", rdata)
1008 - dynamic_data.update(rdata)
1009 - # logging.debug("dynamic_data: %s", dynamic_data)
1010
1011 if xpkg_complete:
1012 return