From 8b838ebb89c521cd92dd7a1c7cec075c3b30d72f Mon Sep 17 00:00:00 2001 From: Chris Hunt Date: Sun, 2 Aug 2020 18:32:54 -0400 Subject: [PATCH] Prepare lazy wheels more so they are downloaded This keeps all knowledge about preparation and types of requirements in `RequirementPreparer`, so there's one place to look when we're ready to start breaking it apart later. --- src/pip/_internal/operations/prepare.py | 14 ++++++++++++++ src/pip/_internal/req/req_install.py | 3 +++ .../_internal/resolution/resolvelib/resolver.py | 3 +++ 3 files changed, 20 insertions(+) diff --git a/src/pip/_internal/operations/prepare.py b/src/pip/_internal/operations/prepare.py index d6f136d0a..ddfa42989 100644 --- a/src/pip/_internal/operations/prepare.py +++ b/src/pip/_internal/operations/prepare.py @@ -486,7 +486,21 @@ class RequirementPreparer(object): self._log_preparing_link(req) wheel_dist = self._fetch_metadata(link) if wheel_dist is not None: + req.needs_more_preparation = True return wheel_dist + return self._prepare_linked_requirement(req, parallel_builds) + + def prepare_linked_requirement_more(self, req, parallel_builds=False): + # type: (InstallRequirement, bool) -> None + """Prepare a linked requirement more, if needed.""" + if not req.needs_more_preparation: + return + self._prepare_linked_requirement(req, parallel_builds) + + def _prepare_linked_requirement(self, req, parallel_builds): + # type: (InstallRequirement, bool) -> Distribution + assert req.link + link = req.link if link.is_wheel and self.wheel_download_dir: # Download wheels to a dedicated dir when doing `pip wheel`. download_dir = self.wheel_download_dir diff --git a/src/pip/_internal/req/req_install.py b/src/pip/_internal/req/req_install.py index 4759f4af6..816969f8e 100644 --- a/src/pip/_internal/req/req_install.py +++ b/src/pip/_internal/req/req_install.py @@ -213,6 +213,9 @@ class InstallRequirement(object): # but after loading this flag should be treated as read only. self.use_pep517 = use_pep517 + # This requirement needs more preparation before it can be built + self.needs_more_preparation = False + def __str__(self): # type: () -> str if self.req: diff --git a/src/pip/_internal/resolution/resolvelib/resolver.py b/src/pip/_internal/resolution/resolvelib/resolver.py index e83f35ca7..6a38ffa5c 100644 --- a/src/pip/_internal/resolution/resolvelib/resolver.py +++ b/src/pip/_internal/resolution/resolvelib/resolver.py @@ -159,6 +159,9 @@ class Resolver(BaseResolver): req_set.add_named_requirement(ireq) + for actual_req in req_set.all_requirements: + self.factory.preparer.prepare_linked_requirement_more(actual_req) + return req_set def get_installation_order(self, req_set):