commit:     d0454110c604d328777f3391854299a449e66f89
Author:     Brian Dolbec <dolsen <AT> gentoo <DOT> org>
AuthorDate: Mon Apr 25 01:15:36 2016 +0000
Commit:     Brian Dolbec <dolsen <AT> gentoo <DOT> org>
CommitDate: Mon Apr 25 03:05:50 2016 +0000
URL:        https://gitweb.gentoo.org/proj/portage.git/commit/?id=d0454110

repoman: Convert all pointer type dynamic_data to the new ExtendedFuture class

 pym/repoman/main.py                                | 13 ++---
 pym/repoman/modules/scan/arches/__init__.py        |  4 +-
 pym/repoman/modules/scan/arches/arches.py          |  5 +-
 pym/repoman/modules/scan/depend/__init__.py        | 22 +++++--
 pym/repoman/modules/scan/depend/depend.py          | 15 +++--
 pym/repoman/modules/scan/depend/profile.py         | 10 ++--
 pym/repoman/modules/scan/depend/unknown.py         |  6 +-
 pym/repoman/modules/scan/directories/__init__.py   | 12 +++-
 pym/repoman/modules/scan/directories/files.py      |  2 +-
 pym/repoman/modules/scan/directories/mtime.py      |  4 +-
 pym/repoman/modules/scan/eapi/__init__.py          |  3 +-
 pym/repoman/modules/scan/eapi/eapi.py              |  2 +-
 pym/repoman/modules/scan/ebuild/__init__.py        | 29 ++++++---
 pym/repoman/modules/scan/ebuild/ebuild.py          | 18 +++---
 pym/repoman/modules/scan/ebuild/isebuild.py        | 17 ++----
 pym/repoman/modules/scan/ebuild/multicheck.py      |  4 +-
 pym/repoman/modules/scan/eclasses/__init__.py      | 12 +++-
 pym/repoman/modules/scan/eclasses/live.py          | 11 ++--
 pym/repoman/modules/scan/eclasses/ruby.py          |  4 +-
 pym/repoman/modules/scan/fetch/__init__.py         |  9 ++-
 pym/repoman/modules/scan/fetch/fetches.py          |  3 +-
 pym/repoman/modules/scan/keywords/__init__.py      |  9 ++-
 pym/repoman/modules/scan/keywords/keywords.py      |  6 +-
 pym/repoman/modules/scan/manifest/__init__.py      |  4 +-
 pym/repoman/modules/scan/metadata/__init__.py      | 39 +++++++++----
 pym/repoman/modules/scan/metadata/description.py   |  4 +-
 .../modules/scan/metadata/ebuild_metadata.py       | 11 ++--
 pym/repoman/modules/scan/metadata/license.py       |  4 +-
 pym/repoman/modules/scan/metadata/pkgmetadata.py   | 12 ++--
 pym/repoman/modules/scan/metadata/restrict.py      |  2 +-
 pym/repoman/modules/scan/metadata/unused.py        |  6 +-
 pym/repoman/modules/scan/mirrors/__init__.py       |  4 +-
 .../modules/scan/mirrors/thirdpartymirrors.py      |  5 +-
 pym/repoman/modules/scan/scanbase.py               | 36 ------------
 pym/repoman/modules/scan/status/__init__.py        |  7 ++-
 pym/repoman/modules/scan/status/vcsstatus.py       |  5 +-
 pym/repoman/modules/scan/use/__init__.py           | 10 +++-
 pym/repoman/modules/scan/use/use_flags.py          | 10 +---
 pym/repoman/scanner.py                             | 68 +++++++++++++++++-----
 39 files changed, 255 insertions(+), 192 deletions(-)

diff --git a/pym/repoman/main.py b/pym/repoman/main.py
index 62c3c2c..2009a44 100755
--- a/pym/repoman/main.py
+++ b/pym/repoman/main.py
@@ -22,8 +22,8 @@ import portage.repository.config
 from portage.output import create_color_func, nocolor
 from portage.output import ConsoleStyleFile, StyleWriter
 from portage.util import formatter
-from portage.util.futures import (
-       Future,
+from portage.util.futures.extendedfutures import (
+       ExtendedFuture,
        InvalidStateError,
 )
 
@@ -79,7 +79,7 @@ def repoman_main(argv):
        # Set this to False when an extraordinary issue (generally
        # something other than a QA issue) makes it impossible to
        # commit (like if Manifest generation fails).
-       can_force = Future()
+       can_force = ExtendedFuture(True)
 
        portdir, portdir_overlay, mydir = 
utilities.FindPortdir(repoman_settings)
        if portdir is None:
@@ -174,14 +174,9 @@ def repoman_main(argv):
        qa_output = qa_output.getvalue()
        qa_output = qa_output.splitlines(True)
 
-       try:
-               can_force = can_force.result()
-       except InvalidStateError:
-               can_force = True
-
        # output the results
        actions = Actions(repo_settings, options, scanner, vcs_settings)
-       if actions.inform(can_force, result):
+       if actions.inform(can_force.get(), result):
                # perform any other actions
                actions.perform(qa_output)
 

diff --git a/pym/repoman/modules/scan/arches/__init__.py 
b/pym/repoman/modules/scan/arches/__init__.py
index e4a4806..d66be1e 100644
--- a/pym/repoman/modules/scan/arches/__init__.py
+++ b/pym/repoman/modules/scan/arches/__init__.py
@@ -20,7 +20,9 @@ module_spec = {
                        },
                        'mod_kwargs': ['options', 'repo_settings', 'profiles'
                        ],
-                       'func_kwargs': {'ebuild': None, 'arches': 'set',
+                       'func_kwargs': {
+                               'arches': ('Future', 'set'),
+                               'ebuild': (None, None),
                        },
                },
        }

