summaryrefslogtreecommitdiffstats
path: root/third_party/python/pip/pip/_internal/operations/build/wheel_editable.py
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/python/pip/pip/_internal/operations/build/wheel_editable.py')
-rw-r--r--third_party/python/pip/pip/_internal/operations/build/wheel_editable.py46
1 files changed, 46 insertions, 0 deletions
diff --git a/third_party/python/pip/pip/_internal/operations/build/wheel_editable.py b/third_party/python/pip/pip/_internal/operations/build/wheel_editable.py
new file mode 100644
index 0000000000..719d69dd80
--- /dev/null
+++ b/third_party/python/pip/pip/_internal/operations/build/wheel_editable.py
@@ -0,0 +1,46 @@
+import logging
+import os
+from typing import Optional
+
+from pip._vendor.pyproject_hooks import BuildBackendHookCaller, HookMissing
+
+from pip._internal.utils.subprocess import runner_with_spinner_message
+
+logger = logging.getLogger(__name__)
+
+
+def build_wheel_editable(
+ name: str,
+ backend: BuildBackendHookCaller,
+ metadata_directory: str,
+ tempd: str,
+) -> Optional[str]:
+ """Build one InstallRequirement using the PEP 660 build process.
+
+ Returns path to wheel if successfully built. Otherwise, returns None.
+ """
+ assert metadata_directory is not None
+ try:
+ logger.debug("Destination directory: %s", tempd)
+
+ runner = runner_with_spinner_message(
+ f"Building editable for {name} (pyproject.toml)"
+ )
+ with backend.subprocess_runner(runner):
+ try:
+ wheel_name = backend.build_editable(
+ tempd,
+ metadata_directory=metadata_directory,
+ )
+ except HookMissing as e:
+ logger.error(
+ "Cannot build editable %s because the build "
+ "backend does not have the %s hook",
+ name,
+ e,
+ )
+ return None
+ except Exception:
+ logger.error("Failed building editable for %s", name)
+ return None
+ return os.path.join(tempd, wheel_name)