From 7ee1a554d070ddb0ffb8c44ea86042a8c6fa1b72 Mon Sep 17 00:00:00 2001 From: Hugo Date: Sun, 10 Mar 2019 23:37:41 +0200 Subject: [PATCH 1/3] pip-wheel-metadata doesn't need to persist between pip invocations --- .gitignore | 1 - news/6213.bugfix | 1 + src/pip/_internal/req/req_install.py | 31 ++++++++++++++-------------- 3 files changed, 17 insertions(+), 16 deletions(-) create mode 100644 news/6213.bugfix diff --git a/.gitignore b/.gitignore index 276d24d4d3d..6c387e2f0d0 100644 --- a/.gitignore +++ b/.gitignore @@ -27,7 +27,6 @@ nosetests.xml coverage.xml *.cover tests/data/common_wheels/ -pip-wheel-metadata # Misc *~ diff --git a/news/6213.bugfix b/news/6213.bugfix new file mode 100644 index 00000000000..08a2483fc80 --- /dev/null +++ b/news/6213.bugfix @@ -0,0 +1 @@ +The ``pip-wheel-metadata`` directory does not need to persist between invocations of pip, use a temporary directory instead of the current ``setup.py`` directory. diff --git a/src/pip/_internal/req/req_install.py b/src/pip/_internal/req/req_install.py index ddca56861ae..4ac290c1b42 100644 --- a/src/pip/_internal/req/req_install.py +++ b/src/pip/_internal/req/req_install.py @@ -556,23 +556,24 @@ def prepare_pep517_metadata(self): # type: () -> None assert self.pep517_backend is not None - metadata_dir = os.path.join( - self.setup_py_dir, - 'pip-wheel-metadata' - ) - ensure_dir(metadata_dir) - - with self.build_env: - # Note that Pep517HookCaller implements a fallback for - # prepare_metadata_for_build_wheel, so we don't have to - # consider the possibility that this hook doesn't exist. - backend = self.pep517_backend - self.spin_message = "Preparing wheel metadata" - distinfo_dir = backend.prepare_metadata_for_build_wheel( - metadata_dir + with TempDirectory(delete=False) as temp_dir: + metadata_dir = os.path.join( + temp_dir.path, + 'pip-wheel-metadata', ) + ensure_dir(metadata_dir) + + with self.build_env: + # Note that Pep517HookCaller implements a fallback for + # prepare_metadata_for_build_wheel, so we don't have to + # consider the possibility that this hook doesn't exist. + backend = self.pep517_backend + self.spin_message = "Preparing wheel metadata" + distinfo_dir = backend.prepare_metadata_for_build_wheel( + metadata_dir + ) - self.metadata_directory = os.path.join(metadata_dir, distinfo_dir) + self.metadata_directory = os.path.join(metadata_dir, distinfo_dir) def run_egg_info(self): # type: () -> None From 820f8bb87e660122f52895f729f7eb7f16fb194d Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 11 Mar 2019 15:03:11 +0200 Subject: [PATCH 2/3] Clean up temporary directory at exit --- src/pip/_internal/req/req_install.py | 41 +++++++++++++++++----------- 1 file changed, 25 insertions(+), 16 deletions(-) diff --git a/src/pip/_internal/req/req_install.py b/src/pip/_internal/req/req_install.py index 4ac290c1b42..2e883964ab8 100644 --- a/src/pip/_internal/req/req_install.py +++ b/src/pip/_internal/req/req_install.py @@ -1,5 +1,6 @@ from __future__ import absolute_import +import atexit import logging import os import shutil @@ -552,28 +553,36 @@ def prepare_metadata(self): ) self.req = Requirement(metadata_name) + def cleanup(self): + # type: () -> None + if self._temp_dir is not None: + self._temp_dir.cleanup() + def prepare_pep517_metadata(self): # type: () -> None assert self.pep517_backend is not None - with TempDirectory(delete=False) as temp_dir: - metadata_dir = os.path.join( - temp_dir.path, - 'pip-wheel-metadata', - ) - ensure_dir(metadata_dir) + self._temp_dir = TempDirectory(delete=False, kind="req-install") + self._temp_dir.create() + metadata_dir = os.path.join( + self._temp_dir.path, + 'pip-wheel-metadata', + ) + atexit.register(self.cleanup) - with self.build_env: - # Note that Pep517HookCaller implements a fallback for - # prepare_metadata_for_build_wheel, so we don't have to - # consider the possibility that this hook doesn't exist. - backend = self.pep517_backend - self.spin_message = "Preparing wheel metadata" - distinfo_dir = backend.prepare_metadata_for_build_wheel( - metadata_dir - ) + ensure_dir(metadata_dir) + + with self.build_env: + # Note that Pep517HookCaller implements a fallback for + # prepare_metadata_for_build_wheel, so we don't have to + # consider the possibility that this hook doesn't exist. + backend = self.pep517_backend + self.spin_message = "Preparing wheel metadata" + distinfo_dir = backend.prepare_metadata_for_build_wheel( + metadata_dir + ) - self.metadata_directory = os.path.join(metadata_dir, distinfo_dir) + self.metadata_directory = os.path.join(metadata_dir, distinfo_dir) def run_egg_info(self): # type: () -> None From 1bcc718804ebb3eef40c9f2feee3666981cd5711 Mon Sep 17 00:00:00 2001 From: Hugo Date: Thu, 14 Mar 2019 11:10:57 +0200 Subject: [PATCH 3/3] Add note: This needs to be refactored to stop using atexit --- src/pip/_internal/req/req_install.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pip/_internal/req/req_install.py b/src/pip/_internal/req/req_install.py index 2e883964ab8..4333d693625 100644 --- a/src/pip/_internal/req/req_install.py +++ b/src/pip/_internal/req/req_install.py @@ -562,6 +562,7 @@ def prepare_pep517_metadata(self): # type: () -> None assert self.pep517_backend is not None + # NOTE: This needs to be refactored to stop using atexit self._temp_dir = TempDirectory(delete=False, kind="req-install") self._temp_dir.create() metadata_dir = os.path.join(