metadata_legacy.py 1.9 KB

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