@@ -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
2526func 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.
3353type 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.
93115func 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.
104125func 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