mirror of https://github.com/pypa/pip
Merge pull request #5312 from pradyunsg/fix/windows-pip-blocker-message
Move Windows protection check to specific commands
This commit is contained in:
commit
e671005a52
|
@ -0,0 +1 @@
|
|||
Fix "pip wheel pip" being blocked by the "don't use pip to modify itself" check
|
|
@ -0,0 +1 @@
|
|||
Fix "pip wheel pip" being blocked by the "don't use pip to modify itself" check
|
|
@ -11,7 +11,6 @@ from pip._internal import cmdoptions
|
|||
from pip._internal.baseparser import (
|
||||
ConfigOptionParser, UpdatingDefaultsHelpFormatter,
|
||||
)
|
||||
from pip._internal.compat import WINDOWS
|
||||
from pip._internal.download import PipSession
|
||||
from pip._internal.exceptions import (
|
||||
BadCommand, CommandError, InstallationError, PreviousBuildDirError,
|
||||
|
@ -321,23 +320,6 @@ class RequirementCommand(Command):
|
|||
'You must give at least one requirement to %(name)s '
|
||||
'(see "pip help %(name)s")' % opts)
|
||||
|
||||
# On Windows, any operation modifying pip should be run as:
|
||||
# python -m pip ...
|
||||
# See https://github.com/pypa/pip/issues/1299 for more discussion
|
||||
should_show_use_python_msg = (
|
||||
WINDOWS and
|
||||
requirement_set.has_requirement("pip") and
|
||||
os.path.basename(sys.argv[0]).startswith("pip")
|
||||
)
|
||||
if should_show_use_python_msg:
|
||||
new_command = [
|
||||
sys.executable, "-m", "pip"
|
||||
] + sys.argv[1:]
|
||||
raise CommandError(
|
||||
'To modify pip, please run the following command:\n{}'
|
||||
.format(" ".join(new_command))
|
||||
)
|
||||
|
||||
def _build_package_finder(self, options, session,
|
||||
platform=None, python_versions=None,
|
||||
abi=None, implementation=None):
|
||||
|
|
|
@ -20,7 +20,10 @@ from pip._internal.req import RequirementSet, install_given_reqs
|
|||
from pip._internal.resolve import Resolver
|
||||
from pip._internal.status_codes import ERROR
|
||||
from pip._internal.utils.filesystem import check_path_owner
|
||||
from pip._internal.utils.misc import ensure_dir, get_installed_version
|
||||
from pip._internal.utils.misc import (
|
||||
ensure_dir, get_installed_version,
|
||||
protect_pip_from_modification_on_windows,
|
||||
)
|
||||
from pip._internal.utils.temp_dir import TempDirectory
|
||||
from pip._internal.wheel import WheelBuilder
|
||||
|
||||
|
@ -291,6 +294,10 @@ class InstallCommand(RequirementCommand):
|
|||
)
|
||||
resolver.resolve(requirement_set)
|
||||
|
||||
protect_pip_from_modification_on_windows(
|
||||
modifying_pip=requirement_set.has_requirement("pip")
|
||||
)
|
||||
|
||||
# If caching is disabled or wheel is not installed don't
|
||||
# try to build wheels.
|
||||
if wheel and options.cache_dir:
|
||||
|
|
|
@ -5,6 +5,7 @@ from pip._vendor.packaging.utils import canonicalize_name
|
|||
from pip._internal.basecommand import Command
|
||||
from pip._internal.exceptions import InstallationError
|
||||
from pip._internal.req import InstallRequirement, parse_requirements
|
||||
from pip._internal.utils.misc import protect_pip_from_modification_on_windows
|
||||
|
||||
|
||||
class UninstallCommand(Command):
|
||||
|
@ -63,6 +64,11 @@ class UninstallCommand(Command):
|
|||
'You must give at least one requirement to %(name)s (see '
|
||||
'"pip help %(name)s")' % dict(name=self.name)
|
||||
)
|
||||
|
||||
protect_pip_from_modification_on_windows(
|
||||
modifying_pip="pip" in reqs_to_uninstall
|
||||
)
|
||||
|
||||
for req in reqs_to_uninstall.values():
|
||||
uninstall_pathset = req.uninstall(
|
||||
auto_confirm=options.yes, verbose=self.verbosity > 0,
|
||||
|
|
|
@ -26,8 +26,10 @@ from pip._vendor.six import PY2
|
|||
from pip._vendor.six.moves import input
|
||||
from pip._vendor.six.moves.urllib import parse as urllib_parse
|
||||
|
||||
from pip._internal.compat import console_to_str, expanduser, stdlib_pkgs
|
||||
from pip._internal.exceptions import InstallationError
|
||||
from pip._internal.compat import (
|
||||
WINDOWS, console_to_str, expanduser, stdlib_pkgs,
|
||||
)
|
||||
from pip._internal.exceptions import CommandError, InstallationError
|
||||
from pip._internal.locations import (
|
||||
running_under_virtualenv, site_packages, user_site, virtualenv_no_global,
|
||||
write_delete_marker_file,
|
||||
|
@ -868,3 +870,32 @@ def remove_auth_from_url(url):
|
|||
)
|
||||
surl = urllib_parse.urlunsplit(url_pieces)
|
||||
return surl
|
||||
|
||||
|
||||
def protect_pip_from_modification_on_windows(modifying_pip):
|
||||
"""Protection of pip.exe from modification on Windows
|
||||
|
||||
On Windows, any operation modifying pip should be run as:
|
||||
python -m pip ...
|
||||
"""
|
||||
pip_names = [
|
||||
"pip.exe",
|
||||
"pip{}.exe".format(sys.version_info[0]),
|
||||
"pip{}.{}.exe".format(*sys.version_info[:2])
|
||||
]
|
||||
|
||||
# See https://github.com/pypa/pip/issues/1299 for more discussion
|
||||
should_show_use_python_msg = (
|
||||
modifying_pip and
|
||||
WINDOWS and
|
||||
os.path.basename(sys.argv[0]) in pip_names
|
||||
)
|
||||
|
||||
if should_show_use_python_msg:
|
||||
new_command = [
|
||||
sys.executable, "-m", "pip"
|
||||
] + sys.argv[1:]
|
||||
raise CommandError(
|
||||
'To modify pip, please run the following command:\n{}'
|
||||
.format(" ".join(new_command))
|
||||
)
|
||||
|
|
|
@ -40,9 +40,8 @@ def test_pep518_uses_build_env(script, data, common_wheels, command, variant):
|
|||
def test_pep518_with_user_pip(script, virtualenv, pip_src,
|
||||
data, common_wheels):
|
||||
virtualenv.system_site_packages = True
|
||||
script.pip_install_local("--ignore-installed",
|
||||
"-f", common_wheels,
|
||||
"--user", pip_src)
|
||||
script.pip("install", "--ignore-installed", "--user", pip_src,
|
||||
use_module=True)
|
||||
system_pip_dir = script.site_packages_path / 'pip'
|
||||
system_pip_dir.rmtree()
|
||||
system_pip_dir.mkdir()
|
||||
|
|
Loading…
Reference in New Issue