-
Notifications
You must be signed in to change notification settings - Fork 0
/
versioner.go
106 lines (90 loc) · 2.28 KB
/
versioner.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
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package version
import (
"bytes"
"fmt"
"golang.org/x/text/cases"
"golang.org/x/text/language"
"strings"
"text/template"
"time"
)
// unspecified placeholder used to indicate unspecified values
const unspecified = "unspecified"
// dateLayout is string layout for parsing datetime
const dateLayout = "2006-01-02T15:04:05ZMST"
// verTemplate is template for version message
const verTemplate = `{{.GetName}} {{.Tag}}
{{if .IfSpecified}}Branch {{.Branch}}, commit hash: {{.Commit}}
Origin repository: {{.URL}}
Compiled at: {{.Date}}
©{{.Date.Year}} {{end}}gateway.fm
`
// This variables supposed to be bound during compilation using -ldflags
var (
ServiceName = unspecified
CommitTag = unspecified
CommitSHA = unspecified
CommitBranch = unspecified
OriginURL = unspecified
BuildDate = unspecified
)
// Version represent git version structure
type Version struct {
Service string
Tag string
Commit string
Branch string
URL string
Date time.Time
msg bytes.Buffer
}
// NewVersion create new girt Version instance
func NewVersion() (ver *Version, err error) {
var date time.Time
if BuildDate == "unspecified" {
date = time.Now()
} else {
date, err = time.Parse(dateLayout, BuildDate)
if err != nil {
return nil, fmt.Errorf("parse build date: %w", err)
}
}
tag := CommitTag
if tag == "" || tag == unspecified {
tag = "v0.0.0"
}
ver = &Version{
Service: ServiceName,
Tag: tag,
Commit: CommitSHA,
Branch: CommitBranch,
URL: strings.TrimSuffix(OriginURL, ".git"),
Date: date,
}
err = ver.initTemplate()
return
}
// initTemplate initialize Version message from template
func (v *Version) initTemplate() (err error) {
tmpl, err := template.New("version").Parse(verTemplate)
if err != nil {
return fmt.Errorf("create version template: %w", err)
}
err = tmpl.Execute(&v.msg, v)
return
}
// IfSpecified check if version specified
func (v Version) IfSpecified() bool {
if v.Service == unspecified || v.Commit == unspecified || v.Branch == unspecified || v.URL == unspecified {
return false
}
return true
}
// String return version message
func (v Version) String() string {
return v.msg.String()
}
// GetName return service name
func (v Version) GetName() string {
return cases.Title(language.English).String(v.Service)
}