diff --git a/version/git.go b/version/git.go index 667b678..614affd 100644 --- a/version/git.go +++ b/version/git.go @@ -124,13 +124,20 @@ func getTagMap(repo *git.Repository, match func(string) bool) (map[string]Tag, e if err != nil { return nil } - hash := commit.Hash.String() - if c, ok := result[hash]; ok && !commit.Committer.When.After(c.When) { + tagName := ref.Name().Short() + + if !match(tagName) { return nil } - tagName := ref.Name().Short() - if match(tagName) { - result[hash] = Tag{Name: tagName, When: commit.Committer.When} + hash := commit.Hash.String() + if c, ok := result[hash]; !ok || (ok && !commit.Committer.When.After(c.When)) { + h0 := RepoHead{c.Name, 0, hash} + h1 := RepoHead{tagName, 0, hash} + v0, err0 := NewFromHead(&h0, "") + v1, err1 := NewFromHead(&h1, "") + if err0 != nil || (err1 == nil && v1.Compare(&v0) > 0) { + result[hash] = Tag{Name: tagName, When: commit.Committer.When} + } } default: return err diff --git a/version/version.go b/version/version.go index b0b81ec..5890a13 100644 --- a/version/version.go +++ b/version/version.go @@ -89,6 +89,21 @@ type Version struct { Meta string } +// Return 0 if both versions are equal +// Compares two versions. It returns +// - 0 if both versions are equal +// - some positive number if v > o +// - some negative number if v < o +func (v Version) Compare(o *Version) int { + if v.Major != o.Major { + return v.Major - o.Major + } + if v.Minor != o.Minor { + return v.Minor - o.Minor + } + return v.Patch - o.Patch +} + // BumpTo increases the version to the next patch/minor/major version. The version components with // lower priority than the update target will be reset to zero. // diff --git a/version/version_test.go b/version/version_test.go index 24851be..cdd7b7a 100644 --- a/version/version_test.go +++ b/version/version_test.go @@ -210,3 +210,10 @@ func TestParseRelease(t *testing.T) { require.NoError(t, target.Set("major")) assert.Equal(t, Major, target) } + +func TestVersionCompare(t *testing.T) { + v := Version{Major: 1, Minor: 2, Patch: 3} + assert.Equal(t, v.Compare(&Version{Major: 1, Minor: 3, Patch: 0}), -1) + assert.Equal(t, v.Compare(&Version{Major: 1, Minor: 0, Patch: 0}), 2) + assert.Equal(t, v.Compare(&Version{Major: 1, Minor: 2, Patch: 3}), 0) +}