Repository: pypa/pip

Issue:
protect_pip_from_modification_on_windows check breaks some valid use cases
**Environment**

* pip version: 19.3.1
* Python version: 3.6.8
* OS: Windows

**Description**

The `protect_pip_from_modification_on_windows` check can error out on some valid use cases (with no attempt to modify the calling pip's executable that would run foul of Windows limitations). E.g.:
* `python src/pip install pip`
* `pip install -t target pip`
* ...

The [call when installing build requirements](https://github.com/pypa/pip/blob/master/src/pip/_internal/build_env.py#L172) is probably impacted too.

Setuptools test suite is hit by this issue: see [this code](https://github.com/pypa/setuptools/blob/master/tools/tox_pip.py#L25). Note that the issue does not seem to occur with Python 2.7.17: https://ci.appveyor.com/project/jaraco/setuptools/builds/28883044.


Discussion:
We should revert #6864 until we can figure this out. This is a pretty major bug that affects anyone doing pip-related development on Windows (like @uranusjr).

Resolving patch:
diff --git a/src/pip/_internal/utils/misc.py b/src/pip/_internal/utils/misc.py
--- a/src/pip/_internal/utils/misc.py
+++ b/src/pip/_internal/utils/misc.py
@@ -836,11 +836,11 @@ def protect_pip_from_modification_on_windows(modifying_pip):
     On Windows, any operation modifying pip should be run as:
         python -m pip ...
     """
-    pip_names = set()
-    for ext in ('', '.exe'):
-        pip_names.add('pip{ext}'.format(ext=ext))
-        pip_names.add('pip{}{ext}'.format(sys.version_info[0], ext=ext))
-        pip_names.add('pip{}.{}{ext}'.format(*sys.version_info[:2], ext=ext))
+    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 = (


Test patch:
diff --git a/tests/functional/test_install.py b/tests/functional/test_install.py
--- a/tests/functional/test_install.py
+++ b/tests/functional/test_install.py
@@ -10,7 +10,6 @@
 
 import pytest
 
-from pip import __version__ as pip_current_version
 from pip._internal.cli.status_codes import ERROR, SUCCESS
 from pip._internal.models.index import PyPI, TestPyPI
 from pip._internal.utils.misc import rmtree
@@ -1658,89 +1657,6 @@ def test_user_config_accepted(script):
     assert join(relative_user, 'simplewheel') in result.files_created
 
 
-@pytest.mark.network
-@pytest.mark.skipif("sys.platform != 'win32'")
-@pytest.mark.parametrize('pip_name', [
-    'pip',
-    'pip{}'.format(sys.version_info[0]),
-    'pip{}.{}'.format(*sys.version_info[:2]),
-    'pip.exe',
-    'pip{}.exe'.format(sys.version_info[0]),
-    'pip{}.{}.exe'.format(*sys.version_info[:2])
-])
-def test_protect_pip_from_modification_on_windows(script, pip_name):
-    """
-    Test that pip modification command using ``pip install ...``
-    raises an error on Windows.
-    """
-    command = [pip_name, 'install', 'pip != {}'.format(pip_current_version)]
-    result = script.run(*command, expect_error=True)
-    new_command = [sys.executable, '-m', 'pip'] + command[1:]
-    expected_message = (
-        'To modify pip, please run the following command:\n{}'
-        .format(' '.join(new_command))
-    )
-    assert expected_message in result.stderr, str(result)
-
-
-@pytest.mark.network
-@pytest.mark.skipif("sys.platform != 'win32'")
-def test_protect_pip_from_modification_via_deps_on_windows(script):
-    """
-    Test ``pip install pkga`` raises an error on Windows
-    if `pkga` implicitly tries to upgrade pip.
-    """
-    pkga_wheel_path = create_basic_wheel_for_package(
-        script,
-        'pkga', '0.1',
-        depends=['pip != {}'.format(pip_current_version)],
-    )
-
-    # Make sure pip install pkga raises an error
-    args = ['install', pkga_wheel_path]
-    result = script.pip(*args, expect_error=True, use_module=False)
-    new_command = [sys.executable, '-m', 'pip'] + args
-    expected_message = (
-        'To modify pip, please run the following command:\n{}'
-        .format(' '.join(new_command))
-    )
-    assert expected_message in result.stderr, str(result)
-
-
-@pytest.mark.network
-@pytest.mark.skipif("sys.platform != 'win32'")
-def test_protect_pip_from_modification_via_sub_deps_on_windows(script):
-    """
-    Test ``pip install pkga`` raises an error on Windows
-    if sub-dependencies of `pkga` implicitly tries to upgrade pip.
-    """
-    # Make a wheel for pkga which requires pkgb
-    pkga_wheel_path = create_basic_wheel_for_package(
-        script,
-        'pkga', '0.1',
-        depends=['pkgb'],
-    )
-
-    # Make a wheel for pkgb which requires pip
-    pkgb_wheel_path = create_basic_wheel_for_package(
-        script,
-        'pkgb', '0.1',
-        depends=['pip != {}'.format(pip_current_version)],
-    )
-
-    # Make sure pip install pkga raises an error
-    args = [
-        'install', pkga_wheel_path, '--find-links', pkgb_wheel_path.parent
-    ]
-    result = script.pip(*args, expect_error=True, use_module=False)
-    new_command = [sys.executable, '-m', 'pip'] + args
-    expected_message = (
-        'To modify pip, please run the following command:\n{}'
-        .format(' '.join(new_command))
-    )
-    assert expected_message in result.stderr, str(result)
-
-
 @pytest.mark.parametrize(
     'install_args, expected_message', [
         ([], 'Requirement already satisfied: pip in'),