From 31160e4a84235dda8c6e9669533ed15247962721 Mon Sep 17 00:00:00 2001 From: Evan Date: Thu, 12 Aug 2021 14:44:39 +0800 Subject: [PATCH] fix: sort tags by commit order Signed-off-by: Evan --- fields.go | 1 + tag_reader.go | 27 ++++++++++++++++++++++++++- tag_reader_test.go | 42 +++++++++++++++++++++++++++++++----------- 3 files changed, 58 insertions(+), 12 deletions(-) diff --git a/fields.go b/fields.go index 2d68b885..687ec956 100644 --- a/fields.go +++ b/fields.go @@ -109,6 +109,7 @@ type Tag struct { Name string Subject string Date time.Time + Order int // The less the newer Next *RelateTag Previous *RelateTag } diff --git a/tag_reader.go b/tag_reader.go index 754cb633..6e3f4aca 100644 --- a/tag_reader.go +++ b/tag_reader.go @@ -76,6 +76,7 @@ func (r *tagReader) ReadAll() ([]*Tag, error) { switch r.sortBy { case "date": + r.assignOrderToTags(tags) r.sortTags(tags) case "semver": r.filterSemVerTags(&tags) @@ -146,9 +147,33 @@ func (*tagReader) assignPreviousAndNextTag(tags []*Tag) { } } +func (r *tagReader) assignOrderToTags(tags []*Tag) error { + out, err := r.client.Exec("log", "--oneline", "--decorate=short") + if err != nil { + return fmt.Errorf("failed to get git-log: %w", err) + } + + lines := strings.Split(out, "\n") + re := regexp.MustCompile(`tag:\s([^\s]*)[,)]`) + for i, line := range lines { + result := re.FindAllStringSubmatch(line, -1) + for _, match := range result { + tagOfCommit := match[1] + for _, tag := range tags { + if tagOfCommit == tag.Name { + tag.Order = i + break + } + } + } + } + return nil +} + func (*tagReader) sortTags(tags []*Tag) { sort.Slice(tags, func(i, j int) bool { - return !tags[i].Date.Before(tags[j].Date) + //return !tags[i].Date.Before(tags[j].Date) + return tags[i].Order < tags[j].Order }) } diff --git a/tag_reader_test.go b/tag_reader_test.go index 43cd308d..70d2fac5 100644 --- a/tag_reader_test.go +++ b/tag_reader_test.go @@ -13,19 +13,31 @@ func TestTagReader(t *testing.T) { assert := assert.New(t) client := &mockClient{ ReturnExec: func(subcmd string, args ...string) (string, error) { - if subcmd != "for-each-ref" { + if subcmd == "for-each-ref" { + + return strings.Join([]string{ + "", + "refs/tags/v2.0.4-beta.1@@__CHGLOG__@@Release v2.0.4-beta.1@@__CHGLOG__@@Thu Feb 1 00:00:00 2018 +0000@@__CHGLOG__@@", + "refs/tags/4.4.3@@__CHGLOG__@@This is tag subject@@__CHGLOG__@@@@__CHGLOG__@@Fri Feb 2 00:00:00 2018 +0000", + "refs/tags/4.4.4@@__CHGLOG__@@Release 4.4.4@@__CHGLOG__@@Fri Feb 2 10:00:40 2018 +0000@@__CHGLOG__@@", + "refs/tags/v2.0.4-beta.2@@__CHGLOG__@@Release v2.0.4-beta.2@@__CHGLOG__@@Sat Feb 3 12:15:00 2018 +0000@@__CHGLOG__@@", + "refs/tags/5.0.0-rc.0@@__CHGLOG__@@Release 5.0.0-rc.0@@__CHGLOG__@@Sat Feb 3 12:30:10 2018 +0000@@__CHGLOG__@@", + "refs/tags/hoge_fuga@@__CHGLOG__@@Invalid semver tag name@@__CHGLOG__@@Mon Mar 12 12:30:10 2018 +0000@@__CHGLOG__@@", + "hoge@@__CHGLOG__@@", + }, "\n"), nil + } else if subcmd == "log" { + return strings.Join([]string{ + "9cf6994 (tag: hoge_fuga) xxxx", + "7f68835 (tag: 5.0.0-rc.0) xxxx", + "548c4f7 xxxxx", + "6f3a743 (tag: v2.0.4-beta.2) xxxxx", + "eeff0d9 (tag: 4.4.4) xxxx", + "182d417 (tag: 4.4.3) xxxx", + "c4c2f10 (tag: v2.0.4-beta.1) xxxxx", + }, "\n"), nil + } else { return "", errors.New("") } - return strings.Join([]string{ - "", - "refs/tags/v2.0.4-beta.1@@__CHGLOG__@@Release v2.0.4-beta.1@@__CHGLOG__@@Thu Feb 1 00:00:00 2018 +0000@@__CHGLOG__@@", - "refs/tags/4.4.3@@__CHGLOG__@@This is tag subject@@__CHGLOG__@@@@__CHGLOG__@@Fri Feb 2 00:00:00 2018 +0000", - "refs/tags/4.4.4@@__CHGLOG__@@Release 4.4.4@@__CHGLOG__@@Fri Feb 2 10:00:40 2018 +0000@@__CHGLOG__@@", - "refs/tags/v2.0.4-beta.2@@__CHGLOG__@@Release v2.0.4-beta.2@@__CHGLOG__@@Sat Feb 3 12:15:00 2018 +0000@@__CHGLOG__@@", - "refs/tags/5.0.0-rc.0@@__CHGLOG__@@Release 5.0.0-rc.0@@__CHGLOG__@@Sat Feb 3 12:30:10 2018 +0000@@__CHGLOG__@@", - "refs/tags/hoge_fuga@@__CHGLOG__@@Invalid semver tag name@@__CHGLOG__@@Mon Mar 12 12:30:10 2018 +0000@@__CHGLOG__@@", - "hoge@@__CHGLOG__@@", - }, "\n"), nil }, } @@ -38,6 +50,7 @@ func TestTagReader(t *testing.T) { Name: "hoge_fuga", Subject: "Invalid semver tag name", Date: time.Date(2018, 3, 12, 12, 30, 10, 0, time.UTC), + Order: 0, Next: nil, Previous: &RelateTag{ Name: "5.0.0-rc.0", @@ -49,6 +62,7 @@ func TestTagReader(t *testing.T) { Name: "5.0.0-rc.0", Subject: "Release 5.0.0-rc.0", Date: time.Date(2018, 2, 3, 12, 30, 10, 0, time.UTC), + Order: 1, Next: &RelateTag{ Name: "hoge_fuga", Subject: "Invalid semver tag name", @@ -64,6 +78,7 @@ func TestTagReader(t *testing.T) { Name: "v2.0.4-beta.2", Subject: "Release v2.0.4-beta.2", Date: time.Date(2018, 2, 3, 12, 15, 0, 0, time.UTC), + Order: 3, Next: &RelateTag{ Name: "5.0.0-rc.0", Subject: "Release 5.0.0-rc.0", @@ -79,6 +94,7 @@ func TestTagReader(t *testing.T) { Name: "4.4.4", Subject: "Release 4.4.4", Date: time.Date(2018, 2, 2, 10, 0, 40, 0, time.UTC), + Order: 4, Next: &RelateTag{ Name: "v2.0.4-beta.2", Subject: "Release v2.0.4-beta.2", @@ -94,6 +110,7 @@ func TestTagReader(t *testing.T) { Name: "4.4.3", Subject: "This is tag subject", Date: time.Date(2018, 2, 2, 0, 0, 0, 0, time.UTC), + Order: 5, Next: &RelateTag{ Name: "4.4.4", Subject: "Release 4.4.4", @@ -109,6 +126,7 @@ func TestTagReader(t *testing.T) { Name: "v2.0.4-beta.1", Subject: "Release v2.0.4-beta.1", Date: time.Date(2018, 2, 1, 0, 0, 0, 0, time.UTC), + Order: 6, Next: &RelateTag{ Name: "4.4.3", Subject: "This is tag subject", @@ -204,6 +222,7 @@ func TestTagReader(t *testing.T) { Name: "v2.0.4-beta.2", Subject: "Release v2.0.4-beta.2", Date: time.Date(2018, 2, 3, 12, 15, 0, 0, time.UTC), + Order: 3, Next: nil, Previous: &RelateTag{ Name: "v2.0.4-beta.1", @@ -215,6 +234,7 @@ func TestTagReader(t *testing.T) { Name: "v2.0.4-beta.1", Subject: "Release v2.0.4-beta.1", Date: time.Date(2018, 2, 1, 0, 0, 0, 0, time.UTC), + Order: 6, Next: &RelateTag{ Name: "v2.0.4-beta.2", Subject: "Release v2.0.4-beta.2",