Skip to content

Commit dbfdb67

Browse files
authored
get_ref: Fix annotated tags (#10)
* dulwich: Use `get_peeled` for Tags Fixes `get_ref` for annotated tags. Closes iterative/dvc#6383 * pygit2: Use `peel` for annotted tags in `get_ref`. Fixes `get_ref` for annotated tags.
1 parent 9dcd906 commit dbfdb67

File tree

3 files changed

+14
-1
lines changed

3 files changed

+14
-1
lines changed

scmrepo/git/backend/dulwich/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -334,6 +334,7 @@ def set_ref(
334334
raise SCMError(f"Failed to set '{name}'")
335335

336336
def get_ref(self, name, follow: bool = True) -> Optional[str]:
337+
from dulwich.objects import Tag
337338
from dulwich.refs import parse_symref_value
338339

339340
name_b = os.fsencode(name)
@@ -350,6 +351,8 @@ def get_ref(self, name, follow: bool = True) -> Optional[str]:
350351
except ValueError:
351352
pass
352353
if ref:
354+
if ref in self.repo and isinstance(self.repo[ref], Tag):
355+
ref = self.repo.get_peeled(name_b)
353356
return os.fsdecode(ref)
354357
return None
355358

scmrepo/git/backend/pygit2.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,13 +317,20 @@ def set_ref(
317317
)
318318

319319
def get_ref(self, name, follow: bool = True) -> Optional[str]:
320-
from pygit2 import GIT_REF_SYMBOLIC
320+
from pygit2 import GIT_OBJ_COMMIT, GIT_REF_SYMBOLIC, Tag
321321

322322
ref = self.repo.references.get(name)
323323
if not ref:
324324
return None
325325
if follow and ref.type == GIT_REF_SYMBOLIC:
326326
ref = ref.resolve()
327+
try:
328+
obj = self.repo[ref.target]
329+
if isinstance(obj, Tag):
330+
return str(obj.peel(GIT_OBJ_COMMIT).id)
331+
except ValueError:
332+
pass
333+
327334
return str(ref.target)
328335

329336
def remove_ref(self, name: str, old_ref: Optional[str] = None):

tests/test_git.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,9 +280,12 @@ def test_get_ref(tmp_dir: TmpDir, scm: Git, git: Git):
280280
): "ref: refs/heads/master",
281281
}
282282
)
283+
scm.tag(["-a", "annotated", "-m", "Annotated Tag"])
283284

284285
assert init_rev == git.get_ref("refs/foo/bar")
285286
assert init_rev == git.get_ref("refs/foo/baz")
287+
assert init_rev == git.get_ref("refs/tags/annotated", follow=True)
288+
assert init_rev == git.get_ref("refs/tags/annotated", follow=False)
286289
assert git.get_ref("refs/foo/baz", follow=False) == "refs/heads/master"
287290
assert git.get_ref("refs/foo/qux") is None
288291

0 commit comments

Comments
 (0)