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) + } + }) + } +}