Skip to content

Commit 1aaa4f6

Browse files
committed
tag: list using sort and filter options
1 parent 9a01961 commit 1aaa4f6

File tree

2 files changed

+43
-2
lines changed

2 files changed

+43
-2
lines changed

repo_tag.go

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,10 @@ type TagsOptions struct {
144144
// The timeout duration before giving up for each shell command execution.
145145
// The default timeout duration will be used when not supplied.
146146
Timeout time.Duration
147+
// SortKet sorts tags with provided tag key, optionally prefixed with '-' to sort tags in descending order.
148+
SortKey string
149+
// Pattern filters tags matching the specified pattern.
150+
Pattern string
147151
}
148152

149153
// RepoTags returns a list of tags of the repository in given path.
@@ -159,8 +163,18 @@ func RepoTags(repoPath string, opts ...TagsOptions) ([]string, error) {
159163
}
160164

161165
cmd := NewCommand("tag", "--list")
162-
if goversion.Compare(version, "2.4.9", ">=") {
166+
167+
var sorted bool
168+
if opt.SortKey != "" {
169+
cmd.AddArgs(fmt.Sprintf("--sort=%s", opt.SortKey))
170+
sorted = true
171+
} else if goversion.Compare(version, "2.4.9", ">=") {
163172
cmd.AddArgs("--sort=-creatordate")
173+
sorted = true
174+
}
175+
176+
if opt.Pattern != "" {
177+
cmd.AddArgs(opt.Pattern)
164178
}
165179

166180
stdout, err := cmd.RunInDirWithTimeout(opt.Timeout, repoPath)
@@ -171,7 +185,7 @@ func RepoTags(repoPath string, opts ...TagsOptions) ([]string, error) {
171185
tags := strings.Split(string(stdout), "\n")
172186
tags = tags[:len(tags)-1]
173187

174-
if goversion.Compare(version, "2.4.9", "<") {
188+
if !sorted {
175189
goversion.Sort(tags)
176190

177191
// Reverse order

repo_tag_test.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,33 @@ func TestRepository_Tags(t *testing.T) {
5858
assert.NotEmpty(t, tags)
5959
}
6060

61+
func TestRepository_Tags_VersionSort(t *testing.T) {
62+
r, cleanup, err := setupTempRepo()
63+
if err != nil {
64+
t.Fatal(err)
65+
}
66+
defer cleanup()
67+
68+
err = r.CreateTag("v3.0.0", "master", CreateTagOptions{})
69+
if err != nil {
70+
t.Fatal(err)
71+
}
72+
err = r.CreateTag("v2.0.0", "master", CreateTagOptions{})
73+
if err != nil {
74+
t.Fatal(err)
75+
}
76+
77+
tags, err := r.Tags(TagsOptions{
78+
SortKey: "-version:refname",
79+
Pattern: "v*",
80+
})
81+
if err != nil {
82+
t.Fatal(err)
83+
}
84+
85+
assert.Equal(t, "v3.0.0", tags[0])
86+
}
87+
6188
func TestRepository_CreateTag(t *testing.T) {
6289
r, cleanup, err := setupTempRepo()
6390
if err != nil {

0 commit comments

Comments
 (0)