Skip to content

Commit 9f8fc60

Browse files
authored
Merge pull request #41 from weimingzha0/fix_tags
Select larger tag for commits with multiple lightweight tags
2 parents a87b66a + 6049caa commit 9f8fc60

File tree

3 files changed

+52
-3
lines changed

3 files changed

+52
-3
lines changed

version/git.go

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -124,14 +124,25 @@ func getTagMap(repo *git.Repository, match func(string) bool) (map[string]Tag, e
124124
if err != nil {
125125
return nil
126126
}
127+
tagName := ref.Name().Short()
128+
if !match(tagName) {
129+
return nil
130+
}
127131
hash := commit.Hash.String()
128-
if c, ok := result[hash]; ok && !commit.Committer.When.After(c.When) {
132+
c, ok := result[hash]
133+
if !ok {
134+
result[hash] = Tag{Name: tagName, When: commit.Committer.When}
129135
return nil
130136
}
131-
tagName := ref.Name().Short()
132-
if match(tagName) {
137+
// two tags on the same commit, select the larger one.
138+
h0 := RepoHead{c.Name, 0, hash}
139+
h1 := RepoHead{tagName, 0, hash}
140+
v0, err0 := NewFromHead(&h0, "")
141+
v1, err1 := NewFromHead(&h1, "")
142+
if err0 != nil || (err1 == nil && v1.Compare(&v0) > 0) {
133143
result[hash] = Tag{Name: tagName, When: commit.Committer.When}
134144
}
145+
return nil
135146
default:
136147
return err
137148
}

version/version.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,31 @@ type Version struct {
8989
Meta string
9090
}
9191

92+
// Return 0 if both versions are equal
93+
// Compares two versions. It returns
94+
// - 0 if both versions are equal
95+
// - some positive number if v > o
96+
// - some negative number if v < o
97+
func (v Version) Compare(o *Version) int {
98+
if v.Major != o.Major {
99+
return v.Major - o.Major
100+
}
101+
if v.Minor != o.Minor {
102+
return v.Minor - o.Minor
103+
}
104+
if v.Patch != o.Patch {
105+
return v.Patch - o.Patch
106+
}
107+
if v.Commits != o.Commits {
108+
return v.Commits - o.Commits
109+
}
110+
if v.Meta != o.Meta {
111+
return strings.Compare(v.Meta, o.Meta)
112+
}
113+
// alphabetic order
114+
return strings.Compare(v.String(), o.String())
115+
}
116+
92117
// BumpTo increases the version to the next patch/minor/major version. The version components with
93118
// lower priority than the update target will be reset to zero.
94119
//

version/version_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,3 +210,16 @@ func TestParseRelease(t *testing.T) {
210210
require.NoError(t, target.Set("major"))
211211
assert.Equal(t, Major, target)
212212
}
213+
214+
func TestVersionCompare(t *testing.T) {
215+
v := Version{Major: 1, Minor: 2, Patch: 3}
216+
assert.Equal(t, v.Compare(&Version{Major: 1, Minor: 3, Patch: 0}), -1)
217+
assert.Equal(t, v.Compare(&Version{Major: 1, Minor: 0, Patch: 0}), 2)
218+
assert.Equal(t, v.Compare(&Version{Major: 1, Minor: 2, Patch: 3}), 0)
219+
assert.Equal(t, v.Compare(&Version{Major: 1, Minor: 2, Patch: 3}), 0)
220+
221+
v = Version{Major: 1, Minor: 2, Patch: 3, Meta: "dev.2"}
222+
assert.Equal(t, v.Compare(&Version{Major: 1, Minor: 2, Patch: 3, Meta: "dev.1"}), 1)
223+
assert.Equal(t, v.Compare(&Version{Major: 1, Minor: 2, Patch: 3, Meta: "dev.5"}), -1)
224+
assert.Equal(t, v.Compare(&Version{Major: 1, Minor: 2, Patch: 3, Meta: "dev.2"}), 0)
225+
}

0 commit comments

Comments
 (0)