From 2115507d52476f3f4626730cc36cc07f43dabef6 Mon Sep 17 00:00:00 2001 From: Leon Mika Date: Sat, 2 May 2026 09:50:04 +1000 Subject: [PATCH] =?UTF-8?q?Add=20version=20resolver=20(tag=20=E2=86=92=20s?= =?UTF-8?q?trip-v=20/=20fall=20back=20to=20short=20SHA)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 (1M context) --- internal/version/version.go | 20 ++++++++++++++++++++ internal/version/version_test.go | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 internal/version/version.go create mode 100644 internal/version/version_test.go diff --git a/internal/version/version.go b/internal/version/version.go new file mode 100644 index 0000000..bce1655 --- /dev/null +++ b/internal/version/version.go @@ -0,0 +1,20 @@ +package version + +import "regexp" + +var semverTag = regexp.MustCompile(`^refs/tags/v(\d+\.\d+\.\d+)$`) + +// Resolve returns the version string to use in artifact names. +// Precedence: override > matching semver tag > short SHA. +func Resolve(override, ref, sha string) string { + if override != "" { + return override + } + if m := semverTag.FindStringSubmatch(ref); m != nil { + return m[1] + } + if len(sha) > 7 { + return sha[:7] + } + return sha +} diff --git a/internal/version/version_test.go b/internal/version/version_test.go new file mode 100644 index 0000000..c29d57c --- /dev/null +++ b/internal/version/version_test.go @@ -0,0 +1,32 @@ +package version_test + +import ( + "testing" + + "github.com/leonmika/wails-release/internal/version" +) + +func TestResolve(t *testing.T) { + cases := []struct { + name string + override string + ref string + sha string + want string + }{ + {"override wins", "9.9.9", "refs/tags/v1.2.3", "abcdefg1234", "9.9.9"}, + {"clean tag strips v", "", "refs/tags/v1.2.3", "abcdefg1234", "1.2.3"}, + {"prerelease tag falls back to sha", "", "refs/tags/v1.2.3-rc1", "abcdefg1234", "abcdefg"}, + {"non-tag ref falls back to sha", "", "refs/heads/main", "abcdefg1234", "abcdefg"}, + {"empty ref falls back to sha", "", "", "abcdefg1234", "abcdefg"}, + {"short sha shorter than 7 returned verbatim", "", "", "abc", "abc"}, + } + for _, c := range cases { + t.Run(c.name, func(t *testing.T) { + got := version.Resolve(c.override, c.ref, c.sha) + if got != c.want { + t.Fatalf("got %q, want %q", got, c.want) + } + }) + } +}