Skip to content

Commit c9d6dd9

Browse files
committed
fix: add buildinfo
1 parent 3adf344 commit c9d6dd9

3 files changed

Lines changed: 169 additions & 5 deletions

File tree

cmd/pmp/buildinfo.go

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package main
2+
3+
import (
4+
"runtime/debug"
5+
6+
"github.com/singl3focus/pmp/cli"
7+
)
8+
9+
var readBuildInfo = debug.ReadBuildInfo
10+
11+
func resolveVersionInfo(version, commit, date string) cli.VersionInfo {
12+
build := cli.VersionInfo{
13+
Version: version,
14+
Commit: commit,
15+
Date: date,
16+
}
17+
18+
info, ok := readBuildInfo()
19+
if !ok {
20+
return build
21+
}
22+
23+
if build.Version == "" || build.Version == "dev" {
24+
if resolvedVersion := resolveModuleVersion(info); resolvedVersion != "" {
25+
build.Version = resolvedVersion
26+
}
27+
}
28+
29+
if build.Commit == "" || build.Commit == "none" {
30+
if resolvedCommit := buildSetting(info, "vcs.revision"); resolvedCommit != "" {
31+
build.Commit = resolvedCommit
32+
}
33+
}
34+
35+
if build.Date == "" || build.Date == "unknown" {
36+
if resolvedDate := buildSetting(info, "vcs.time"); resolvedDate != "" {
37+
build.Date = resolvedDate
38+
}
39+
}
40+
41+
return build
42+
}
43+
44+
func resolveModuleVersion(info *debug.BuildInfo) string {
45+
if info == nil {
46+
return ""
47+
}
48+
49+
if isTaggedVersion(info.Main.Version) {
50+
return info.Main.Version
51+
}
52+
53+
return ""
54+
}
55+
56+
func isTaggedVersion(version string) bool {
57+
return version != "" && version != "(devel)"
58+
}
59+
60+
func buildSetting(info *debug.BuildInfo, key string) string {
61+
if info == nil {
62+
return ""
63+
}
64+
65+
for _, setting := range info.Settings {
66+
if setting.Key == key {
67+
return setting.Value
68+
}
69+
}
70+
71+
return ""
72+
}

cmd/pmp/buildinfo_test.go

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
package main
2+
3+
import (
4+
"runtime/debug"
5+
"testing"
6+
)
7+
8+
func TestResolveVersionInfoPrefersLdflags(t *testing.T) {
9+
t.Cleanup(func() {
10+
readBuildInfo = debug.ReadBuildInfo
11+
})
12+
13+
readBuildInfo = func() (*debug.BuildInfo, bool) {
14+
return &debug.BuildInfo{
15+
Main: debug.Module{
16+
Path: "github.com/singl3focus/pmp/cmd/pmp",
17+
Version: "v0.2.0",
18+
},
19+
Settings: []debug.BuildSetting{
20+
{Key: "vcs.revision", Value: "deadbeef"},
21+
{Key: "vcs.time", Value: "2026-04-05T12:00:00Z"},
22+
},
23+
}, true
24+
}
25+
26+
build := resolveVersionInfo("v9.9.9", "abc123", "2026-04-01T00:00:00Z")
27+
if build.Version != "v9.9.9" {
28+
t.Fatalf("expected ldflags version to win, got %q", build.Version)
29+
}
30+
if build.Commit != "abc123" {
31+
t.Fatalf("expected ldflags commit to win, got %q", build.Commit)
32+
}
33+
if build.Date != "2026-04-01T00:00:00Z" {
34+
t.Fatalf("expected ldflags date to win, got %q", build.Date)
35+
}
36+
}
37+
38+
func TestResolveVersionInfoFallsBackToBuildInfo(t *testing.T) {
39+
t.Cleanup(func() {
40+
readBuildInfo = debug.ReadBuildInfo
41+
})
42+
43+
readBuildInfo = func() (*debug.BuildInfo, bool) {
44+
return &debug.BuildInfo{
45+
Main: debug.Module{
46+
Path: "github.com/singl3focus/pmp/cmd/pmp",
47+
Version: "v0.2.0",
48+
},
49+
Settings: []debug.BuildSetting{
50+
{Key: "vcs.revision", Value: "deadbeef"},
51+
{Key: "vcs.time", Value: "2026-04-05T12:00:00Z"},
52+
},
53+
}, true
54+
}
55+
56+
build := resolveVersionInfo("dev", "none", "unknown")
57+
if build.Version != "v0.2.0" {
58+
t.Fatalf("expected module version from build info, got %q", build.Version)
59+
}
60+
if build.Commit != "deadbeef" {
61+
t.Fatalf("expected vcs revision from build info, got %q", build.Commit)
62+
}
63+
if build.Date != "2026-04-05T12:00:00Z" {
64+
t.Fatalf("expected vcs time from build info, got %q", build.Date)
65+
}
66+
}
67+
68+
func TestResolveVersionInfoKeepsDevWhenBuildInfoIsDevel(t *testing.T) {
69+
t.Cleanup(func() {
70+
readBuildInfo = debug.ReadBuildInfo
71+
})
72+
73+
readBuildInfo = func() (*debug.BuildInfo, bool) {
74+
return &debug.BuildInfo{
75+
Main: debug.Module{
76+
Path: "github.com/singl3focus/pmp/cmd/pmp",
77+
Version: "(devel)",
78+
},
79+
Settings: []debug.BuildSetting{
80+
{Key: "vcs.revision", Value: "deadbeef"},
81+
{Key: "vcs.time", Value: "2026-04-05T12:00:00Z"},
82+
},
83+
}, true
84+
}
85+
86+
build := resolveVersionInfo("dev", "none", "unknown")
87+
if build.Version != "dev" {
88+
t.Fatalf("expected dev version to remain for local builds, got %q", build.Version)
89+
}
90+
if build.Commit != "deadbeef" {
91+
t.Fatalf("expected vcs revision from build info, got %q", build.Commit)
92+
}
93+
if build.Date != "2026-04-05T12:00:00Z" {
94+
t.Fatalf("expected vcs time from build info, got %q", build.Date)
95+
}
96+
}

cmd/pmp/main.go

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,7 @@ var (
1616
func main() {
1717
initConsole()
1818

19-
if err := cli.Execute(os.Args[1:], cli.VersionInfo{
20-
Version: version,
21-
Commit: commit,
22-
Date: date,
23-
}); err != nil {
19+
if err := cli.Execute(os.Args[1:], resolveVersionInfo(version, commit, date)); err != nil {
2420
fmt.Fprintln(os.Stderr, err)
2521
os.Exit(1)
2622
}

0 commit comments

Comments
 (0)