Skip to content

Commit c0400ff

Browse files
Merge pull request #68 from api7/fix/version-go-install
fix(version): report module version for go-install builds
2 parents 21b078b + 725fb69 commit c0400ff

2 files changed

Lines changed: 109 additions & 0 deletions

File tree

internal/version/version.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package version
22

3+
import "runtime/debug"
4+
35
// These variables are set at build time via ldflags.
46
var (
57
// Version is the semantic version (e.g., "v0.1.0").
@@ -9,3 +11,42 @@ var (
911
// Date is the build date in UTC.
1012
Date = "unknown"
1113
)
14+
15+
// init falls back to the Go module build info for any value that was not
16+
// injected via ldflags, so that binaries installed with
17+
// `go install github.com/api7/a7/cmd/a7@<tag>` report the module version
18+
// instead of "dev".
19+
func init() {
20+
if info, ok := debug.ReadBuildInfo(); ok {
21+
Version, Commit, Date = resolve(Version, Commit, Date, info)
22+
}
23+
}
24+
25+
// resolve returns version, commit, and date with unset (default) values
26+
// filled in from build info. Values already set via ldflags take precedence.
27+
func resolve(version, commit, date string, info *debug.BuildInfo) (string, string, string) {
28+
if version == "dev" && info.Main.Version != "" && info.Main.Version != "(devel)" {
29+
version = info.Main.Version
30+
}
31+
32+
var revision, vcsTime string
33+
for _, s := range info.Settings {
34+
switch s.Key {
35+
case "vcs.revision":
36+
revision = s.Value
37+
case "vcs.time":
38+
vcsTime = s.Value
39+
}
40+
}
41+
if commit == "unknown" && revision != "" {
42+
if len(revision) > 7 {
43+
revision = revision[:7]
44+
}
45+
commit = revision
46+
}
47+
if date == "unknown" && vcsTime != "" {
48+
date = vcsTime
49+
}
50+
51+
return version, commit, date
52+
}

internal/version/version_test.go

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package version
2+
3+
import (
4+
"runtime/debug"
5+
"testing"
6+
7+
"github.com/stretchr/testify/assert"
8+
)
9+
10+
func TestResolve_GoInstallModuleVersion(t *testing.T) {
11+
// `go install .../cmd/a7@v1.0.0` embeds the module version but no ldflags.
12+
info := &debug.BuildInfo{Main: debug.Module{Version: "v1.0.0"}}
13+
14+
v, c, d := resolve("dev", "unknown", "unknown", info)
15+
16+
assert.Equal(t, "v1.0.0", v)
17+
assert.Equal(t, "unknown", c)
18+
assert.Equal(t, "unknown", d)
19+
}
20+
21+
func TestResolve_DevelBuildStaysDev(t *testing.T) {
22+
// `go build` from a source checkout reports "(devel)" as the module version.
23+
info := &debug.BuildInfo{Main: debug.Module{Version: "(devel)"}}
24+
25+
v, _, _ := resolve("dev", "unknown", "unknown", info)
26+
27+
assert.Equal(t, "dev", v)
28+
}
29+
30+
func TestResolve_LdflagsTakePrecedence(t *testing.T) {
31+
info := &debug.BuildInfo{
32+
Main: debug.Module{Version: "v9.9.9"},
33+
Settings: []debug.BuildSetting{
34+
{Key: "vcs.revision", Value: "ffffffffffffffffffffffffffffffffffffffff"},
35+
{Key: "vcs.time", Value: "2026-01-01T00:00:00Z"},
36+
},
37+
}
38+
39+
v, c, d := resolve("v1.2.3", "abc1234", "2026-05-27T03:23:51Z", info)
40+
41+
assert.Equal(t, "v1.2.3", v)
42+
assert.Equal(t, "abc1234", c)
43+
assert.Equal(t, "2026-05-27T03:23:51Z", d)
44+
}
45+
46+
func TestResolve_VCSSettingsFallback(t *testing.T) {
47+
info := &debug.BuildInfo{
48+
Main: debug.Module{Version: "(devel)"},
49+
Settings: []debug.BuildSetting{
50+
{Key: "vcs.revision", Value: "0123456789abcdef0123456789abcdef01234567"},
51+
{Key: "vcs.time", Value: "2026-06-03T00:00:00Z"},
52+
},
53+
}
54+
55+
v, c, d := resolve("dev", "unknown", "unknown", info)
56+
57+
assert.Equal(t, "dev", v)
58+
assert.Equal(t, "0123456", c, "commit should be shortened to 7 characters")
59+
assert.Equal(t, "2026-06-03T00:00:00Z", d)
60+
}
61+
62+
func TestResolve_EmptyBuildInfo(t *testing.T) {
63+
v, c, d := resolve("dev", "unknown", "unknown", &debug.BuildInfo{})
64+
65+
assert.Equal(t, "dev", v)
66+
assert.Equal(t, "unknown", c)
67+
assert.Equal(t, "unknown", d)
68+
}

0 commit comments

Comments
 (0)