package version import ( "runtime/debug" "strconv" "time" ) // These will be set by ldflags at build time var ( Version = "dev" Commit = "" BuildTime = "0" IsModified = "false" ) type VersionInfo struct { BuildTime time.Time `json:"build_time"` IsModified bool `json:"is_modified"` Revision string `json:"revision"` } func Get() VersionInfo { // Try ldflags first (set by Nix build) if Commit != "" && Commit != "unknown" { var buildTime time.Time if timestamp, err := strconv.ParseInt(BuildTime, 10, 64); err == nil && timestamp > 0 { buildTime = time.Unix(timestamp, 0) } return VersionInfo{ Revision: Commit, BuildTime: buildTime, IsModified: IsModified == "true", } } // Fallback to debug.ReadBuildInfo() for development info, ok := debug.ReadBuildInfo() if !ok { return VersionInfo{ Revision: "unknown", } } var version VersionInfo for _, setting := range info.Settings { switch setting.Key { case "vcs.modified": version.IsModified = setting.Value == "true" case "vcs.revision": if len(setting.Value) > 7 { version.Revision = setting.Value[:7] } else { version.Revision = setting.Value } case "vcs.time": if t, err := time.Parse(time.RFC3339, setting.Value); err == nil { version.BuildTime = t } } } return version }