diff --git a/pym/repoman/modules/scan/arches/arches.py 
b/pym/repoman/modules/scan/arches/arches.py
index 6e1c17d..b86848d 100644
--- a/pym/repoman/modules/scan/arches/arches.py
+++ b/pym/repoman/modules/scan/arches/arches.py
@@ -23,7 +23,7 @@ class ArchChecks(ScanBase):
                @param ebuild: Ebuild which we check (object).
                @returns: dictionary, including arches set
                '''
-               ebuild = kwargs.get('ebuild').result()
+               ebuild = kwargs.get('ebuild').get()
                if self.options.ignore_arches:
                        arches = [[
                                self.repo_settings.repoman_settings["ARCH"], 
self.repo_settings.repoman_settings["ARCH"],
@@ -69,8 +69,7 @@ class ArchChecks(ScanBase):
                                arches.add(('**', '**', ('**',)))
                # update the dynamic data
                dyn_arches = kwargs.get('arches')
-               dyn_arches.clear()
-               dyn_arches.update(arches)
+               dyn_arches.set(arches)
                return False
 
        @property

diff --git a/pym/repoman/modules/scan/depend/__init__.py 
b/pym/repoman/modules/scan/depend/__init__.py
index cf5b415..27c803d 100644
--- a/pym/repoman/modules/scan/depend/__init__.py
+++ b/pym/repoman/modules/scan/depend/__init__.py
@@ -20,8 +20,12 @@ module_spec = {
                        },
                        'mod_kwargs': ['qatracker', 'portdb'
                        ],
-                       'func_kwargs': {'ebuild': None, 'pkg': None, 
'unknown_pkgs': 'set',
-                               'badlicsyntax': 'Future', 'baddepsyntax': 
'Future',
+                       'func_kwargs': {
+                               'baddepsyntax': ('Future', False),
+                               'badlicsyntax': ('Future', False),
+                               'ebuild': (None, None),
+                               'pkg': (None, None),
+                               'unknown_pkgs': ('Future', 'UNSET'),
                        },
                },
                'profile-module': {
@@ -36,8 +40,12 @@ module_spec = {
                                'repo_settings', 'include_arches', 'caches',
                                'repoman_incrementals', 'env', 'have', 
'dev_keywords'
                        ],
-                       'func_kwargs': {'arches': None, 'ebuild': None, 'pkg': 
None,
-                               'unknown_pkgs': None, 'baddepsyntax': None,
+                       'func_kwargs': {
+                               'arches': (None, None),
+                               'baddepsyntax': (None, None),
+                               'ebuild': (None, None),
+                               'pkg': (None, None),
+                               'unknown_pkgs': (None, None),
                        },
                },
                'unknown-module': {
@@ -50,8 +58,10 @@ module_spec = {
                        },
                        'mod_kwargs': ['qatracker',
                        ],
-                       'func_kwargs': {'ebuild': None, 'unknown_pkgs': 'set',
-                               'baddepsyntax': None,
+                       'func_kwargs': {
+                               'baddepsyntax': (None, None),
+                               'ebuild': (None, None),
+                               'unknown_pkgs': ('Future', 'UNSET'),
                        },
                },
        }

diff --git a/pym/repoman/modules/scan/depend/depend.py 
b/pym/repoman/modules/scan/depend/depend.py
index cd1fb33..44a21e9 100644
--- a/pym/repoman/modules/scan/depend/depend.py
+++ b/pym/repoman/modules/scan/depend/depend.py
@@ -28,8 +28,8 @@ class DependChecks(ScanBase):
                @param ebuild: Ebuild which we check (object).
                @returns: boolean
                '''
-               ebuild = kwargs.get('ebuild').result()
-               pkg = kwargs.get('pkg').result()
+               ebuild = kwargs.get('ebuild').get()
+               pkg = kwargs.get('pkg').get()
 
                unknown_pkgs = set()
 
@@ -145,12 +145,11 @@ class DependChecks(ScanBase):
 
                # update the dynamic data
                dyn_unknown = kwargs.get('unknown_pkgs')
-               dyn_unknown.clear()
-               dyn_unknown.update(unknown_pkgs)
-               self.set_result_pass([
-                       (kwargs.get('badlicsyntax'), badlicsyntax),
-                       (kwargs.get('baddepsyntax'), baddepsyntax),
-                       ])
+               dyn_unknown.set(unknown_pkgs)
+               dyn_badlicsyntax = kwargs.get('badlicsyntax')
+               dyn_badlicsyntax.set(badlicsyntax, ignore_InvalidState=True)
+               dyn_baddepsyntax = kwargs.get('baddepsyntax')
+               dyn_baddepsyntax.set(baddepsyntax, ignore_InvalidState=True)
                return False
 
        @property

diff --git a/pym/repoman/modules/scan/depend/profile.py 
b/pym/repoman/modules/scan/depend/profile.py
index b4ec8ca..8fc7721 100644
--- a/pym/repoman/modules/scan/depend/profile.py
+++ b/pym/repoman/modules/scan/depend/profile.py
@@ -56,11 +56,11 @@ class ProfileDependsChecks(ScanBase):
                @param unknown_pkgs: set of tuples (type, atom.unevaluated_atom)
                @returns: dictionary
                '''
-               arches = kwargs.get('arches')
-               ebuild = kwargs.get('ebuild').result()
-               pkg = kwargs.get('pkg').result()
-               baddepsyntax = self.get_result(kwargs.get('baddepsyntax'), 
False)
-               unknown_pkgs = kwargs.get('unknown_pkgs')
+               arches = kwargs.get('arches').get()
+               ebuild = kwargs.get('ebuild').get()
+               pkg = kwargs.get('pkg').get()
+               baddepsyntax = kwargs.get('baddepsyntax').get()
+               unknown_pkgs = kwargs.get('unknown_pkgs').get()
 
                relevant_profiles = []
                for keyword, arch, groups in arches:

diff --git a/pym/repoman/modules/scan/depend/unknown.py 
b/pym/repoman/modules/scan/depend/unknown.py
index 9e8f7f8..6667d4f 100644
--- a/pym/repoman/modules/scan/depend/unknown.py
+++ b/pym/repoman/modules/scan/depend/unknown.py
@@ -21,9 +21,9 @@ class DependUnknown(ScanBase):
                @param unknown_pkgs: set of tuples (type, atom.unevaluated_atom)
                @returns: dictionary
                '''
-               ebuild = kwargs.get('ebuild').result()
-               baddepsyntax = self.get_result(kwargs.get('baddepsyntax'), 
False)
-               unknown_pkgs = kwargs.get('unknown_pkgs')
+               ebuild = kwargs.get('ebuild').get()
+               baddepsyntax = kwargs.get('baddepsyntax').get()
+               unknown_pkgs = kwargs.get('unknown_pkgs').get()
 
                if not baddepsyntax and unknown_pkgs:
                        type_map = {}

diff --git a/pym/repoman/modules/scan/directories/__init__.py 
b/pym/repoman/modules/scan/directories/__init__.py
index 0193843..47834cb 100644
--- a/pym/repoman/modules/scan/directories/__init__.py
+++ b/pym/repoman/modules/scan/directories/__init__.py
@@ -20,8 +20,11 @@ module_spec = {
                        },
                        'mod_kwargs': ['portdb', 'qatracker', 'repo_settings', 
'vcs_settings',
                        ],
-                       'func_kwargs': {'checkdir': None, 'checkdirlist': None,
-                               'checkdir_relative': None, 'changed': None,
+                       'func_kwargs': {
+                               'changed': (None, None),
+                               'checkdir': (None, None),
+                               'checkdirlist': (None, None),
+                               'checkdir_relative': (None, None),
                        },
                },
                'mtime-module': {
@@ -34,7 +37,10 @@ module_spec = {
                        },
                        'mod_kwargs': ['vcs_settings',
                        ],
-                       'func_kwargs': {'ebuild': None, 'changed': None, 'pkg': 
None,
+                       'func_kwargs': {
+                               'changed': (None, None),
+                               'ebuild': (None, None),
+                               'pkg': (None, None),
                        },
                },
        }

