Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Vladislav Rykov
THSO.server
Commits
ff4a13ed
Commit
ff4a13ed
authored
Apr 17, 2020
by
Vladislav Rykov
Browse files
major changes
parent
51f76a47
Pipeline
#38
failed with stages
Changes
394
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Too many changes to show.
To preserve performance only
14 of 394+
files are displayed.
Plain diff
Email patch
env/lib/python3.5/site-packages/pip/_internal/cli/status_codes.py
0 → 100644
View file @
ff4a13ed
from
__future__
import
absolute_import
SUCCESS
=
0
ERROR
=
1
UNKNOWN_ERROR
=
2
VIRTUALENV_NOT_FOUND
=
3
PREVIOUS_BUILD_DIR_ERROR
=
4
NO_MATCHES_FOUND
=
23
env/lib/python3.5/site-packages/pip/_internal/commands/__init__.py
0 → 100644
View file @
ff4a13ed
"""
Package containing all pip commands
"""
# The following comment should be removed at some point in the future.
# mypy: disallow-untyped-defs=False
from
__future__
import
absolute_import
import
importlib
from
collections
import
OrderedDict
,
namedtuple
from
pip._internal.utils.typing
import
MYPY_CHECK_RUNNING
if
MYPY_CHECK_RUNNING
:
from
typing
import
Any
from
pip._internal.cli.base_command
import
Command
CommandInfo
=
namedtuple
(
'CommandInfo'
,
'module_path, class_name, summary'
)
# The ordering matters for help display.
# Also, even though the module path starts with the same
# "pip._internal.commands" prefix in each case, we include the full path
# because it makes testing easier (specifically when modifying commands_dict
# in test setup / teardown by adding info for a FakeCommand class defined
# in a test-related module).
# Finally, we need to pass an iterable of pairs here rather than a dict
# so that the ordering won't be lost when using Python 2.7.
commands_dict
=
OrderedDict
([
(
'install'
,
CommandInfo
(
'pip._internal.commands.install'
,
'InstallCommand'
,
'Install packages.'
,
)),
(
'download'
,
CommandInfo
(
'pip._internal.commands.download'
,
'DownloadCommand'
,
'Download packages.'
,
)),
(
'uninstall'
,
CommandInfo
(
'pip._internal.commands.uninstall'
,
'UninstallCommand'
,
'Uninstall packages.'
,
)),
(
'freeze'
,
CommandInfo
(
'pip._internal.commands.freeze'
,
'FreezeCommand'
,
'Output installed packages in requirements format.'
,
)),
(
'list'
,
CommandInfo
(
'pip._internal.commands.list'
,
'ListCommand'
,
'List installed packages.'
,
)),
(
'show'
,
CommandInfo
(
'pip._internal.commands.show'
,
'ShowCommand'
,
'Show information about installed packages.'
,
)),
(
'check'
,
CommandInfo
(
'pip._internal.commands.check'
,
'CheckCommand'
,
'Verify installed packages have compatible dependencies.'
,
)),
(
'config'
,
CommandInfo
(
'pip._internal.commands.configuration'
,
'ConfigurationCommand'
,
'Manage local and global configuration.'
,
)),
(
'search'
,
CommandInfo
(
'pip._internal.commands.search'
,
'SearchCommand'
,
'Search PyPI for packages.'
,
)),
(
'wheel'
,
CommandInfo
(
'pip._internal.commands.wheel'
,
'WheelCommand'
,
'Build wheels from your requirements.'
,
)),
(
'hash'
,
CommandInfo
(
'pip._internal.commands.hash'
,
'HashCommand'
,
'Compute hashes of package archives.'
,
)),
(
'completion'
,
CommandInfo
(
'pip._internal.commands.completion'
,
'CompletionCommand'
,
'A helper command used for command completion.'
,
)),
(
'debug'
,
CommandInfo
(
'pip._internal.commands.debug'
,
'DebugCommand'
,
'Show information useful for debugging.'
,
)),
(
'help'
,
CommandInfo
(
'pip._internal.commands.help'
,
'HelpCommand'
,
'Show help for commands.'
,
)),
])
# type: OrderedDict[str, CommandInfo]
def
create_command
(
name
,
**
kwargs
):
# type: (str, **Any) -> Command
"""
Create an instance of the Command class with the given name.
"""
module_path
,
class_name
,
summary
=
commands_dict
[
name
]
module
=
importlib
.
import_module
(
module_path
)
command_class
=
getattr
(
module
,
class_name
)
command
=
command_class
(
name
=
name
,
summary
=
summary
,
**
kwargs
)
return
command
def
get_similar_commands
(
name
):
"""Command name auto-correct."""
from
difflib
import
get_close_matches
name
=
name
.
lower
()
close_commands
=
get_close_matches
(
name
,
commands_dict
.
keys
())
if
close_commands
:
return
close_commands
[
0
]
else
:
return
False
env/lib/python3.5/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-35.pyc
0 → 100644
View file @
ff4a13ed
File added
env/lib/python3.5/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-35.pyc
0 → 100644
View file @
ff4a13ed
File added
env/lib/python3.5/site-packages/pip/_internal/commands/__pycache__/install.cpython-35.pyc
0 → 100644
View file @
ff4a13ed
File added
env/lib/python3.5/site-packages/pip/_internal/commands/check.py
0 → 100644
View file @
ff4a13ed
# The following comment should be removed at some point in the future.
# mypy: disallow-untyped-defs=False
import
logging
from
pip._internal.cli.base_command
import
Command
from
pip._internal.operations.check
import
(
check_package_set
,
create_package_set_from_installed
,
)
from
pip._internal.utils.misc
import
write_output
logger
=
logging
.
getLogger
(
__name__
)
class
CheckCommand
(
Command
):
"""Verify installed packages have compatible dependencies."""
usage
=
"""
%prog [options]"""
def
run
(
self
,
options
,
args
):
package_set
,
parsing_probs
=
create_package_set_from_installed
()
missing
,
conflicting
=
check_package_set
(
package_set
)
for
project_name
in
missing
:
version
=
package_set
[
project_name
].
version
for
dependency
in
missing
[
project_name
]:
write_output
(
"%s %s requires %s, which is not installed."
,
project_name
,
version
,
dependency
[
0
],
)
for
project_name
in
conflicting
:
version
=
package_set
[
project_name
].
version
for
dep_name
,
dep_version
,
req
in
conflicting
[
project_name
]:
write_output
(
"%s %s has requirement %s, but you have %s %s."
,
project_name
,
version
,
req
,
dep_name
,
dep_version
,
)
if
missing
or
conflicting
or
parsing_probs
:
return
1
else
:
write_output
(
"No broken requirements found."
)
env/lib/python3.5/site-packages/pip/_internal/commands/completion.py
0 → 100644
View file @
ff4a13ed
# The following comment should be removed at some point in the future.
# mypy: disallow-untyped-defs=False
from
__future__
import
absolute_import
import
sys
import
textwrap
from
pip._internal.cli.base_command
import
Command
from
pip._internal.utils.misc
import
get_prog
BASE_COMPLETION
=
"""
# pip %(shell)s completion start%(script)s# pip %(shell)s completion end
"""
COMPLETION_SCRIPTS
=
{
'bash'
:
"""
_pip_completion()
{
COMPREPLY=( $( COMP_WORDS="${COMP_WORDS[*]}"
\\
COMP_CWORD=$COMP_CWORD
\\
PIP_AUTO_COMPLETE=1 $1 2>/dev/null ) )
}
complete -o default -F _pip_completion %(prog)s
"""
,
'zsh'
:
"""
function _pip_completion {
local words cword
read -Ac words
read -cn cword
reply=( $( COMP_WORDS="$words[*]"
\\
COMP_CWORD=$(( cword-1 ))
\\
PIP_AUTO_COMPLETE=1 $words[1] 2>/dev/null ))
}
compctl -K _pip_completion %(prog)s
"""
,
'fish'
:
"""
function __fish_complete_pip
set -lx COMP_WORDS (commandline -o) ""
set -lx COMP_CWORD (
\\
math (contains -i -- (commandline -t) $COMP_WORDS)-1
\\
)
set -lx PIP_AUTO_COMPLETE 1
string split
\\
-- (eval $COMP_WORDS[1])
end
complete -fa "(__fish_complete_pip)" -c %(prog)s
"""
,
}
class
CompletionCommand
(
Command
):
"""A helper command to be used for command completion."""
ignore_require_venv
=
True
def
__init__
(
self
,
*
args
,
**
kw
):
super
(
CompletionCommand
,
self
).
__init__
(
*
args
,
**
kw
)
cmd_opts
=
self
.
cmd_opts
cmd_opts
.
add_option
(
'--bash'
,
'-b'
,
action
=
'store_const'
,
const
=
'bash'
,
dest
=
'shell'
,
help
=
'Emit completion code for bash'
)
cmd_opts
.
add_option
(
'--zsh'
,
'-z'
,
action
=
'store_const'
,
const
=
'zsh'
,
dest
=
'shell'
,
help
=
'Emit completion code for zsh'
)
cmd_opts
.
add_option
(
'--fish'
,
'-f'
,
action
=
'store_const'
,
const
=
'fish'
,
dest
=
'shell'
,
help
=
'Emit completion code for fish'
)
self
.
parser
.
insert_option_group
(
0
,
cmd_opts
)
def
run
(
self
,
options
,
args
):
"""Prints the completion code of the given shell"""
shells
=
COMPLETION_SCRIPTS
.
keys
()
shell_options
=
[
'--'
+
shell
for
shell
in
sorted
(
shells
)]
if
options
.
shell
in
shells
:
script
=
textwrap
.
dedent
(
COMPLETION_SCRIPTS
.
get
(
options
.
shell
,
''
)
%
{
'prog'
:
get_prog
(),
}
)
print
(
BASE_COMPLETION
%
{
'script'
:
script
,
'shell'
:
options
.
shell
})
else
:
sys
.
stderr
.
write
(
'ERROR: You must pass %s
\n
'
%
' or '
.
join
(
shell_options
)
)
env/lib/python3.5/site-packages/pip/_internal/commands/configuration.py
0 → 100644
View file @
ff4a13ed
# The following comment should be removed at some point in the future.
# mypy: disallow-untyped-defs=False
import
logging
import
os
import
subprocess
from
pip._internal.cli.base_command
import
Command
from
pip._internal.cli.status_codes
import
ERROR
,
SUCCESS
from
pip._internal.configuration
import
(
Configuration
,
get_configuration_files
,
kinds
,
)
from
pip._internal.exceptions
import
PipError
from
pip._internal.utils.misc
import
get_prog
,
write_output
logger
=
logging
.
getLogger
(
__name__
)
class
ConfigurationCommand
(
Command
):
"""Manage local and global configuration.
Subcommands:
list: List the active configuration (or from the file specified)
edit: Edit the configuration file in an editor
get: Get the value associated with name
set: Set the name=value
unset: Unset the value associated with name
If none of --user, --global and --site are passed, a virtual
environment configuration file is used if one is active and the file
exists. Otherwise, all modifications happen on the to the user file by
default.
"""
ignore_require_venv
=
True
usage
=
"""
%prog [<file-option>] list
%prog [<file-option>] [--editor <editor-path>] edit
%prog [<file-option>] get name
%prog [<file-option>] set name value
%prog [<file-option>] unset name
"""
def
__init__
(
self
,
*
args
,
**
kwargs
):
super
(
ConfigurationCommand
,
self
).
__init__
(
*
args
,
**
kwargs
)
self
.
configuration
=
None
self
.
cmd_opts
.
add_option
(
'--editor'
,
dest
=
'editor'
,
action
=
'store'
,
default
=
None
,
help
=
(
'Editor to use to edit the file. Uses VISUAL or EDITOR '
'environment variables if not provided.'
)
)
self
.
cmd_opts
.
add_option
(
'--global'
,
dest
=
'global_file'
,
action
=
'store_true'
,
default
=
False
,
help
=
'Use the system-wide configuration file only'
)
self
.
cmd_opts
.
add_option
(
'--user'
,
dest
=
'user_file'
,
action
=
'store_true'
,
default
=
False
,
help
=
'Use the user configuration file only'
)
self
.
cmd_opts
.
add_option
(
'--site'
,
dest
=
'site_file'
,
action
=
'store_true'
,
default
=
False
,
help
=
'Use the current environment configuration file only'
)
self
.
parser
.
insert_option_group
(
0
,
self
.
cmd_opts
)
def
run
(
self
,
options
,
args
):
handlers
=
{
"list"
:
self
.
list_values
,
"edit"
:
self
.
open_in_editor
,
"get"
:
self
.
get_name
,
"set"
:
self
.
set_name_value
,
"unset"
:
self
.
unset_name
}
# Determine action
if
not
args
or
args
[
0
]
not
in
handlers
:
logger
.
error
(
"Need an action ({}) to perform."
.
format
(
", "
.
join
(
sorted
(
handlers
)))
)
return
ERROR
action
=
args
[
0
]
# Determine which configuration files are to be loaded
# Depends on whether the command is modifying.
try
:
load_only
=
self
.
_determine_file
(
options
,
need_value
=
(
action
in
[
"get"
,
"set"
,
"unset"
,
"edit"
])
)
except
PipError
as
e
:
logger
.
error
(
e
.
args
[
0
])
return
ERROR
# Load a new configuration
self
.
configuration
=
Configuration
(
isolated
=
options
.
isolated_mode
,
load_only
=
load_only
)
self
.
configuration
.
load
()
# Error handling happens here, not in the action-handlers.
try
:
handlers
[
action
](
options
,
args
[
1
:])
except
PipError
as
e
:
logger
.
error
(
e
.
args
[
0
])
return
ERROR
return
SUCCESS
def
_determine_file
(
self
,
options
,
need_value
):
file_options
=
[
key
for
key
,
value
in
(
(
kinds
.
USER
,
options
.
user_file
),
(
kinds
.
GLOBAL
,
options
.
global_file
),
(
kinds
.
SITE
,
options
.
site_file
),
)
if
value
]
if
not
file_options
:
if
not
need_value
:
return
None
# Default to user, unless there's a site file.
elif
any
(
os
.
path
.
exists
(
site_config_file
)
for
site_config_file
in
get_configuration_files
()[
kinds
.
SITE
]
):
return
kinds
.
SITE
else
:
return
kinds
.
USER
elif
len
(
file_options
)
==
1
:
return
file_options
[
0
]
raise
PipError
(
"Need exactly one file to operate upon "
"(--user, --site, --global) to perform."
)
def
list_values
(
self
,
options
,
args
):
self
.
_get_n_args
(
args
,
"list"
,
n
=
0
)
for
key
,
value
in
sorted
(
self
.
configuration
.
items
()):
write_output
(
"%s=%r"
,
key
,
value
)
def
get_name
(
self
,
options
,
args
):
key
=
self
.
_get_n_args
(
args
,
"get [name]"
,
n
=
1
)
value
=
self
.
configuration
.
get_value
(
key
)
write_output
(
"%s"
,
value
)
def
set_name_value
(
self
,
options
,
args
):
key
,
value
=
self
.
_get_n_args
(
args
,
"set [name] [value]"
,
n
=
2
)
self
.
configuration
.
set_value
(
key
,
value
)
self
.
_save_configuration
()
def
unset_name
(
self
,
options
,
args
):
key
=
self
.
_get_n_args
(
args
,
"unset [name]"
,
n
=
1
)
self
.
configuration
.
unset_value
(
key
)
self
.
_save_configuration
()
def
open_in_editor
(
self
,
options
,
args
):
editor
=
self
.
_determine_editor
(
options
)
fname
=
self
.
configuration
.
get_file_to_edit
()
if
fname
is
None
:
raise
PipError
(
"Could not determine appropriate file."
)
try
:
subprocess
.
check_call
([
editor
,
fname
])
except
subprocess
.
CalledProcessError
as
e
:
raise
PipError
(
"Editor Subprocess exited with exit code {}"
.
format
(
e
.
returncode
)
)
def
_get_n_args
(
self
,
args
,
example
,
n
):
"""Helper to make sure the command got the right number of arguments
"""
if
len
(
args
)
!=
n
:
msg
=
(
'Got unexpected number of arguments, expected {}. '
'(example: "{} config {}")'
).
format
(
n
,
get_prog
(),
example
)
raise
PipError
(
msg
)
if
n
==
1
:
return
args
[
0
]
else
:
return
args
def
_save_configuration
(
self
):
# We successfully ran a modifying command. Need to save the
# configuration.
try
:
self
.
configuration
.
save
()
except
Exception
:
logger
.
error
(
"Unable to save configuration. Please report this as a bug."
,
exc_info
=
1
)
raise
PipError
(
"Internal Error."
)
def
_determine_editor
(
self
,
options
):
if
options
.
editor
is
not
None
:
return
options
.
editor
elif
"VISUAL"
in
os
.
environ
:
return
os
.
environ
[
"VISUAL"
]
elif
"EDITOR"
in
os
.
environ
:
return
os
.
environ
[
"EDITOR"
]
else
:
raise
PipError
(
"Could not determine editor to use."
)
env/lib/python3.5/site-packages/pip/_internal/commands/debug.py
0 → 100644
View file @
ff4a13ed
# The following comment should be removed at some point in the future.
# mypy: disallow-untyped-defs=False
from
__future__
import
absolute_import
import
locale
import
logging
import
os
import
sys
from
pip._vendor.certifi
import
where
from
pip._internal.cli
import
cmdoptions
from
pip._internal.cli.base_command
import
Command
from
pip._internal.cli.cmdoptions
import
make_target_python
from
pip._internal.cli.status_codes
import
SUCCESS
from
pip._internal.utils.logging
import
indent_log
from
pip._internal.utils.misc
import
get_pip_version
from
pip._internal.utils.typing
import
MYPY_CHECK_RUNNING
if
MYPY_CHECK_RUNNING
:
from
typing
import
Any
,
List
,
Optional
from
optparse
import
Values
logger
=
logging
.
getLogger
(
__name__
)
def
show_value
(
name
,
value
):
# type: (str, Optional[str]) -> None
logger
.
info
(
'{}: {}'
.
format
(
name
,
value
))
def
show_sys_implementation
():
# type: () -> None
logger
.
info
(
'sys.implementation:'
)
if
hasattr
(
sys
,
'implementation'
):
implementation
=
sys
.
implementation
# type: ignore
implementation_name
=
implementation
.
name
else
:
implementation_name
=
''
with
indent_log
():
show_value
(
'name'
,
implementation_name
)
def
show_tags
(
options
):
# type: (Values) -> None
tag_limit
=
10
target_python
=
make_target_python
(
options
)
tags
=
target_python
.
get_tags
()
# Display the target options that were explicitly provided.
formatted_target
=
target_python
.
format_given
()
suffix
=
''
if
formatted_target
:
suffix
=
' (target: {})'
.
format
(
formatted_target
)
msg
=
'Compatible tags: {}{}'
.
format
(
len
(
tags
),
suffix
)
logger
.
info
(
msg
)
if
options
.
verbose
<
1
and
len
(
tags
)
>
tag_limit
:
tags_limited
=
True
tags
=
tags
[:
tag_limit
]
else
:
tags_limited
=
False
with
indent_log
():
for
tag
in
tags
:
logger
.
info
(
str
(
tag
))
if
tags_limited
:
msg
=
(
'...
\n
'
'[First {tag_limit} tags shown. Pass --verbose to show all.]'
).
format
(
tag_limit
=
tag_limit
)
logger
.
info
(
msg
)
def
ca_bundle_info
(
config
):
levels
=
set
()
for
key
,
value
in
config
.
items
():
levels
.
add
(
key
.
split
(
'.'
)[
0
])
if
not
levels
:
return
"Not specified"
levels_that_override_global
=
[
'install'
,
'wheel'
,
'download'
]
global_overriding_level
=
[
level
for
level
in
levels
if
level
in
levels_that_override_global
]
if
not
global_overriding_level
:
return
'global'
levels
.
remove
(
'global'
)
return
", "
.
join
(
levels
)
class
DebugCommand
(
Command
):
"""
Display debug information.
"""
usage
=
"""
%prog <options>"""
ignore_require_venv
=
True
def
__init__
(
self
,
*
args
,
**
kw
):
super
(
DebugCommand
,
self
).
__init__
(
*
args
,
**
kw
)
cmd_opts
=
self
.
cmd_opts
cmdoptions
.
add_target_python_options
(
cmd_opts
)
self
.
parser
.
insert_option_group
(
0
,
cmd_opts
)
self
.
parser
.
config
.
load
()
def
run
(
self
,
options
,
args
):
# type: (Values, List[Any]) -> int
logger
.
warning
(
"This command is only meant for debugging. "
"Do not use this with automation for parsing and getting these "
"details, since the output and options of this command may "
"change without notice."
)
show_value
(
'pip version'
,
get_pip_version
())
show_value
(
'sys.version'
,
sys
.
version
)
show_value
(
'sys.executable'
,
sys
.
executable
)
show_value
(
'sys.getdefaultencoding'
,
sys
.
getdefaultencoding
())
show_value
(
'sys.getfilesystemencoding'
,
sys
.
getfilesystemencoding
())
show_value
(
'locale.getpreferredencoding'
,
locale
.
getpreferredencoding
(),
)
show_value
(
'sys.platform'
,
sys
.
platform
)
show_sys_implementation
()
show_value
(
"'cert' config value"
,
ca_bundle_info
(
self
.
parser
.
config
))
show_value
(
"REQUESTS_CA_BUNDLE"
,
os
.
environ
.
get
(
'REQUESTS_CA_BUNDLE'
))
show_value
(
"CURL_CA_BUNDLE"
,
os
.
environ
.
get
(
'CURL_CA_BUNDLE'
))
show_value
(
"pip._vendor.certifi.where()"
,
where
())
show_tags
(
options
)
return
SUCCESS
env/lib/python3.5/site-packages/pip/_internal/commands/download.py
0 → 100644
View file @
ff4a13ed
# The following comment should be removed at some point in the future.
# mypy: disallow-untyped-defs=False
from
__future__
import
absolute_import
import
logging
import
os
from
pip._internal.cli
import
cmdoptions
from
pip._internal.cli.cmdoptions
import
make_target_python
from
pip._internal.cli.req_command
import
RequirementCommand
from
pip._internal.req
import
RequirementSet
from
pip._internal.req.req_tracker
import
get_requirement_tracker
from
pip._internal.utils.misc
import
ensure_dir
,
normalize_path
,
write_output
from
pip._internal.utils.temp_dir
import
TempDirectory
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.
"""
usage
=
"""
%prog [options] <requirement specifier> [package-index-options] ...
%prog [options] -r <requirements file> [package-index-options] ...
%prog [options] <vcs project url> ...
%prog [options] <local project path> ...
%prog [options] <archive url/path> ..."""
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
.
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
.
prefer_binary
())
cmd_opts
.
add_option
(
cmdoptions
.
src
())
cmd_opts
.
add_option
(
cmdoptions
.
pre
())
cmd_opts
.
add_option
(
cmdoptions
.
no_clean
())
cmd_opts
.
add_option
(
cmdoptions
.
require_hashes
())
cmd_opts
.
add_option
(
cmdoptions
.
progress_bar
())
cmd_opts
.
add_option
(
cmdoptions
.
no_build_isolation
())
cmd_opts
.
add_option
(
cmdoptions
.
use_pep517
())
cmd_opts
.
add_option
(
cmdoptions
.
no_use_pep517
())
cmd_opts
.
add_option
(
'-d'
,
'--dest'
,
'--destination-dir'
,
'--destination-directory'
,
dest
=
'download_dir'
,
metavar
=
'dir'
,
default
=
os
.
curdir
,
help
=
(
"Download packages into <dir>."
),
)
cmdoptions
.
add_target_python_options
(
cmd_opts
)
index_opts
=
cmdoptions
.
make_option_group
(
cmdoptions
.
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
# editable doesn't really make sense for `pip download`, but the bowels
# of the RequirementSet code require that property.
options
.
editables
=
[]
cmdoptions
.
check_dist_restriction
(
options
)
options
.
download_dir
=
normalize_path
(
options
.
download_dir
)
ensure_dir
(
options
.
download_dir
)
session
=
self
.
get_default_session
(
options
)
target_python
=
make_target_python
(
options
)
finder
=
self
.
_build_package_finder
(
options
=
options
,
session
=
session
,
target_python
=
target_python
,
)
build_delete
=
(
not
(
options
.
no_clean
or
options
.
build_dir
))
with
get_requirement_tracker
()
as
req_tracker
,
TempDirectory
(
options
.
build_dir
,
delete
=
build_delete
,
kind
=
"download"
)
as
directory
:
requirement_set
=
RequirementSet
()
self
.
populate_requirement_set
(
requirement_set
,
args
,
options
,
finder
,
session
,
None
)
preparer
=
self
.
make_requirement_preparer
(
temp_build_dir
=
directory
,
options
=
options
,
req_tracker
=
req_tracker
,
session
=
session
,
finder
=
finder
,
download_dir
=
options
.
download_dir
,
use_user_site
=
False
,
)
resolver
=
self
.
make_resolver
(
preparer
=
preparer
,
finder
=
finder
,
options
=
options
,
py_version_info
=
options
.
python_version
,
)
self
.
trace_basic_info
(
finder
)
resolver
.
resolve
(
requirement_set
)
downloaded
=
' '
.
join
([
req
.
name
for
req
in
requirement_set
.
successfully_downloaded
])
if
downloaded
:
write_output
(
'Successfully downloaded %s'
,
downloaded
)
# Clean up
if
not
options
.
no_clean
:
requirement_set
.
cleanup_files
()
return
requirement_set
env/lib/python3.5/site-packages/pip/_internal/commands/freeze.py
0 → 100644
View file @
ff4a13ed
# The following comment should be removed at some point in the future.
# mypy: disallow-untyped-defs=False
from
__future__
import
absolute_import
import
sys
from
pip._internal.cache
import
WheelCache
from
pip._internal.cli
import
cmdoptions
from
pip._internal.cli.base_command
import
Command
from
pip._internal.models.format_control
import
FormatControl
from
pip._internal.operations.freeze
import
freeze
from
pip._internal.utils.compat
import
stdlib_pkgs
DEV_PKGS
=
{
'pip'
,
'setuptools'
,
'distribute'
,
'wheel'
}
class
FreezeCommand
(
Command
):
"""
Output installed packages in requirements format.
packages are listed in a case-insensitive sorted order.
"""
usage
=
"""
%prog [options]"""
log_streams
=
(
"ext://sys.stderr"
,
"ext://sys.stderr"
)
def
__init__
(
self
,
*
args
,
**
kw
):
super
(
FreezeCommand
,
self
).
__init__
(
*
args
,
**
kw
)
self
.
cmd_opts
.
add_option
(
'-r'
,
'--requirement'
,
dest
=
'requirements'
,
action
=
'append'
,
default
=
[],
metavar
=
'file'
,
help
=
"Use the order in the given requirements file and its "
"comments when generating output. This option can be "
"used multiple times."
)
self
.
cmd_opts
.
add_option
(
'-f'
,
'--find-links'
,
dest
=
'find_links'
,
action
=
'append'
,
default
=
[],
metavar
=
'URL'
,
help
=
'URL for finding packages, which will be added to the '
'output.'
)
self
.
cmd_opts
.
add_option
(
'-l'
,
'--local'
,
dest
=
'local'
,
action
=
'store_true'
,
default
=
False
,
help
=
'If in a virtualenv that has global access, do not output '
'globally-installed packages.'
)
self
.
cmd_opts
.
add_option
(
'--user'
,
dest
=
'user'
,
action
=
'store_true'
,
default
=
False
,
help
=
'Only output packages installed in user-site.'
)
self
.
cmd_opts
.
add_option
(
cmdoptions
.
list_path
())
self
.
cmd_opts
.
add_option
(
'--all'
,
dest
=
'freeze_all'
,
action
=
'store_true'
,
help
=
'Do not skip these packages in the output:'
' %s'
%
', '
.
join
(
DEV_PKGS
))
self
.
cmd_opts
.
add_option
(
'--exclude-editable'
,
dest
=
'exclude_editable'
,
action
=
'store_true'
,
help
=
'Exclude editable package from output.'
)
self
.
parser
.
insert_option_group
(
0
,
self
.
cmd_opts
)
def
run
(
self
,
options
,
args
):
format_control
=
FormatControl
(
set
(),
set
())
wheel_cache
=
WheelCache
(
options
.
cache_dir
,
format_control
)
skip
=
set
(
stdlib_pkgs
)
if
not
options
.
freeze_all
:
skip
.
update
(
DEV_PKGS
)
cmdoptions
.
check_list_path_option
(
options
)
freeze_kwargs
=
dict
(
requirement
=
options
.
requirements
,
find_links
=
options
.
find_links
,
local_only
=
options
.
local
,
user_only
=
options
.
user
,
paths
=
options
.
path
,
skip_regex
=
options
.
skip_requirements_regex
,
isolated
=
options
.
isolated_mode
,
wheel_cache
=
wheel_cache
,
skip
=
skip
,
exclude_editable
=
options
.
exclude_editable
,
)
try
:
for
line
in
freeze
(
**
freeze_kwargs
):
sys
.
stdout
.
write
(
line
+
'
\n
'
)
finally
:
wheel_cache
.
cleanup
()
env/lib/python3.5/site-packages/pip/_internal/commands/hash.py
0 → 100644
View file @
ff4a13ed
# The following comment should be removed at some point in the future.
# mypy: disallow-untyped-defs=False
from
__future__
import
absolute_import
import
hashlib
import
logging
import
sys
from
pip._internal.cli.base_command
import
Command
from
pip._internal.cli.status_codes
import
ERROR
from
pip._internal.utils.hashes
import
FAVORITE_HASH
,
STRONG_HASHES
from
pip._internal.utils.misc
import
read_chunks
,
write_output
logger
=
logging
.
getLogger
(
__name__
)
class
HashCommand
(
Command
):
"""
Compute a hash of a local package archive.
These can be used with --hash in a requirements file to do repeatable
installs.
"""
usage
=
'%prog [options] <file> ...'
ignore_require_venv
=
True
def
__init__
(
self
,
*
args
,
**
kw
):
super
(
HashCommand
,
self
).
__init__
(
*
args
,
**
kw
)
self
.
cmd_opts
.
add_option
(
'-a'
,
'--algorithm'
,
dest
=
'algorithm'
,
choices
=
STRONG_HASHES
,
action
=
'store'
,
default
=
FAVORITE_HASH
,
help
=
'The hash algorithm to use: one of %s'
%
', '
.
join
(
STRONG_HASHES
))
self
.
parser
.
insert_option_group
(
0
,
self
.
cmd_opts
)
def
run
(
self
,
options
,
args
):
if
not
args
:
self
.
parser
.
print_usage
(
sys
.
stderr
)
return
ERROR
algorithm
=
options
.
algorithm
for
path
in
args
:
write_output
(
'%s:
\n
--hash=%s:%s'
,
path
,
algorithm
,
_hash_of_file
(
path
,
algorithm
))
def
_hash_of_file
(
path
,
algorithm
):
"""Return the hash digest of a file."""
with
open
(
path
,
'rb'
)
as
archive
:
hash
=
hashlib
.
new
(
algorithm
)
for
chunk
in
read_chunks
(
archive
):
hash
.
update
(
chunk
)
return
hash
.
hexdigest
()
env/lib/python3.5/site-packages/pip/_internal/commands/help.py
0 → 100644
View file @
ff4a13ed
# The following comment should be removed at some point in the future.
# mypy: disallow-untyped-defs=False
from
__future__
import
absolute_import
from
pip._internal.cli.base_command
import
Command
from
pip._internal.cli.status_codes
import
SUCCESS
from
pip._internal.exceptions
import
CommandError
class
HelpCommand
(
Command
):
"""Show help for commands"""
usage
=
"""
%prog <command>"""
ignore_require_venv
=
True
def
run
(
self
,
options
,
args
):
from
pip._internal.commands
import
(
commands_dict
,
create_command
,
get_similar_commands
,
)
try
:
# 'pip help' with no args is handled by pip.__init__.parseopt()
cmd_name
=
args
[
0
]
# the command we need help for
except
IndexError
:
return
SUCCESS
if
cmd_name
not
in
commands_dict
:
guess
=
get_similar_commands
(
cmd_name
)
msg
=
[
'unknown command "%s"'
%
cmd_name
]
if
guess
:
msg
.
append
(
'maybe you meant "%s"'
%
guess
)
raise
CommandError
(
' - '
.
join
(
msg
))
command
=
create_command
(
cmd_name
)
command
.
parser
.
print_help
()
return
SUCCESS
env/lib/python3.5/site-packages/pip/_internal/commands/install.py
0 → 100644
View file @
ff4a13ed
# The following comment should be removed at some point in the future.
# It's included for now because without it InstallCommand.run() has a
# couple errors where we have to know req.name is str rather than
# Optional[str] for the InstallRequirement req.
# mypy: strict-optional=False
# mypy: disallow-untyped-defs=False
from
__future__
import
absolute_import
import
errno
import
logging
import
operator
import
os
import
shutil
import
site
from
optparse
import
SUPPRESS_HELP
from
pip._vendor
import
pkg_resources
from
pip._vendor.packaging.utils
import
canonicalize_name
from
pip._internal.cache
import
WheelCache
from
pip._internal.cli
import
cmdoptions
from
pip._internal.cli.cmdoptions
import
make_target_python
from
pip._internal.cli.req_command
import
RequirementCommand
from
pip._internal.cli.status_codes
import
ERROR
,
SUCCESS
from
pip._internal.exceptions
import
(
CommandError
,
InstallationError
,
PreviousBuildDirError
,
)
from
pip._internal.locations
import
distutils_scheme
from
pip._internal.operations.check
import
check_install_conflicts
from
pip._internal.req
import
RequirementSet
,
install_given_reqs
from
pip._internal.req.req_tracker
import
get_requirement_tracker
from
pip._internal.utils.deprecation
import
deprecated
from
pip._internal.utils.distutils_args
import
parse_distutils_args
from
pip._internal.utils.filesystem
import
test_writable_dir
from
pip._internal.utils.misc
import
(
ensure_dir
,
get_installed_version
,
protect_pip_from_modification_on_windows
,
write_output
,
)
from
pip._internal.utils.temp_dir
import
TempDirectory
from
pip._internal.utils.typing
import
MYPY_CHECK_RUNNING
from
pip._internal.utils.virtualenv
import
virtualenv_no_global
from
pip._internal.wheel_builder
import
build
,
should_build_for_install_command
if
MYPY_CHECK_RUNNING
:
from
optparse
import
Values
from
typing
import
Any
,
Iterable
,
List
,
Optional
from
pip._internal.models.format_control
import
FormatControl
from
pip._internal.req.req_install
import
InstallRequirement
from
pip._internal.wheel_builder
import
BinaryAllowedPredicate
logger
=
logging
.
getLogger
(
__name__
)
def
get_check_binary_allowed
(
format_control
):
# type: (FormatControl) -> BinaryAllowedPredicate
def
check_binary_allowed
(
req
):
# type: (InstallRequirement) -> bool
if
req
.
use_pep517
:
return
True
canonical_name
=
canonicalize_name
(
req
.
name
)
allowed_formats
=
format_control
.
get_allowed_formats
(
canonical_name
)
return
"binary"
in
allowed_formats
return
check_binary_allowed
class
InstallCommand
(
RequirementCommand
):
"""
Install packages from:
- PyPI (and other indexes) using requirement specifiers.
- VCS project urls.
- Local project directories.
- Local or remote source archives.
pip also supports installing from "requirements files", which provide
an easy way to specify a whole environment to be installed.
"""
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> ..."""
def
__init__
(
self
,
*
args
,
**
kw
):
super
(
InstallCommand
,
self
).
__init__
(
*
args
,
**
kw
)
cmd_opts
=
self
.
cmd_opts
cmd_opts
.
add_option
(
cmdoptions
.
requirements
())
cmd_opts
.
add_option
(
cmdoptions
.
constraints
())
cmd_opts
.
add_option
(
cmdoptions
.
no_deps
())
cmd_opts
.
add_option
(
cmdoptions
.
pre
())
cmd_opts
.
add_option
(
cmdoptions
.
editable
())
cmd_opts
.
add_option
(
'-t'
,
'--target'
,
dest
=
'target_dir'
,
metavar
=
'dir'
,
default
=
None
,
help
=
'Install packages into <dir>. '
'By default this will not replace existing files/folders in '
'<dir>. Use --upgrade to replace existing packages in <dir> '
'with new versions.'
)
cmdoptions
.
add_target_python_options
(
cmd_opts
)
cmd_opts
.
add_option
(
'--user'
,
dest
=
'use_user_site'
,
action
=
'store_true'
,
help
=
"Install to the Python user install directory for your "
"platform. Typically ~/.local/, or %APPDATA%
\\
Python on "
"Windows. (See the Python documentation for site.USER_BASE "
"for full details.)"
)
cmd_opts
.
add_option
(
'--no-user'
,
dest
=
'use_user_site'
,
action
=
'store_false'
,
help
=
SUPPRESS_HELP
)
cmd_opts
.
add_option
(
'--root'
,
dest
=
'root_path'
,
metavar
=
'dir'
,
default
=
None
,
help
=
"Install everything relative to this alternate root "
"directory."
)
cmd_opts
.
add_option
(
'--prefix'
,
dest
=
'prefix_path'
,
metavar
=
'dir'
,
default
=
None
,
help
=
"Installation prefix where lib, bin and other top-level "
"folders are placed"
)
cmd_opts
.
add_option
(
cmdoptions
.
build_dir
())
cmd_opts
.
add_option
(
cmdoptions
.
src
())
cmd_opts
.
add_option
(
'-U'
,
'--upgrade'
,
dest
=
'upgrade'
,
action
=
'store_true'
,
help
=
'Upgrade all specified packages to the newest available '
'version. The handling of dependencies depends on the '
'upgrade-strategy used.'
)
cmd_opts
.
add_option
(
'--upgrade-strategy'
,
dest
=
'upgrade_strategy'
,
default
=
'only-if-needed'
,
choices
=
[
'only-if-needed'
,
'eager'
],
help
=
'Determines how dependency upgrading should be handled '
'[default: %default]. '
'"eager" - dependencies are upgraded regardless of '
'whether the currently installed version satisfies the '
'requirements of the upgraded package(s). '
'"only-if-needed" - are upgraded only when they do not '
'satisfy the requirements of the upgraded package(s).'
)
cmd_opts
.
add_option
(
'--force-reinstall'
,
dest
=
'force_reinstall'
,
action
=
'store_true'
,
help
=
'Reinstall all packages even if they are already '
'up-to-date.'
)
cmd_opts
.
add_option
(
'-I'
,
'--ignore-installed'
,
dest
=
'ignore_installed'
,
action
=
'store_true'
,
help
=
'Ignore the installed packages, overwriting them. '
'This can break your system if the existing package '
'is of a different version or was installed '
'with a different package manager!'
)
cmd_opts
.
add_option
(
cmdoptions
.
ignore_requires_python
())
cmd_opts
.
add_option
(
cmdoptions
.
no_build_isolation
())
cmd_opts
.
add_option
(
cmdoptions
.
use_pep517
())
cmd_opts
.
add_option
(
cmdoptions
.
no_use_pep517
())
cmd_opts
.
add_option
(
cmdoptions
.
install_options
())
cmd_opts
.
add_option
(
cmdoptions
.
global_options
())
cmd_opts
.
add_option
(
"--compile"
,
action
=
"store_true"
,
dest
=
"compile"
,
default
=
True
,
help
=
"Compile Python source files to bytecode"
,
)
cmd_opts
.
add_option
(
"--no-compile"
,
action
=
"store_false"
,
dest
=
"compile"
,
help
=
"Do not compile Python source files to bytecode"
,
)
cmd_opts
.
add_option
(
"--no-warn-script-location"
,
action
=
"store_false"
,
dest
=
"warn_script_location"
,
default
=
True
,
help
=
"Do not warn when installing scripts outside PATH"
,
)
cmd_opts
.
add_option
(
"--no-warn-conflicts"
,
action
=
"store_false"
,
dest
=
"warn_about_conflicts"
,
default
=
True
,
help
=
"Do not warn about broken dependencies"
,
)
cmd_opts
.
add_option
(
cmdoptions
.
no_binary
())
cmd_opts
.
add_option
(
cmdoptions
.
only_binary
())
cmd_opts
.
add_option
(
cmdoptions
.
prefer_binary
())
cmd_opts
.
add_option
(
cmdoptions
.
no_clean
())
cmd_opts
.
add_option
(
cmdoptions
.
require_hashes
())
cmd_opts
.
add_option
(
cmdoptions
.
progress_bar
())
index_opts
=
cmdoptions
.
make_option_group
(
cmdoptions
.
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
):
# type: (Values, List[Any]) -> int
cmdoptions
.
check_install_build_global
(
options
)
upgrade_strategy
=
"to-satisfy-only"
if
options
.
upgrade
:
upgrade_strategy
=
options
.
upgrade_strategy
cmdoptions
.
check_dist_restriction
(
options
,
check_target
=
True
)
install_options
=
options
.
install_options
or
[]
options
.
use_user_site
=
decide_user_install
(
options
.
use_user_site
,
prefix_path
=
options
.
prefix_path
,
target_dir
=
options
.
target_dir
,
root_path
=
options
.
root_path
,
isolated_mode
=
options
.
isolated_mode
,
)
target_temp_dir
=
None
# type: Optional[TempDirectory]
target_temp_dir_path
=
None
# type: Optional[str]
if
options
.
target_dir
:
options
.
ignore_installed
=
True
options
.
target_dir
=
os
.
path
.
abspath
(
options
.
target_dir
)
if
(
os
.
path
.
exists
(
options
.
target_dir
)
and
not
os
.
path
.
isdir
(
options
.
target_dir
)):
raise
CommandError
(
"Target path exists but is not a directory, will not "
"continue."
)
# Create a target directory for using with the target option
target_temp_dir
=
TempDirectory
(
kind
=
"target"
)
target_temp_dir_path
=
target_temp_dir
.
path
global_options
=
options
.
global_options
or
[]
session
=
self
.
get_default_session
(
options
)
target_python
=
make_target_python
(
options
)
finder
=
self
.
_build_package_finder
(
options
=
options
,
session
=
session
,
target_python
=
target_python
,
ignore_requires_python
=
options
.
ignore_requires_python
,
)
build_delete
=
(
not
(
options
.
no_clean
or
options
.
build_dir
))
wheel_cache
=
WheelCache
(
options
.
cache_dir
,
options
.
format_control
)
with
get_requirement_tracker
()
as
req_tracker
,
TempDirectory
(
options
.
build_dir
,
delete
=
build_delete
,
kind
=
"install"
)
as
directory
:
requirement_set
=
RequirementSet
(
check_supported_wheels
=
not
options
.
target_dir
,
)
try
:
self
.
populate_requirement_set
(
requirement_set
,
args
,
options
,
finder
,
session
,
wheel_cache
)
warn_deprecated_install_options
(
requirement_set
,
options
.
install_options
)
preparer
=
self
.
make_requirement_preparer
(
temp_build_dir
=
directory
,
options
=
options
,
req_tracker
=
req_tracker
,
session
=
session
,
finder
=
finder
,
use_user_site
=
options
.
use_user_site
,
)
resolver
=
self
.
make_resolver
(
preparer
=
preparer
,
finder
=
finder
,
options
=
options
,
wheel_cache
=
wheel_cache
,
use_user_site
=
options
.
use_user_site
,
ignore_installed
=
options
.
ignore_installed
,
ignore_requires_python
=
options
.
ignore_requires_python
,
force_reinstall
=
options
.
force_reinstall
,
upgrade_strategy
=
upgrade_strategy
,
use_pep517
=
options
.
use_pep517
,
)
self
.
trace_basic_info
(
finder
)
resolver
.
resolve
(
requirement_set
)
try
:
pip_req
=
requirement_set
.
get_requirement
(
"pip"
)
except
KeyError
:
modifying_pip
=
None
else
:
# If we're not replacing an already installed pip,
# we're not modifying it.
modifying_pip
=
pip_req
.
satisfied_by
is
None
protect_pip_from_modification_on_windows
(
modifying_pip
=
modifying_pip
)
check_binary_allowed
=
get_check_binary_allowed
(
finder
.
format_control
)
reqs_to_build
=
[
r
for
r
in
requirement_set
.
requirements
.
values
()
if
should_build_for_install_command
(
r
,
check_binary_allowed
)
]
_
,
build_failures
=
build
(
reqs_to_build
,
wheel_cache
=
wheel_cache
,
build_options
=
[],
global_options
=
[],
)
# If we're using PEP 517, we cannot do a direct install
# so we fail here.
# We don't care about failures building legacy
# requirements, as we'll fall through to a direct
# install for those.
pep517_build_failures
=
[
r
for
r
in
build_failures
if
r
.
use_pep517
]
if
pep517_build_failures
:
raise
InstallationError
(
"Could not build wheels for {} which use"
" PEP 517 and cannot be installed directly"
.
format
(
", "
.
join
(
r
.
name
for
r
in
pep517_build_failures
)))
to_install
=
resolver
.
get_installation_order
(
requirement_set
)
# Consistency Checking of the package set we're installing.
should_warn_about_conflicts
=
(
not
options
.
ignore_dependencies
and
options
.
warn_about_conflicts
)
if
should_warn_about_conflicts
:
self
.
_warn_about_conflicts
(
to_install
)
# Don't warn about script install locations if
# --target has been specified
warn_script_location
=
options
.
warn_script_location
if
options
.
target_dir
:
warn_script_location
=
False
installed
=
install_given_reqs
(
to_install
,
install_options
,
global_options
,
root
=
options
.
root_path
,
home
=
target_temp_dir_path
,
prefix
=
options
.
prefix_path
,
pycompile
=
options
.
compile
,
warn_script_location
=
warn_script_location
,
use_user_site
=
options
.
use_user_site
,
)
lib_locations
=
get_lib_location_guesses
(
user
=
options
.
use_user_site
,
home
=
target_temp_dir_path
,
root
=
options
.
root_path
,
prefix
=
options
.
prefix_path
,
isolated
=
options
.
isolated_mode
,
)
working_set
=
pkg_resources
.
WorkingSet
(
lib_locations
)
installed
.
sort
(
key
=
operator
.
attrgetter
(
'name'
))
items
=
[]
for
result
in
installed
:
item
=
result
.
name
try
:
installed_version
=
get_installed_version
(
result
.
name
,
working_set
=
working_set
)
if
installed_version
:
item
+=
'-'
+
installed_version
except
Exception
:
pass
items
.
append
(
item
)
installed_desc
=
' '
.
join
(
items
)
if
installed_desc
:
write_output
(
'Successfully installed %s'
,
installed_desc
,
)
except
EnvironmentError
as
error
:
show_traceback
=
(
self
.
verbosity
>=
1
)
message
=
create_env_error_message
(
error
,
show_traceback
,
options
.
use_user_site
,
)
logger
.
error
(
message
,
exc_info
=
show_traceback
)
return
ERROR
except
PreviousBuildDirError
:
options
.
no_clean
=
True
raise
finally
:
# Clean up
if
not
options
.
no_clean
:
requirement_set
.
cleanup_files
()
wheel_cache
.
cleanup
()
if
options
.
target_dir
:
self
.
_handle_target_dir
(
options
.
target_dir
,
target_temp_dir
,
options
.
upgrade
)
return
SUCCESS
def
_handle_target_dir
(
self
,
target_dir
,
target_temp_dir
,
upgrade
):
ensure_dir
(
target_dir
)
# Checking both purelib and platlib directories for installed
# packages to be moved to target directory
lib_dir_list
=
[]
with
target_temp_dir
:
# Checking both purelib and platlib directories for installed
# packages to be moved to target directory
scheme
=
distutils_scheme
(
''
,
home
=
target_temp_dir
.
path
)
purelib_dir
=
scheme
[
'purelib'
]
platlib_dir
=
scheme
[
'platlib'
]
data_dir
=
scheme
[
'data'
]
if
os
.
path
.
exists
(
purelib_dir
):
lib_dir_list
.
append
(
purelib_dir
)
if
os
.
path
.
exists
(
platlib_dir
)
and
platlib_dir
!=
purelib_dir
:
lib_dir_list
.
append
(
platlib_dir
)
if
os
.
path
.
exists
(
data_dir
):
lib_dir_list
.
append
(
data_dir
)
for
lib_dir
in
lib_dir_list
:
for
item
in
os
.
listdir
(
lib_dir
):
if
lib_dir
==
data_dir
:
ddir
=
os
.
path
.
join
(
data_dir
,
item
)
if
any
(
s
.
startswith
(
ddir
)
for
s
in
lib_dir_list
[:
-
1
]):
continue
target_item_dir
=
os
.
path
.
join
(
target_dir
,
item
)
if
os
.
path
.
exists
(
target_item_dir
):
if
not
upgrade
:
logger
.
warning
(
'Target directory %s already exists. Specify '
'--upgrade to force replacement.'
,
target_item_dir
)
continue
if
os
.
path
.
islink
(
target_item_dir
):
logger
.
warning
(
'Target directory %s already exists and is '
'a link. Pip will not automatically replace '
'links, please remove if replacement is '
'desired.'
,
target_item_dir
)
continue
if
os
.
path
.
isdir
(
target_item_dir
):
shutil
.
rmtree
(
target_item_dir
)
else
:
os
.
remove
(
target_item_dir
)
shutil
.
move
(
os
.
path
.
join
(
lib_dir
,
item
),
target_item_dir
)
def
_warn_about_conflicts
(
self
,
to_install
):
try
:
package_set
,
_dep_info
=
check_install_conflicts
(
to_install
)
except
Exception
:
logger
.
error
(
"Error checking for conflicts."
,
exc_info
=
True
)
return
missing
,
conflicting
=
_dep_info
# NOTE: There is some duplication here from pip check
for
project_name
in
missing
:
version
=
package_set
[
project_name
][
0
]
for
dependency
in
missing
[
project_name
]:
logger
.
critical
(
"%s %s requires %s, which is not installed."
,
project_name
,
version
,
dependency
[
1
],
)
for
project_name
in
conflicting
:
version
=
package_set
[
project_name
][
0
]
for
dep_name
,
dep_version
,
req
in
conflicting
[
project_name
]:
logger
.
critical
(
"%s %s has requirement %s, but you'll have %s %s which is "
"incompatible."
,
project_name
,
version
,
req
,
dep_name
,
dep_version
,
)
def
get_lib_location_guesses
(
*
args
,
**
kwargs
):
scheme
=
distutils_scheme
(
''
,
*
args
,
**
kwargs
)
return
[
scheme
[
'purelib'
],
scheme
[
'platlib'
]]
def
site_packages_writable
(
**
kwargs
):
return
all
(
test_writable_dir
(
d
)
for
d
in
set
(
get_lib_location_guesses
(
**
kwargs
))
)
def
decide_user_install
(
use_user_site
,
# type: Optional[bool]
prefix_path
=
None
,
# type: Optional[str]
target_dir
=
None
,
# type: Optional[str]
root_path
=
None
,
# type: Optional[str]
isolated_mode
=
False
,
# type: bool
):
# type: (...) -> bool
"""Determine whether to do a user install based on the input options.
If use_user_site is False, no additional checks are done.
If use_user_site is True, it is checked for compatibility with other
options.
If use_user_site is None, the default behaviour depends on the environment,
which is provided by the other arguments.
"""
# In some cases (config from tox), use_user_site can be set to an integer
# rather than a bool, which 'use_user_site is False' wouldn't catch.
if
(
use_user_site
is
not
None
)
and
(
not
use_user_site
):
logger
.
debug
(
"Non-user install by explicit request"
)
return
False
if
use_user_site
:
if
prefix_path
:
raise
CommandError
(
"Can not combine '--user' and '--prefix' as they imply "
"different installation locations"
)
if
virtualenv_no_global
():
raise
InstallationError
(
"Can not perform a '--user' install. User site-packages "
"are not visible in this virtualenv."
)
logger
.
debug
(
"User install by explicit request"
)
return
True
# If we are here, user installs have not been explicitly requested/avoided
assert
use_user_site
is
None
# user install incompatible with --prefix/--target
if
prefix_path
or
target_dir
:
logger
.
debug
(
"Non-user install due to --prefix or --target option"
)
return
False
# If user installs are not enabled, choose a non-user install
if
not
site
.
ENABLE_USER_SITE
:
logger
.
debug
(
"Non-user install because user site-packages disabled"
)
return
False
# If we have permission for a non-user install, do that,
# otherwise do a user install.
if
site_packages_writable
(
root
=
root_path
,
isolated
=
isolated_mode
):
logger
.
debug
(
"Non-user install because site-packages writeable"
)
return
False
logger
.
info
(
"Defaulting to user installation because normal site-packages "
"is not writeable"
)
return
True
def
warn_deprecated_install_options
(
requirement_set
,
options
):
# type: (RequirementSet, Optional[List[str]]) -> None
"""If any location-changing --install-option arguments were passed for
requirements or on the command-line, then show a deprecation warning.
"""
def
format_options
(
option_names
):
# type: (Iterable[str]) -> List[str]
return
[
"--{}"
.
format
(
name
.
replace
(
"_"
,
"-"
))
for
name
in
option_names
]
requirements
=
(
requirement_set
.
unnamed_requirements
+
list
(
requirement_set
.
requirements
.
values
())
)
offenders
=
[]
for
requirement
in
requirements
:
install_options
=
requirement
.
options
.
get
(
"install_options"
,
[])
location_options
=
parse_distutils_args
(
install_options
)
if
location_options
:
offenders
.
append
(
"{!r} from {}"
.
format
(
format_options
(
location_options
.
keys
()),
requirement
)
)
if
options
:
location_options
=
parse_distutils_args
(
options
)
if
location_options
:
offenders
.
append
(
"{!r} from command line"
.
format
(
format_options
(
location_options
.
keys
())
)
)
if
not
offenders
:
return
deprecated
(
reason
=
(
"Location-changing options found in --install-option: {}. "
"This configuration may cause unexpected behavior and is "
"unsupported."
.
format
(
"; "
.
join
(
offenders
)
)
),
replacement
=
(
"using pip-level options like --user, --prefix, --root, and "
"--target"
),
gone_in
=
"20.2"
,
issue
=
7309
,
)
def
create_env_error_message
(
error
,
show_traceback
,
using_user_site
):
"""Format an error message for an EnvironmentError
It may occur anytime during the execution of the install command.
"""
parts
=
[]
# Mention the error if we are not going to show a traceback
parts
.
append
(
"Could not install packages due to an EnvironmentError"
)
if
not
show_traceback
:
parts
.
append
(
": "
)
parts
.
append
(
str
(
error
))
else
:
parts
.
append
(
"."
)
# Spilt the error indication from a helper message (if any)
parts
[
-
1
]
+=
"
\n
"
# Suggest useful actions to the user:
# (1) using user site-packages or (2) verifying the permissions
if
error
.
errno
==
errno
.
EACCES
:
user_option_part
=
"Consider using the `--user` option"
permissions_part
=
"Check the permissions"
if
not
using_user_site
:
parts
.
extend
([
user_option_part
,
" or "
,
permissions_part
.
lower
(),
])
else
:
parts
.
append
(
permissions_part
)
parts
.
append
(
".
\n
"
)
return
""
.
join
(
parts
).
strip
()
+
"
\n
"
Prev
1
…
16
17
18
19
20
Next
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment