1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
|
//
// Copyright 2022 The Sigstore Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package version
import (
"os"
"runtime/debug"
"strings"
)
// Base version information.
//
// This is the fallback data used when version information from git is not
// provided via go ldflags.
var (
// Output of "git describe". The prerequisite is that the
// branch should be tagged using the correct versioning strategy.
gitVersion = "devel"
envVarPrefixes = []string{
"GITSIGN_",
// Can modify Sigstore/TUF client behavior - https://github.com/sigstore/sigstore/blob/35d6a82c15183f7fe7a07eca45e17e378aa32126/pkg/tuf/client.go#L52
"SIGSTORE_",
"TUF_",
}
)
type Info struct {
GitVersion string `json:"gitVersion"`
Env []string `json:"env"`
}
func getBuildInfo() *debug.BuildInfo {
bi, ok := debug.ReadBuildInfo()
if !ok {
return nil
}
return bi
}
func getGitVersion(bi *debug.BuildInfo) string {
if bi == nil {
return "unknown"
}
// https://github.com/golang/go/issues/29228
if bi.Main.Version == "(devel)" || bi.Main.Version == "" {
return gitVersion
}
return bi.Main.Version
}
func getGitsignEnv() []string {
out := []string{}
for _, e := range os.Environ() {
// Prefixes to look for. err on the side of showing too much rather
// than too little. We'll only output things that have values set.
for _, prefix := range envVarPrefixes {
if strings.HasPrefix(e, prefix) {
eComponents := strings.Split(strings.TrimSpace(e), "=")
if len(eComponents) == 1 || len(eComponents[1]) == 0 {
// The variable is set to nothing
// eg: SIGSTORE_ROOT_FILE=
continue
}
out = append(out, e)
}
}
}
return out
}
// GetVersionInfo represents known information on how this binary was built.
func GetVersionInfo() Info {
buildInfo := getBuildInfo()
gitVersion = getGitVersion(buildInfo)
return Info{
GitVersion: gitVersion,
Env: getGitsignEnv(),
}
}
|