diff --git a/src/pip/_internal/network/download.py b/src/pip/_internal/network/download.py index 0eb4fd9ce..5fd277330 100644 --- a/src/pip/_internal/network/download.py +++ b/src/pip/_internal/network/download.py @@ -164,11 +164,14 @@ class Downloader(object): raise filename = _get_http_response_filename(resp, link) + filepath = os.path.join(location, filename) + chunks = _prepare_download(resp, link, self._progress_bar) - with open(os.path.join(location, filename), 'wb') as content_file: + with open(filepath, 'wb') as content_file: for chunk in chunks: content_file.write(chunk) - return content_file.name, resp.headers.get('Content-Type', '') + content_type = resp.headers.get('Content-Type', '') + return filepath, content_type def download_many(self, links, location): # type: (Iterable[Link], str) -> Iterable[Tuple[str, Tuple[str, str]]] diff --git a/src/pip/_internal/operations/prepare.py b/src/pip/_internal/operations/prepare.py index 5fdbd674b..5f2a0c74f 100644 --- a/src/pip/_internal/operations/prepare.py +++ b/src/pip/_internal/operations/prepare.py @@ -45,7 +45,7 @@ from pip._internal.utils.unpacking import unpack_file from pip._internal.vcs import vcs if MYPY_CHECK_RUNNING: - from typing import Callable, Dict, List, Optional, Tuple + from typing import Callable, Dict, Iterable, List, Optional, Tuple from mypy_extensions import TypedDict from pip._vendor.pkg_resources import Distribution @@ -484,8 +484,10 @@ class RequirementPreparer(object): return self._prepare_linked_requirement(req, parallel_builds) def prepare_linked_requirements_more(self, reqs, parallel_builds=False): - # type: (List[InstallRequirement], bool) -> None + # type: (Iterable[InstallRequirement], bool) -> None """Prepare a linked requirement more, if needed.""" + reqs = [req for req in reqs if req.needs_more_preparation] + # Let's download to a temporary directory. tmpdir = TempDirectory(kind="unpack", globally_managed=True).path links = (req.link for req in reqs) @@ -505,9 +507,7 @@ class RequirementPreparer(object): with indent_log(): self._ensure_link_req_src_dir(req, download_dir, parallel_builds) - if link.url in self._downloaded: - local_file = File(*self._downloaded[link.url]) - else: + if link.url not in self._downloaded: try: local_file = unpack_url( link, req.source_dir, self.downloader, download_dir, @@ -518,6 +518,8 @@ class RequirementPreparer(object): 'Could not install requirement {} because of HTTP ' 'error {} for URL {}'.format(req, exc, link) ) + else: + local_file = File(*self._downloaded[link.url]) # For use in later processing, preserve the file path on the # requirement. diff --git a/src/pip/_internal/resolution/resolvelib/resolver.py b/src/pip/_internal/resolution/resolvelib/resolver.py index 1cabe236d..031d2f107 100644 --- a/src/pip/_internal/resolution/resolvelib/resolver.py +++ b/src/pip/_internal/resolution/resolvelib/resolver.py @@ -160,11 +160,8 @@ class Resolver(BaseResolver): req_set.add_named_requirement(ireq) - self.factory.preparer.prepare_linked_requirements_more([ - req for req in req_set.all_requirements - if req.needs_more_preparation - ]) - + reqs = req_set.all_requirements + self.factory.preparer.prepare_linked_requirements_more(reqs) return req_set def get_installation_order(self, req_set):