1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- package mod
- import (
- "runtime/debug"
- "sync"
- "golang.org/x/mod/module"
- "golang.org/x/mod/semver"
- )
- var (
- buildInfoOnce sync.Once
- buildInfo *debug.BuildInfo
- )
- func Version(name string) (modVersion string) {
- return moduleVersion(name, readBuildInfo())
- }
- func moduleVersion(name string, bi *debug.BuildInfo) (modVersion string) {
- if bi == nil {
- return
- }
- // iterate over all dependencies and find buildkit
- for _, dep := range bi.Deps {
- if dep.Path != name {
- continue
- }
- // get the version of buildkit dependency
- modVersion = dep.Version
- if dep.Replace != nil {
- // if the version is replaced, get the replaced version
- modVersion = dep.Replace.Version
- }
- if !module.IsPseudoVersion(modVersion) {
- return
- }
- // if the version is a pseudo version, get the base version
- // e.g. v0.10.7-0.20230306143919-70f2ad56d3e5 => v0.10.6
- if base, err := module.PseudoVersionBase(modVersion); err == nil && base != "" {
- // set canonical version of the base version (removes +incompatible suffix)
- // e.g. v2.1.2+incompatible => v2.1.2
- base = semver.Canonical(base)
- // if the version is a pseudo version, get the revision
- // e.g. v0.10.7-0.20230306143919-70f2ad56d3e5 => 70f2ad56d3e5
- if rev, err := module.PseudoVersionRev(modVersion); err == nil && rev != "" {
- // append the revision to the version
- // e.g. v0.10.7-0.20230306143919-70f2ad56d3e5 => v0.10.6+70f2ad56d3e5
- modVersion = base + "+" + rev
- } else {
- // if the revision is not available, use the base version
- modVersion = base
- }
- }
- break
- }
- return
- }
- func readBuildInfo() *debug.BuildInfo {
- buildInfoOnce.Do(func() {
- buildInfo, _ = debug.ReadBuildInfo()
- })
- return buildInfo
- }
|