From 7d212c50eb3d1a1d1d88acc65cf572613a0e329b Mon Sep 17 00:00:00 2001 From: karajan1001 Date: Mon, 7 Feb 2022 18:35:27 +0800 Subject: [PATCH] pygit2: resolve_rev raise a proper exception with `~` like references. fix: #30 Current pygit2 backend's resolve_rev didn't raise a proper exception when dealing with `HEAD~n` like reference. 1. Catch the exception in resolve_rev and reraise it into a proper format. 2. Add a test for it. --- scmrepo/git/backend/pygit2.py | 12 ++++++++++-- tests/test_git.py | 4 ++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/scmrepo/git/backend/pygit2.py b/scmrepo/git/backend/pygit2.py index d95e338b..6849d575 100644 --- a/scmrepo/git/backend/pygit2.py +++ b/scmrepo/git/backend/pygit2.py @@ -317,9 +317,17 @@ def set_ref( ) def get_ref(self, name, follow: bool = True) -> Optional[str]: - from pygit2 import GIT_OBJ_COMMIT, GIT_REF_SYMBOLIC, Tag + from pygit2 import ( + GIT_OBJ_COMMIT, + GIT_REF_SYMBOLIC, + InvalidSpecError, + Tag, + ) - ref = self.repo.references.get(name) + try: + ref = self.repo.references.get(name) + except InvalidSpecError: + return None if not ref: return None if follow and ref.type == GIT_REF_SYMBOLIC: diff --git a/tests/test_git.py b/tests/test_git.py index cc1655be..34ef7e58 100644 --- a/tests/test_git.py +++ b/tests/test_git.py @@ -571,6 +571,7 @@ def test_resolve_rev( assert git.resolve_rev("refs/foo") == rev assert git.resolve_rev("bar") == rev assert git.resolve_rev("origin/baz") == rev + assert git.resolve_rev("HEAD~1") == init_rev with pytest.raises(RevError): git.resolve_rev("qux") @@ -578,6 +579,9 @@ def test_resolve_rev( with pytest.raises(RevError): git.resolve_rev("baz") + with pytest.raises(RevError): + git.resolve_rev("HEAD~3") + @pytest.mark.skip_git_backend("dulwich") def test_checkout(tmp_dir: TmpDir, scm: Git, git: Git):