-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathversion.go
70 lines (61 loc) · 1.72 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
package main
import (
"regexp"
"gopkg.in/src-d/go-git.v4"
"gopkg.in/src-d/go-git.v4/plumbing"
"gopkg.in/src-d/go-git.v4/plumbing/object"
)
// Returns the last semver tag in the git history
func latestSemverTag(repo *git.Repository) (semver, error) {
tagRefs, err := repo.Tags()
checkIfError(err)
var latestTagCommit *object.Commit
var latestTagName semver
err = tagRefs.ForEach(func(tagRef *plumbing.Reference) error {
tagName := tagRef.Name().String()
_, err := isSemver(tagName)
if err == nil {
revision := plumbing.Revision(tagName)
tagCommitHash, err := repo.ResolveRevision(revision)
checkIfError(err)
commit, err := repo.CommitObject(*tagCommitHash)
checkIfError(err)
if latestTagCommit == nil {
latestTagCommit = commit
latestTagName = semverFromString(tagName)
}
if commit.Committer.When.After(latestTagCommit.Committer.When) {
latestTagCommit = commit
latestTagName = semverFromString(tagName)
}
}
return nil
})
checkIfError(err)
return latestTagName, nil
}
// Returns the semantic version value given commits
// and major, minor and patch values of current version
func semverBump(commits []*object.Commit, s semver) semver {
patchRegex, err := regexp.Compile(`(build|chore|ci|docs|fix|perf|refactor|revert|style|test)(\([a-z ]+\))?: [\w ]+`)
checkIfError(err)
minorRegex, err := regexp.Compile(`(feat|feature)(\([a-z ]+\))?: [\w ]+`)
checkIfError(err)
patchFlag := false
minorFlag := false
for _, c := range commits {
if patchRegex.MatchString(c.Message) {
patchFlag = true
}
if minorRegex.MatchString(c.Message) {
minorFlag = true
}
}
if minorFlag {
return s.incrementMinor()
} else if patchFlag {
return s.incrementPatch()
} else {
return s
}
}