Skip to content

Commit

Permalink
fix: sort tags by commit order
Browse files Browse the repository at this point in the history
Signed-off-by: Evan <chaol@vmware.com>
  • Loading branch information
evanchaoli committed Aug 12, 2021
1 parent 93707ab commit 31160e4
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 12 deletions.
1 change: 1 addition & 0 deletions fields.go
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@ type Tag struct {
Name string
Subject string
Date time.Time
Order int // The less the newer
Next *RelateTag
Previous *RelateTag
}
Expand Down
27 changes: 26 additions & 1 deletion tag_reader.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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
})
}

Expand Down
42 changes: 31 additions & 11 deletions tag_reader_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
},
}

Expand All @@ -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",
Expand All @@ -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",
Expand All @@ -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",
Expand All @@ -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",
Expand All @@ -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",
Expand All @@ -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",
Expand Down Expand Up @@ -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",
Expand All @@ -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",
Expand Down

0 comments on commit 31160e4

Please sign in to comment.