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/, pym/repoman/modules/scan/keywords/, pym/repoman/modules/scan/use/, ...
Date: Fri, 29 Apr 2016 17:25:06
Message-Id: 1461598133.7ec0953fd023a6285beaea0421b438de2b88a2e6.dolsen@gentoo
1 commit: 7ec0953fd023a6285beaea0421b438de2b88a2e6
2 Author: Brian Dolbec <dolsen <AT> gentoo <DOT> org>
3 AuthorDate: Mon Apr 25 01:15:36 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=7ec0953f
7
8 repoman: Convert all pointer type dynamic_data to the new ExtendedFuture class
9
10 pym/repoman/main.py | 13 ++---
11 pym/repoman/modules/scan/arches/__init__.py | 4 +-
12 pym/repoman/modules/scan/arches/arches.py | 5 +-
13 pym/repoman/modules/scan/depend/__init__.py | 22 +++++--
14 pym/repoman/modules/scan/depend/depend.py | 15 +++--
15 pym/repoman/modules/scan/depend/profile.py | 10 ++--
16 pym/repoman/modules/scan/depend/unknown.py | 6 +-
17 pym/repoman/modules/scan/directories/__init__.py | 12 +++-
18 pym/repoman/modules/scan/directories/files.py | 2 +-
19 pym/repoman/modules/scan/directories/mtime.py | 4 +-
20 pym/repoman/modules/scan/eapi/__init__.py | 3 +-
21 pym/repoman/modules/scan/eapi/eapi.py | 2 +-
22 pym/repoman/modules/scan/ebuild/__init__.py | 29 ++++++---
23 pym/repoman/modules/scan/ebuild/ebuild.py | 18 +++---
24 pym/repoman/modules/scan/ebuild/isebuild.py | 17 ++----
25 pym/repoman/modules/scan/ebuild/multicheck.py | 4 +-
26 pym/repoman/modules/scan/eclasses/__init__.py | 12 +++-
27 pym/repoman/modules/scan/eclasses/live.py | 11 ++--
28 pym/repoman/modules/scan/eclasses/ruby.py | 4 +-
29 pym/repoman/modules/scan/fetch/__init__.py | 9 ++-
30 pym/repoman/modules/scan/fetch/fetches.py | 3 +-
31 pym/repoman/modules/scan/keywords/__init__.py | 9 ++-
32 pym/repoman/modules/scan/keywords/keywords.py | 6 +-
33 pym/repoman/modules/scan/manifest/__init__.py | 4 +-
34 pym/repoman/modules/scan/metadata/__init__.py | 39 +++++++++----
35 pym/repoman/modules/scan/metadata/description.py | 4 +-
36 .../modules/scan/metadata/ebuild_metadata.py | 11 ++--
37 pym/repoman/modules/scan/metadata/license.py | 4 +-
38 pym/repoman/modules/scan/metadata/pkgmetadata.py | 12 ++--
39 pym/repoman/modules/scan/metadata/restrict.py | 2 +-
40 pym/repoman/modules/scan/metadata/unused.py | 6 +-
41 pym/repoman/modules/scan/mirrors/__init__.py | 4 +-
42 .../modules/scan/mirrors/thirdpartymirrors.py | 5 +-
43 pym/repoman/modules/scan/scanbase.py | 36 ------------
44 pym/repoman/modules/scan/status/__init__.py | 7 ++-
45 pym/repoman/modules/scan/status/vcsstatus.py | 5 +-
46 pym/repoman/modules/scan/use/__init__.py | 10 +++-
47 pym/repoman/modules/scan/use/use_flags.py | 10 +---
48 pym/repoman/scanner.py | 68 +++++++++++++++++-----
49 39 files changed, 255 insertions(+), 192 deletions(-)
50
51 diff --git a/pym/repoman/main.py b/pym/repoman/main.py
52 index 62c3c2c..2009a44 100755
53 --- a/pym/repoman/main.py
54 +++ b/pym/repoman/main.py
55 @@ -22,8 +22,8 @@ import portage.repository.config
56 from portage.output import create_color_func, nocolor
57 from portage.output import ConsoleStyleFile, StyleWriter
58 from portage.util import formatter
59 -from portage.util.futures import (
60 - Future,
61 +from portage.util.futures.extendedfutures import (
62 + ExtendedFuture,
63 InvalidStateError,
64 )
65
66 @@ -79,7 +79,7 @@ def repoman_main(argv):
67 # Set this to False when an extraordinary issue (generally
68 # something other than a QA issue) makes it impossible to
69 # commit (like if Manifest generation fails).
70 - can_force = Future()
71 + can_force = ExtendedFuture(True)
72
73 portdir, portdir_overlay, mydir = utilities.FindPortdir(repoman_settings)
74 if portdir is None:
75 @@ -174,14 +174,9 @@ def repoman_main(argv):
76 qa_output = qa_output.getvalue()
77 qa_output = qa_output.splitlines(True)
78
79 - try:
80 - can_force = can_force.result()
81 - except InvalidStateError:
82 - can_force = True
83 -
84 # output the results
85 actions = Actions(repo_settings, options, scanner, vcs_settings)
86 - if actions.inform(can_force, result):
87 + if actions.inform(can_force.get(), result):
88 # perform any other actions
89 actions.perform(qa_output)
90
91
92 diff --git a/pym/repoman/modules/scan/arches/__init__.py b/pym/repoman/modules/scan/arches/__init__.py
93 index e4a4806..d66be1e 100644
94 --- a/pym/repoman/modules/scan/arches/__init__.py
95 +++ b/pym/repoman/modules/scan/arches/__init__.py
96 @@ -20,7 +20,9 @@ module_spec = {
97 },
98 'mod_kwargs': ['options', 'repo_settings', 'profiles'
99 ],
100 - 'func_kwargs': {'ebuild': None, 'arches': 'set',
101 + 'func_kwargs': {
102 + 'arches': ('Future', 'set'),
103 + 'ebuild': (None, None),
104 },
105 },
106 }
107
108 diff --git a/pym/repoman/modules/scan/arches/arches.py b/pym/repoman/modules/scan/arches/arches.py
109 index 6e1c17d..b86848d 100644
110 --- a/pym/repoman/modules/scan/arches/arches.py
111 +++ b/pym/repoman/modules/scan/arches/arches.py
112 @@ -23,7 +23,7 @@ class ArchChecks(ScanBase):
113 @param ebuild: Ebuild which we check (object).
114 @returns: dictionary, including arches set
115 '''
116 - ebuild = kwargs.get('ebuild').result()
117 + ebuild = kwargs.get('ebuild').get()
118 if self.options.ignore_arches:
119 arches = [[
120 self.repo_settings.repoman_settings["ARCH"], self.repo_settings.repoman_settings["ARCH"],
121 @@ -69,8 +69,7 @@ class ArchChecks(ScanBase):
122 arches.add(('**', '**', ('**',)))
123 # update the dynamic data
124 dyn_arches = kwargs.get('arches')
125 - dyn_arches.clear()
126 - dyn_arches.update(arches)
127 + dyn_arches.set(arches)
128 return False
129
130 @property
131
132 diff --git a/pym/repoman/modules/scan/depend/__init__.py b/pym/repoman/modules/scan/depend/__init__.py
133 index cf5b415..27c803d 100644
134 --- a/pym/repoman/modules/scan/depend/__init__.py
135 +++ b/pym/repoman/modules/scan/depend/__init__.py
136 @@ -20,8 +20,12 @@ module_spec = {
137 },
138 'mod_kwargs': ['qatracker', 'portdb'
139 ],
140 - 'func_kwargs': {'ebuild': None, 'pkg': None, 'unknown_pkgs': 'set',
141 - 'badlicsyntax': 'Future', 'baddepsyntax': 'Future',
142 + 'func_kwargs': {
143 + 'baddepsyntax': ('Future', False),
144 + 'badlicsyntax': ('Future', False),
145 + 'ebuild': (None, None),
146 + 'pkg': (None, None),
147 + 'unknown_pkgs': ('Future', 'UNSET'),
148 },
149 },
150 'profile-module': {
151 @@ -36,8 +40,12 @@ module_spec = {
152 'repo_settings', 'include_arches', 'caches',
153 'repoman_incrementals', 'env', 'have', 'dev_keywords'
154 ],
155 - 'func_kwargs': {'arches': None, 'ebuild': None, 'pkg': None,
156 - 'unknown_pkgs': None, 'baddepsyntax': None,
157 + 'func_kwargs': {
158 + 'arches': (None, None),
159 + 'baddepsyntax': (None, None),
160 + 'ebuild': (None, None),
161 + 'pkg': (None, None),
162 + 'unknown_pkgs': (None, None),
163 },
164 },
165 'unknown-module': {
166 @@ -50,8 +58,10 @@ module_spec = {
167 },
168 'mod_kwargs': ['qatracker',
169 ],
170 - 'func_kwargs': {'ebuild': None, 'unknown_pkgs': 'set',
171 - 'baddepsyntax': None,
172 + 'func_kwargs': {
173 + 'baddepsyntax': (None, None),
174 + 'ebuild': (None, None),
175 + 'unknown_pkgs': ('Future', 'UNSET'),
176 },
177 },
178 }
179
180 diff --git a/pym/repoman/modules/scan/depend/depend.py b/pym/repoman/modules/scan/depend/depend.py
181 index cd1fb33..44a21e9 100644
182 --- a/pym/repoman/modules/scan/depend/depend.py
183 +++ b/pym/repoman/modules/scan/depend/depend.py
184 @@ -28,8 +28,8 @@ class DependChecks(ScanBase):
185 @param ebuild: Ebuild which we check (object).
186 @returns: boolean
187 '''
188 - ebuild = kwargs.get('ebuild').result()
189 - pkg = kwargs.get('pkg').result()
190 + ebuild = kwargs.get('ebuild').get()
191 + pkg = kwargs.get('pkg').get()
192
193 unknown_pkgs = set()
194
195 @@ -145,12 +145,11 @@ class DependChecks(ScanBase):
196
197 # update the dynamic data
198 dyn_unknown = kwargs.get('unknown_pkgs')
199 - dyn_unknown.clear()
200 - dyn_unknown.update(unknown_pkgs)
201 - self.set_result_pass([
202 - (kwargs.get('badlicsyntax'), badlicsyntax),
203 - (kwargs.get('baddepsyntax'), baddepsyntax),
204 - ])
205 + dyn_unknown.set(unknown_pkgs)
206 + dyn_badlicsyntax = kwargs.get('badlicsyntax')
207 + dyn_badlicsyntax.set(badlicsyntax, ignore_InvalidState=True)
208 + dyn_baddepsyntax = kwargs.get('baddepsyntax')
209 + dyn_baddepsyntax.set(baddepsyntax, ignore_InvalidState=True)
210 return False
211
212 @property
213
214 diff --git a/pym/repoman/modules/scan/depend/profile.py b/pym/repoman/modules/scan/depend/profile.py
215 index b4ec8ca..8fc7721 100644
216 --- a/pym/repoman/modules/scan/depend/profile.py
217 +++ b/pym/repoman/modules/scan/depend/profile.py
218 @@ -56,11 +56,11 @@ class ProfileDependsChecks(ScanBase):
219 @param unknown_pkgs: set of tuples (type, atom.unevaluated_atom)
220 @returns: dictionary
221 '''
222 - arches = kwargs.get('arches')
223 - ebuild = kwargs.get('ebuild').result()
224 - pkg = kwargs.get('pkg').result()
225 - baddepsyntax = self.get_result(kwargs.get('baddepsyntax'), False)
226 - unknown_pkgs = kwargs.get('unknown_pkgs')
227 + arches = kwargs.get('arches').get()
228 + ebuild = kwargs.get('ebuild').get()
229 + pkg = kwargs.get('pkg').get()
230 + baddepsyntax = kwargs.get('baddepsyntax').get()
231 + unknown_pkgs = kwargs.get('unknown_pkgs').get()
232
233 relevant_profiles = []
234 for keyword, arch, groups in arches:
235
236 diff --git a/pym/repoman/modules/scan/depend/unknown.py b/pym/repoman/modules/scan/depend/unknown.py
237 index 9e8f7f8..6667d4f 100644
238 --- a/pym/repoman/modules/scan/depend/unknown.py
239 +++ b/pym/repoman/modules/scan/depend/unknown.py
240 @@ -21,9 +21,9 @@ class DependUnknown(ScanBase):
241 @param unknown_pkgs: set of tuples (type, atom.unevaluated_atom)
242 @returns: dictionary
243 '''
244 - ebuild = kwargs.get('ebuild').result()
245 - baddepsyntax = self.get_result(kwargs.get('baddepsyntax'), False)
246 - unknown_pkgs = kwargs.get('unknown_pkgs')
247 + ebuild = kwargs.get('ebuild').get()
248 + baddepsyntax = kwargs.get('baddepsyntax').get()
249 + unknown_pkgs = kwargs.get('unknown_pkgs').get()
250
251 if not baddepsyntax and unknown_pkgs:
252 type_map = {}
253
254 diff --git a/pym/repoman/modules/scan/directories/__init__.py b/pym/repoman/modules/scan/directories/__init__.py
255 index 0193843..47834cb 100644
256 --- a/pym/repoman/modules/scan/directories/__init__.py
257 +++ b/pym/repoman/modules/scan/directories/__init__.py
258 @@ -20,8 +20,11 @@ module_spec = {
259 },
260 'mod_kwargs': ['portdb', 'qatracker', 'repo_settings', 'vcs_settings',
261 ],
262 - 'func_kwargs': {'checkdir': None, 'checkdirlist': None,
263 - 'checkdir_relative': None, 'changed': None,
264 + 'func_kwargs': {
265 + 'changed': (None, None),
266 + 'checkdir': (None, None),
267 + 'checkdirlist': (None, None),
268 + 'checkdir_relative': (None, None),
269 },
270 },
271 'mtime-module': {
272 @@ -34,7 +37,10 @@ module_spec = {
273 },
274 'mod_kwargs': ['vcs_settings',
275 ],
276 - 'func_kwargs': {'ebuild': None, 'changed': None, 'pkg': None,
277 + 'func_kwargs': {
278 + 'changed': (None, None),
279 + 'ebuild': (None, None),
280 + 'pkg': (None, None),
281 },
282 },
283 }
284
285 diff --git a/pym/repoman/modules/scan/directories/files.py b/pym/repoman/modules/scan/directories/files.py
286 index 94a0791..2aed264 100644
287 --- a/pym/repoman/modules/scan/directories/files.py
288 +++ b/pym/repoman/modules/scan/directories/files.py
289 @@ -39,7 +39,7 @@ class FileChecks(ScanBase):
290 @returns: dictionary
291 '''
292 checkdir = kwargs.get('checkdir')
293 - checkdirlist = kwargs.get('checkdirlist')
294 + checkdirlist = kwargs.get('checkdirlist').get()
295 checkdir_relative = kwargs.get('checkdir_relative')
296 changed = kwargs.get('changed').changed
297 new = kwargs.get('changed').new
298
299 diff --git a/pym/repoman/modules/scan/directories/mtime.py b/pym/repoman/modules/scan/directories/mtime.py
300 index 6c667df..134a86b 100644
301 --- a/pym/repoman/modules/scan/directories/mtime.py
302 +++ b/pym/repoman/modules/scan/directories/mtime.py
303 @@ -15,9 +15,9 @@ class MtimeChecks(ScanBase):
304 @param changed: dictionary instance
305 @returns: dictionary
306 '''
307 - ebuild = kwargs.get('ebuild').result()
308 + ebuild = kwargs.get('ebuild').get()
309 changed = kwargs.get('changed')
310 - pkg = kwargs.get('pkg').result()
311 + pkg = kwargs.get('pkg').get()
312 if not self.vcs_settings.vcs_preserves_mtime:
313 if ebuild.ebuild_path not in changed.new_ebuilds and \
314 ebuild.ebuild_path not in changed.ebuilds:
315
316 diff --git a/pym/repoman/modules/scan/eapi/__init__.py b/pym/repoman/modules/scan/eapi/__init__.py
317 index 376e79a..4c3dd6e 100644
318 --- a/pym/repoman/modules/scan/eapi/__init__.py
319 +++ b/pym/repoman/modules/scan/eapi/__init__.py
320 @@ -20,7 +20,8 @@ module_spec = {
321 },
322 'mod_kwargs': ['qatracker', 'repo_settings'
323 ],
324 - 'func_kwargs': {'ebuild': None,
325 + 'func_kwargs': {
326 + 'ebuild': (None, None),
327 },
328 },
329 }
330
331 diff --git a/pym/repoman/modules/scan/eapi/eapi.py b/pym/repoman/modules/scan/eapi/eapi.py
332 index 18bab3d..1d4ad5a 100644
333 --- a/pym/repoman/modules/scan/eapi/eapi.py
334 +++ b/pym/repoman/modules/scan/eapi/eapi.py
335 @@ -23,7 +23,7 @@ class EAPIChecks(ScanBase):
336 @param ebuild: Ebuild which we check (object).
337 @returns: dictionary
338 '''
339 - ebuild = kwargs.get('ebuild').result()
340 + ebuild = kwargs.get('ebuild').get()
341
342 if not self._checkBanned(ebuild):
343 self._checkDeprecated(ebuild)
344
345 diff --git a/pym/repoman/modules/scan/ebuild/__init__.py b/pym/repoman/modules/scan/ebuild/__init__.py
346 index efb2feb..b243314 100644
347 --- a/pym/repoman/modules/scan/ebuild/__init__.py
348 +++ b/pym/repoman/modules/scan/ebuild/__init__.py
349 @@ -20,8 +20,13 @@ module_spec = {
350 },
351 'mod_kwargs': ['portdb', 'qatracker', 'repo_settings'
352 ],
353 - 'func_kwargs': {'checkdirlist': 'list', 'checkdir': None, 'xpkg': None,
354 - 'validity_future': 'Future', 'can_force': None, 'pkgs': 'dict',
355 + 'func_kwargs': {
356 + 'can_force': (None, None),
357 + 'checkdir': (None, None),
358 + 'checkdirlist': (None, None),
359 + 'pkgs': ('Future', 'dict'),
360 + 'validity_future': ('Future', True),
361 + 'xpkg': (None, None),
362 },
363 },
364 'ebuild-module': {
365 @@ -34,10 +39,18 @@ module_spec = {
366 },
367 'mod_kwargs': ['qatracker', 'repo_settings', 'vcs_settings', 'checks',
368 ],
369 - 'func_kwargs': {'xpkg': None, 'y_ebuild': None, 'changed': None,
370 - 'changelog_modified': None, 'pkg': 'Future', 'pkgs': None,
371 - 'ebuild': 'Future', 'validity_future': None, 'pkgdir': None,
372 - 'repolevel': None, 'catdir': None,
373 + 'func_kwargs': {
374 + 'catdir': (None, None),
375 + 'changed': (None, None),
376 + 'changelog_modified': (None, None),
377 + 'ebuild': ('Future', 'UNSET'),
378 + 'pkg': ('Future', 'UNSET'),
379 + 'pkgdir': (None, None),
380 + 'pkgs': (None, None),
381 + 'repolevel': (None, None),
382 + 'validity_future': (None, None),
383 + 'xpkg': (None, None),
384 + 'y_ebuild': (None, None),
385 },
386 },
387 'multicheck-module': {
388 @@ -50,7 +63,9 @@ module_spec = {
389 },
390 'mod_kwargs': ['qatracker', 'options'
391 ],
392 - 'func_kwargs': {'ebuild': None, 'pkg': None,
393 + 'func_kwargs': {
394 + 'ebuild': (None, None),
395 + 'pkg': (None, None),
396 },
397 },
398 }
399
400 diff --git a/pym/repoman/modules/scan/ebuild/ebuild.py b/pym/repoman/modules/scan/ebuild/ebuild.py
401 index b02cdcd..92b1ea4 100644
402 --- a/pym/repoman/modules/scan/ebuild/ebuild.py
403 +++ b/pym/repoman/modules/scan/ebuild/ebuild.py
404 @@ -86,7 +86,8 @@ class Ebuild(ScanBase):
405 self.qatracker.add_error(
406 "ebuild.notadded", self.xpkg + "/" + self.y_ebuild + ".ebuild")
407 # update the dynamic data
408 - self.set_result_raise([(kwargs.get('ebuild'), self)])
409 + dyn_ebuild = kwargs.get('ebuild')
410 + dyn_ebuild.set(self)
411 return False
412
413 def set_pkg_data(self, **kwargs):
414 @@ -95,7 +96,8 @@ class Ebuild(ScanBase):
415 @param pkgs: the dynamic list of ebuilds
416 @returns: dictionary
417 '''
418 - self.pkg = kwargs.get('pkgs')[self.y_ebuild]
419 + pkgs = kwargs.get('pkgs').get()
420 + self.pkg = pkgs[self.y_ebuild]
421 self.metadata = self.pkg._metadata
422 self.eapi = self.metadata["EAPI"]
423 self.inherited = self.pkg.inherited
424 @@ -133,21 +135,17 @@ class Ebuild(ScanBase):
425 @returns: dictionary, including {pkg object}
426 '''
427 fuse = kwargs.get('validity_future')
428 + dyn_pkg = kwargs.get('pkg')
429 if self.pkg.invalid:
430 for k, msgs in self.pkg.invalid.items():
431 for msg in msgs:
432 self.qatracker.add_error(k, "%s: %s" % (self.relative_path, msg))
433 # update the dynamic data
434 - self.set_result_pass([
435 - (fuse, False),])
436 - self.set_result_raise([
437 - (kwargs.get('pkg'), self.pkg),
438 - ])
439 + fuse.set(False, ignore_InvalidState=True)
440 + dyn_pkg.set(self.pkg)
441 return True
442 # update the dynamic data
443 - self.set_result_raise([
444 - (kwargs.get('pkg'), self.pkg),
445 - ])
446 + dyn_pkg.set(self.pkg)
447 return False
448
449 @property
450
451 diff --git a/pym/repoman/modules/scan/ebuild/isebuild.py b/pym/repoman/modules/scan/ebuild/isebuild.py
452 index 24680e2..7277ad0 100644
453 --- a/pym/repoman/modules/scan/ebuild/isebuild.py
454 +++ b/pym/repoman/modules/scan/ebuild/isebuild.py
455 @@ -39,7 +39,7 @@ class IsEbuild(ScanBase):
456 @param validity_future: Future instance
457 @returns: dictionary, including {pkgs, can_force}
458 '''
459 - checkdirlist = kwargs.get('checkdirlist')
460 + checkdirlist = kwargs.get('checkdirlist').get()
461 checkdir = kwargs.get('checkdir')
462 xpkg = kwargs.get('xpkg')
463 fuse = kwargs.get('validity_future')
464 @@ -65,15 +65,15 @@ class IsEbuild(ScanBase):
465 try:
466 myaux = dict(zip(allvars, self.portdb.aux_get(cpv, allvars)))
467 except KeyError:
468 - self.set_result_pass([(fuse, False)])
469 + fuse.set(False, ignore_InvalidState=True)
470 self.qatracker.add_error("ebuild.syntax", os.path.join(xpkg, y))
471 continue
472 except IOError:
473 - self.set_result_pass([(fuse, False)])
474 + fuse.set(False, ignore_InvalidState=True)
475 self.qatracker.add_error("ebuild.output", os.path.join(xpkg, y))
476 continue
477 if not portage.eapi_is_supported(myaux["EAPI"]):
478 - self.set_result_pass([(fuse, False)])
479 + fuse.set(False, ignore_InvalidState=True)
480 self.qatracker.add_error("EAPI.unsupported", os.path.join(xpkg, y))
481 continue
482 pkgs[pf] = Package(
483 @@ -87,15 +87,10 @@ class IsEbuild(ScanBase):
484 # metadata leads to false positives for several checks, and false
485 # positives confuse users.
486 self.continue_ = True
487 - self.set_result_pass([(can_force, False)])
488 + can_force.set(False, ignore_InvalidState=True)
489 # set our updated data
490 dyn_pkgs = kwargs.get('pkgs')
491 - # clear() sets it to None,
492 - # we don't want to kill the pointer reference
493 - # just set it back to an empty dict()
494 - for key in list(dyn_pkgs):
495 - dyn_pkgs.pop(key)
496 - dyn_pkgs.update(pkgs)
497 + dyn_pkgs.set(pkgs)
498 return self.continue_
499
500 @property
501
502 diff --git a/pym/repoman/modules/scan/ebuild/multicheck.py b/pym/repoman/modules/scan/ebuild/multicheck.py
503 index ed7556d..9e36e2a 100644
504 --- a/pym/repoman/modules/scan/ebuild/multicheck.py
505 +++ b/pym/repoman/modules/scan/ebuild/multicheck.py
506 @@ -31,8 +31,8 @@ class MultiCheck(ScanBase):
507 @param ebuild: Ebuild which we check (object).
508 @returns: dictionary
509 '''
510 - ebuild = kwargs.get('ebuild').result()
511 - pkg = kwargs.get('pkg').result()
512 + ebuild = kwargs.get('ebuild').get()
513 + pkg = kwargs.get('pkg').get()
514 try:
515 # All ebuilds should have utf_8 encoding.
516 f = io.open(
517
518 diff --git a/pym/repoman/modules/scan/eclasses/__init__.py b/pym/repoman/modules/scan/eclasses/__init__.py
519 index 7be954c..63bb86f 100644
520 --- a/pym/repoman/modules/scan/eclasses/__init__.py
521 +++ b/pym/repoman/modules/scan/eclasses/__init__.py
522 @@ -20,8 +20,12 @@ module_spec = {
523 },
524 'mod_kwargs': ['qatracker', 'repo_metadata', 'repo_settings',
525 ],
526 - 'func_kwargs': {'live_ebuild': 'set', 'pkg': None, 'xpkg': None,
527 - 'ebuild': None, 'y_ebuild': None,
528 + 'func_kwargs': {
529 + 'ebuild': (None, None),
530 + 'live_ebuild': ('Future', 'UNSET'),
531 + 'pkg': (None, None),
532 + 'xpkg': (None, None),
533 + 'y_ebuild': (None, None),
534 },
535 },
536 'ruby-module': {
537 @@ -34,7 +38,9 @@ module_spec = {
538 },
539 'mod_kwargs': ['qatracker'
540 ],
541 - 'func_kwargs': {'pkg': None, 'ebuild': None,
542 + 'func_kwargs': {
543 + 'ebuild': (None, None),
544 + 'pkg': (None, None),
545 },
546 },
547 }
548
549 diff --git a/pym/repoman/modules/scan/eclasses/live.py b/pym/repoman/modules/scan/eclasses/live.py
550 index 85e829c..842cbab 100644
551 --- a/pym/repoman/modules/scan/eclasses/live.py
552 +++ b/pym/repoman/modules/scan/eclasses/live.py
553 @@ -25,11 +25,10 @@ class LiveEclassChecks(ScanBase):
554
555 @returns: dictionary, including {live_ebuild}
556 '''
557 - ebuild = kwargs.get('ebuild').result()
558 + ebuild = kwargs.get('ebuild').get()
559 # update the dynamic data
560 dyn_live = kwargs.get('live_ebuild')
561 - #dyn_live.clear()
562 - dyn_live.update(LIVE_ECLASSES.intersection(ebuild.inherited))
563 + dyn_live.set(LIVE_ECLASSES.intersection(ebuild.inherited))
564 return False
565
566 def check(self, **kwargs):
567 @@ -46,12 +45,12 @@ class LiveEclassChecks(ScanBase):
568 '''
569 pkg = kwargs.get("pkg").result()
570 package = kwargs.get('xpkg')
571 - ebuild = kwargs.get('ebuild').result()
572 + ebuild = kwargs.get('ebuild').get()
573 y_ebuild = kwargs.get('y_ebuild')
574 keywords = ebuild.keywords
575 + live_ebuild = kwargs.get('live_ebuild').get()
576
577 - if not (kwargs.get('live_ebuild') and
578 - self.repo_settings.repo_config.name == "gentoo"):
579 + if not live_ebuild and self.repo_settings.repo_config.name == "gentoo":
580 return False
581
582 is_stable = lambda kw: not kw.startswith("~") and not kw.startswith("-")
583
584 diff --git a/pym/repoman/modules/scan/eclasses/ruby.py b/pym/repoman/modules/scan/eclasses/ruby.py
585 index 92b9649..b350180 100644
586 --- a/pym/repoman/modules/scan/eclasses/ruby.py
587 +++ b/pym/repoman/modules/scan/eclasses/ruby.py
588 @@ -25,8 +25,8 @@ class RubyEclassChecks(ScanBase):
589 @param ebuild: Ebuild which we check (object).
590 @returns: dictionary
591 '''
592 - pkg = kwargs.get('pkg').result()
593 - ebuild = kwargs.get('ebuild').result()
594 + pkg = kwargs.get('pkg').get()
595 + ebuild = kwargs.get('ebuild').get()
596 is_inherited = lambda eclass: eclass in pkg.inherited
597 is_old_ruby_eclass_inherited = filter(
598 is_inherited, self.old_ruby_eclasses)
599
600 diff --git a/pym/repoman/modules/scan/fetch/__init__.py b/pym/repoman/modules/scan/fetch/__init__.py
601 index 795eabf..1228435 100644
602 --- a/pym/repoman/modules/scan/fetch/__init__.py
603 +++ b/pym/repoman/modules/scan/fetch/__init__.py
604 @@ -20,9 +20,12 @@ module_spec = {
605 },
606 'mod_kwargs': ['portdb', 'qatracker', 'repo_settings', 'vcs_settings',
607 ],
608 - 'func_kwargs': {'xpkg': None, 'checkdir': None,
609 - 'checkdir_relative': None, 'changed': None,
610 - 'src_uri_error': 'Future',
611 + 'func_kwargs': {
612 + 'changed': (None, None),
613 + 'checkdir': (None, None),
614 + 'checkdir_relative': (None, None),
615 + 'src_uri_error': ('Future', 'UNSET'),
616 + 'xpkg': (None, None),
617 },
618 },
619 }
620
621 diff --git a/pym/repoman/modules/scan/fetch/fetches.py b/pym/repoman/modules/scan/fetch/fetches.py
622 index f6adece..ddbf6bd 100644
623 --- a/pym/repoman/modules/scan/fetch/fetches.py
624 +++ b/pym/repoman/modules/scan/fetch/fetches.py
625 @@ -131,7 +131,8 @@ class FetchChecks(ScanBase):
626 "file.name",
627 "%s/files/%s: char '%s'" % (checkdir, y, y[index]))
628 # update the dynamic data
629 - self.set_result_pass([(kwargs.get('src_uri_error'), self._src_uri_error)])
630 + dyn_src_uri_error = kwargs.get('src_uri_error')
631 + dyn_src_uri_error.set(self._src_uri_error)
632 return False
633
634 def digests(self, checkdir):
635
636 diff --git a/pym/repoman/modules/scan/keywords/__init__.py b/pym/repoman/modules/scan/keywords/__init__.py
637 index 2b3f6ca..1c424ca 100644
638 --- a/pym/repoman/modules/scan/keywords/__init__.py
639 +++ b/pym/repoman/modules/scan/keywords/__init__.py
640 @@ -20,8 +20,13 @@ module_spec = {
641 },
642 'mod_kwargs': ['qatracker', 'options', 'repo_metadata', 'profiles',
643 ],
644 - 'func_kwargs': {'pkg': 'Future', 'xpkg': None, 'ebuild': 'Future',
645 - 'y_ebuild': None, 'changed': None, 'live_ebuild': 'set',
646 + 'func_kwargs': {
647 + 'changed': (None, None),
648 + 'ebuild': ('Future', 'UNSET'),
649 + 'live_ebuild': ('Future', 'UNSET'),
650 + 'pkg': ('Future', 'UNSET'),
651 + 'xpkg': None,
652 + 'y_ebuild': (None, None),
653 },
654 },
655 }
656
657 diff --git a/pym/repoman/modules/scan/keywords/keywords.py b/pym/repoman/modules/scan/keywords/keywords.py
658 index ec48bb6..af94c6f 100644
659 --- a/pym/repoman/modules/scan/keywords/keywords.py
660 +++ b/pym/repoman/modules/scan/keywords/keywords.py
661 @@ -40,12 +40,12 @@ class KeywordChecks(ScanBase):
662 @param live_ebuild: A boolean that determines if this is a live ebuild.
663 @returns: dictionary
664 '''
665 - pkg = kwargs.get('pkg').result()
666 + pkg = kwargs.get('pkg').get()
667 xpkg =kwargs.get('xpkg')
668 - ebuild = kwargs.get('ebuild').result()
669 + ebuild = kwargs.get('ebuild').get()
670 y_ebuild = kwargs.get('y_ebuild')
671 changed = kwargs.get('changed')
672 - live_ebuild = kwargs.get('live_ebuild')
673 + live_ebuild = kwargs.get('live_ebuild').get()
674 if not self.options.straight_to_stable:
675 self._checkAddedWithStableKeywords(
676 xpkg, ebuild, y_ebuild, ebuild.keywords, changed)
677
678 diff --git a/pym/repoman/modules/scan/manifest/__init__.py b/pym/repoman/modules/scan/manifest/__init__.py
679 index bd9f8da..dca431b 100644
680 --- a/pym/repoman/modules/scan/manifest/__init__.py
681 +++ b/pym/repoman/modules/scan/manifest/__init__.py
682 @@ -20,7 +20,9 @@ module_spec = {
683 },
684 'mod_kwargs': ['options', 'portdb', 'qatracker', 'repo_settings',
685 ],
686 - 'func_kwargs': {'checkdir': None, 'xpkg': None,
687 + 'func_kwargs': {
688 + 'checkdir': (None, None),
689 + 'xpkg': (None, None),
690 },
691 },
692 }
693
694 diff --git a/pym/repoman/modules/scan/metadata/__init__.py b/pym/repoman/modules/scan/metadata/__init__.py
695 index 9ccf377..98df9cf 100644
696 --- a/pym/repoman/modules/scan/metadata/__init__.py
697 +++ b/pym/repoman/modules/scan/metadata/__init__.py
698 @@ -20,8 +20,12 @@ module_spec = {
699 },
700 'mod_kwargs': ['repo_settings', 'qatracker', 'options', 'metadata_dtd',
701 ],
702 - 'func_kwargs': {'xpkg': None, 'checkdir': None, 'checkdirlist': None,
703 - 'repolevel': None, 'muselist': 'Future',
704 + 'func_kwargs': {
705 + 'checkdir': (None, None),
706 + 'checkdirlist': (None, None),
707 + 'muselist': ('Future', 'set'),
708 + 'repolevel': (None, None),
709 + 'xpkg': (None, None),
710 },
711 },
712 'ebuild-metadata': {
713 @@ -34,8 +38,12 @@ module_spec = {
714 },
715 'mod_kwargs': ['qatracker',
716 ],
717 - 'func_kwargs': {'ebuild': None, 'catdir': None, 'live_ebuild': None,
718 - 'xpkg': None, 'y_ebuild': None,
719 + 'func_kwargs': {
720 + 'catdir': (None, None),
721 + 'ebuild': (None, None),
722 + 'live_ebuild': (None, None),
723 + 'xpkg': (None, None),
724 + 'y_ebuild': (None, None),
725 },
726 },
727 'description-metadata': {
728 @@ -48,7 +56,9 @@ module_spec = {
729 },
730 'mod_kwargs': ['qatracker',
731 ],
732 - 'func_kwargs': {'ebuild': None, 'pkg': 'Future',
733 + 'func_kwargs': {
734 + 'ebuild': (None, None),
735 + 'pkg': ('Future', 'UNSET'),
736 },
737 },
738 'license-metadata': {
739 @@ -61,8 +71,11 @@ module_spec = {
740 },
741 'mod_kwargs': ['qatracker', 'repo_metadata',
742 ],
743 - 'func_kwargs': {'xpkg': None, 'ebuild': None, 'y_ebuild': None,
744 - 'badlicsyntax': None,
745 + 'func_kwargs': {
746 + 'badlicsyntax': (None, None),
747 + 'ebuild': (None, None),
748 + 'xpkg': (None, None),
749 + 'y_ebuild': (None, None),
750 },
751 },
752 'restrict-metadata': {
753 @@ -75,7 +88,10 @@ module_spec = {
754 },
755 'mod_kwargs': ['qatracker',
756 ],
757 - 'func_kwargs': {'xpkg': None, 'ebuild': None, 'y_ebuild': None,
758 + 'func_kwargs': {
759 + 'ebuild': (None, None),
760 + 'xpkg': (None, None),
761 + 'y_ebuild': (None, None),
762 },
763 },
764 'unused-metadata': {
765 @@ -88,8 +104,11 @@ module_spec = {
766 },
767 'mod_kwargs': ['qatracker',
768 ],
769 - 'func_kwargs': {'xpkg': None, 'muselist': None, 'used_useflags': None,
770 - 'validity_future': None,
771 + 'func_kwargs': {
772 + 'muselist': (None, None),
773 + 'used_useflags': (None, None),
774 + 'validity_future': (None, None),
775 + 'xpkg': (None, None),
776 },
777 },
778 }
779
780 diff --git a/pym/repoman/modules/scan/metadata/description.py b/pym/repoman/modules/scan/metadata/description.py
781 index 8bce8d8..79f62e1 100644
782 --- a/pym/repoman/modules/scan/metadata/description.py
783 +++ b/pym/repoman/modules/scan/metadata/description.py
784 @@ -21,8 +21,8 @@ class DescriptionChecks(ScanBase):
785 @param pkg: Package in which we check (object).
786 @param ebuild: Ebuild which we check (object).
787 '''
788 - ebuild = kwargs.get('ebuild').result()
789 - pkg = kwargs.get('pkg').result()
790 + ebuild = kwargs.get('ebuild').get()
791 + pkg = kwargs.get('pkg').get()
792 # 14 is the length of DESCRIPTION=""
793 if len(pkg._metadata['DESCRIPTION']) > max_desc_len:
794 self.qatracker.add_error(
795
796 diff --git a/pym/repoman/modules/scan/metadata/ebuild_metadata.py b/pym/repoman/modules/scan/metadata/ebuild_metadata.py
797 index 38b13d5..e239b47 100644
798 --- a/pym/repoman/modules/scan/metadata/ebuild_metadata.py
799 +++ b/pym/repoman/modules/scan/metadata/ebuild_metadata.py
800 @@ -20,7 +20,7 @@ class EbuildMetadata(ScanBase):
801 self.qatracker = kwargs.get('qatracker')
802
803 def invalidchar(self, **kwargs):
804 - ebuild = kwargs.get('ebuild').result()
805 + ebuild = kwargs.get('ebuild').get()
806 for k, v in ebuild.metadata.items():
807 if not isinstance(v, basestring):
808 continue
809 @@ -34,13 +34,14 @@ class EbuildMetadata(ScanBase):
810 return False
811
812 def missing(self, **kwargs):
813 - ebuild = kwargs.get('ebuild').result()
814 + ebuild = kwargs.get('ebuild').get()
815 + live_ebuild = kwargs.get('live_ebuild').get()
816 for pos, missing_var in enumerate(missingvars):
817 if not ebuild.metadata.get(missing_var):
818 if kwargs.get('catdir') == "virtual" and \
819 missing_var in ("HOMEPAGE", "LICENSE"):
820 continue
821 - if kwargs.get('live_ebuild') and missing_var == "KEYWORDS":
822 + if live_ebuild and missing_var == "KEYWORDS":
823 continue
824 myqakey = missingvars[pos] + ".missing"
825 self.qatracker.add_error(myqakey, '%s/%s.ebuild'
826 @@ -48,13 +49,13 @@ class EbuildMetadata(ScanBase):
827 return False
828
829 def old_virtual(self, **kwargs):
830 - ebuild = kwargs.get('ebuild').result()
831 + ebuild = kwargs.get('ebuild').get()
832 if ebuild.metadata.get("PROVIDE"):
833 self.qatracker.add_error("virtual.oldstyle", ebuild.relative_path)
834 return False
835
836 def virtual(self, **kwargs):
837 - ebuild = kwargs.get('ebuild').result()
838 + ebuild = kwargs.get('ebuild').get()
839 if kwargs.get('catdir') == "virtual":
840 for var in ("HOMEPAGE", "LICENSE"):
841 if ebuild.metadata.get(var):
842
843 diff --git a/pym/repoman/modules/scan/metadata/license.py b/pym/repoman/modules/scan/metadata/license.py
844 index b08834a..4a67c70 100644
845 --- a/pym/repoman/modules/scan/metadata/license.py
846 +++ b/pym/repoman/modules/scan/metadata/license.py
847 @@ -26,9 +26,9 @@ class LicenseChecks(ScanBase):
848 @param y_ebuild: Ebuild which we check (string).
849 '''
850 xpkg = kwargs.get('xpkg')
851 - ebuild = kwargs.get('ebuild').result()
852 + ebuild = kwargs.get('ebuild').get()
853 y_ebuild = kwargs.get('y_ebuild')
854 - if not self.get_result(kwargs.get('badlicsyntax'), False):
855 + if not kwargs.get('badlicsyntax').get():
856 # Parse the LICENSE variable, remove USE conditions and flatten it.
857 licenses = portage.dep.use_reduce(
858 ebuild.metadata["LICENSE"], matchall=1, flat=True)
859
860 diff --git a/pym/repoman/modules/scan/metadata/pkgmetadata.py b/pym/repoman/modules/scan/metadata/pkgmetadata.py
861 index 242c923..9216d77 100644
862 --- a/pym/repoman/modules/scan/metadata/pkgmetadata.py
863 +++ b/pym/repoman/modules/scan/metadata/pkgmetadata.py
864 @@ -68,15 +68,14 @@ class PkgMetadata(ScanBase):
865 '''
866 xpkg = kwargs.get('xpkg')
867 checkdir = kwargs.get('checkdir')
868 - checkdirlist = kwargs.get('checkdirlist')
869 + checkdirlist = kwargs.get('checkdirlist').get()
870 repolevel = kwargs.get('repolevel')
871
872 self.musedict = {}
873 if self.options.mode in ['manifest']:
874 # update the dynamic data
875 - self.set_result_raise([
876 - (kwargs.get('muselist'), frozenset(self.musedict))
877 - ])
878 + dyn_muselist = kwargs.get('muselist')
879 + dyn_muselist.set(frozenset(self.musedict))
880 return False
881
882 # metadata.xml file check
883 @@ -189,9 +188,8 @@ class PkgMetadata(ScanBase):
884 self.qatracker.add_error("metadata.bad", xpkg + "/metadata.xml")
885 del metadata_bad
886 # update the dynamic data
887 - self.set_result_raise([
888 - (kwargs.get('muselist'), frozenset(self.musedict))
889 - ])
890 + dyn_muselist = kwargs.get('muselist')
891 + dyn_muselist.set(frozenset(self.musedict))
892 return False
893
894 @property
895
896 diff --git a/pym/repoman/modules/scan/metadata/restrict.py b/pym/repoman/modules/scan/metadata/restrict.py
897 index 044cc2a..0f9c5e5 100644
898 --- a/pym/repoman/modules/scan/metadata/restrict.py
899 +++ b/pym/repoman/modules/scan/metadata/restrict.py
900 @@ -21,7 +21,7 @@ class RestrictChecks(ScanBase):
901
902 def check(self, **kwargs):
903 xpkg = kwargs.get('xpkg')
904 - ebuild = kwargs.get('ebuild').result()
905 + ebuild = kwargs.get('ebuild').get()
906 y_ebuild = kwargs.get('y_ebuild')
907 myrestrict = None
908
909
910 diff --git a/pym/repoman/modules/scan/metadata/unused.py b/pym/repoman/modules/scan/metadata/unused.py
911 index fdca418..7733847 100644
912 --- a/pym/repoman/modules/scan/metadata/unused.py
913 +++ b/pym/repoman/modules/scan/metadata/unused.py
914 @@ -1,8 +1,6 @@
915
916 from repoman.modules.scan.scanbase import ScanBase
917
918 -from portage.util.futures import InvalidStateError
919 -
920
921 class UnusedCheck(ScanBase):
922 '''Checks and reports any un-used metadata.xml use flag descriptions'''
923 @@ -23,9 +21,9 @@ class UnusedCheck(ScanBase):
924 @param validity_future: Future instance
925 '''
926 xpkg = kwargs.get('xpkg')
927 - muselist = self.get_result(kwargs.get('muselist'), set())
928 + muselist = kwargs.get('muselist').get()
929 used_useflags = kwargs.get('used_useflags')
930 - valid_state = self.get_result(kwargs['validity_future'], True)
931 + valid_state = kwargs.get('validity_future').get()
932 # check if there are unused local USE-descriptions in metadata.xml
933 # (unless there are any invalids, to avoid noise)
934 if valid_state:
935
936 diff --git a/pym/repoman/modules/scan/mirrors/__init__.py b/pym/repoman/modules/scan/mirrors/__init__.py
937 index 1885dca..94ded6d 100644
938 --- a/pym/repoman/modules/scan/mirrors/__init__.py
939 +++ b/pym/repoman/modules/scan/mirrors/__init__.py
940 @@ -20,7 +20,9 @@ module_spec = {
941 },
942 'mod_kwargs': ['repo_settings', 'qatracker',
943 ],
944 - 'func_kwargs': {'ebuild': None, 'src_uri_error': None,
945 + 'func_kwargs': {
946 + 'ebuild': (None, None),
947 + 'src_uri_error': (None, None),
948 },
949 },
950 }
951
952 diff --git a/pym/repoman/modules/scan/mirrors/thirdpartymirrors.py b/pym/repoman/modules/scan/mirrors/thirdpartymirrors.py
953 index 8e3d250..9118d59 100644
954 --- a/pym/repoman/modules/scan/mirrors/thirdpartymirrors.py
955 +++ b/pym/repoman/modules/scan/mirrors/thirdpartymirrors.py
956 @@ -33,8 +33,9 @@ class ThirdPartyMirrors(ScanBase):
957 @param src_uri_error: boolean
958 @returns: dictionary
959 '''
960 - ebuild = kwargs.get('ebuild').result()
961 - if self.get_result(kwargs.get('src_uri_error'), False):
962 + ebuild = kwargs.get('ebuild').get()
963 + src_uri_error = kwargs.get('src_uri_error').get()
964 + if src_uri_error:
965 return True
966 for uri in portage.dep.use_reduce(
967 ebuild.metadata["SRC_URI"], matchall=True, is_src_uri=True,
968
969 diff --git a/pym/repoman/modules/scan/scanbase.py b/pym/repoman/modules/scan/scanbase.py
970 index 740092e..e5160d2 100644
971 --- a/pym/repoman/modules/scan/scanbase.py
972 +++ b/pym/repoman/modules/scan/scanbase.py
973 @@ -1,7 +1,5 @@
974 # -*- coding:utf-8 -*-
975
976 -from portage.util.futures import InvalidStateError
977 -
978
979 class ScanBase(object):
980 '''Skeleton class for performing a scan for one or more items
981 @@ -35,40 +33,6 @@ class ScanBase(object):
982 return False # used as a continue True/False value
983 """
984
985 - @staticmethod
986 - def set_result_pass(items):
987 - '''Set Future instance results, pass on InvalidStateError
988 -
989 - @param items: iterable of key, value tuples
990 - '''
991 - for key, value in items:
992 - try:
993 - key.set_result(value)
994 - except InvalidStateError:
995 - pass
996 -
997 - @staticmethod
998 - def set_result_raise(items):
999 - '''Set Future instance results, raises an exception on InvalidStateError
1000 -
1001 - @param items: iterable of key, value tuples
1002 - '''
1003 - for key, value in items:
1004 - key.set_result(value)
1005 -
1006 - def get_result(self, future, unset_value=None):
1007 - '''Returns a Future result, or the unset value passed in
1008 -
1009 - @param future: The Future instance being queried
1010 - @param unset_value:
1011 - @returns: Future result
1012 - '''
1013 - try:
1014 - result = future.result()
1015 - except InvalidStateError:
1016 - result = unset_value
1017 - return result
1018 -
1019 @property
1020 def runInPkgs(self):
1021 '''Package level scans'''
1022
1023 diff --git a/pym/repoman/modules/scan/status/__init__.py b/pym/repoman/modules/scan/status/__init__.py
1024 index f4683bb..5f30639 100644
1025 --- a/pym/repoman/modules/scan/status/__init__.py
1026 +++ b/pym/repoman/modules/scan/status/__init__.py
1027 @@ -20,8 +20,11 @@ module_spec = {
1028 },
1029 'mod_kwargs': ['vcs_settings', 'checks',
1030 ],
1031 - 'func_kwargs': {'checkdir': None, 'checkdir_relative': None,
1032 - 'xpkg': None, 'eadded': 'Future',
1033 + 'func_kwargs': {
1034 + 'checkdir': (None, None),
1035 + 'checkdir_relative': (None, None),
1036 + 'eadded': ('Future', 'UNSET'),
1037 + 'xpkg': (None, None),
1038 },
1039 },
1040 }
1041
1042 diff --git a/pym/repoman/modules/scan/status/vcsstatus.py b/pym/repoman/modules/scan/status/vcsstatus.py
1043 index cadc5c0..fd56560 100644
1044 --- a/pym/repoman/modules/scan/status/vcsstatus.py
1045 +++ b/pym/repoman/modules/scan/status/vcsstatus.py
1046 @@ -32,9 +32,8 @@ class VCSStatus(ScanBase):
1047 if self.check_not_added:
1048 self.vcs_settings.status.check(checkdir, checkdir_relative, xpkg)
1049 # update the dynamic data
1050 - self.set_result_pass([
1051 - (kwargs.get('eadded'), self.vcs_settings.status.eadded),
1052 - ])
1053 + dyn_eadded = kwargs.get('eadded')
1054 + dyn_eadded.set(self.vcs_settings.status.eadded)
1055 return False
1056
1057 @property
1058
1059 diff --git a/pym/repoman/modules/scan/use/__init__.py b/pym/repoman/modules/scan/use/__init__.py
1060 index f157386..32da5d9 100644
1061 --- a/pym/repoman/modules/scan/use/__init__.py
1062 +++ b/pym/repoman/modules/scan/use/__init__.py
1063 @@ -20,9 +20,13 @@ module_spec = {
1064 },
1065 'mod_kwargs': ['qatracker', 'uselist',
1066 ],
1067 - 'func_kwargs': {'pkg': None, 'xpkg': None, 'ebuild': None,
1068 - 'y_ebuild': None, 'muselist': None, 'ebuild_UsedUseFlags': 'set',
1069 - 'used_useflags': None,
1070 + 'func_kwargs': {
1071 + 'ebuild': (None, None),
1072 + 'muselist': (None, None),
1073 + 'pkg': (None, None),
1074 + 'used_useflags': (None, None),
1075 + 'xpkg': (None, None),
1076 + 'y_ebuild': (None, None),
1077 },
1078 },
1079 }
1080
1081 diff --git a/pym/repoman/modules/scan/use/use_flags.py b/pym/repoman/modules/scan/use/use_flags.py
1082 index b2b1cc0..ae8cd0d 100644
1083 --- a/pym/repoman/modules/scan/use/use_flags.py
1084 +++ b/pym/repoman/modules/scan/use/use_flags.py
1085 @@ -38,24 +38,20 @@ class USEFlagChecks(ScanBase):
1086 @param muselist: Local USE flags of the package
1087 @returns: dictionary, including {ebuild_UsedUseFlags, used_useflags}
1088 '''
1089 - pkg = kwargs.get('pkg').result()
1090 + pkg = kwargs.get('pkg').get()
1091 package = kwargs.get('xpkg')
1092 - ebuild = kwargs.get('ebuild').result()
1093 + ebuild = kwargs.get('ebuild').get()
1094 y_ebuild = kwargs.get('y_ebuild')
1095 - localUseFlags = self.get_result(kwargs.get('muselist'), set())
1096 - dyn_ebuild_used = kwargs.get('ebuild_UsedUseFlags')
1097 + localUseFlags = kwargs.get('muselist').get()
1098 dyn_used = kwargs.get('used_useflags')
1099 # reset state variables for the run
1100 self.useFlags = []
1101 self.defaultUseFlags = []
1102 self.usedUseFlags = set()
1103 - dyn_ebuild_used.clear()
1104 # perform the checks
1105 self._checkGlobal(pkg)
1106 self._checkMetadata(package, ebuild, y_ebuild, localUseFlags)
1107 self._checkRequiredUSE(pkg, ebuild)
1108 - # update the dynamic data
1109 - dyn_ebuild_used.union(self.usedUseFlags)
1110 dyn_used.update(self.usedUseFlags)
1111 return False
1112
1113
1114 diff --git a/pym/repoman/scanner.py b/pym/repoman/scanner.py
1115 index b3eeafd..c9b76a4 100644
1116 --- a/pym/repoman/scanner.py
1117 +++ b/pym/repoman/scanner.py
1118 @@ -9,7 +9,7 @@ import portage
1119 from portage import normalize_path
1120 from portage import os
1121 from portage.output import green
1122 -from portage.util.futures.futures import Future
1123 +from portage.util.futures.extendedfutures import ExtendedFuture
1124 from repoman.modules.commit import repochecks
1125 from repoman.profile import check_profiles, dev_profile_keywords, setup_profile
1126 from repoman.repos import repo_metadata
1127 @@ -28,7 +28,7 @@ MODULE_NAMES = MODULE_CONTROLLER.module_names[:]
1128 # initial development debug info
1129 logging.debug("module_names: %s", MODULE_NAMES)
1130
1131 -DATA_TYPES = {'dict': dict, 'Future': Future, 'list': list, 'set': set}
1132 +DATA_TYPES = {'dict': dict, 'Future': ExtendedFuture, 'list': list, 'set': set}
1133
1134
1135 class Scanner(object):
1136 @@ -203,6 +203,8 @@ class Scanner(object):
1137 }
1138 # initialize the plugin checks here
1139 self.modules = {}
1140 + self.ext_futures = {}
1141 + self.pkg_level_futures = None
1142
1143 def set_kwargs(self, mod):
1144 '''Creates a limited set of kwargs to pass to the module's __init__()
1145 @@ -215,8 +217,7 @@ class Scanner(object):
1146 kwargs[key] = self.kwargs[key]
1147 return kwargs
1148
1149 - @staticmethod
1150 - def set_func_kwargs(mod, dynamic_data=None):
1151 + def set_func_kwargs(self, mod, dynamic_data=None):
1152 '''Updates the dynamic_data dictionary with any new key, value pairs.
1153 Creates a limited set of kwargs to pass to the modulefunctions to run
1154
1155 @@ -233,17 +234,49 @@ class Scanner(object):
1156 for key in new:
1157 logging.debug("set_func_kwargs(); adding: %s, %s",
1158 key, func_kwargs[key])
1159 - dynamic_data[key] = DATA_TYPES[func_kwargs[key]]()
1160 + logging.debug("set_func_kwargs(); adding: %s, %s",
1161 + key, func_kwargs[key])
1162 + if func_kwargs[key][0] in ['Future', 'ExtendedFuture']:
1163 + if key not in self.ext_futures:
1164 + logging.debug(
1165 + "Adding a new key: %s to the ExtendedFuture dict", key)
1166 + self.ext_futures[key] = func_kwargs[key]
1167 + self._set_future(dynamic_data, key, func_kwargs[key])
1168 + else: # builtin python data type
1169 + dynamic_data[key] = DATA_TYPES[func_kwargs[key][0]]()
1170 kwargs = {}
1171 for key in required:
1172 kwargs[key] = dynamic_data[key]
1173 return kwargs
1174
1175 def reset_futures(self, dynamic_data):
1176 - for key in list(dynamic_data):
1177 - #if key in ['ebuild', 'pkg']: # and isinstance(dynamic_data[key], Future):
1178 - if isinstance(dynamic_data[key], Future) and key not in ['muselist']:
1179 - dynamic_data[key] = Future()
1180 + '''Reset any Future data types
1181 +
1182 + @param dynamic_data: dictionary
1183 + '''
1184 + for key in list(self.ext_futures):
1185 + if key not in self.pkg_level_futures:
1186 + self._set_future(dynamic_data, key, self.ext_futures[key])
1187 +
1188 + @staticmethod
1189 + def _set_future(dynamic_data, key, data):
1190 + '''Set a dynamic_data key to a new ExtendedFuture instance
1191 +
1192 + @param dynamic_data: dictionary
1193 + @param key: tuple of (dictionary-key, default-value)
1194 + '''
1195 + #print("***", key, data)
1196 + if data[0] in ['Future', 'ExtendedFuture']:
1197 + if data[1] in ['UNSET']:
1198 + #print("adding unset default")
1199 + dynamic_data[key] = ExtendedFuture()
1200 + else:
1201 + if data[1] in DATA_TYPES:
1202 + default = DATA_TYPES[data[1]]()
1203 + else:
1204 + default = data[1]
1205 + #print("adding default:", default)
1206 + dynamic_data[key] = ExtendedFuture(default)
1207
1208 def scan_pkgs(self, can_force):
1209 for xpkg in self.effective_scanlist:
1210 @@ -264,7 +297,7 @@ class Scanner(object):
1211 checkdirlist = os.listdir(checkdir)
1212
1213 dynamic_data = {
1214 - 'checkdirlist': checkdirlist,
1215 + 'checkdirlist': ExtendedFuture(checkdirlist),
1216 'checkdir': checkdir,
1217 'xpkg': xpkg,
1218 'changed': self.changed,
1219 @@ -273,12 +306,21 @@ class Scanner(object):
1220 'repolevel': self.repolevel,
1221 'catdir': catdir,
1222 'pkgdir': pkgdir,
1223 - 'validity_future': Future(),
1224 + 'pkgs': ExtendedFuture({}),
1225 + 'validity_future': ExtendedFuture(True),
1226 'y_ebuild': None,
1227 # this needs to be reset at the pkg level only,
1228 # easiest is to just initialize it here
1229 - 'muselist': Future(),
1230 + 'muselist': ExtendedFuture(set()),
1231 + 'src_uri_error': ExtendedFuture(),
1232 }
1233 + self.pkg_level_futures = [
1234 + 'checkdirlist',
1235 + 'muselist',
1236 + 'pkgs',
1237 + 'src_uri_error',
1238 + 'validity_future',
1239 + ]
1240 # need to set it up for ==> self.modules or some other ordered list
1241 for mod in [('manifests', 'Manifests'), ('isebuild', 'IsEbuild'),
1242 ('keywords', 'KeywordChecks'), ('files', 'FileChecks'),
1243 @@ -306,7 +348,7 @@ class Scanner(object):
1244 continue
1245
1246 # Sort ebuilds in ascending order for the KEYWORDS.dropped check.
1247 - self.pkgs = dynamic_data['pkgs']
1248 + self.pkgs = dynamic_data['pkgs'].get()
1249 ebuildlist = sorted(self.pkgs.values())
1250 ebuildlist = [pkg.pf for pkg in ebuildlist]