From 96b7a2ef726f36b5d1d3c161e1ce44fa6f6c3ad3 Mon Sep 17 00:00:00 2001 From: Scott K Logan Date: Fri, 4 Oct 2024 13:53:32 -0500 Subject: [PATCH] Fix invocation from a repository subdirectory (#26) This should mean that you can invoke the tool from, for example, the 'rosdep' subdirectory. --- rosdistro_reviewer/verb/review.py | 21 ++++++++++++++++++--- test/test_verb_review.py | 16 ++++++++++++++++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/rosdistro_reviewer/verb/review.py b/rosdistro_reviewer/verb/review.py index 96f7f3d..9e0e3da 100644 --- a/rosdistro_reviewer/verb/review.py +++ b/rosdistro_reviewer/verb/review.py @@ -13,6 +13,20 @@ from rosdistro_reviewer.submitter import submit_review +def _find_repo_root(): + # We delay this import until after the GitPython + # logger has already been configured to avoid DEBUG + # messages on the console at import time + from git import Repo + from git import InvalidGitRepositoryError + try: + with Repo(Path.cwd(), search_parent_directories=True) as repo: + return Path(repo.working_tree_dir) + except InvalidGitRepositoryError as e: + raise RuntimeError( + 'This tool must be run from within a git repository') from e + + class ReviewVerb(VerbExtensionPoint): """Generate a review for rosdistro changes.""" @@ -36,13 +50,14 @@ def add_arguments(self, *, parser): # noqa: D102 add_review_submitter_arguments(parser) def main(self, *, context): # noqa: D102 + root = _find_repo_root() review = analyze( - Path.cwd(), + root, target_ref=context.args.target_ref, head_ref=context.args.head_ref) if review: - root = Path.cwd() if context.args.head_ref is None else None - print('\n' + review.to_text(root=root) + '\n') + text_root = root if context.args.head_ref is None else None + print('\n' + review.to_text(root=text_root) + '\n') submit_review(context.args, review) return 0 diff --git a/test/test_verb_review.py b/test/test_verb_review.py index 11313f2..74444ff 100644 --- a/test/test_verb_review.py +++ b/test/test_verb_review.py @@ -76,3 +76,19 @@ def test_verb_review(empty_repo): return_value=Path(empty_repo.working_tree_dir), ): assert 0 == extension.main(context=context) + + +def test_verb_review_no_repo(tmp_path): + extension = ReviewVerb() + extension.add_arguments(parser=Mock()) + + context = CommandContext( + command_name='rosdistro-reviewer', + args=Mock()) + + with patch( + 'rosdistro_reviewer.verb.review.Path.cwd', + return_value=tmp_path, + ): + with pytest.raises(RuntimeError): + extension.main(context=context)