diff --git a/pym/repoman/modules/scan/directories/files.py 
b/pym/repoman/modules/scan/directories/files.py
index 94a0791..2aed264 100644
--- a/pym/repoman/modules/scan/directories/files.py
+++ b/pym/repoman/modules/scan/directories/files.py
@@ -39,7 +39,7 @@ class FileChecks(ScanBase):
                @returns: dictionary
                '''
                checkdir = kwargs.get('checkdir')
-               checkdirlist = kwargs.get('checkdirlist')
+               checkdirlist = kwargs.get('checkdirlist').get()
                checkdir_relative = kwargs.get('checkdir_relative')
                changed = kwargs.get('changed').changed
                new = kwargs.get('changed').new

diff --git a/pym/repoman/modules/scan/directories/mtime.py 
b/pym/repoman/modules/scan/directories/mtime.py
index 6c667df..134a86b 100644
--- a/pym/repoman/modules/scan/directories/mtime.py
+++ b/pym/repoman/modules/scan/directories/mtime.py
@@ -15,9 +15,9 @@ class MtimeChecks(ScanBase):
                @param changed: dictionary instance
                @returns: dictionary
                '''
-               ebuild = kwargs.get('ebuild').result()
+               ebuild = kwargs.get('ebuild').get()
                changed = kwargs.get('changed')
-               pkg = kwargs.get('pkg').result()
+               pkg = kwargs.get('pkg').get()
                if not self.vcs_settings.vcs_preserves_mtime:
                        if ebuild.ebuild_path not in changed.new_ebuilds and \
                                        ebuild.ebuild_path not in 
changed.ebuilds:

diff --git a/pym/repoman/modules/scan/eapi/__init__.py 
b/pym/repoman/modules/scan/eapi/__init__.py
index 376e79a..4c3dd6e 100644
--- a/pym/repoman/modules/scan/eapi/__init__.py
+++ b/pym/repoman/modules/scan/eapi/__init__.py
@@ -20,7 +20,8 @@ module_spec = {
                        },
                        'mod_kwargs': ['qatracker', 'repo_settings'
                        ],
-                       'func_kwargs': {'ebuild': None,
+                       'func_kwargs': {
+                               'ebuild': (None, None),
                        },
                },
        }

diff --git a/pym/repoman/modules/scan/eapi/eapi.py 
b/pym/repoman/modules/scan/eapi/eapi.py
index 18bab3d..1d4ad5a 100644
--- a/pym/repoman/modules/scan/eapi/eapi.py
+++ b/pym/repoman/modules/scan/eapi/eapi.py
@@ -23,7 +23,7 @@ class EAPIChecks(ScanBase):
                @param ebuild: Ebuild which we check (object).
                @returns: dictionary
                '''
-               ebuild = kwargs.get('ebuild').result()
+               ebuild = kwargs.get('ebuild').get()
 
                if not self._checkBanned(ebuild):
                        self._checkDeprecated(ebuild)

diff --git a/pym/repoman/modules/scan/ebuild/__init__.py 
b/pym/repoman/modules/scan/ebuild/__init__.py
index efb2feb..b243314 100644
--- a/pym/repoman/modules/scan/ebuild/__init__.py
+++ b/pym/repoman/modules/scan/ebuild/__init__.py
@@ -20,8 +20,13 @@ module_spec = {
                        },
                        'mod_kwargs': ['portdb', 'qatracker', 'repo_settings'
                        ],
-                       'func_kwargs': {'checkdirlist': 'list', 'checkdir': 
None, 'xpkg': None,
-                               'validity_future': 'Future', 'can_force': None, 
'pkgs': 'dict',
+                       'func_kwargs': {
+                               'can_force': (None, None),
+                               'checkdir': (None, None),
+                               'checkdirlist': (None, None),
+                               'pkgs': ('Future', 'dict'),
+                               'validity_future': ('Future', True),
+                               'xpkg': (None, None),
                        },
                },
                'ebuild-module': {
@@ -34,10 +39,18 @@ module_spec = {
                        },
                        'mod_kwargs': ['qatracker', 'repo_settings', 
'vcs_settings', 'checks',
                        ],
-                       'func_kwargs': {'xpkg': None, 'y_ebuild': None, 
'changed': None,
-                               'changelog_modified': None, 'pkg': 'Future', 
'pkgs': None,
-                               'ebuild': 'Future', 'validity_future': None, 
'pkgdir': None,
-                               'repolevel': None, 'catdir': None,
+                       'func_kwargs': {
+                               'catdir': (None, None),
+                               'changed': (None, None),
+                               'changelog_modified': (None, None),
+                               'ebuild': ('Future', 'UNSET'),
+                               'pkg': ('Future', 'UNSET'),
+                               'pkgdir': (None, None),
+                               'pkgs': (None, None),
+                               'repolevel': (None, None),
+                               'validity_future': (None, None),
+                               'xpkg': (None, None),
+                               'y_ebuild': (None, None),
                        },
                },
                'multicheck-module': {
@@ -50,7 +63,9 @@ module_spec = {
                        },
                        'mod_kwargs': ['qatracker', 'options'
                        ],
-                       'func_kwargs': {'ebuild': None, 'pkg': None,
+                       'func_kwargs': {
+                               'ebuild': (None, None),
+                               'pkg': (None, None),
                        },
                },
        }

diff --git a/pym/repoman/modules/scan/ebuild/ebuild.py 
b/pym/repoman/modules/scan/ebuild/ebuild.py
index b02cdcd..92b1ea4 100644
--- a/pym/repoman/modules/scan/ebuild/ebuild.py
+++ b/pym/repoman/modules/scan/ebuild/ebuild.py
@@ -86,7 +86,8 @@ class Ebuild(ScanBase):
                        self.qatracker.add_error(
                                "ebuild.notadded", self.xpkg + "/" + 
self.y_ebuild + ".ebuild")
                # update the dynamic data
-               self.set_result_raise([(kwargs.get('ebuild'), self)])
+               dyn_ebuild = kwargs.get('ebuild')
+               dyn_ebuild.set(self)
                return False
 
        def set_pkg_data(self, **kwargs):
@@ -95,7 +96,8 @@ class Ebuild(ScanBase):
                @param pkgs: the dynamic list of ebuilds
                @returns: dictionary
                '''
-               self.pkg = kwargs.get('pkgs')[self.y_ebuild]
+               pkgs = kwargs.get('pkgs').get()
+               self.pkg = pkgs[self.y_ebuild]
                self.metadata = self.pkg._metadata
                self.eapi = self.metadata["EAPI"]
                self.inherited = self.pkg.inherited
@@ -133,21 +135,17 @@ class Ebuild(ScanBase):
                @returns: dictionary, including {pkg object}
                '''
                fuse = kwargs.get('validity_future')
+               dyn_pkg = kwargs.get('pkg')
                if self.pkg.invalid:
                        for k, msgs in self.pkg.invalid.items():
                                for msg in msgs:
                                        self.qatracker.add_error(k, "%s: %s" % 
(self.relative_path, msg))
                        # update the dynamic data
-                       self.set_result_pass([
-                               (fuse, False),])
-                       self.set_result_raise([
-                               (kwargs.get('pkg'), self.pkg),
-                               ])
+                       fuse.set(False, ignore_InvalidState=True)
+                       dyn_pkg.set(self.pkg)
                        return True
                # update the dynamic data
-               self.set_result_raise([
-                       (kwargs.get('pkg'), self.pkg),
-                       ])
+               dyn_pkg.set(self.pkg)
                return False
 
        @property

diff --git a/pym/repoman/modules/scan/ebuild/isebuild.py 
b/pym/repoman/modules/scan/ebuild/isebuild.py
index 24680e2..7277ad0 100644
--- a/pym/repoman/modules/scan/ebuild/isebuild.py
+++ b/pym/repoman/modules/scan/ebuild/isebuild.py
@@ -39,7 +39,7 @@ class IsEbuild(ScanBase):
                @param validity_future: Future instance
                @returns: dictionary, including {pkgs, can_force}
                '''
