@@ -11,7 +11,6 @@ import (
11
11
"github.com/go-git/go-git/v5"
12
12
"github.com/go-git/go-git/v5/plumbing"
13
13
"github.com/go-git/go-git/v5/plumbing/object"
14
- "github.com/go-git/go-git/v5/plumbing/storer"
15
14
log "github.com/sirupsen/logrus"
16
15
)
17
16
@@ -77,14 +76,14 @@ func (g *GitUtil) GetBranch() (string, error) {
77
76
}
78
77
79
78
// GetLastVersion from git tags
80
- func (g * GitUtil ) GetLastVersion () (* semver.Version , string , error ) {
79
+ func (g * GitUtil ) GetLastVersion () (* semver.Version , * plumbing. Reference , error ) {
81
80
82
81
var tags []* semver.Version
83
82
84
83
gitTags , err := g .Repository .Tags ()
85
84
86
85
if err != nil {
87
- return nil , "" , err
86
+ return nil , nil , err
88
87
}
89
88
90
89
err = gitTags .ForEach (func (p * plumbing.Reference ) error {
@@ -100,59 +99,69 @@ func (g *GitUtil) GetLastVersion() (*semver.Version, string, error) {
100
99
})
101
100
102
101
if err != nil {
103
- return nil , "" , err
102
+ return nil , nil , err
104
103
}
105
104
106
105
sort .Sort (sort .Reverse (semver .Collection (tags )))
107
106
108
107
if len (tags ) == 0 {
109
108
log .Debugf ("Found no tags" )
110
- return nil , "" , nil
109
+ return nil , nil , nil
111
110
}
112
111
113
112
log .Debugf ("Found old version %s" , tags [0 ].String ())
114
113
115
114
tag , err := g .Repository .Tag (tags [0 ].Original ())
116
115
if err != nil {
117
- return nil , "" , err
116
+ return nil , nil , err
118
117
}
119
118
120
119
log .Debugf ("Found old hash %s" , tag .Hash ().String ())
121
- return tags [0 ], tag . Hash (). String () , nil
120
+ return tags [0 ], tag , nil
122
121
}
123
122
124
123
// GetCommits from git hash to HEAD
125
- func (g * GitUtil ) GetCommits (lastTagHash string ) ([]shared.Commit , error ) {
124
+ func (g * GitUtil ) GetCommits (lastTagHash * plumbing. Reference ) ([]shared.Commit , error ) {
126
125
127
126
ref , err := g .Repository .Head ()
128
127
if err != nil {
129
128
return nil , err
130
129
}
131
130
132
- cIter , err := g .Repository .Log (& git.LogOptions {From : ref .Hash (), Order : git . LogOrderCommitterTime })
131
+ excludeIter , err := g .Repository .Log (& git.LogOptions {From : lastTagHash .Hash ()})
133
132
if err != nil {
134
133
return nil , err
135
134
}
136
135
137
- commits := make (map [string ]shared.Commit )
138
- var foundEnd bool
136
+ startCommit , err := g .Repository .CommitObject (ref .Hash ())
137
+ if err != nil {
138
+ return nil , err
139
+ }
140
+ seen := map [plumbing.Hash ]struct {}{}
139
141
140
- err = cIter .ForEach (func (c * object.Commit ) error {
142
+ err = excludeIter .ForEach (func (c * object.Commit ) error {
143
+ seen [c .Hash ] = struct {}{}
144
+ return nil
145
+ })
146
+ if err != nil {
147
+ return nil , err
148
+ }
141
149
142
- if c .Hash .String () == lastTagHash {
143
- log .Debugf ("Found commit with hash %s, will stop here" , c .Hash .String ())
144
- foundEnd = true
145
- return storer .ErrStop
146
- }
150
+ var isValid object.CommitFilter = func (commit * object.Commit ) bool {
151
+ _ , ok := seen [commit .Hash ]
152
+ return ! ok && len (commit .ParentHashes ) < 2
153
+ }
147
154
148
- if ! foundEnd {
149
- log .Tracef ("Found commit with hash %s" , c .Hash .String ())
150
- commits [c .Hash .String ()] = shared.Commit {
151
- Message : c .Message ,
152
- Author : c .Committer .Name ,
153
- Hash : c .Hash .String (),
154
- }
155
+ cIter := object .NewFilterCommitIter (startCommit , & isValid , nil )
156
+
157
+ commits := make (map [string ]shared.Commit )
155
158
159
+ err = cIter .ForEach (func (c * object.Commit ) error {
160
+ log .Debugf ("Found commit with hash %s" , c .Hash .String ())
161
+ commits [c .Hash .String ()] = shared.Commit {
162
+ Message : c .Message ,
163
+ Author : c .Committer .Name ,
164
+ Hash : c .Hash .String (),
156
165
}
157
166
return nil
158
167
})
0 commit comments