-
Notifications
You must be signed in to change notification settings - Fork 3.1k
Add pip download
command and deprecate pip install --download
.
#3085
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
xavfernandez
merged 1 commit into
pypa:develop
from
patricklaw:add-pip-download-command
Sep 15, 2015
Merged
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -7,6 +7,7 @@ Reference Guide | |
|
||
pip | ||
pip_install | ||
pip_download | ||
pip_uninstall | ||
pip_freeze | ||
pip_list | ||
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
|
||
.. _`pip download`: | ||
|
||
pip download | ||
------------ | ||
|
||
.. contents:: | ||
|
||
Usage | ||
***** | ||
|
||
.. pip-command-usage:: download | ||
|
||
|
||
Description | ||
*********** | ||
|
||
.. pip-command-description:: download | ||
|
||
|
||
Overview | ||
++++++++ | ||
``pip download`` replaces the ``--download`` option to ``pip install``, | ||
which is now deprecated and will be removed in pip 10. | ||
|
||
``pip download`` does the same resolution and downloading as ``pip install``, | ||
but instead of installing the dependencies, it collects the downloaded | ||
distributions into the directory provided (defaulting to ``./pip_downloads``). | ||
This directory can later be passed as the value to | ||
``pip install --find-links`` to facilitate offline or locked down package | ||
installation. | ||
|
||
|
||
Options | ||
******* | ||
|
||
.. pip-command-options:: download | ||
|
||
.. pip-index-options:: | ||
|
||
|
||
Examples | ||
******** | ||
|
||
1. Download a package and all of its dependencies | ||
|
||
:: | ||
|
||
$ pip download -d ./pip_downloads SomePackage | ||
$ pip download SomePackage # equivalent to above | ||
$ pip download --no-index --find-links=/tmp/wheelhouse -d /tmp/otherwheelhouse SomePackage | ||
|
||
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,135 @@ | ||
from __future__ import absolute_import | ||
|
||
import logging | ||
import os | ||
|
||
from pip.req import RequirementSet | ||
from pip.basecommand import RequirementCommand | ||
from pip import cmdoptions | ||
from pip.utils import ensure_dir, normalize_path | ||
from pip.utils.build import BuildDirectory | ||
from pip.utils.filesystem import check_path_owner | ||
|
||
|
||
DEFAULT_DOWNLOAD_DIR = os.path.join(normalize_path(os.curdir), 'pip_downloads') | ||
|
||
|
||
logger = logging.getLogger(__name__) | ||
|
||
|
||
class DownloadCommand(RequirementCommand): | ||
""" | ||
Download packages from: | ||
|
||
- PyPI (and other indexes) using requirement specifiers. | ||
- VCS project urls. | ||
- Local project directories. | ||
- Local or remote source archives. | ||
|
||
pip also supports downloading from "requirements files", which provide | ||
an easy way to specify a whole environment to be downloaded. | ||
""" | ||
name = 'download' | ||
|
||
usage = """ | ||
%prog [options] <requirement specifier> [package-index-options] ... | ||
%prog [options] -r <requirements file> [package-index-options] ... | ||
%prog [options] [-e] <vcs project url> ... | ||
%prog [options] [-e] <local project path> ... | ||
%prog [options] <archive url/path> ...""" | ||
|
||
summary = 'Download packages.' | ||
|
||
def __init__(self, *args, **kw): | ||
super(DownloadCommand, self).__init__(*args, **kw) | ||
|
||
cmd_opts = self.cmd_opts | ||
|
||
cmd_opts.add_option(cmdoptions.constraints()) | ||
cmd_opts.add_option(cmdoptions.editable()) | ||
cmd_opts.add_option(cmdoptions.requirements()) | ||
cmd_opts.add_option(cmdoptions.build_dir()) | ||
cmd_opts.add_option(cmdoptions.no_deps()) | ||
cmd_opts.add_option(cmdoptions.global_options()) | ||
cmd_opts.add_option(cmdoptions.no_binary()) | ||
cmd_opts.add_option(cmdoptions.only_binary()) | ||
cmd_opts.add_option(cmdoptions.src()) | ||
cmd_opts.add_option(cmdoptions.no_clean()) | ||
cmd_opts.add_option(cmdoptions.pre()) | ||
|
||
cmd_opts.add_option( | ||
'-d', '--dest', '--destination-dir', '--destination-directory', | ||
dest='download_dir', | ||
metavar='dir', | ||
default=DEFAULT_DOWNLOAD_DIR, | ||
help=("Download packages into <dir>."), | ||
) | ||
|
||
index_opts = cmdoptions.make_option_group( | ||
cmdoptions.non_deprecated_index_group, | ||
self.parser, | ||
) | ||
|
||
self.parser.insert_option_group(0, index_opts) | ||
self.parser.insert_option_group(0, cmd_opts) | ||
|
||
def run(self, options, args): | ||
options.ignore_installed = True | ||
options.src_dir = os.path.abspath(options.src_dir) | ||
ensure_dir(options.download_dir) | ||
|
||
with self._build_session(options) as session: | ||
|
||
finder = self._build_package_finder(options, session) | ||
build_delete = (not (options.no_clean or options.build_dir)) | ||
if options.cache_dir and not check_path_owner(options.cache_dir): | ||
logger.warning( | ||
"The directory '%s' or its parent directory is not owned " | ||
"by the current user and caching wheels has been " | ||
"disabled. check the permissions and owner of that " | ||
"directory. If executing pip with sudo, you may want " | ||
"sudo's -H flag.", | ||
options.cache_dir, | ||
) | ||
options.cache_dir = None | ||
|
||
with BuildDirectory(options.build_dir, | ||
delete=build_delete) as build_dir: | ||
|
||
requirement_set = RequirementSet( | ||
build_dir=build_dir, | ||
src_dir=options.src_dir, | ||
download_dir=options.download_dir, | ||
ignore_installed=True, | ||
ignore_dependencies=options.ignore_dependencies, | ||
session=session, | ||
isolated=options.isolated_mode, | ||
) | ||
self.populate_requirement_set( | ||
requirement_set, | ||
args, | ||
options, | ||
finder, | ||
session, | ||
self.name, | ||
None | ||
) | ||
|
||
if not requirement_set.has_requirements: | ||
return | ||
|
||
requirement_set.prepare_files(finder) | ||
|
||
downloaded = ' '.join([ | ||
req.name for req in requirement_set.successfully_downloaded | ||
]) | ||
if downloaded: | ||
logger.info( | ||
'Successfully downloaded %s', downloaded | ||
) | ||
|
||
# Clean up | ||
if not options.no_clean: | ||
requirement_set.cleanup_files() | ||
|
||
return requirement_set |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Better but the directory is not automatically created and a simple
pip download setuptools
crashes.We need to create the dir if it doesn't exist, I'd again copy the
pip wheel
command behavior, cf https://github.com/pypa/pip/blob/develop/pip/req/req_set.py#L330-L331There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ideally with a new test case for the download command without --download-dir option
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fixed, and test added.