Add build version reporting
This commit is contained in:
36
internal/buildinfo/buildinfo.go
Normal file
36
internal/buildinfo/buildinfo.go
Normal file
@@ -0,0 +1,36 @@
|
||||
// Package buildinfo resolves the product version embedded in a Notarius build.
|
||||
package buildinfo
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"regexp"
|
||||
"runtime/debug"
|
||||
)
|
||||
|
||||
var stableVersion = regexp.MustCompile(`^v(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$`)
|
||||
|
||||
// Override is set at link time for controlled builds.
|
||||
var Override string
|
||||
|
||||
// Version returns the release version embedded in the build, or development
|
||||
// when the build does not carry a stable release tag.
|
||||
func Version() (string, error) {
|
||||
buildVersion := ""
|
||||
if info, ok := debug.ReadBuildInfo(); ok {
|
||||
buildVersion = info.Main.Version
|
||||
}
|
||||
return resolve(Override, buildVersion)
|
||||
}
|
||||
|
||||
func resolve(override, buildVersion string) (string, error) {
|
||||
if override != "" {
|
||||
if !stableVersion.MatchString(override) {
|
||||
return "", fmt.Errorf("build version override is not a stable release tag")
|
||||
}
|
||||
return override, nil
|
||||
}
|
||||
if stableVersion.MatchString(buildVersion) {
|
||||
return buildVersion, nil
|
||||
}
|
||||
return "development", nil
|
||||
}
|
||||
45
internal/buildinfo/buildinfo_test.go
Normal file
45
internal/buildinfo/buildinfo_test.go
Normal file
@@ -0,0 +1,45 @@
|
||||
package buildinfo
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestResolve(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
override string
|
||||
buildVersion string
|
||||
want string
|
||||
wantErr bool
|
||||
}{
|
||||
{name: "stable main module version", buildVersion: "v1.2.3", want: "v1.2.3"},
|
||||
{name: "zero version", buildVersion: "v0.0.0", want: "v0.0.0"},
|
||||
{name: "override takes precedence", override: "v2.3.4", buildVersion: "v1.2.3", want: "v2.3.4"},
|
||||
{name: "invalid override", override: "version", buildVersion: "v1.2.3", wantErr: true},
|
||||
{name: "override with whitespace", override: " v1.2.3", wantErr: true},
|
||||
{name: "leading zero major", buildVersion: "v01.2.3", want: "development"},
|
||||
{name: "leading zero minor", buildVersion: "v1.02.3", want: "development"},
|
||||
{name: "leading zero patch", buildVersion: "v1.2.03", want: "development"},
|
||||
{name: "build version with whitespace", buildVersion: "v1.2.3 ", want: "development"},
|
||||
{name: "prerelease", buildVersion: "v1.2.3-rc.1", want: "development"},
|
||||
{name: "build suffix", buildVersion: "v1.2.3+build.1", want: "development"},
|
||||
{name: "pseudo version", buildVersion: "v0.0.0-20260102030405-abcdef123456", want: "development"},
|
||||
{name: "development build", buildVersion: "(devel)", want: "development"},
|
||||
{name: "missing build information", want: "development"},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
got, err := resolve(tt.override, tt.buildVersion)
|
||||
if tt.wantErr {
|
||||
if err == nil {
|
||||
t.Fatal("resolve() error = nil, want error")
|
||||
}
|
||||
return
|
||||
}
|
||||
if err != nil {
|
||||
t.Fatalf("resolve() error = %v", err)
|
||||
}
|
||||
if got != tt.want {
|
||||
t.Fatalf("resolve() = %q, want %q", got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user