39 lines
980 B
Go
39 lines
980 B
Go
// Package runtimeinfo implements the private runtime version state used by the
|
|
// public buildinfo facade.
|
|
package runtimeinfo
|
|
|
|
import (
|
|
"runtime/debug"
|
|
"sync"
|
|
)
|
|
|
|
var injectedVersion string
|
|
|
|
// Version returns the injected version or the running executable's main module
|
|
// version, falling back to "dev" when neither provides a release identifier.
|
|
func Version() string {
|
|
if injectedVersion != "" {
|
|
return injectedVersion
|
|
}
|
|
return fallbackVersion()
|
|
}
|
|
|
|
var fallbackVersion = newFallbackVersion(debug.ReadBuildInfo)
|
|
|
|
func newFallbackVersion(readBuildInfo func() (*debug.BuildInfo, bool)) func() string {
|
|
return sync.OnceValue(func() string { return version("", readBuildInfo) })
|
|
}
|
|
|
|
func version(injected string, readBuildInfo func() (*debug.BuildInfo, bool)) string {
|
|
if injected != "" {
|
|
return injected
|
|
}
|
|
|
|
info, ok := readBuildInfo()
|
|
if ok && info != nil && info.Main.Version != "" && info.Main.Version != "(devel)" {
|
|
return info.Main.Version
|
|
}
|
|
|
|
return "dev"
|
|
}
|