diff --git a/news/6642.bugfix b/news/6642.bugfix new file mode 100644 index 000000000..470572ad6 --- /dev/null +++ b/news/6642.bugfix @@ -0,0 +1,2 @@ +Do not attempt to run ``setup.py clean`` after a ``pep517`` build error, +since a ``setup.py`` may not exist in that case. diff --git a/src/pip/_internal/wheel_builder.py b/src/pip/_internal/wheel_builder.py index b992bd676..35e4f9eff 100644 --- a/src/pip/_internal/wheel_builder.py +++ b/src/pip/_internal/wheel_builder.py @@ -231,11 +231,12 @@ def _build_one_inside_env( req.name, e, ) # Ignore return, we can't do anything else useful. - _clean_one(req, global_options) + if not req.use_pep517: + _clean_one_legacy(req, global_options) return None -def _clean_one(req, global_options): +def _clean_one_legacy(req, global_options): # type: (InstallRequirement, List[str]) -> bool clean_args = make_setuptools_clean_args( req.setup_py_path, diff --git a/tests/data/packages/pep517_wrapper_buildsys/mybuildsys.py b/tests/data/packages/pep517_wrapper_buildsys/mybuildsys.py index df391e96a..e2f920ba3 100644 --- a/tests/data/packages/pep517_wrapper_buildsys/mybuildsys.py +++ b/tests/data/packages/pep517_wrapper_buildsys/mybuildsys.py @@ -8,6 +8,9 @@ from setuptools.build_meta import (get_requires_for_build_sdist, def build_wheel(*a, **kw): + if os.environ.get("PIP_TEST_FAIL_BUILD_WHEEL"): + raise RuntimeError("Failing build_wheel, as requested.") + # Create the marker file to record that the hook was called with open(os.environ['PIP_TEST_MARKER_FILE'], 'wb'): pass diff --git a/tests/functional/test_install.py b/tests/functional/test_install.py index 8ae64319d..5548d792c 100644 --- a/tests/functional/test_install.py +++ b/tests/functional/test_install.py @@ -1256,6 +1256,7 @@ def test_cleanup_after_failed_wheel(script, with_wheel): shebang = open(script_py, 'r').readline().strip() assert shebang != '#!python', shebang # OK, assert that we *said* we were cleaning up: + # /!\ if in need to change this, also change test_pep517_no_legacy_cleanup assert "Running setup.py clean for wheelbrokenafter" in str(res), str(res) diff --git a/tests/functional/test_install_cleanup.py b/tests/functional/test_install_cleanup.py index dc87bc3f7..c6464e3ee 100644 --- a/tests/functional/test_install_cleanup.py +++ b/tests/functional/test_install_cleanup.py @@ -136,3 +136,19 @@ def test_cleanup_prevented_upon_build_dir_exception(script, data): assert result.returncode == PREVIOUS_BUILD_DIR_ERROR, str(result) assert "pip can't proceed" in result.stderr, str(result) assert exists(build_simple), str(result) + + +@pytest.mark.network +def test_pep517_no_legacy_cleanup(script, data, with_wheel): + """Test a PEP 517 failed build does not attempt a legacy cleanup""" + to_install = data.packages.joinpath('pep517_wrapper_buildsys') + script.environ["PIP_TEST_FAIL_BUILD_WHEEL"] = "1" + res = script.pip( + 'install', '-f', data.find_links, to_install, + expect_error=True + ) + # Must not have built the package + expected = "Failed building wheel for pep517-wrapper-buildsys" + assert expected in str(res) + # Must not have attempted legacy cleanup + assert "setup.py clean" not in str(res)