138 lines
3.1 KiB
Go
138 lines
3.1 KiB
Go
// Copyright (c) HashiCorp, Inc.
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
package version
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"strings"
|
|
|
|
gvers "github.com/hashicorp/go-version"
|
|
)
|
|
|
|
const BoundaryPrefix = "Boundary v"
|
|
|
|
// Info
|
|
type Info struct {
|
|
Revision string `json:"revision,omitempty"`
|
|
Version string `json:"version,omitempty"`
|
|
VersionPrerelease string `json:"version_prerelease,omitempty"`
|
|
VersionMetadata string `json:"version_metadata,omitempty"`
|
|
BuildDate string `json:"build_date,omitempty"`
|
|
CgoEnabled bool `json:"cgo_enabled,omitempty"`
|
|
}
|
|
|
|
func Get() *Info {
|
|
ver := Version
|
|
rel := VersionPrerelease
|
|
md := VersionMetadata
|
|
bd := BuildDate
|
|
if GitDescribe != "" {
|
|
ver = GitDescribe
|
|
}
|
|
if GitDescribe == "" && rel == "" && VersionPrerelease != "" {
|
|
rel = "dev"
|
|
}
|
|
// Remove metadata string from version output for oss
|
|
if md == "oss" {
|
|
md = ""
|
|
}
|
|
|
|
return &Info{
|
|
CgoEnabled: CgoEnabled,
|
|
Revision: GitCommit,
|
|
Version: ver,
|
|
VersionPrerelease: rel,
|
|
VersionMetadata: md,
|
|
BuildDate: bd,
|
|
}
|
|
}
|
|
|
|
func (c *Info) VersionNumber() string {
|
|
if Version == "unknown" && VersionPrerelease == "unknown" {
|
|
return "(version unknown)"
|
|
}
|
|
|
|
version := c.Version
|
|
|
|
if c.VersionPrerelease != "" {
|
|
version = fmt.Sprintf("%s-%s", version, c.VersionPrerelease)
|
|
}
|
|
|
|
if c.VersionMetadata != "" && c.VersionMetadata != "oss" {
|
|
version = fmt.Sprintf("%s+%s", version, c.VersionMetadata)
|
|
}
|
|
|
|
return version
|
|
}
|
|
|
|
// Semver returns a *gvers.Version if the Info is parseable as
|
|
// a semantic version. Otherwise it returns nil.
|
|
func (c *Info) Semver() *gvers.Version {
|
|
if c == nil {
|
|
return nil
|
|
}
|
|
v, err := gvers.NewSemver(c.VersionNumber())
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
return v
|
|
}
|
|
|
|
// FromVersionString returns an *Info containing the version, or nil if the
|
|
// string was unable to be parsed.
|
|
func FromVersionString(s string) *Info {
|
|
s = strings.TrimSpace(s)
|
|
s = strings.TrimPrefix(s, BoundaryPrefix)
|
|
i := Info{}
|
|
|
|
// Get the revision
|
|
startOfRevIdx := strings.LastIndex(s, "(")
|
|
endOfRevIdx := strings.LastIndex(s, ")")
|
|
if startOfRevIdx > 0 && endOfRevIdx > 0 {
|
|
if endOfRevIdx < startOfRevIdx {
|
|
return nil
|
|
}
|
|
i.Revision, s = s[startOfRevIdx+1:endOfRevIdx], strings.TrimSpace(s[:startOfRevIdx])
|
|
}
|
|
|
|
v, err := gvers.NewSemver(s)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
|
|
if md := v.Metadata(); len(md) > 0 && md != "oss" {
|
|
i.VersionMetadata = md
|
|
}
|
|
if pr := v.Prerelease(); len(pr) > 0 {
|
|
i.VersionPrerelease = pr
|
|
}
|
|
i.Version = v.Core().String()
|
|
|
|
return &i
|
|
}
|
|
|
|
func (c *Info) FullVersionNumber(rev bool) string {
|
|
var versionString bytes.Buffer
|
|
|
|
if Version == "unknown" && VersionPrerelease == "unknown" {
|
|
return "Boundary (version unknown)"
|
|
}
|
|
|
|
fmt.Fprintf(&versionString, "%s%s", BoundaryPrefix, c.Version)
|
|
if c.VersionPrerelease != "" {
|
|
fmt.Fprintf(&versionString, "-%s", c.VersionPrerelease)
|
|
}
|
|
|
|
if c.VersionMetadata != "" && c.VersionMetadata != "oss" {
|
|
fmt.Fprintf(&versionString, "+%s", c.VersionMetadata)
|
|
}
|
|
|
|
if rev && c.Revision != "" {
|
|
fmt.Fprintf(&versionString, " (%s)", c.Revision)
|
|
}
|
|
|
|
return versionString.String()
|
|
}
|