fix(semver): skip non-semver tags when picking latest existing tag

Rolling tags like 'v1' (and any other tag that doesn't parse as x.y.z
after prefix stripping) used to enter the latest-tag candidate set in
CalculateSemver. When such a tag shared a commit with a real semver tag
(e.g. v1 and v1.16.3 both pointing at the same release commit), go-git's
alphabetical tag iteration made 'v1' win, ParseExistingSemver bailed out
because '1' has only one component, and the calculator silently reset
the baseline to 0.0.0 — producing nonsense like 0.0.5 on this branch.

ListExistingTags now filters tags through a new IsParseableSemverTag
helper before recording them, so non-semver tags never participate in
latest-tag selection. The behavior change is invisible for repos that
only use proper vX.Y.Z tags, and it's covered by a new test table.
This commit is contained in:
2026-05-22 00:39:59 +01:00
parent ab52de167e
commit dfeb03b8bb
5 changed files with 64 additions and 8 deletions
+1 -1
View File
@@ -142,7 +142,7 @@ func TestListExistingTags(t *testing.T) {
repo := &GitRepository{}
// Now we can safely call ListExistingTags since we've added a nil check
ListExistingTags(repo)
ListExistingTags(repo, nil)
// Verify no tags were added
assert.Empty(t, repo.Tags, "Should have no tags after calling with nil Handler")