From 02b678f55776a8a462e35b18bbe754b65f09e9d2 Mon Sep 17 00:00:00 2001 From: Benoit Pierre Date: Sun, 15 Apr 2018 00:33:28 +0200 Subject: [PATCH] fix PEP 518 support when pip is installed in the user site Do not use the build environment isolation during the build dependencies installation. --- news/5524.bugfix | 1 + src/pip/_internal/operations/prepare.py | 6 ++++-- tests/conftest.py | 18 +++++++++++------- tests/functional/test_install.py | 23 +++++++++++++++++++++++ 4 files changed, 39 insertions(+), 9 deletions(-) create mode 100644 news/5524.bugfix diff --git a/news/5524.bugfix b/news/5524.bugfix new file mode 100644 index 00000000000..4d841e1877f --- /dev/null +++ b/news/5524.bugfix @@ -0,0 +1 @@ +Fix PEP 518 support when pip is installed in the user site. diff --git a/src/pip/_internal/operations/prepare.py b/src/pip/_internal/operations/prepare.py index 7d1297ea00b..27e3a5dd32e 100644 --- a/src/pip/_internal/operations/prepare.py +++ b/src/pip/_internal/operations/prepare.py @@ -144,8 +144,10 @@ def format_reqs(rs): ) if should_isolate: - with self.req.build_env as prefix: - _install_build_reqs(finder, prefix, build_requirements) + with self.req.build_env: + pass + _install_build_reqs(finder, self.req.build_env.path, + build_requirements) else: self.req.build_env = NoOpBuildEnvironment(no_clean=False) diff --git a/tests/conftest.py b/tests/conftest.py index defb500a4f9..1e927fc1389 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -137,20 +137,24 @@ def isolate(tmpdir): ) -@pytest.yield_fixture(scope='session') -def virtualenv_template(tmpdir_factory): - tmpdir = Path(str(tmpdir_factory.mktemp('virtualenv'))) - # Copy over our source tree so that each virtual environment is self - # contained - pip_src = tmpdir.join("pip_src").abspath +@pytest.fixture(scope='session') +def pip_src(tmpdir_factory): + pip_src = Path(str(tmpdir_factory.mktemp('pip_src'))).join('pip_src') + # Copy over our source tree so that each use is self contained shutil.copytree( SRC_DIR, - pip_src, + pip_src.abspath, ignore=shutil.ignore_patterns( "*.pyc", "__pycache__", "contrib", "docs", "tasks", "*.txt", "tests", "pip.egg-info", "build", "dist", ".tox", ".git", ), ) + return pip_src + + +@pytest.yield_fixture(scope='session') +def virtualenv_template(tmpdir_factory, pip_src): + tmpdir = Path(str(tmpdir_factory.mktemp('virtualenv'))) # Create the virtual environment venv = VirtualEnvironment.create( tmpdir.join("venv_orig"), diff --git a/tests/functional/test_install.py b/tests/functional/test_install.py index dc875d67b55..f616292997a 100644 --- a/tests/functional/test_install.py +++ b/tests/functional/test_install.py @@ -45,6 +45,29 @@ def test_pep518_uses_build_env(script, data, original_setuptools): ) +def test_pep518_with_user_pip(script, virtualenv, pip_src, data): + virtualenv.system_site_packages = True + script.pip("install", "--ignore-installed", "--user", pip_src) + system_pip_dir = script.site_packages_path / 'pip' + system_pip_dir.rmtree() + system_pip_dir.mkdir() + with open(system_pip_dir / '__init__.py', 'w') as fp: + fp.write('raise ImportError\n') + to_install = data.src.join("pep518-3.0") + for command in ('install', 'wheel'): + kwargs = {} + if sys.version_info[:2] == (3, 3): + # Ignore Python 3.3 deprecation warning... + kwargs['expect_stderr'] = True + script.run( + "python", "-c", + "import pip._internal; pip._internal.main([" + "%r, " "'-f', %r, " "%r, " + "])" % (command, str(data.packages), str(to_install)), + **kwargs + ) + + @pytest.mark.network def test_pip_second_command_line_interface_works(script, data): """