package main import ( "runtime/debug" "strings" ) var ( version = "dev" gitCommit = "unknown" buildTime = "unknown" ) type binaryBuildInfo struct { Version string `json:"version"` GitCommit string `json:"git_commit"` BuildTime string `json:"build_time"` } func currentBuildInfo() binaryBuildInfo { out := binaryBuildInfo{ Version: version, GitCommit: gitCommit, BuildTime: buildTime, } if bi, ok := debug.ReadBuildInfo(); ok { if out.Version == "" || out.Version == "dev" { if bi.Main.Version != "" && bi.Main.Version != "(devel)" { out.Version = bi.Main.Version } } for _, s := range bi.Settings { if s.Key == "vcs.revision" && (out.GitCommit == "" || out.GitCommit == "unknown") { if len(s.Value) > 12 { out.GitCommit = s.Value[:12] } else { out.GitCommit = s.Value } } if s.Key == "vcs.time" && (out.BuildTime == "" || out.BuildTime == "unknown") { out.BuildTime = s.Value } } } out.Version = normalizeBuildField(out.Version, "dev") out.GitCommit = normalizeBuildField(out.GitCommit, "unknown") out.BuildTime = normalizeBuildField(out.BuildTime, "unknown") return out } func normalizeBuildField(v string, fallback string) string { v = strings.TrimSpace(v) if v == "" { return fallback } return v }