-               checkdirlist = kwargs.get('checkdirlist')
+               checkdirlist = kwargs.get('checkdirlist').get()
                checkdir = kwargs.get('checkdir')
                xpkg = kwargs.get('xpkg')
                fuse = kwargs.get('validity_future')
@@ -65,15 +65,15 @@ class IsEbuild(ScanBase):
                                try:
                                        myaux = dict(zip(allvars, 
self.portdb.aux_get(cpv, allvars)))
                                except KeyError:
-                                       self.set_result_pass([(fuse, False)])
+                                       fuse.set(False, 
ignore_InvalidState=True)
                                        
self.qatracker.add_error("ebuild.syntax", os.path.join(xpkg, y))
                                        continue
                                except IOError:
-                                       self.set_result_pass([(fuse, False)])
+                                       fuse.set(False, 
ignore_InvalidState=True)
                                        
self.qatracker.add_error("ebuild.output", os.path.join(xpkg, y))
                                        continue
                                if not portage.eapi_is_supported(myaux["EAPI"]):
-                                       self.set_result_pass([(fuse, False)])
+                                       fuse.set(False, 
ignore_InvalidState=True)
                                        
self.qatracker.add_error("EAPI.unsupported", os.path.join(xpkg, y))
                                        continue
                                pkgs[pf] = Package(
@@ -87,15 +87,10 @@ class IsEbuild(ScanBase):
                        # metadata leads to false positives for several checks, 
and false
                        # positives confuse users.
                        self.continue_ = True
-                       self.set_result_pass([(can_force, False)])
+                       can_force.set(False, ignore_InvalidState=True)
                # set our updated data
                dyn_pkgs = kwargs.get('pkgs')
-               # clear() sets it to None,
-               # we don't want to kill the pointer reference
-               # just set it back to an empty dict()
-               for key in list(dyn_pkgs):
-                       dyn_pkgs.pop(key)
-               dyn_pkgs.update(pkgs)
+               dyn_pkgs.set(pkgs)
                return self.continue_
 
        @property

diff --git a/pym/repoman/modules/scan/ebuild/multicheck.py 
b/pym/repoman/modules/scan/ebuild/multicheck.py
index ed7556d..9e36e2a 100644
--- a/pym/repoman/modules/scan/ebuild/multicheck.py
+++ b/pym/repoman/modules/scan/ebuild/multicheck.py
@@ -31,8 +31,8 @@ class MultiCheck(ScanBase):
                @param ebuild: Ebuild which we check (object).
                @returns: dictionary
                '''
-               ebuild = kwargs.get('ebuild').result()
-               pkg = kwargs.get('pkg').result()
+               ebuild = kwargs.get('ebuild').get()
+               pkg = kwargs.get('pkg').get()
                try:
                        # All ebuilds should have utf_8 encoding.
                        f = io.open(

diff --git a/pym/repoman/modules/scan/eclasses/__init__.py 
b/pym/repoman/modules/scan/eclasses/__init__.py
index 7be954c..63bb86f 100644
--- a/pym/repoman/modules/scan/eclasses/__init__.py
+++ b/pym/repoman/modules/scan/eclasses/__init__.py
@@ -20,8 +20,12 @@ module_spec = {
                        },
                        'mod_kwargs': ['qatracker', 'repo_metadata', 
'repo_settings',
                        ],
-                       'func_kwargs': {'live_ebuild': 'set', 'pkg': None, 
'xpkg': None,
-                               'ebuild': None, 'y_ebuild': None,
+                       'func_kwargs': {
+                               'ebuild': (None, None),
+                               'live_ebuild': ('Future', 'UNSET'),
+                               'pkg': (None, None),
+                               'xpkg': (None, None),
+                               'y_ebuild': (None, None),
                        },
                },
                'ruby-module': {
@@ -34,7 +38,9 @@ module_spec = {
                        },
                        'mod_kwargs': ['qatracker'
                        ],
-                       'func_kwargs': {'pkg': None, 'ebuild': None,
+                       'func_kwargs': {
+                               'ebuild': (None, None),
+                               'pkg': (None, None),
                        },
                },
        }

diff --git a/pym/repoman/modules/scan/eclasses/live.py 
b/pym/repoman/modules/scan/eclasses/live.py
index 85e829c..842cbab 100644
--- a/pym/repoman/modules/scan/eclasses/live.py
+++ b/pym/repoman/modules/scan/eclasses/live.py
@@ -25,11 +25,10 @@ class LiveEclassChecks(ScanBase):
 
                @returns: dictionary, including {live_ebuild}
                '''
-               ebuild = kwargs.get('ebuild').result()
+               ebuild = kwargs.get('ebuild').get()
                # update the dynamic data
                dyn_live = kwargs.get('live_ebuild')
-               #dyn_live.clear()
-               dyn_live.update(LIVE_ECLASSES.intersection(ebuild.inherited))
+               dyn_live.set(LIVE_ECLASSES.intersection(ebuild.inherited))
                return False
 
        def check(self, **kwargs):
@@ -46,12 +45,12 @@ class LiveEclassChecks(ScanBase):
                '''
                pkg = kwargs.get("pkg").result()
                package = kwargs.get('xpkg')
-               ebuild = kwargs.get('ebuild').result()
+               ebuild = kwargs.get('ebuild').get()
                y_ebuild = kwargs.get('y_ebuild')
                keywords = ebuild.keywords
+               live_ebuild = kwargs.get('live_ebuild').get()
 
-               if not (kwargs.get('live_ebuild') and
-                               self.repo_settings.repo_config.name == 
"gentoo"):
+               if not live_ebuild and self.repo_settings.repo_config.name == 
"gentoo":
                        return False
 
                is_stable = lambda kw: not kw.startswith("~") and not 
kw.startswith("-")

diff --git a/pym/repoman/modules/scan/eclasses/ruby.py 
b/pym/repoman/modules/scan/eclasses/ruby.py
index 92b9649..b350180 100644
--- a/pym/repoman/modules/scan/eclasses/ruby.py
+++ b/pym/repoman/modules/scan/eclasses/ruby.py
@@ -25,8 +25,8 @@ class RubyEclassChecks(ScanBase):
                @param ebuild: Ebuild which we check (object).
                @returns: dictionary
                '''
-               pkg = kwargs.get('pkg').result()
-               ebuild = kwargs.get('ebuild').result()
+               pkg = kwargs.get('pkg').get()
+               ebuild = kwargs.get('ebuild').get()
                is_inherited = lambda eclass: eclass in pkg.inherited
                is_old_ruby_eclass_inherited = filter(
                        is_inherited, self.old_ruby_eclasses)

diff --git a/pym/repoman/modules/scan/fetch/__init__.py 
b/pym/repoman/modules/scan/fetch/__init__.py
index 795eabf..1228435 100644
--- a/pym/repoman/modules/scan/fetch/__init__.py
+++ b/pym/repoman/modules/scan/fetch/__init__.py
@@ -20,9 +20,12 @@ module_spec = {
                        },
                        'mod_kwargs': ['portdb', 'qatracker', 'repo_settings', 
'vcs_settings',
                        ],
-                       'func_kwargs': {'xpkg': None, 'checkdir': None,
-                               'checkdir_relative': None, 'changed': None,
-                               'src_uri_error': 'Future',
+                       'func_kwargs': {
+                               'changed': (None, None),
+                               'checkdir': (None, None),
+                               'checkdir_relative': (None, None),
+                               'src_uri_error': ('Future', 'UNSET'),
+                               'xpkg': (None, None),
                        },
                },
        }

