Skip to content

Commit

Permalink
Merge usage of download_dir and wheel_download_dir
Browse files Browse the repository at this point in the history
In every cases, at least one of them is None.  By doing this,
it is also possible to simplify wrapper codes around download_dir.
  • Loading branch information
McSinyx committed Sep 17, 2020
1 parent 3c57f0a commit 7a7a16b
Show file tree
Hide file tree
Showing 5 changed files with 20 additions and 39 deletions.
2 changes: 0 additions & 2 deletions src/pip/_internal/cli/req_command.py
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,6 @@ def make_requirement_preparer(
finder, # type: PackageFinder
use_user_site, # type: bool
download_dir=None, # type: str
wheel_download_dir=None, # type: str
):
# type: (...) -> RequirementPreparer
"""
Expand All @@ -232,7 +231,6 @@ def make_requirement_preparer(
build_dir=temp_build_dir_path,
src_dir=options.src_dir,
download_dir=download_dir,
wheel_download_dir=wheel_download_dir,
build_isolation=options.build_isolation,
req_tracker=req_tracker,
session=session,
Expand Down
2 changes: 1 addition & 1 deletion src/pip/_internal/commands/wheel.py
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ def run(self, options, args):
req_tracker=req_tracker,
session=session,
finder=finder,
wheel_download_dir=options.wheel_dir,
download_dir=options.wheel_dir,
use_user_site=False,
)

Expand Down
50 changes: 16 additions & 34 deletions src/pip/_internal/operations/prepare.py
Original file line number Diff line number Diff line change
Expand Up @@ -307,7 +307,6 @@ def __init__(
build_dir, # type: str
download_dir, # type: Optional[str]
src_dir, # type: str
wheel_download_dir, # type: Optional[str]
build_isolation, # type: bool
req_tracker, # type: RequirementTracker
session, # type: PipSession
Expand All @@ -332,16 +331,6 @@ def __init__(
# not saved, and are deleted immediately after unpacking.
self.download_dir = download_dir

# Where still-packed .whl files should be written to. If None, they are
# written to the download_dir parameter. Separate to download_dir to
# permit only keeping wheel archives for pip wheel.
self.wheel_download_dir = wheel_download_dir

# NOTE
# download_dir and wheel_download_dir overlap semantically and may
# be combined if we're willing to have non-wheel archives present in
# the wheelhouse output by 'pip wheel'.

# Is build isolation allowed?
self.build_isolation = build_isolation

Expand Down Expand Up @@ -378,15 +367,8 @@ def _log_preparing_link(self, req):
with indent_log():
logger.info("Using cached %s", req.link.filename)

def _get_download_dir(self, link):
# type: (Link) -> Optional[str]
if link.is_wheel and self.wheel_download_dir:
# Download wheels to a dedicated dir when doing `pip wheel`.
return self.wheel_download_dir
return self.download_dir

def _ensure_link_req_src_dir(self, req, download_dir, parallel_builds):
# type: (InstallRequirement, Optional[str], bool) -> None
def _ensure_link_req_src_dir(self, req, parallel_builds):
# type: (InstallRequirement, bool) -> None
"""Ensure source_dir of a linked InstallRequirement."""
# Since source_dir is only set for editable requirements.
if req.link.is_wheel:
Expand Down Expand Up @@ -496,11 +478,12 @@ def prepare_linked_requirements_more(self, reqs, parallel_builds=False):
reqs = [req for req in reqs if req.needs_more_preparation]
links = [] # type: List[Link]
for req in reqs:
download_dir = self._get_download_dir(req.link)
if download_dir is not None:
if self.download_dir is not None:
hashes = self._get_linked_req_hashes(req)
file_path = _check_download_dir(req.link, download_dir, hashes)
if download_dir is None or file_path is None:
file_path = _check_download_dir(
req.link, self.download_dir, hashes,
)
if self.download_dir is None or file_path is None:
links.append(req.link)
else:
self._downloaded[req.link.url] = file_path, None
Expand All @@ -515,15 +498,14 @@ def _prepare_linked_requirement(self, req, parallel_builds):
# type: (InstallRequirement, bool) -> Distribution
assert req.link
link = req.link
download_dir = self._get_download_dir(link)

self._ensure_link_req_src_dir(req, download_dir, parallel_builds)
self._ensure_link_req_src_dir(req, parallel_builds)
hashes = self._get_linked_req_hashes(req)
if link.url not in self._downloaded:
try:
local_file = unpack_url(
link, req.source_dir, self._download,
download_dir, hashes,
self.download_dir, hashes,
)
except NetworkConnectionError as exc:
raise InstallationError(
Expand All @@ -545,20 +527,21 @@ def _prepare_linked_requirement(self, req, parallel_builds):
req, self.req_tracker, self.finder, self.build_isolation,
)

if download_dir:
if self.download_dir is not None:
if link.is_existing_dir():
logger.info('Link is a directory, ignoring download_dir')
elif local_file:
download_location = os.path.join(download_dir, link.filename)
download_location = os.path.join(
self.download_dir, link.filename
)
if not os.path.exists(download_location):
shutil.copy(local_file.path, download_location)
download_path = display_path(download_location)
logger.info('Saved %s', download_path)

if link.is_vcs:
# Make a .zip of the source_dir we already created.
if self.download_dir is not None:
req.archive(self.download_dir)
req.archive(self.download_dir)
return dist

def prepare_editable_requirement(
Expand All @@ -580,14 +563,13 @@ def prepare_editable_requirement(
'hash.'.format(req)
)
req.ensure_has_source_dir(self.src_dir)
req.update_editable(not self._download_should_save)
req.update_editable(self.download_dir is None)

dist = _get_prepared_distribution(
req, self.req_tracker, self.finder, self.build_isolation,
)

if self._download_should_save:
req.archive(self.download_dir)
req.archive(self.download_dir)
req.check_if_exists(self.use_user_site)

return dist
Expand Down
4 changes: 3 additions & 1 deletion src/pip/_internal/req/req_install.py
Original file line number Diff line number Diff line change
Expand Up @@ -698,12 +698,14 @@ def _clean_zip_name(name, prefix):
return self.name + '/' + name

def archive(self, build_dir):
# type: (str) -> None
# type: (Optional[str]) -> None
"""Saves archive to provided build_dir.
Used for saving downloaded VCS requirements as part of `pip download`.
"""
assert self.source_dir
if build_dir is None:
return

create_archive = True
archive_name = '{}-{}.zip'.format(self.name, self.metadata["version"])
Expand Down
1 change: 0 additions & 1 deletion tests/unit/test_req.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,6 @@ def _basic_resolver(self, finder, require_hashes=False):
build_dir=os.path.join(self.tempdir, 'build'),
src_dir=os.path.join(self.tempdir, 'src'),
download_dir=None,
wheel_download_dir=None,
build_isolation=True,
req_tracker=tracker,
session=session,
Expand Down

0 comments on commit 7a7a16b

Please sign in to comment.