From 3248926cfbf082fe6a606b9716c206e71780124f Mon Sep 17 00:00:00 2001 From: Daniel Date: Wed, 10 Apr 2024 13:47:49 +0200 Subject: [PATCH] Improve version info, add build time --- info/version.go | 64 ++++++++++++++++++++++++++--------------- metrics/metrics_info.go | 2 +- 2 files changed, 42 insertions(+), 24 deletions(-) diff --git a/info/version.go b/info/version.go index 6d4e99a..a222a41 100644 --- a/info/version.go +++ b/info/version.go @@ -14,6 +14,7 @@ var ( name string version = "dev build" buildSource = "[source unknown]" + buildTime = "[build time unknown]" license = "[license unknown]" info *Info @@ -25,19 +26,25 @@ type Info struct { Name string Version string License string - Commit string - Time string - Source string - Dirty bool + + Source string + BuildTime string + + Commit string + CommitTime string + Dirty bool debug.BuildInfo } // Set sets meta information via the main routine. This should be the first thing your program calls. -func Set(setName string, setVersion string, setLicenseName string, compareVersionToTag bool) { +func Set(setName string, setVersion string, setLicenseName string) { name = setName - version = setVersion license = setLicenseName + + if setVersion != "" { + version = setVersion + } } // GetInfo returns all the meta information about the program. @@ -50,14 +57,22 @@ func GetInfo() *Info { } info = &Info{ - Name: name, - Version: version, - License: license, - BuildInfo: *buildInfo, - Source: buildSource, - Commit: buildSettings["vcs.revision"], - Time: buildSettings["vcs.time"], - Dirty: buildSettings["vcs.modified"] == "true", + Name: name, + Version: version, + License: license, + Source: buildSource, + BuildTime: buildTime, + Commit: buildSettings["vcs.revision"], + CommitTime: buildSettings["vcs.time"], + Dirty: buildSettings["vcs.modified"] == "true", + BuildInfo: *buildInfo, + } + + if info.Commit == "" { + info.Commit = "[commit unknown]" + } + if info.CommitTime == "" { + info.CommitTime = "[commit time unknown]" } }) @@ -78,14 +93,21 @@ func Version() string { // FullVersion returns the full and detailed version string. func FullVersion() string { info := GetInfo() - builder := new(strings.Builder) - builder.WriteString(fmt.Sprintf("%s\nversion %s\n", info.Name, Version())) + // Name and version. + builder.WriteString(fmt.Sprintf("%s %s\n", info.Name, Version())) + + // Build info. + builder.WriteString(fmt.Sprintf("\nbuilt with %s (%s) %s/%s\n", runtime.Version(), runtime.Compiler, runtime.GOOS, runtime.GOARCH)) + builder.WriteString(fmt.Sprintf(" at %s\n", info.BuildTime)) + + // Commit info. builder.WriteString(fmt.Sprintf("\ncommit %s\n", info.Commit)) - builder.WriteString(fmt.Sprintf("built with %s (%s) %s/%s\n", runtime.Version(), runtime.Compiler, runtime.GOOS, runtime.GOARCH)) - builder.WriteString(fmt.Sprintf(" on %s\n", info.Time)) - builder.WriteString(fmt.Sprintf("\nLicensed under the %s license.\nThe source code is available here: %s", license, info.Source)) + builder.WriteString(fmt.Sprintf(" at %s\n", info.CommitTime)) + builder.WriteString(fmt.Sprintf(" from %s\n", info.Source)) + + builder.WriteString(fmt.Sprintf("\nLicensed under the %s license.", license)) return builder.String() } @@ -102,10 +124,6 @@ func CheckVersion() error { if name == "[NAME]" || license == "[license unknown]" { return errors.New("must call SetInfo() before calling CheckVersion()") } - - if version == "[version unknown]" { - return errors.New("please build using the supplied build script.\n$ ./build {main.go|...}") - } } return nil diff --git a/metrics/metrics_info.go b/metrics/metrics_info.go index 81dfd3e..594fb49 100644 --- a/metrics/metrics_info.go +++ b/metrics/metrics_info.go @@ -17,7 +17,7 @@ func registerInfoMetric() error { map[string]string{ "version": checkUnknown(meta.Version), "commit": checkUnknown(meta.Commit), - "build_date": checkUnknown(meta.Time), + "build_date": checkUnknown(meta.BuildTime), "build_source": checkUnknown(meta.Source), "go_os": runtime.GOOS, "go_arch": runtime.GOARCH,