Skip to content

Commit b2e172a

Browse files
committed
repo_tag: add unit tests
1 parent 13e2d13 commit b2e172a

File tree

4 files changed

+136
-13
lines changed

4 files changed

+136
-13
lines changed

Diff for: git.go

+1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ func log(format string, args ...interface{}) {
4040

4141
var (
4242
// gitVersion stores the Git binary version.
43+
// NOTE: To check Git version should call BinVersion not this global variable.
4344
gitVersion string
4445
gitVersionOnce sync.Once
4546
gitVersionErr error

Diff for: repo_tag.go

+14-11
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,6 @@ l:
3535
}
3636
tag.commitID = id
3737
case "type":
38-
// A commit can have one or more parents
39-
tag.typ = ObjectType(line[spacepos+1:])
4038
case "tagger":
4139
sig, err := parseSignature(line[spacepos+1:])
4240
if err != nil {
@@ -86,11 +84,11 @@ func (r *Repository) getTag(timeout time.Duration, id *SHA1) (*Tag, error) {
8684
return nil, err
8785
}
8886

89-
tag, err := parseTag(data)
87+
tag, err = parseTag(data)
9088
if err != nil {
9189
return nil, err
9290
}
93-
91+
tag.typ = ObjectTag
9492
tag.id = id
9593
tag.repo = r
9694
default:
@@ -139,22 +137,27 @@ func (r *Repository) Tag(refspec string, opts ...TagOptions) (*Tag, error) {
139137
return tag, nil
140138
}
141139

142-
// TagListOptions contains optional arguments for listing tags.
140+
// TagsOptions contains optional arguments for listing tags.
143141
// Docs: https://git-scm.com/docs/git-tag#Documentation/git-tag.txt---list
144-
type TagListOptions struct {
142+
type TagsOptions struct {
145143
// The timeout duration before giving up. The default timeout duration will be used when not supplied.
146144
Timeout time.Duration
147145
}
148146

149-
// TagList returns a list of tags in the repository.
150-
func (r *Repository) TagList(opts ...TagListOptions) ([]string, error) {
151-
var opt TagListOptions
147+
// Tags returns a list of tags in the repository.
148+
func (r *Repository) Tags(opts ...TagsOptions) ([]string, error) {
149+
var opt TagsOptions
152150
if len(opts) > 0 {
153151
opt = opts[0]
154152
}
155153

154+
version, err := BinVersion()
155+
if err != nil {
156+
return nil, err
157+
}
158+
156159
cmd := NewCommand("tag", "--list")
157-
if goversion.Compare(gitVersion, "2.4.9", ">=") {
160+
if goversion.Compare(version, "2.4.9", ">=") {
158161
cmd.AddArgs("--sort=-creatordate")
159162
}
160163

@@ -166,7 +169,7 @@ func (r *Repository) TagList(opts ...TagListOptions) ([]string, error) {
166169
tags := strings.Split(string(stdout), "\n")
167170
tags = tags[:len(tags)-1]
168171

169-
if goversion.Compare(gitVersion, "2.4.9", "<") {
172+
if goversion.Compare(version, "2.4.9", "<") {
170173
goversion.Sort(tags)
171174

172175
// Reverse order

Diff for: repo_tag_test.go

+89
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package git
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
)
8+
9+
func TestRepository_Tag(t *testing.T) {
10+
tests := []struct {
11+
refspec string
12+
opt TagOptions
13+
expTag *Tag
14+
}{
15+
{
16+
refspec: "v1.0.0",
17+
expTag: &Tag{
18+
typ: ObjectCommit,
19+
id: MustIDFromString("0eedd79eba4394bbef888c804e899731644367fe"),
20+
commitID: MustIDFromString("0eedd79eba4394bbef888c804e899731644367fe"),
21+
refspec: "v1.0.0",
22+
},
23+
}, {
24+
refspec: "v1.1.0",
25+
expTag: &Tag{
26+
typ: ObjectTag,
27+
id: MustIDFromString("b39c8508bbc4b00ad2e24d358012ea123bcafd8d"),
28+
commitID: MustIDFromString("0eedd79eba4394bbef888c804e899731644367fe"),
29+
refspec: "v1.1.0",
30+
},
31+
},
32+
}
33+
for _, test := range tests {
34+
t.Run("", func(t *testing.T) {
35+
tag, err := testrepo.Tag(test.refspec, test.opt)
36+
if err != nil {
37+
t.Fatal(err)
38+
}
39+
40+
assert.Equal(t, test.expTag.Type(), tag.Type())
41+
assert.Equal(t, test.expTag.ID().String(), tag.ID().String())
42+
assert.Equal(t, test.expTag.CommitID().String(), tag.CommitID().String())
43+
assert.Equal(t, test.expTag.Refspec(), tag.Refspec())
44+
})
45+
}
46+
}
47+
48+
func TestRepository_Tags(t *testing.T) {
49+
// Make sure it does not blow up
50+
tags, err := testrepo.Tags(TagsOptions{})
51+
if err != nil {
52+
t.Fatal(err)
53+
}
54+
assert.NotEmpty(t, tags)
55+
}
56+
57+
func TestRepository_CreateTag(t *testing.T) {
58+
r, cleanup, err := setupTempRepo()
59+
if err != nil {
60+
t.Fatal(err)
61+
}
62+
defer cleanup()
63+
64+
assert.False(t, r.HasReference(RefsTags+"v2.0.0"))
65+
66+
err = r.CreateTag("v2.0.0", "master", CreateTagOptions{})
67+
if err != nil {
68+
t.Fatal(err)
69+
}
70+
71+
assert.True(t, r.HasReference(RefsTags+"v2.0.0"))
72+
}
73+
74+
func TestRepository_DeleteTag(t *testing.T) {
75+
r, cleanup, err := setupTempRepo()
76+
if err != nil {
77+
t.Fatal(err)
78+
}
79+
defer cleanup()
80+
81+
assert.True(t, r.HasReference(RefsTags+"v1.0.0"))
82+
83+
err = r.DeleteTag("v1.0.0", DeleteTagOptions{})
84+
if err != nil {
85+
t.Fatal(err)
86+
}
87+
88+
assert.False(t, r.HasReference(RefsTags+"v1.0.0"))
89+
}

Diff for: tag.go

+32-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,37 @@ type Tag struct {
1616
repo *Repository
1717
}
1818

19+
// Type returns the type of the tag.
20+
func (t *Tag) Type() ObjectType {
21+
return t.typ
22+
}
23+
24+
// ID returns the SHA-1 hash of the tag.
25+
func (t *Tag) ID() *SHA1 {
26+
return t.id
27+
}
28+
29+
// CommitID returns the commit ID of the tag.
30+
func (t *Tag) CommitID() *SHA1 {
31+
return t.commitID
32+
}
33+
34+
// Refspec returns the refspec of the tag.
35+
func (t *Tag) Refspec() string {
36+
return t.refspec
37+
}
38+
39+
// Tagger returns the tagger of the tag.
40+
func (t *Tag) Tagger() *Signature {
41+
return t.tagger
42+
}
43+
44+
// Message returns the message of the tag.
45+
func (t *Tag) Message() string {
46+
return t.message
47+
}
48+
1949
// Commit returns the underlying commit of the tag.
20-
func (tag *Tag) Commit(opts ...CatFileCommitOptions) (*Commit, error) {
21-
return tag.repo.CatFileCommit(tag.commitID.String(), opts...)
50+
func (t *Tag) Commit(opts ...CatFileCommitOptions) (*Commit, error) {
51+
return t.repo.CatFileCommit(t.commitID.String(), opts...)
2252
}

0 commit comments

Comments
 (0)