diff --git a/pym/repoman/modules/scan/fetch/fetches.py 
b/pym/repoman/modules/scan/fetch/fetches.py
index f6adece..ddbf6bd 100644
--- a/pym/repoman/modules/scan/fetch/fetches.py
+++ b/pym/repoman/modules/scan/fetch/fetches.py
@@ -131,7 +131,8 @@ class FetchChecks(ScanBase):
                                                "file.name",
                                                "%s/files/%s: char '%s'" % 
(checkdir, y, y[index]))
                # update the dynamic data
-               self.set_result_pass([(kwargs.get('src_uri_error'), 
self._src_uri_error)])
+               dyn_src_uri_error = kwargs.get('src_uri_error')
+               dyn_src_uri_error.set(self._src_uri_error)
                return False
 
        def digests(self, checkdir):

diff --git a/pym/repoman/modules/scan/keywords/__init__.py 
b/pym/repoman/modules/scan/keywords/__init__.py
index 2b3f6ca..1c424ca 100644
--- a/pym/repoman/modules/scan/keywords/__init__.py
+++ b/pym/repoman/modules/scan/keywords/__init__.py
@@ -20,8 +20,13 @@ module_spec = {
                        },
                        'mod_kwargs': ['qatracker', 'options', 'repo_metadata', 
'profiles',
                        ],
-                       'func_kwargs': {'pkg': 'Future', 'xpkg': None, 
'ebuild': 'Future',
-                               'y_ebuild': None, 'changed': None, 
'live_ebuild': 'set',
+                       'func_kwargs': {
+                               'changed': (None, None),
+                               'ebuild': ('Future', 'UNSET'),
+                               'live_ebuild': ('Future', 'UNSET'),
+                               'pkg': ('Future', 'UNSET'),
+                               'xpkg': None,
+                               'y_ebuild': (None, None),
                        },
                },
        }

diff --git a/pym/repoman/modules/scan/keywords/keywords.py 
b/pym/repoman/modules/scan/keywords/keywords.py
index ec48bb6..af94c6f 100644
--- a/pym/repoman/modules/scan/keywords/keywords.py
+++ b/pym/repoman/modules/scan/keywords/keywords.py
@@ -40,12 +40,12 @@ class KeywordChecks(ScanBase):
                @param live_ebuild: A boolean that determines if this is a live 
ebuild.
                @returns: dictionary
                '''
-               pkg = kwargs.get('pkg').result()
+               pkg = kwargs.get('pkg').get()
                xpkg =kwargs.get('xpkg')
-               ebuild = kwargs.get('ebuild').result()
+               ebuild = kwargs.get('ebuild').get()
                y_ebuild = kwargs.get('y_ebuild')
                changed = kwargs.get('changed')
-               live_ebuild = kwargs.get('live_ebuild')
+               live_ebuild = kwargs.get('live_ebuild').get()
                if not self.options.straight_to_stable:
                        self._checkAddedWithStableKeywords(
                                xpkg, ebuild, y_ebuild, ebuild.keywords, 
changed)

diff --git a/pym/repoman/modules/scan/manifest/__init__.py 
b/pym/repoman/modules/scan/manifest/__init__.py
index bd9f8da..dca431b 100644
--- a/pym/repoman/modules/scan/manifest/__init__.py
+++ b/pym/repoman/modules/scan/manifest/__init__.py
@@ -20,7 +20,9 @@ module_spec = {
                        },
                        'mod_kwargs': ['options', 'portdb', 'qatracker', 
'repo_settings',
                        ],
-                       'func_kwargs': {'checkdir': None, 'xpkg': None,
+                       'func_kwargs': {
+                               'checkdir': (None, None),
+                               'xpkg': (None, None),
                        },
                },
        }

diff --git a/pym/repoman/modules/scan/metadata/__init__.py 
b/pym/repoman/modules/scan/metadata/__init__.py
index 9ccf377..98df9cf 100644
--- a/pym/repoman/modules/scan/metadata/__init__.py
+++ b/pym/repoman/modules/scan/metadata/__init__.py
@@ -20,8 +20,12 @@ module_spec = {
                        },
                        'mod_kwargs': ['repo_settings', 'qatracker', 'options', 
'metadata_dtd',
                        ],
-                       'func_kwargs': {'xpkg': None, 'checkdir': None, 
'checkdirlist': None,
-                               'repolevel': None, 'muselist': 'Future',
+                       'func_kwargs': {
+                               'checkdir': (None, None),
+                               'checkdirlist': (None, None),
+                               'muselist': ('Future', 'set'),
+                               'repolevel': (None, None),
+                               'xpkg': (None, None),
                        },
                },
                'ebuild-metadata': {
@@ -34,8 +38,12 @@ module_spec = {
                        },
                        'mod_kwargs': ['qatracker',
                        ],
-                       'func_kwargs': {'ebuild': None, 'catdir': None, 
'live_ebuild': None,
-                               'xpkg': None, 'y_ebuild': None,
+                       'func_kwargs': {
+                               'catdir': (None, None),
+                               'ebuild': (None, None),
+                               'live_ebuild': (None, None),
+                               'xpkg': (None, None),
+                               'y_ebuild': (None, None),
                        },
                },
                'description-metadata': {
@@ -48,7 +56,9 @@ module_spec = {
                        },
                        'mod_kwargs': ['qatracker',
                        ],
-                       'func_kwargs': {'ebuild': None, 'pkg': 'Future',
+                       'func_kwargs': {
+                               'ebuild': (None, None),
+                               'pkg': ('Future', 'UNSET'),
                        },
                },
                'license-metadata': {
@@ -61,8 +71,11 @@ module_spec = {
                        },
                        'mod_kwargs': ['qatracker', 'repo_metadata',
                        ],
-                       'func_kwargs': {'xpkg': None, 'ebuild': None, 
'y_ebuild': None,
-                               'badlicsyntax': None,
+                       'func_kwargs': {
+                               'badlicsyntax': (None, None),
+                               'ebuild': (None, None),
+                               'xpkg': (None, None),
+                               'y_ebuild': (None, None),
                        },
                },
                'restrict-metadata': {
@@ -75,7 +88,10 @@ module_spec = {
                        },
                        'mod_kwargs': ['qatracker',
                        ],
-                       'func_kwargs': {'xpkg': None, 'ebuild': None, 
'y_ebuild': None,
+                       'func_kwargs': {
+                               'ebuild': (None, None),
+                               'xpkg': (None, None),
+                               'y_ebuild': (None, None),
                        },
                },
                'unused-metadata': {
@@ -88,8 +104,11 @@ module_spec = {
                        },
                        'mod_kwargs': ['qatracker',
                        ],
-                       'func_kwargs': {'xpkg': None, 'muselist': None, 
'used_useflags': None,
-                               'validity_future': None,
+                       'func_kwargs': {
+                               'muselist': (None, None),
+                               'used_useflags': (None, None),
+                               'validity_future': (None, None),
+                               'xpkg': (None, None),
                        },
                },
        }

diff --git a/pym/repoman/modules/scan/metadata/description.py 
b/pym/repoman/modules/scan/metadata/description.py
index 8bce8d8..79f62e1 100644
--- a/pym/repoman/modules/scan/metadata/description.py
+++ b/pym/repoman/modules/scan/metadata/description.py
@@ -21,8 +21,8 @@ class DescriptionChecks(ScanBase):
                @param pkg: Package in which we check (object).
                @param ebuild: Ebuild which we check (object).
                '''
