constellation/cli/internal/cmd/version.go
Otto Bittner 1d5a8283e0
cli: use Semver type to represent microservice versions (#2125)
Previously we used strings to pass microservice versions. This invited
bugs due to missing input validation.
2023-07-25 14:20:25 +02:00

89 lines
2.3 KiB
Go

/*
Copyright (c) Edgeless Systems GmbH
SPDX-License-Identifier: AGPL-3.0-only
*/
package cmd
import (
"runtime"
"runtime/debug"
"github.com/edgelesssys/constellation/v2/internal/constants"
"github.com/spf13/cobra"
)
// NewVersionCmd returns a new cobra.Command for the verify command.
func NewVersionCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "version",
Short: "Display version of this CLI",
Long: "Display version of this CLI.",
Args: cobra.NoArgs,
Run: runVersion,
}
return cmd
}
func runVersion(cmd *cobra.Command, _ []string) {
buildInfo, ok := debug.ReadBuildInfo()
var commit, state, date, goVersion, compiler, platform string
if ok {
commit, state, date, goVersion, compiler, platform = parseBuildInfo(buildInfo)
} else {
commit, state, date, goVersion, compiler, platform = parseStamp()
}
cmd.Printf("Version:\t%s (%s)\n", constants.BinaryVersion().String(), constants.VersionBuild)
cmd.Printf("GitCommit:\t%s\n", commit)
cmd.Printf("GitTreeState:\t%s\n", state)
cmd.Printf("BuildDate:\t%s\n", date)
cmd.Printf("GoVersion:\t%s\n", goVersion)
cmd.Printf("Compiler:\t%s\n", compiler)
cmd.Printf("Platform:\t%s\n", platform)
}
// parseBuildInfo parses the build info from the debug info provided by setting the buildvcs flag.
func parseBuildInfo(info *debug.BuildInfo) (commit, state, date, goVersion, compiler, platform string) {
var arch, os string
for idx := range info.Settings {
key := info.Settings[idx].Key
value := info.Settings[idx].Value
switch key {
case "-compiler":
compiler = value
case "GOARCH":
arch = value
case "GOOS":
os = value
case "vcs.time":
date = value
case "vcs.modified":
if value == "true" {
state = "dirty"
} else {
state = "clean"
}
case "vcs.revision":
commit = value
}
}
platform = os + "/" + arch
goVersion = info.GoVersion
return commit, state, date, goVersion, compiler, platform
}
// parseStamp parses the build info from the stamping information provided by Bazel.
func parseStamp() (commit, state, date, goVersion, compiler, platform string) {
commit = constants.Commit()
state = constants.State()
date = constants.Timestamp()
goVersion = runtime.Version()
compiler = "bazel/gc"
platform = runtime.GOOS + "/" + runtime.GOARCH
return commit, state, date, goVersion, compiler, platform
}