Skip to content

Commit 5028c0a

Browse files
sermojohnunknwon
andauthored
repo_tag: able to list tags using sort and filter options (#71)
Co-authored-by: Joe Chen <[email protected]>
1 parent c16247b commit 5028c0a

File tree

2 files changed

+47
-2
lines changed

2 files changed

+47
-2
lines changed

repo_tag.go

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,10 @@ func (r *Repository) Tag(name string, opts ...TagOptions) (*Tag, error) {
143143
//
144144
// Docs: https://git-scm.com/docs/git-tag#Documentation/git-tag.txt---list
145145
type TagsOptions struct {
146+
// SortKet sorts tags with provided tag key, optionally prefixed with '-' to sort tags in descending order.
147+
SortKey string
148+
// Pattern filters tags matching the specified pattern.
149+
Pattern string
146150
// The timeout duration before giving up for each shell command execution. The
147151
// default timeout duration will be used when not supplied.
148152
Timeout time.Duration
@@ -161,8 +165,18 @@ func RepoTags(repoPath string, opts ...TagsOptions) ([]string, error) {
161165
}
162166

163167
cmd := NewCommand("tag", "--list")
164-
if goversion.Compare(version, "2.4.9", ">=") {
168+
169+
var sorted bool
170+
if opt.SortKey != "" {
171+
cmd.AddArgs("--sort=" + opt.SortKey)
172+
sorted = true
173+
} else if goversion.Compare(version, "2.4.9", ">=") {
165174
cmd.AddArgs("--sort=-creatordate")
175+
sorted = true
176+
}
177+
178+
if opt.Pattern != "" {
179+
cmd.AddArgs(opt.Pattern)
166180
}
167181

168182
stdout, err := cmd.RunInDirWithTimeout(opt.Timeout, repoPath)
@@ -173,7 +187,7 @@ func RepoTags(repoPath string, opts ...TagsOptions) ([]string, error) {
173187
tags := strings.Split(string(stdout), "\n")
174188
tags = tags[:len(tags)-1]
175189

176-
if goversion.Compare(version, "2.4.9", "<") {
190+
if !sorted {
177191
goversion.Sort(tags)
178192

179193
// Reverse order

repo_tag_test.go

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,37 @@ 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")
69+
if err != nil {
70+
t.Fatal(err)
71+
}
72+
err = r.CreateTag("v2.999.0", "master")
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+
if len(tags) < 2 {
86+
t.Fatalf("Should have at least two tags but got %d", len(tags))
87+
}
88+
assert.Equal(t, "v3.0.0", tags[0])
89+
assert.Equal(t, "v2.999.0", tags[1])
90+
}
91+
6192
func TestRepository_CreateTag(t *testing.T) {
6293
r, cleanup, err := setupTempRepo()
6394
if err != nil {

0 commit comments

Comments
 (0)