forked from STI/Astroport.ONE
75 lines
2.1 KiB
Python
75 lines
2.1 KiB
Python
|
"""Metadata generation logic for legacy source distributions.
|
||
|
"""
|
||
|
|
||
|
import logging
|
||
|
import os
|
||
|
|
||
|
from pip._internal.build_env import BuildEnvironment
|
||
|
from pip._internal.cli.spinners import open_spinner
|
||
|
from pip._internal.exceptions import (
|
||
|
InstallationError,
|
||
|
InstallationSubprocessError,
|
||
|
MetadataGenerationFailed,
|
||
|
)
|
||
|
from pip._internal.utils.setuptools_build import make_setuptools_egg_info_args
|
||
|
from pip._internal.utils.subprocess import call_subprocess
|
||
|
from pip._internal.utils.temp_dir import TempDirectory
|
||
|
|
||
|
logger = logging.getLogger(__name__)
|
||
|
|
||
|
|
||
|
def _find_egg_info(directory: str) -> str:
|
||
|
"""Find an .egg-info subdirectory in `directory`."""
|
||
|
filenames = [f for f in os.listdir(directory) if f.endswith(".egg-info")]
|
||
|
|
||
|
if not filenames:
|
||
|
raise InstallationError(f"No .egg-info directory found in {directory}")
|
||
|
|
||
|
if len(filenames) > 1:
|
||
|
raise InstallationError(
|
||
|
"More than one .egg-info directory found in {}".format(directory)
|
||
|
)
|
||
|
|
||
|
return os.path.join(directory, filenames[0])
|
||
|
|
||
|
|
||
|
def generate_metadata(
|
||
|
build_env: BuildEnvironment,
|
||
|
setup_py_path: str,
|
||
|
source_dir: str,
|
||
|
isolated: bool,
|
||
|
details: str,
|
||
|
) -> str:
|
||
|
"""Generate metadata using setup.py-based defacto mechanisms.
|
||
|
|
||
|
Returns the generated metadata directory.
|
||
|
"""
|
||
|
logger.debug(
|
||
|
"Running setup.py (path:%s) egg_info for package %s",
|
||
|
setup_py_path,
|
||
|
details,
|
||
|
)
|
||
|
|
||
|
egg_info_dir = TempDirectory(kind="pip-egg-info", globally_managed=True).path
|
||
|
|
||
|
args = make_setuptools_egg_info_args(
|
||
|
setup_py_path,
|
||
|
egg_info_dir=egg_info_dir,
|
||
|
no_user_config=isolated,
|
||
|
)
|
||
|
|
||
|
with build_env:
|
||
|
with open_spinner("Preparing metadata (setup.py)") as spinner:
|
||
|
try:
|
||
|
call_subprocess(
|
||
|
args,
|
||
|
cwd=source_dir,
|
||
|
command_desc="python setup.py egg_info",
|
||
|
spinner=spinner,
|
||
|
)
|
||
|
except InstallationSubprocessError as error:
|
||
|
raise MetadataGenerationFailed(package_details=details) from error
|
||
|
|
||
|
# Return the .egg-info directory.
|
||
|
return _find_egg_info(egg_info_dir)
|