-               ebuild = kwargs.get('ebuild').result()
-               pkg = kwargs.get('pkg').result()
+               ebuild = kwargs.get('ebuild').get()
+               pkg = kwargs.get('pkg').get()
                # 14 is the length of DESCRIPTION=""
                if len(pkg._metadata['DESCRIPTION']) > max_desc_len:
                        self.qatracker.add_error(

diff --git a/pym/repoman/modules/scan/metadata/ebuild_metadata.py 
b/pym/repoman/modules/scan/metadata/ebuild_metadata.py
index 38b13d5..e239b47 100644
--- a/pym/repoman/modules/scan/metadata/ebuild_metadata.py
+++ b/pym/repoman/modules/scan/metadata/ebuild_metadata.py
@@ -20,7 +20,7 @@ class EbuildMetadata(ScanBase):
                self.qatracker = kwargs.get('qatracker')
 
        def invalidchar(self, **kwargs):
-               ebuild = kwargs.get('ebuild').result()
+               ebuild = kwargs.get('ebuild').get()
                for k, v in ebuild.metadata.items():
                        if not isinstance(v, basestring):
                                continue
@@ -34,13 +34,14 @@ class EbuildMetadata(ScanBase):
                return False
 
        def missing(self, **kwargs):
-               ebuild = kwargs.get('ebuild').result()
+               ebuild = kwargs.get('ebuild').get()
+               live_ebuild = kwargs.get('live_ebuild').get()
                for pos, missing_var in enumerate(missingvars):
                        if not ebuild.metadata.get(missing_var):
                                if kwargs.get('catdir') == "virtual" and \
                                        missing_var in ("HOMEPAGE", "LICENSE"):
                                        continue
-                               if kwargs.get('live_ebuild') and missing_var == 
"KEYWORDS":
+                               if live_ebuild and missing_var == "KEYWORDS":
                                        continue
                                myqakey = missingvars[pos] + ".missing"
                                self.qatracker.add_error(myqakey, '%s/%s.ebuild'
@@ -48,13 +49,13 @@ class EbuildMetadata(ScanBase):
                return False
 
        def old_virtual(self, **kwargs):
-               ebuild = kwargs.get('ebuild').result()
+               ebuild = kwargs.get('ebuild').get()
                if ebuild.metadata.get("PROVIDE"):
                        self.qatracker.add_error("virtual.oldstyle", 
ebuild.relative_path)
                return False
 
        def virtual(self, **kwargs):
-               ebuild = kwargs.get('ebuild').result()
+               ebuild = kwargs.get('ebuild').get()
                if kwargs.get('catdir') == "virtual":
                        for var in ("HOMEPAGE", "LICENSE"):
                                if ebuild.metadata.get(var):

diff --git a/pym/repoman/modules/scan/metadata/license.py 
b/pym/repoman/modules/scan/metadata/license.py
index b08834a..4a67c70 100644
--- a/pym/repoman/modules/scan/metadata/license.py
+++ b/pym/repoman/modules/scan/metadata/license.py
@@ -26,9 +26,9 @@ class LicenseChecks(ScanBase):
                @param y_ebuild: Ebuild which we check (string).
                '''
                xpkg = kwargs.get('xpkg')
-               ebuild = kwargs.get('ebuild').result()
+               ebuild = kwargs.get('ebuild').get()
                y_ebuild = kwargs.get('y_ebuild')
-               if not self.get_result(kwargs.get('badlicsyntax'), False):
+               if not kwargs.get('badlicsyntax').get():
                        # Parse the LICENSE variable, remove USE conditions and 
flatten it.
                        licenses = portage.dep.use_reduce(
                                ebuild.metadata["LICENSE"], matchall=1, 
flat=True)

diff --git a/pym/repoman/modules/scan/metadata/pkgmetadata.py 
b/pym/repoman/modules/scan/metadata/pkgmetadata.py
index 242c923..9216d77 100644
--- a/pym/repoman/modules/scan/metadata/pkgmetadata.py
+++ b/pym/repoman/modules/scan/metadata/pkgmetadata.py
@@ -68,15 +68,14 @@ class PkgMetadata(ScanBase):
                '''
                xpkg = kwargs.get('xpkg')
                checkdir = kwargs.get('checkdir')
-               checkdirlist = kwargs.get('checkdirlist')
+               checkdirlist = kwargs.get('checkdirlist').get()
                repolevel = kwargs.get('repolevel')
 
                self.musedict = {}
                if self.options.mode in ['manifest']:
                        # update the dynamic data
-                       self.set_result_raise([
-                               (kwargs.get('muselist'), 
frozenset(self.musedict))
-                               ])
+                       dyn_muselist = kwargs.get('muselist')
+                       dyn_muselist.set(frozenset(self.musedict))
                        return False
 
                # metadata.xml file check
@@ -189,9 +188,8 @@ class PkgMetadata(ScanBase):
                                        
self.qatracker.add_error("metadata.bad", xpkg + "/metadata.xml")
                        del metadata_bad
                # update the dynamic data
-               self.set_result_raise([
-                       (kwargs.get('muselist'), frozenset(self.musedict))
-                       ])
+               dyn_muselist = kwargs.get('muselist')
+               dyn_muselist.set(frozenset(self.musedict))
                return False
 
        @property

diff --git a/pym/repoman/modules/scan/metadata/restrict.py 
b/pym/repoman/modules/scan/metadata/restrict.py
index 044cc2a..0f9c5e5 100644
--- a/pym/repoman/modules/scan/metadata/restrict.py
+++ b/pym/repoman/modules/scan/metadata/restrict.py
@@ -21,7 +21,7 @@ class RestrictChecks(ScanBase):
 
        def check(self, **kwargs):
                xpkg = kwargs.get('xpkg')
-               ebuild = kwargs.get('ebuild').result()
+               ebuild = kwargs.get('ebuild').get()
                y_ebuild = kwargs.get('y_ebuild')
                myrestrict = None
 

diff --git a/pym/repoman/modules/scan/metadata/unused.py 
b/pym/repoman/modules/scan/metadata/unused.py
index fdca418..7733847 100644
--- a/pym/repoman/modules/scan/metadata/unused.py
+++ b/pym/repoman/modules/scan/metadata/unused.py
@@ -1,8 +1,6 @@
 
 from repoman.modules.scan.scanbase import ScanBase
 
-from portage.util.futures import InvalidStateError
-
 
 class UnusedCheck(ScanBase):
        '''Checks and reports any un-used metadata.xml use flag descriptions'''
@@ -23,9 +21,9 @@ class UnusedCheck(ScanBase):
                @param validity_future: Future instance
                '''
                xpkg = kwargs.get('xpkg')
-               muselist = self.get_result(kwargs.get('muselist'), set())
+               muselist = kwargs.get('muselist').get()
                used_useflags = kwargs.get('used_useflags')
-               valid_state = self.get_result(kwargs['validity_future'], True)
+               valid_state = kwargs.get('validity_future').get()
                # check if there are unused local USE-descriptions in 
metadata.xml
                # (unless there are any invalids, to avoid noise)
                if valid_state:

diff --git a/pym/repoman/modules/scan/mirrors/__init__.py 
b/pym/repoman/modules/scan/mirrors/__init__.py
index 1885dca..94ded6d 100644
--- a/pym/repoman/modules/scan/mirrors/__init__.py
+++ b/pym/repoman/modules/scan/mirrors/__init__.py
@@ -20,7 +20,9 @@ module_spec = {
                        },
                        'mod_kwargs': ['repo_settings', 'qatracker',
                        ],
-                       'func_kwargs': {'ebuild': None, 'src_uri_error': None,
+                       'func_kwargs': {
+                               'ebuild': (None, None),
+                               'src_uri_error': (None, None),
                        },
                },
        }

diff --git a/pym/repoman/modules/scan/mirrors/thirdpartymirrors.py 
b/pym/repoman/modules/scan/mirrors/thirdpartymirrors.py
index 8e3d250..9118d59 100644
--- a/pym/repoman/modules/scan/mirrors/thirdpartymirrors.py
+++ b/pym/repoman/modules/scan/mirrors/thirdpartymirrors.py
@@ -33,8 +33,9 @@ class ThirdPartyMirrors(ScanBase):
                @param src_uri_error: boolean
                @returns: dictionary
                '''
-               ebuild = kwargs.get('ebuild').result()
-               if self.get_result(kwargs.get('src_uri_error'), False):
+               ebuild = kwargs.get('ebuild').get()
+               src_uri_error = kwargs.get('src_uri_error').get()
+               if src_uri_error:
                        return True
                for uri in portage.dep.use_reduce(
                        ebuild.metadata["SRC_URI"], matchall=True, 
is_src_uri=True,

diff --git a/pym/repoman/modules/scan/scanbase.py 
b/pym/repoman/modules/scan/scanbase.py
index 740092e..e5160d2 100644
--- a/pym/repoman/modules/scan/scanbase.py
+++ b/pym/repoman/modules/scan/scanbase.py
@@ -1,7 +1,5 @@
 # -*- coding:utf-8 -*-
 
-from portage.util.futures import InvalidStateError
-
 
 class ScanBase(object):
        '''Skeleton class for performing a scan for one or more items
@@ -35,40 +33,6 @@ class ScanBase(object):
                return False  # used as a continue True/False value
        """
 
-       @staticmethod
-       def set_result_pass(items):
-               '''Set Future instance results, pass on InvalidStateError
-
-               @param items: iterable of key, value tuples
-               '''
-               for key, value in items:
-                       try:
-                               key.set_result(value)
-                       except InvalidStateError:
-                               pass
-
-       @staticmethod
-       def set_result_raise(items):
-               '''Set Future instance results, raises an exception on 
InvalidStateError
-
-               @param items: iterable of key, value tuples
-               '''
-               for key, value in items:
-                       key.set_result(value)
-
-       def get_result(self, future, unset_value=None):
-               '''Returns a Future result, or the unset value passed in
-
-               @param future: The Future instance being queried
-               @param unset_value:
-               @returns: Future result
-               '''
-               try:
-                       result = future.result()
-               except InvalidStateError:
-                       result = unset_value
-               return result
-
        @property
        def runInPkgs(self):
                '''Package level scans'''

diff --git a/pym/repoman/modules/scan/status/__init__.py 
b/pym/repoman/modules/scan/status/__init__.py
index f4683bb..5f30639 100644
--- a/pym/repoman/modules/scan/status/__init__.py
+++ b/pym/repoman/modules/scan/status/__init__.py
@@ -20,8 +20,11 @@ module_spec = {
                        },
                        'mod_kwargs': ['vcs_settings', 'checks',
                        ],
-                       'func_kwargs': {'checkdir': None, 'checkdir_relative': 
None,
-                               'xpkg': None, 'eadded': 'Future',
+                       'func_kwargs': {
+                               'checkdir': (None, None),
+                               'checkdir_relative': (None, None),
+                               'eadded': ('Future', 'UNSET'),
+                               'xpkg': (None, None),
                        },
                },
        }

diff --git a/pym/repoman/modules/scan/status/vcsstatus.py 
b/pym/repoman/modules/scan/status/vcsstatus.py
index cadc5c0..fd56560 100644
--- a/pym/repoman/modules/scan/status/vcsstatus.py
+++ b/pym/repoman/modules/scan/status/vcsstatus.py
@@ -32,9 +32,8 @@ class VCSStatus(ScanBase):
                if self.check_not_added:
                        self.vcs_settings.status.check(checkdir, 
checkdir_relative, xpkg)
                # update the dynamic data
-               self.set_result_pass([
-                       (kwargs.get('eadded'), self.vcs_settings.status.eadded),
-                       ])
+               dyn_eadded = kwargs.get('eadded')
+               dyn_eadded.set(self.vcs_settings.status.eadded)
                return False
 
        @property

diff --git a/pym/repoman/modules/scan/use/__init__.py 
b/pym/repoman/modules/scan/use/__init__.py
index f157386..32da5d9 100644
--- a/pym/repoman/modules/scan/use/__init__.py
+++ b/pym/repoman/modules/scan/use/__init__.py
@@ -20,9 +20,13 @@ module_spec = {
                        },
                        'mod_kwargs': ['qatracker', 'uselist',
                        ],
-                       'func_kwargs': {'pkg': None, 'xpkg': None, 'ebuild': 
None,
-                               'y_ebuild': None, 'muselist': None, 
'ebuild_UsedUseFlags': 'set',
-                               'used_useflags': None,
+                       'func_kwargs': {
+                               'ebuild': (None, None),
+                               'muselist': (None, None),
+                               'pkg': (None, None),
+                               'used_useflags': (None, None),
+                               'xpkg': (None, None),
+                               'y_ebuild': (None, None),
                        },
                },
        }

diff --git a/pym/repoman/modules/scan/use/use_flags.py 
b/pym/repoman/modules/scan/use/use_flags.py
index b2b1cc0..ae8cd0d 100644
--- a/pym/repoman/modules/scan/use/use_flags.py
+++ b/pym/repoman/modules/scan/use/use_flags.py
@@ -38,24 +38,20 @@ class USEFlagChecks(ScanBase):
                @param muselist: Local USE flags of the package
                @returns: dictionary, including {ebuild_UsedUseFlags, 
used_useflags}
                '''
-               pkg = kwargs.get('pkg').result()
+               pkg = kwargs.get('pkg').get()
                package = kwargs.get('xpkg')
-               ebuild = kwargs.get('ebuild').result()
+               ebuild = kwargs.get('ebuild').get()
                y_ebuild = kwargs.get('y_ebuild')
-               localUseFlags = self.get_result(kwargs.get('muselist'), set())
-               dyn_ebuild_used = kwargs.get('ebuild_UsedUseFlags')
+               localUseFlags = kwargs.get('muselist').get()
                dyn_used = kwargs.get('used_useflags')
                # reset state variables for the run
                self.useFlags = []
                self.defaultUseFlags = []
                self.usedUseFlags = set()
-               dyn_ebuild_used.clear()
                # perform the checks
                self._checkGlobal(pkg)
                self._checkMetadata(package, ebuild, y_ebuild, localUseFlags)
                self._checkRequiredUSE(pkg, ebuild)
-               # update the dynamic data
-               dyn_ebuild_used.union(self.usedUseFlags)
                dyn_used.update(self.usedUseFlags)
                return False
 

diff --git a/pym/repoman/scanner.py b/pym/repoman/scanner.py
index b3eeafd..c9b76a4 100644
--- a/pym/repoman/scanner.py
+++ b/pym/repoman/scanner.py
@@ -9,7 +9,7 @@ import portage
 from portage import normalize_path
 from portage import os
 from portage.output import green
-from portage.util.futures.futures import Future
+from portage.util.futures.extendedfutures import ExtendedFuture
 from repoman.modules.commit import repochecks
 from repoman.profile import check_profiles, dev_profile_keywords, setup_profile
 from repoman.repos import repo_metadata
@@ -28,7 +28,7 @@ MODULE_NAMES = MODULE_CONTROLLER.module_names[:]
 # initial development debug info
 logging.debug("module_names: %s", MODULE_NAMES)
 
-DATA_TYPES = {'dict': dict, 'Future': Future, 'list': list, 'set': set}
+DATA_TYPES = {'dict': dict, 'Future': ExtendedFuture, 'list': list, 'set': set}
 
 
 class Scanner(object):
@@ -203,6 +203,8 @@ class Scanner(object):
                }
                # initialize the plugin checks here
                self.modules = {}
+               self.ext_futures = {}
+               self.pkg_level_futures = None
 
        def set_kwargs(self, mod):
                '''Creates a limited set of kwargs to pass to the module's 
__init__()
@@ -215,8 +217,7 @@ class Scanner(object):
                        kwargs[key] = self.kwargs[key]
                return kwargs
 
-       @staticmethod
-       def set_func_kwargs(mod, dynamic_data=None):
+       def set_func_kwargs(self, mod, dynamic_data=None):
                '''Updates the dynamic_data dictionary with any new key, value 
pairs.
                Creates a limited set of kwargs to pass to the modulefunctions 
to run
 
@@ -233,17 +234,49 @@ class Scanner(object):
                for key in new:
                        logging.debug("set_func_kwargs(); adding: %s, %s",
                                key, func_kwargs[key])
-                       dynamic_data[key] = DATA_TYPES[func_kwargs[key]]()
+                       logging.debug("set_func_kwargs(); adding: %s, %s",
+                               key, func_kwargs[key])
+                       if func_kwargs[key][0] in ['Future', 'ExtendedFuture']:
+                               if key not in self.ext_futures:
+                                       logging.debug(
+                                               "Adding a new key: %s to the 
ExtendedFuture dict", key)
+                                       self.ext_futures[key] = func_kwargs[key]
+                               self._set_future(dynamic_data, key, 
func_kwargs[key])
+                       else:  # builtin python data type
+                               dynamic_data[key] = 
DATA_TYPES[func_kwargs[key][0]]()
                kwargs = {}
                for key in required:
                        kwargs[key] = dynamic_data[key]
                return kwargs
 
        def reset_futures(self, dynamic_data):
-               for key in list(dynamic_data):
-                       #if key in ['ebuild', 'pkg']:  # and 
isinstance(dynamic_data[key], Future):
-                       if isinstance(dynamic_data[key], Future) and key not in 
['muselist']:
-                               dynamic_data[key] = Future()
+               '''Reset any Future data types
+
+               @param dynamic_data: dictionary
+               '''
+               for key in list(self.ext_futures):
+                       if key not in self.pkg_level_futures:
+                               self._set_future(dynamic_data, key, 
self.ext_futures[key])
+
+       @staticmethod
+       def _set_future(dynamic_data, key, data):
+               '''Set a dynamic_data key to a new ExtendedFuture instance
+
+               @param dynamic_data: dictionary
+               @param key: tuple of (dictionary-key, default-value)
+               '''
+               #print("***", key, data)
+               if data[0] in ['Future', 'ExtendedFuture']:
+                       if data[1] in ['UNSET']:
+                               #print("adding unset default")
+                               dynamic_data[key] = ExtendedFuture()
+                       else:
+                               if data[1] in DATA_TYPES:
+                                       default = DATA_TYPES[data[1]]()
+                               else:
+                                       default = data[1]
+                               #print("adding default:", default)
+                               dynamic_data[key] = ExtendedFuture(default)
 
        def scan_pkgs(self, can_force):
                for xpkg in self.effective_scanlist:
@@ -264,7 +297,7 @@ class Scanner(object):
                        checkdirlist = os.listdir(checkdir)
 
                        dynamic_data = {
-                               'checkdirlist': checkdirlist,
+                               'checkdirlist': ExtendedFuture(checkdirlist),
                                'checkdir': checkdir,
                                'xpkg': xpkg,
                                'changed': self.changed,
@@ -273,12 +306,21 @@ class Scanner(object):
                                'repolevel': self.repolevel,
                                'catdir': catdir,
                                'pkgdir': pkgdir,
-                               'validity_future': Future(),
+                               'pkgs': ExtendedFuture({}),
+                               'validity_future': ExtendedFuture(True),
                                'y_ebuild': None,
                                # this needs to be reset at the pkg level only,
                                # easiest is to just initialize it here
-                               'muselist': Future(),
+                               'muselist': ExtendedFuture(set()),
+                               'src_uri_error': ExtendedFuture(),
                                }
+                       self.pkg_level_futures = [
+                               'checkdirlist',
+                               'muselist',
+                               'pkgs',
+                               'src_uri_error',
+                               'validity_future',
+                               ]
                        # need to set it up for ==> self.modules or some other 
ordered list
                        for mod in [('manifests', 'Manifests'), ('isebuild', 
'IsEbuild'),
                                                ('keywords', 'KeywordChecks'), 
('files', 'FileChecks'),
@@ -306,7 +348,7 @@ class Scanner(object):
                                continue
 
                        # Sort ebuilds in ascending order for the 
KEYWORDS.dropped check.
-                       self.pkgs = dynamic_data['pkgs']
+                       self.pkgs = dynamic_data['pkgs'].get()
                        ebuildlist = sorted(self.pkgs.values())
                        ebuildlist = [pkg.pf for pkg in ebuildlist]
 

Reply via email to