Skip to content

Commit c4a6f2e

Browse files
authored
Merge pull request #228 from safing/fix/version-metadata
Fix and improve parsing of git tag based version metadata
2 parents c6fa7a8 + e888e08 commit c4a6f2e

File tree

1 file changed

+47
-26
lines changed

1 file changed

+47
-26
lines changed

info/version.go

+47-26
Original file line numberDiff line numberDiff line change
@@ -14,26 +14,47 @@ var (
1414
name string
1515
license string
1616

17-
version = "dev build"
18-
buildSource = "unknown"
19-
buildTime = "unknown"
17+
version = "dev build"
18+
versionNumber = "0.0.0"
19+
buildSource = "unknown"
20+
buildTime = "unknown"
2021

2122
info *Info
2223
loadInfo sync.Once
2324
)
2425

2526
func init() {
26-
// Convert version string space placeholders.
27-
version = strings.ReplaceAll(version, "_", " ")
27+
// Replace space placeholders.
2828
buildSource = strings.ReplaceAll(buildSource, "_", " ")
2929
buildTime = strings.ReplaceAll(buildTime, "_", " ")
30+
31+
// Convert version string from git tag to expected format.
32+
version = strings.TrimSpace(strings.ReplaceAll(strings.TrimPrefix(version, "v"), "_", " "))
33+
versionNumber = strings.TrimSpace(strings.TrimSuffix(version, "dev build"))
34+
if versionNumber == "" {
35+
versionNumber = "0.0.0"
36+
}
37+
38+
// Get build info.
39+
buildInfo, _ := debug.ReadBuildInfo()
40+
buildSettings := make(map[string]string)
41+
for _, setting := range buildInfo.Settings {
42+
buildSettings[setting.Key] = setting.Value
43+
}
44+
45+
// Add "dev build" to version if repo is dirty.
46+
if buildSettings["vcs.modified"] == "true" &&
47+
!strings.HasSuffix(version, "dev build") {
48+
version += " dev build"
49+
}
3050
}
3151

3252
// Info holds the programs meta information.
3353
type Info struct { //nolint:maligned
34-
Name string
35-
Version string
36-
License string
54+
Name string
55+
Version string
56+
VersionNumber string
57+
License string
3758

3859
Source string
3960
BuildTime string
@@ -66,16 +87,17 @@ func GetInfo() *Info {
6687
}
6788

6889
info = &Info{
69-
Name: name,
70-
Version: version,
71-
License: license,
72-
Source: buildSource,
73-
BuildTime: buildTime,
74-
CGO: buildSettings["CGO_ENABLED"] == "1",
75-
Commit: buildSettings["vcs.revision"],
76-
CommitTime: buildSettings["vcs.time"],
77-
Dirty: buildSettings["vcs.modified"] == "true",
78-
BuildInfo: *buildInfo,
90+
Name: name,
91+
Version: version,
92+
VersionNumber: versionNumber,
93+
License: license,
94+
Source: buildSource,
95+
BuildTime: buildTime,
96+
CGO: buildSettings["CGO_ENABLED"] == "1",
97+
Commit: buildSettings["vcs.revision"],
98+
CommitTime: buildSettings["vcs.time"],
99+
Dirty: buildSettings["vcs.modified"] == "true",
100+
BuildInfo: *buildInfo,
79101
}
80102

81103
if info.Commit == "" {
@@ -89,24 +111,23 @@ func GetInfo() *Info {
89111
return info
90112
}
91113

92-
// Version returns the short version string.
114+
// Version returns the annotated version.
93115
func Version() string {
94-
info := GetInfo()
95-
96-
if info.Dirty {
97-
return version + "*"
98-
}
99-
100116
return version
101117
}
102118

119+
// VersionNumber returns the version number only.
120+
func VersionNumber() string {
121+
return versionNumber
122+
}
123+
103124
// FullVersion returns the full and detailed version string.
104125
func FullVersion() string {
105126
info := GetInfo()
106127
builder := new(strings.Builder)
107128

108129
// Name and version.
109-
builder.WriteString(fmt.Sprintf("%s %s\n", info.Name, Version()))
130+
builder.WriteString(fmt.Sprintf("%s %s\n", info.Name, version))
110131

111132
// Build info.
112133
cgoInfo := "-cgo"

0 commit comments

Comments
 (0)