diff --git a/internal/cmd/version.go b/internal/cmd/version.go index d1fc68e6..2248bd15 100644 --- a/internal/cmd/version.go +++ b/internal/cmd/version.go @@ -4,22 +4,39 @@ import ( "context" "fmt" "os" + "runtime/debug" "strings" "github.com/steipete/gogcli/internal/outfmt" ) var ( - version = "0.13.0-dev" - commit = "" - date = "" + version = "dev" + commit = "" + date = "" + readBuildInfo = debug.ReadBuildInfo ) -func VersionString() string { +func resolvedVersion() string { v := strings.TrimSpace(version) + if v != "" && v != "dev" && !strings.HasSuffix(v, "-dev") { + return v + } + info, ok := readBuildInfo() + if ok { + moduleVersion := strings.TrimSpace(info.Main.Version) + if moduleVersion != "" && moduleVersion != "(devel)" { + return moduleVersion + } + } if v == "" { - v = "dev" + return "dev" } + return v +} + +func VersionString() string { + v := resolvedVersion() if strings.TrimSpace(commit) == "" && strings.TrimSpace(date) == "" { return v } @@ -37,7 +54,7 @@ type VersionCmd struct{} func (c *VersionCmd) Run(ctx context.Context) error { if outfmt.IsJSON(ctx) { return outfmt.WriteJSON(ctx, os.Stdout, map[string]any{ - "version": strings.TrimSpace(version), + "version": resolvedVersion(), "commit": strings.TrimSpace(commit), "date": strings.TrimSpace(date), }) diff --git a/internal/cmd/version_test.go b/internal/cmd/version_test.go index 3c4e8fb4..bef57925 100644 --- a/internal/cmd/version_test.go +++ b/internal/cmd/version_test.go @@ -4,6 +4,7 @@ import ( "context" "encoding/json" "io" + "runtime/debug" "testing" "github.com/steipete/gogcli/internal/outfmt" @@ -11,8 +12,9 @@ import ( ) func TestVersionStringVariants(t *testing.T) { - origVersion, origCommit, origDate := version, commit, date - t.Cleanup(func() { version, commit, date = origVersion, origCommit, origDate }) + origVersion, origCommit, origDate, origReadBuildInfo := version, commit, date, readBuildInfo + t.Cleanup(func() { version, commit, date, readBuildInfo = origVersion, origCommit, origDate, origReadBuildInfo }) + readBuildInfo = func() (*debug.BuildInfo, bool) { return nil, false } version, commit, date = "v1", "", "" if got := VersionString(); got != "v1" { @@ -32,9 +34,38 @@ func TestVersionStringVariants(t *testing.T) { } } +func TestVersionStringUsesModuleVersionFallback(t *testing.T) { + origVersion, origCommit, origDate, origReadBuildInfo := version, commit, date, readBuildInfo + t.Cleanup(func() { version, commit, date, readBuildInfo = origVersion, origCommit, origDate, origReadBuildInfo }) + + version, commit, date = "dev", "", "" + readBuildInfo = func() (*debug.BuildInfo, bool) { + return &debug.BuildInfo{Main: debug.Module{Version: "v1.2.3"}}, true + } + + if got := VersionString(); got != "v1.2.3" { + t.Fatalf("unexpected: %q", got) + } +} + +func TestVersionStringPrefersInjectedVersion(t *testing.T) { + origVersion, origCommit, origDate, origReadBuildInfo := version, commit, date, readBuildInfo + t.Cleanup(func() { version, commit, date, readBuildInfo = origVersion, origCommit, origDate, origReadBuildInfo }) + + version, commit, date = "v9.9.9", "", "" + readBuildInfo = func() (*debug.BuildInfo, bool) { + return &debug.BuildInfo{Main: debug.Module{Version: "v1.2.3"}}, true + } + + if got := VersionString(); got != "v9.9.9" { + t.Fatalf("unexpected: %q", got) + } +} + func TestVersionCmd_JSON(t *testing.T) { - origVersion, origCommit, origDate := version, commit, date - t.Cleanup(func() { version, commit, date = origVersion, origCommit, origDate }) + origVersion, origCommit, origDate, origReadBuildInfo := version, commit, date, readBuildInfo + t.Cleanup(func() { version, commit, date, readBuildInfo = origVersion, origCommit, origDate, origReadBuildInfo }) + readBuildInfo = func() (*debug.BuildInfo, bool) { return nil, false } version, commit, date = "v2", "c1", "d1" u, err := ui.New(ui.Options{Stdout: io.Discard, Stderr: io.Discard, Color: "never"})