From d7969ce6c0245b987925785193b6ba44172bb04f Mon Sep 17 00:00:00 2001 From: Sascha Grunert Date: Thu, 14 Jul 2022 14:08:41 +0200 Subject: [PATCH] Allow the override of all `version` package variables This now makes it possible to override all variables via the `-X` ldflag, for example: ```go package main import ( "fmt" "sigs.k8s.io/release-utils/version" ) func main() { v := version.GetVersionInfo() fmt.Print(v.String()) } ``` ``` > go run -ldflags '\ -X sigs.k8s.io/release-utils/version.gitVersion=1 \ -X sigs.k8s.io/release-utils/version.gitCommit=2 \ -X sigs.k8s.io/release-utils/version.gitTreeState=3 \ -X sigs.k8s.io/release-utils/version.buildDate=4 \ -X sigs.k8s.io/release-utils/version.goVersion=5 \ -X sigs.k8s.io/release-utils/version.compiler=6 \ -X sigs.k8s.io/release-utils/version.platform=7' \ main.go GitVersion: 1 GitCommit: 2 GitTreeState: 3 BuildDate: 4 GoVersion: 5 Compiler: 6 Platform: 7 ``` Signed-off-by: Sascha Grunert --- version/version.go | 46 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 35 insertions(+), 11 deletions(-) diff --git a/version/version.go b/version/version.go index d44c9c3..46dd1dc 100644 --- a/version/version.go +++ b/version/version.go @@ -47,6 +47,12 @@ var ( buildDate = unknown // flag to print the ascii name banner asciiName = "true" + // goVersion is the used golang version. + goVersion = unknown + // compiler is the used golang compiler. + compiler = unknown + // platform is the used os/arch identifier. + platform = unknown ) type Info struct { @@ -64,14 +70,6 @@ type Info struct { Description string `json:"-"` } -func init() { - buildInfo := getBuildInfo() - gitVersion = getGitVersion(buildInfo) - gitCommit = getCommit(buildInfo) - gitTreeState = getDirty(buildInfo) - buildDate = getBuildDate(buildInfo) -} - func getBuildInfo() *debug.BuildInfo { bi, ok := debug.ReadBuildInfo() if !ok { @@ -131,15 +129,41 @@ func getKey(bi *debug.BuildInfo, key string) string { // GetVersionInfo represents known information on how this binary was built. func GetVersionInfo() Info { + buildInfo := getBuildInfo() + gitVersion = getGitVersion(buildInfo) + if gitCommit == unknown { + gitCommit = getCommit(buildInfo) + } + + if gitTreeState == unknown { + gitTreeState = getDirty(buildInfo) + } + + if buildDate == unknown { + buildDate = getBuildDate(buildInfo) + } + + if goVersion == unknown { + goVersion = runtime.Version() + } + + if compiler == unknown { + compiler = runtime.Compiler + } + + if platform == unknown { + platform = fmt.Sprintf("%s/%s", runtime.GOOS, runtime.GOARCH) + } + return Info{ ASCIIName: asciiName, GitVersion: gitVersion, GitCommit: gitCommit, GitTreeState: gitTreeState, BuildDate: buildDate, - GoVersion: runtime.Version(), - Compiler: runtime.Compiler, - Platform: fmt.Sprintf("%s/%s", runtime.GOOS, runtime.GOARCH), + GoVersion: goVersion, + Compiler: compiler, + Platform: platform, } }