diff --git a/dvc/scm/git/backend/dulwich/__init__.py b/dvc/scm/git/backend/dulwich/__init__.py index 6a4913e2cb..e856e2d50c 100644 --- a/dvc/scm/git/backend/dulwich/__init__.py +++ b/dvc/scm/git/backend/dulwich/__init__.py @@ -326,6 +326,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) @@ -342,6 +343,8 @@ def get_ref(self, name, follow: bool = True) -> Optional[str]: except ValueError: pass if ref: + if isinstance(self.repo[ref], Tag): + ref = self.repo.get_peeled(name_b) return os.fsdecode(ref) return None diff --git a/tests/func/experiments/test_show.py b/tests/func/experiments/test_show.py index 1aa6cdcd81..dfe0b52405 100644 --- a/tests/func/experiments/test_show.py +++ b/tests/func/experiments/test_show.py @@ -348,6 +348,38 @@ def test_show_multiple_commits(tmp_dir, scm, dvc, exp_stage): assert set(results.keys()) == expected +def test_show_tags(tmp_dir, scm, dvc): + tmp_dir.scm_gen("file", "1", "commit") + scm.tag("light") + rev = scm.get_rev() + + show = dvc.experiments.show(all_tags=True) + assert show[rev]["baseline"]["data"]["name"] == "light" + + tmp_dir.scm_gen("file", "2", "commit") + scm.tag(["-a", "annot", "-m", ""]) + rev = scm.get_rev() + + show = dvc.experiments.show(all_tags=True) + assert show[rev]["baseline"]["data"]["name"] == "annot" + + tmp_dir.scm_gen("file", "3", "commit") + scm.tag(["-a", "annotated", "-m", ""]) + scm.tag(["-a", "pointer", "-m", "", "annotated"]) + rev = scm.get_rev() + + show = dvc.experiments.show(all_tags=True) + assert show[rev]["baseline"]["data"]["name"] == "pointer" + + tmp_dir.scm_gen("file", "3", "commit") + scm.tag(["-a", "foo", "-m", ""]) + scm.tag(["-a", "stacked", "-m", ""]) + rev = scm.get_rev() + + show = dvc.experiments.show(all_tags=True) + assert show[rev]["baseline"]["data"]["name"] == "foo" + + def test_show_sort(tmp_dir, scm, dvc, exp_stage, caplog): with caplog.at_level(logging.ERROR): assert main(["exp", "show", "--no-pager", "--sort-by=bar"]) != 0