Skip to content

Commit

Permalink
Better diagnose when setup.py/cfg cannot be found
Browse files Browse the repository at this point in the history
This adds a check beforer invoking 'setup.py egg_info' to make sure the
file (or setup.cfg) actually exists, and emit a clearer error message
when neither can be found and the egg_info command can never succeed.
  • Loading branch information
uranusjr committed May 4, 2021
1 parent e6414d6 commit 5b14f05
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 0 deletions.
2 changes: 2 additions & 0 deletions news/9944.bugfix.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Emit clearer error message when a project root does not contain either
``pyproject.toml``, ``setup.py`` or ``setup.cfg``.
19 changes: 19 additions & 0 deletions src/pip/_internal/req/req_install.py
Original file line number Diff line number Diff line change
Expand Up @@ -509,13 +509,32 @@ def load_pyproject_toml(self):
self.unpacked_source_directory, backend, backend_path=backend_path,
)

def _check_setup_py_or_cfg_exists(self) -> bool:
"""Check if the requirement actually has a setuptools build file.
If setup.py does not exist, we also check setup.cfg in the same
directory and allow the directory if that exists.
"""
if os.path.exists(self.setup_py_path):
return True
stem, ext = os.path.splitext(self.setup_py_path)
if ext == ".py" and os.path.exists(f"{stem}.cfg"):
return True
return False

def _generate_metadata(self):
# type: () -> str
"""Invokes metadata generator functions, with the required arguments.
"""
if not self.use_pep517:
assert self.unpacked_source_directory

if not self._check_setup_py_or_cfg_exists():
raise InstallationError(
f'File "setup.py" or "setup.cfg" not found for legacy '
f'project {self}.'
)

return generate_metadata_legacy(
build_env=self.build_env,
setup_py_path=self.setup_py_path,
Expand Down

0 comments on commit 5b14f05

Please sign in to comment.