commit: 5497d9033e180a759ed97e5aab920d6ec6ea26cd Author: Zac Medico <zmedico <AT> gentoo <DOT> org> AuthorDate: Sun May 13 04:52:47 2018 +0000 Commit: Zac Medico <zmedico <AT> gentoo <DOT> org> CommitDate: Sun May 13 04:53:21 2018 +0000 URL: https://gitweb.gentoo.org/proj/portage.git/commit/?id=5497d903
_EbuildFetcherProcess: fix event loop recursion (bug 655378) Get SRC_URI metadata asynchronously in order to avoid event loop recursion in doebuild_environment. Bug: https://bugs.gentoo.org/655378 pym/_emerge/EbuildFetcher.py | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/pym/_emerge/EbuildFetcher.py b/pym/_emerge/EbuildFetcher.py index 7c2cb3a58..3b30ebb59 100644 --- a/pym/_emerge/EbuildFetcher.py +++ b/pym/_emerge/EbuildFetcher.py @@ -60,13 +60,26 @@ class EbuildFetcher(CompositeTask): self._async_wait() return + # First get the SRC_URI metadata (it's not cached in self.pkg.metadata + # because some packages have an extremely large SRC_URI value). + self._start_task( + AsyncTaskFuture( + future=self.pkg.root_config.trees["porttree"].dbapi.\ + async_aux_get(self.pkg.cpv, ["SRC_URI"], myrepo=self.pkg.repo, + loop=self.scheduler)), + self._start_with_metadata) + + def _start_with_metadata(self, aux_get_task): + self._assert_current(aux_get_task) + self._fetcher_proc.src_uri, = aux_get_task.future.result() self._start_task(self._fetcher_proc, self._default_final_exit) class _EbuildFetcherProcess(ForkProcess): __slots__ = ("config_pool", "ebuild_path", "fetchonly", "fetchall", - "pkg", "prefetch", "_digests", "_manifest", "_settings", "_uri_map") + "pkg", "prefetch", "src_uri", "_digests", "_manifest", + "_settings", "_uri_map") def async_already_fetched(self, settings): result = self.scheduler.create_future() @@ -172,6 +185,7 @@ class _EbuildFetcherProcess(ForkProcess): settings = self.config_pool.allocate() settings.setcpv(self.pkg) + settings.configdict["pkg"]["SRC_URI"] = self.src_uri portage.doebuild_environment(ebuild_path, 'fetch', settings=settings, db=portdb)
