summaryrefslogtreecommitdiff
path: root/setuptools
diff options
context:
space:
mode:
authorAnderson Bravalheri <andersonbravalheri@gmail.com>2022-08-15 21:02:08 +0100
committerAnderson Bravalheri <andersonbravalheri@gmail.com>2022-08-15 21:02:08 +0100
commitbc68a60192ef5f54f8fc36c5d776f6dbabd6c1a2 (patch)
tree512ece8b5da12318e74541d4430f20da4fc54ed1 /setuptools
parentb5b195a4a21bfa49b32a5c0aa73237aa3ec74736 (diff)
parent01b8529d39d97e46367a29f7bcca5a9ab0ef5f47 (diff)
downloadpython-setuptools-git-bc68a60192ef5f54f8fc36c5d776f6dbabd6c1a2.tar.gz
Fix build_meta when metadata_directory=='.' (#3528)
Diffstat (limited to 'setuptools')
-rw-r--r--setuptools/build_meta.py18
-rw-r--r--setuptools/tests/test_build_meta.py17
2 files changed, 30 insertions, 5 deletions
diff --git a/setuptools/build_meta.py b/setuptools/build_meta.py
index 98fb148a..8ff9a5ce 100644
--- a/setuptools/build_meta.py
+++ b/setuptools/build_meta.py
@@ -40,6 +40,7 @@ from typing import Dict, Iterator, List, Optional, Union
import setuptools
import distutils
+from . import errors
from ._path import same_path
from ._reqs import parse_strings
from ._deprecation_warning import SetuptoolsDeprecationWarning
@@ -346,16 +347,23 @@ class _BuildMetaBackend(_ConfigSettingsTranslator):
Returns the basename of the info directory, e.g. `proj-0.0.0.dist-info`.
"""
- candidates = list(Path(metadata_directory).glob(f"**/*{suffix}/"))
- assert len(candidates) == 1, f"Exactly one {suffix} should have been produced"
- info_dir = candidates[0]
-
+ info_dir = self._find_info_directory(metadata_directory, suffix)
if not same_path(info_dir.parent, metadata_directory):
shutil.move(str(info_dir), metadata_directory)
# PEP 517 allow other files and dirs to exist in metadata_directory
-
return info_dir.name
+ def _find_info_directory(self, metadata_directory: str, suffix: str) -> Path:
+ for parent, dirs, _ in os.walk(metadata_directory):
+ candidates = [f for f in dirs if f.endswith(suffix)]
+
+ if len(candidates) != 0 or len(dirs) != 1:
+ assert len(candidates) == 1, f"Multiple {suffix} directories found"
+ return Path(parent, candidates[0])
+
+ msg = f"No {suffix} directory found in {metadata_directory}"
+ raise errors.InternalError(msg)
+
def prepare_metadata_for_build_wheel(self, metadata_directory,
config_settings=None):
sys.argv = [
diff --git a/setuptools/tests/test_build_meta.py b/setuptools/tests/test_build_meta.py
index e70c71bd..bf1c27ff 100644
--- a/setuptools/tests/test_build_meta.py
+++ b/setuptools/tests/test_build_meta.py
@@ -485,6 +485,23 @@ class TestBuildMetaBackend:
assert os.path.isfile(os.path.join(dist_dir, dist_info, 'METADATA'))
+ def test_prepare_metadata_inplace(self, build_backend):
+ """
+ Some users might pass metadata_directory pre-populated with `.tox` or `.venv`.
+ See issue #3523.
+ """
+ for pre_existing in [
+ ".tox/python/lib/python3.10/site-packages/attrs-22.1.0.dist-info",
+ ".tox/python/lib/python3.10/site-packages/autocommand-2.2.1.dist-info",
+ ".nox/python/lib/python3.10/site-packages/build-0.8.0.dist-info",
+ ".venv/python3.10/site-packages/click-8.1.3.dist-info",
+ "venv/python3.10/site-packages/distlib-0.3.5.dist-info",
+ "env/python3.10/site-packages/docutils-0.19.dist-info",
+ ]:
+ os.makedirs(pre_existing, exist_ok=True)
+ dist_info = build_backend.prepare_metadata_for_build_wheel(".")
+ assert os.path.isfile(os.path.join(dist_info, 'METADATA'))
+
def test_build_sdist_explicit_dist(self, build_backend):
# explicitly specifying the dist folder should work
# the folder sdist_directory and the ``--dist-dir`` can be the same