Repository navigation
Expand file tree
/
Copy pathgit.go
More file actions
88 lines (78 loc) · 1.7 KB
/
Copy pathgit.go
File metadata and controls
88 lines (78 loc) · 1.7 KB
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
package main
import (
"bufio"
"bytes"
"os/exec"
"regexp"
"github.com/Masterminds/semver/v3"
)
var semverRegexp = regexp.MustCompile(
`^v?(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?(?:\+([0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*))?$`, //nolint:revive,lll
)
func init() {
RegisterSource("git", func() Source { return &GitSource{} })
RegisterDefaultSource("Git", SourceWithMeta{
VPrefix: VPrefixAuto,
Source: &GitSource{},
})
}
type GitSource struct {
CD string
Env map[string]string
ReadOnly bool
}
func (g *GitSource) IsCanBeLesser() bool {
return true
}
func (g *GitSource) IsReadOnly() bool {
return g.ReadOnly
}
func (g *GitSource) Get(_ FS) (*semver.Version, error) {
cmd, err := constructCmd([]string{"git", "tag"}, g.CD, g.Env)
if err != nil {
return nil, err
}
out, err := cmd.Output()
if err != nil {
return nil, err
}
tags, err := parseSemverTagsFromReader(bytes.NewReader(out))
if err != nil {
return nil, err
}
var maxTag *semver.Version
for _, tag := range tags {
t, err := semver.NewVersion(tag)
if err != nil {
continue
}
if maxTag == nil || t.GreaterThan(maxTag) {
maxTag = t
continue
}
}
return maxTag, nil
}
func (g *GitSource) Set(v semver.Version, _ FS) error {
if g.ReadOnly {
return nil
}
str := verToString(&v)
cmd := exec.Command("git", "tag", "-f", str) //nolint:gosec,noctx
_, err := cmd.Output()
return err
}
func parseSemverTagsFromReader(r *bytes.Reader) ([]string, error) {
var out []string
sc := bufio.NewScanner(r)
for sc.Scan() {
t := sc.Text()
if semverRegexp.MatchString(t) {
out = append(out, t)
}
}
if err := sc.Err(); err != nil {
return nil, err
}
return out, nil
}