Skip to content

Commit

Permalink
Merge pull request pypa#11076 from pradyunsg/improve-protected-pip
Browse files Browse the repository at this point in the history
Rename `tox_pip.py` to `protected_pip.py`
  • Loading branch information
pradyunsg authored Apr 29, 2022
2 parents cdeb8f9 + 84ee57d commit 04f754d
Show file tree
Hide file tree
Showing 3 changed files with 61 additions and 38 deletions.
2 changes: 1 addition & 1 deletion noxfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@

LOCATIONS = {
"common-wheels": "tests/data/common_wheels",
"protected-pip": "tools/tox_pip.py",
"protected-pip": "tools/protected_pip.py",
}
REQUIREMENTS = {
"docs": "docs/requirements.txt",
Expand Down
60 changes: 60 additions & 0 deletions tools/protected_pip.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
"""Maintain and use a protected copy of pip for use during development.
The protected copy of pip can be used to manipulate the environment while keeping a
potentially-non-functional installation of in-development pip in the development virtual
environment.
This allows for setting up the test environments and exercising the in-development code,
even when it is not functional-enough to install the packages for setting up the
environment that it is being used it.
"""

import os
import shutil
import subprocess
import sys
from glob import glob
from typing import List

VIRTUAL_ENV = os.environ["VIRTUAL_ENV"]
PROTECTED_PIP_DIR = os.path.join(VIRTUAL_ENV, "pip")


def _setup_protected_pip() -> None:
# This setup happens before any development version of pip is installed in this
# environment. So, at this point, the existing pip installation should be from a
# stable release and can be safely used to create the protected copy.
subprocess.check_call(
[
sys.executable,
"-m",
"pip",
"--disable-pip-version-check",
"install",
"-t",
PROTECTED_PIP_DIR,
"pip",
]
)
# Make it impossible for pip (and other Python tooling) to discover this protected
# installation of pip using the metadata, by deleting the metadata.
shutil.rmtree(glob(os.path.join(PROTECTED_PIP_DIR, "pip-*.dist-info"))[0])


def main(args: List[str]) -> None:
# If we don't have a protected pip, let's set it up.
if not os.path.exists(PROTECTED_PIP_DIR):
_setup_protected_pip()

# Run Python, with the protected pip copy on PYTHONPATH.
old_PYTHONPATH_entries = os.environ.get("PYTHONPATH", "").split(os.pathsep)
new_PYTHONPATH = os.pathsep.join([PROTECTED_PIP_DIR] + old_PYTHONPATH_entries)

subprocess.check_call(
[sys.executable, "-m", "pip"] + args,
env={"PYTHONPATH": new_PYTHONPATH},
)


if __name__ == "__main__":
main(sys.argv[1:])
37 changes: 0 additions & 37 deletions tools/tox_pip.py

This file was deleted.

0 comments on commit 04f754d

Please sign in to comment.