/
version.go
77 lines (68 loc) · 1.99 KB
/
version.go
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
// This file is part of CycloneDX GoMod
//
// 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.
//
// SPDX-License-Identifier: Apache-2.0
// Copyright (c) OWASP Foundation. All Rights Reserved.
package version
import (
"golang.org/x/mod/module"
"runtime"
"runtime/debug"
"strconv"
"time"
)
var Info = struct {
Version string
ModuleSum string `json:",omitempty"`
Commit string `json:",omitempty"`
CommitDate *time.Time `json:",omitempty"`
Modified *bool `json:",omitempty"`
GoVersion string
OS string
Arch string
}{
Version: "v0.0.0-unknown",
}
// nolint: gochecknoinits
func init() {
bi, ok := debug.ReadBuildInfo()
if !ok {
return
}
Info.Commit = buildSetting(bi, "vcs.revision")
if vcsDate, err := time.Parse(time.RFC3339, buildSetting(bi, "vcs.time")); err == nil {
Info.CommitDate = &vcsDate
}
if vcsModified, err := strconv.ParseBool(buildSetting(bi, "vcs.modified")); err == nil {
Info.Modified = &vcsModified
}
Info.GoVersion = bi.GoVersion
Info.OS = runtime.GOOS
Info.Arch = runtime.GOARCH
if bi.Main.Version != "" && bi.Main.Version != "(devel)" {
Info.Version = bi.Main.Version
} else if Info.Commit != "" && Info.CommitDate != nil {
Info.Version = module.PseudoVersion("", "", *Info.CommitDate, Info.Commit[:12])
}
Info.ModuleSum = bi.Main.Sum
}
func buildSetting(bi *debug.BuildInfo, key string) (val string) {
for _, setting := range bi.Settings {
if setting.Key == key {
val = setting.Value
break
}
}
return
}