Add an _async_uri_map method to replace the synchronous _get_uri_map
method. This will be used to prevent event loop recursion.

Bug: https://bugs.gentoo.org/653810
---
 pym/_emerge/EbuildFetcher.py | 27 ++++++++++++++++++++-------
 1 file changed, 20 insertions(+), 7 deletions(-)

diff --git a/pym/_emerge/EbuildFetcher.py b/pym/_emerge/EbuildFetcher.py
index 81eeb6dcd..1f574740b 100644
--- a/pym/_emerge/EbuildFetcher.py
+++ b/pym/_emerge/EbuildFetcher.py
@@ -49,7 +49,7 @@ class _EbuildFetcherProcess(ForkProcess):
                "pkg", "prefetch", "_digests", "_manifest", "_settings", 
"_uri_map")
 
        def already_fetched(self, settings):
-               uri_map = self._get_uri_map()
+               uri_map = 
self.scheduler.run_until_complete(self._async_uri_map())
                if not uri_map:
                        return True
 
@@ -125,7 +125,7 @@ class _EbuildFetcherProcess(ForkProcess):
                ebuild_path = self._get_ebuild_path()
 
                try:
-                       uri_map = self._get_uri_map()
+                       uri_map = 
self.scheduler.run_until_complete(self._async_uri_map())
                except portage.exception.InvalidDependString as e:
                        msg_lines = []
                        msg = "Fetch failed for '%s' due to invalid SRC_URI: 
%s" % \
@@ -210,21 +210,34 @@ class _EbuildFetcherProcess(ForkProcess):
                        self._digests = 
self._get_manifest().getTypeDigests("DIST")
                return self._digests
 
-       def _get_uri_map(self):
+       def _async_uri_map(self):
                """
-               This can raise InvalidDependString from portdbapi.getFetchMap().
+               This calls the portdbapi.async_fetch_map method and returns the
+               resulting Future (may contain InvalidDependString exception).
                """
                if self._uri_map is not None:
-                       return self._uri_map
+                       result = self.scheduler.create_future()
+                       result.set_result(self._uri_map)
+                       return result
+
                pkgdir = os.path.dirname(self._get_ebuild_path())
                mytree = os.path.dirname(os.path.dirname(pkgdir))
                use = None
                if not self.fetchall:
                        use = self.pkg.use.enabled
                portdb = self.pkg.root_config.trees["porttree"].dbapi
-               self._uri_map = portdb.getFetchMap(self.pkg.cpv,
+
+               def cache_result(result):
+                       try:
+                               self._uri_map = result.result()
+                       except Exception:
+                               # The caller handles this when it retrieves the 
result.
+                               pass
+
+               result = portdb.async_fetch_map(self.pkg.cpv,
                        useflags=use, mytree=mytree)
-               return self._uri_map
+               result.add_done_callback(cache_result)
+               return result
 
        def _prefetch_size_ok(self, uri_map, settings, ebuild_path):
                distdir = settings["DISTDIR"]
-- 
2.13.6


Reply via email to