diff --git a/scmrepo/git/backend/dulwich/__init__.py b/scmrepo/git/backend/dulwich/__init__.py index 866914e1..acfb021f 100644 --- a/scmrepo/git/backend/dulwich/__init__.py +++ b/scmrepo/git/backend/dulwich/__init__.py @@ -334,6 +334,7 @@ def set_ref( raise SCMError(f"Failed to set '{name}'") def get_ref(self, name, follow: bool = True) -> Optional[str]: + from dulwich.objects import Tag from dulwich.refs import parse_symref_value name_b = os.fsencode(name) @@ -350,6 +351,8 @@ def get_ref(self, name, follow: bool = True) -> Optional[str]: except ValueError: pass if ref: + if ref in self.repo and isinstance(self.repo[ref], Tag): + ref = self.repo.get_peeled(name_b) return os.fsdecode(ref) return None diff --git a/scmrepo/git/backend/pygit2.py b/scmrepo/git/backend/pygit2.py index 8408161c..f9eedb4a 100644 --- a/scmrepo/git/backend/pygit2.py +++ b/scmrepo/git/backend/pygit2.py @@ -317,13 +317,20 @@ def set_ref( ) def get_ref(self, name, follow: bool = True) -> Optional[str]: - from pygit2 import GIT_REF_SYMBOLIC + from pygit2 import GIT_OBJ_COMMIT, GIT_REF_SYMBOLIC, Tag ref = self.repo.references.get(name) if not ref: return None if follow and ref.type == GIT_REF_SYMBOLIC: ref = ref.resolve() + try: + obj = self.repo[ref.target] + if isinstance(obj, Tag): + return str(obj.peel(GIT_OBJ_COMMIT).id) + except ValueError: + pass + return str(ref.target) def remove_ref(self, name: str, old_ref: Optional[str] = None): diff --git a/tests/test_git.py b/tests/test_git.py index 9b858704..22c03c0e 100644 --- a/tests/test_git.py +++ b/tests/test_git.py @@ -214,9 +214,12 @@ def test_get_ref(tmp_dir: TmpDir, scm: Git, git: Git): ): "ref: refs/heads/master", } ) + scm.tag(["-a", "annotated", "-m", "Annotated Tag"]) assert init_rev == git.get_ref("refs/foo/bar") assert init_rev == git.get_ref("refs/foo/baz") + assert init_rev == git.get_ref("refs/tags/annotated", follow=True) + assert init_rev == git.get_ref("refs/tags/annotated", follow=False) assert git.get_ref("refs/foo/baz", follow=False) == "refs/heads/master" assert git.get_ref("refs/foo/qux") is None