e60988d643e007801f79e8718354e7d00c7acf18
[SubU] /
1 """Metadata generation logic for legacy source distributions.
2 """
3
4 import logging
5 import os
6
7 from pip._internal.build_env import BuildEnvironment
8 from pip._internal.cli.spinners import open_spinner
9 from pip._internal.exceptions import (
10     InstallationError,
11     InstallationSubprocessError,
12     MetadataGenerationFailed,
13 )
14 from pip._internal.utils.setuptools_build import make_setuptools_egg_info_args
15 from pip._internal.utils.subprocess import call_subprocess
16 from pip._internal.utils.temp_dir import TempDirectory
17
18 logger = logging.getLogger(__name__)
19
20
21 def _find_egg_info(directory: str) -> str:
22     """Find an .egg-info subdirectory in `directory`."""
23     filenames = [f for f in os.listdir(directory) if f.endswith(".egg-info")]
24
25     if not filenames:
26         raise InstallationError(f"No .egg-info directory found in {directory}")
27
28     if len(filenames) > 1:
29         raise InstallationError(
30             "More than one .egg-info directory found in {}".format(directory)
31         )
32
33     return os.path.join(directory, filenames[0])
34
35
36 def generate_metadata(
37     build_env: BuildEnvironment,
38     setup_py_path: str,
39     source_dir: str,
40     isolated: bool,
41     details: str,
42 ) -> str:
43     """Generate metadata using setup.py-based defacto mechanisms.
44
45     Returns the generated metadata directory.
46     """
47     logger.debug(
48         "Running setup.py (path:%s) egg_info for package %s",
49         setup_py_path,
50         details,
51     )
52
53     egg_info_dir = TempDirectory(kind="pip-egg-info", globally_managed=True).path
54
55     args = make_setuptools_egg_info_args(
56         setup_py_path,
57         egg_info_dir=egg_info_dir,
58         no_user_config=isolated,
59     )
60
61     with build_env:
62         with open_spinner("Preparing metadata (setup.py)") as spinner:
63             try:
64                 call_subprocess(
65                     args,
66                     cwd=source_dir,
67                     command_desc="python setup.py egg_info",
68                     spinner=spinner,
69                 )
70             except InstallationSubprocessError as error:
71                 raise MetadataGenerationFailed(package_details=details) from error
72
73     # Return the .egg-info directory.
74     return _find_egg_info(egg_info_dir)