Skip to content

Commit 2cd2477

Browse files
Nightapesfwiedmann
authored andcommitted
fix(internal): improve git log for commits on current branch since last release
At the moment when PRs where done in parallel it could happen that some commits where ignored in the release. This should be fixed now
1 parent cb3084d commit 2cd2477

File tree

2 files changed

+35
-26
lines changed

2 files changed

+35
-26
lines changed

internal/gitutil/gitutil.go

Lines changed: 33 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111
"github.com/go-git/go-git/v5"
1212
"github.com/go-git/go-git/v5/plumbing"
1313
"github.com/go-git/go-git/v5/plumbing/object"
14-
"github.com/go-git/go-git/v5/plumbing/storer"
1514
log "github.com/sirupsen/logrus"
1615
)
1716

@@ -77,14 +76,14 @@ func (g *GitUtil) GetBranch() (string, error) {
7776
}
7877

7978
// GetLastVersion from git tags
80-
func (g *GitUtil) GetLastVersion() (*semver.Version, string, error) {
79+
func (g *GitUtil) GetLastVersion() (*semver.Version, *plumbing.Reference, error) {
8180

8281
var tags []*semver.Version
8382

8483
gitTags, err := g.Repository.Tags()
8584

8685
if err != nil {
87-
return nil, "", err
86+
return nil, nil, err
8887
}
8988

9089
err = gitTags.ForEach(func(p *plumbing.Reference) error {
@@ -100,59 +99,69 @@ func (g *GitUtil) GetLastVersion() (*semver.Version, string, error) {
10099
})
101100

102101
if err != nil {
103-
return nil, "", err
102+
return nil, nil, err
104103
}
105104

106105
sort.Sort(sort.Reverse(semver.Collection(tags)))
107106

108107
if len(tags) == 0 {
109108
log.Debugf("Found no tags")
110-
return nil, "", nil
109+
return nil, nil, nil
111110
}
112111

113112
log.Debugf("Found old version %s", tags[0].String())
114113

115114
tag, err := g.Repository.Tag(tags[0].Original())
116115
if err != nil {
117-
return nil, "", err
116+
return nil, nil, err
118117
}
119118

120119
log.Debugf("Found old hash %s", tag.Hash().String())
121-
return tags[0], tag.Hash().String(), nil
120+
return tags[0], tag, nil
122121
}
123122

124123
// 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) {
126125

127126
ref, err := g.Repository.Head()
128127
if err != nil {
129128
return nil, err
130129
}
131130

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()})
133132
if err != nil {
134133
return nil, err
135134
}
136135

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{}{}
139141

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+
}
141149

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+
}
147154

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)
155158

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(),
156165
}
157166
return nil
158167
})

pkg/semanticrelease/semantic-release.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ func (s *SemanticRelease) GetNextVersion(provider *ci.ProviderConfig, force bool
131131
Version: &newVersion,
132132
},
133133
Last: shared.ReleaseVersionEntry{
134-
Commit: lastVersionHash,
134+
Commit: lastVersionHash.Hash().String(),
135135
Version: lastVersion,
136136
},
137137
Branch: provider.Branch,
@@ -171,7 +171,7 @@ func (s *SemanticRelease) SetVersion(provider *ci.ProviderConfig, version string
171171
Version: newVersion,
172172
},
173173
Last: shared.ReleaseVersionEntry{
174-
Commit: lastVersionHash,
174+
Commit: lastVersionHash.Hash().String(),
175175
Version: lastVersion,
176176
},
177177
Branch: provider.Branch,

0 commit comments

Comments
 (0)