Skip to content

Commit 93f85f8

Browse files
authored
repo_tag: able to create annotated tag (#70)
1 parent 5028c0a commit 93f85f8

File tree

4 files changed

+59
-2
lines changed

4 files changed

+59
-2
lines changed

command.go

+6
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,12 @@ func (c *Command) AddEnvs(envs ...string) *Command {
5050
return c
5151
}
5252

53+
// AddCommitter appends given committer to the command.
54+
func (c *Command) AddCommitter(committer *Signature) *Command {
55+
c.AddEnvs("GIT_COMMITTER_NAME="+committer.Name, "GIT_COMMITTER_EMAIL="+committer.Email)
56+
return c
57+
}
58+
5359
// DefaultTimeout is the default timeout duration for all commands.
5460
const DefaultTimeout = time.Minute
5561

repo.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -428,7 +428,7 @@ func CreateCommit(repoPath string, committer *Signature, message string, opts ..
428428
}
429429

430430
cmd := NewCommand("commit")
431-
cmd.AddEnvs("GIT_COMMITTER_NAME="+committer.Name, "GIT_COMMITTER_EMAIL="+committer.Email)
431+
cmd.AddCommitter(committer)
432432

433433
if opt.Author == nil {
434434
opt.Author = committer

repo_tag.go

+20-1
Original file line numberDiff line numberDiff line change
@@ -209,6 +209,12 @@ func (r *Repository) Tags(opts ...TagsOptions) ([]string, error) {
209209
//
210210
// Docs: https://git-scm.com/docs/git-tag
211211
type CreateTagOptions struct {
212+
// Annotated marks a tag as annotated rather than lightweight.
213+
Annotated bool
214+
// Message specifies a tagging message for the annotated tag. It is ignored when tag is not annotated.
215+
Message string
216+
// Author is the author of the tag. It is ignored when tag is not annotated.
217+
Author *Signature
212218
// The timeout duration before giving up for each shell command execution. The
213219
// default timeout duration will be used when not supplied.
214220
Timeout time.Duration
@@ -221,7 +227,20 @@ func (r *Repository) CreateTag(name, rev string, opts ...CreateTagOptions) error
221227
opt = opts[0]
222228
}
223229

224-
_, err := NewCommand("tag", name, rev).RunInDirWithTimeout(opt.Timeout, r.path)
230+
cmd := NewCommand("tag")
231+
if opt.Annotated {
232+
cmd.AddArgs("-a", name)
233+
cmd.AddArgs("--message", opt.Message)
234+
if opt.Author != nil {
235+
cmd.AddCommitter(opt.Author)
236+
}
237+
} else {
238+
cmd.AddArgs(name)
239+
}
240+
241+
cmd.AddArgs(rev)
242+
243+
_, err := cmd.RunInDirWithTimeout(opt.Timeout, r.path)
225244
return err
226245
}
227246

repo_tag_test.go

+32
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,38 @@ func TestRepository_CreateTag(t *testing.T) {
106106
assert.True(t, r.HasReference(RefsTags+"v2.0.0"))
107107
}
108108

109+
func TestRepository_CreateAnnotatedTag(t *testing.T) {
110+
r, cleanup, err := setupTempRepo()
111+
if err != nil {
112+
t.Fatal(err)
113+
}
114+
defer cleanup()
115+
116+
assert.False(t, r.HasReference(RefsTags+"v2.0.0"))
117+
118+
err = r.CreateTag("v2.0.0", "master", CreateTagOptions{
119+
Annotated: true,
120+
Author: &Signature{
121+
Name: "alice",
122+
123+
},
124+
})
125+
if err != nil {
126+
t.Fatal(err)
127+
}
128+
129+
assert.True(t, r.HasReference(RefsTags+"v2.0.0"))
130+
131+
tag, err := r.Tag("v2.0.0")
132+
if err != nil {
133+
t.Fatal(err)
134+
}
135+
136+
assert.Equal(t, "alice", tag.tagger.Name)
137+
assert.Equal(t, "[email protected]", tag.tagger.Email)
138+
assert.False(t, tag.tagger.When.IsZero())
139+
}
140+
109141
func TestRepository_DeleteTag(t *testing.T) {
110142
r, cleanup, err := setupTempRepo()
111143
if err != nil {

0 commit comments

Comments
 (0)