-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgit.go
67 lines (61 loc) · 1.47 KB
/
git.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
package main
import (
"sort"
"github.com/Masterminds/semver"
"github.com/go-git/go-git/v5"
"github.com/go-git/go-git/v5/plumbing"
"github.com/go-git/go-git/v5/plumbing/object"
"github.com/go-git/go-git/v5/plumbing/storer"
)
func LatestSemverTag(tags storer.ReferenceIter) string {
var (
semverTags []*semver.Version
semverMetadata map[*semver.Version]string
)
semverMetadata = make(map[*semver.Version]string)
tags.ForEach(func(tag *plumbing.Reference) error {
tagName := tag.Name().Short()
version, err := semver.NewVersion(tagName)
if err != nil {
return nil
}
if version.Prerelease() != "" {
return nil
}
semverTags = append(semverTags, version)
semverMetadata[version] = tagName
return nil
})
if len(semverTags) == 0 {
return ""
}
sort.Sort(semver.Collection(semverTags))
return semverMetadata[semverTags[len(semverTags)-1]]
}
func GetTagRef(repo *git.Repository, tag *plumbing.Reference) plumbing.Hash {
tagRef := tag.Hash()
obj, err := repo.TagObject(tagRef)
if err != nil {
return tagRef
}
tagCommit, err := obj.Commit()
if err != nil {
return tagRef
}
return tagCommit.Hash
}
func CommitMessagesSince(ref plumbing.Hash, commits object.CommitIter) []string {
var commitMessages []string
end := false
commits.ForEach(func(commit *object.Commit) error {
if commit.Hash == ref {
end = true
}
if end {
return nil
}
commitMessages = append(commitMessages, commit.Message)
return nil
})
return commitMessages
}