1diff --git a/pkg/git/git.go b/pkg/git/git.go
2index 7341c1bc3f04e6d91f17ac877bb523afd5ee19e2..a9c42ce0dd57fd28cb5824cad29dc85988209612 100644
3--- a/pkg/git/git.go
4+++ b/pkg/git/git.go
5@@ -8,6 +8,7 @@ "fmt"
6 "io"
7 "io/fs"
8 "path"
9+ "sort"
10 "time"
11
12 "github.com/go-git/go-git/v5"
13@@ -26,10 +27,12 @@ type (
14 GitRepository struct {
15 path string
16 repository *git.Repository
17-
18- ref plumbing.Hash
19- // this is setRef when ref is setRef
20- setRef bool
21+ ref plumbing.Hash
22+ setRef bool
23+ }
24+ TagReference struct {
25+ ref *plumbing.Reference
26+ tag *object.Tag
27 }
28 infoWrapper struct {
29 name string
30@@ -38,10 +41,9 @@ mode fs.FileMode
31 modTime time.Time
32 isDir bool
33 }
34-
35- TagReference struct {
36- ref *plumbing.Reference
37- tag *object.Tag
38+ tagList struct {
39+ refs []*TagReference
40+ r *git.Repository
41 }
42 )
43
44@@ -151,6 +153,10 @@ return nil
45 }); err != nil {
46 return nil, err
47 }
48+
49+ // tagList modify the underlying tag list.
50+ tagList := &tagList{r: g.repository, refs: tags}
51+ sort.Sort(tagList)
52
53 return tags, nil
54 }
55@@ -395,3 +401,40 @@ }
56 return ""
57
58 }
59+
60+func (self *tagList) Len() int {
61+ return len(self.refs)
62+}
63+
64+func (self *tagList) Swap(i, j int) {
65+ self.refs[i], self.refs[j] = self.refs[j], self.refs[i]
66+}
67+
68+func (self *tagList) Less(i, j int) bool {
69+ var dateI time.Time
70+ var dateJ time.Time
71+
72+ if self.refs[i].tag != nil {
73+ dateI = self.refs[i].tag.Tagger.When
74+ } else {
75+ c, err := self.r.CommitObject(self.refs[i].ref.Hash())
76+ if err != nil {
77+ dateI = time.Now()
78+ } else {
79+ dateI = c.Committer.When
80+ }
81+ }
82+
83+ if self.refs[j].tag != nil {
84+ dateJ = self.refs[j].tag.Tagger.When
85+ } else {
86+ c, err := self.r.CommitObject(self.refs[j].ref.Hash())
87+ if err != nil {
88+ dateJ = time.Now()
89+ } else {
90+ dateJ = c.Committer.When
91+ }
92+ }
93+
94+ return dateI.After(dateJ)
95+}