Skip to content

Commit b62ed86

Browse files
Adding Git::Object::Tag .tagger and .message support.
Closes #27
1 parent 0348714 commit b62ed86

File tree

5 files changed

+76
-10
lines changed

5 files changed

+76
-10
lines changed

lib/git/author.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,4 @@ def initialize(author_string)
1111
end
1212

1313
end
14-
end
14+
end

lib/git/base.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,7 @@ def tags
390390
#
391391
def add_tag(name, *opts)
392392
self.lib.tag(name, *opts)
393-
tag(name)
393+
self.tag(name)
394394
end
395395

396396
# deletes a tag

lib/git/lib.rb

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,31 @@ def process_commit_data(data, sha = nil, indent = 4)
200200

201201
return hsh
202202
end
203+
204+
def tag_data(name)
205+
sha = sha.to_s
206+
tdata = command_lines('cat-file', ['tag', name])
207+
process_tag_data(tdata, name, 0)
208+
end
209+
210+
def process_tag_data(data, name, indent=4)
211+
hsh = {
212+
'name' => name,
213+
'message' => ''
214+
}
215+
216+
loop do
217+
key, *value = data.shift.split
218+
219+
break if key.nil?
220+
221+
hsh[key] = value.join(' ')
222+
end
223+
224+
hsh['message'] = data.collect {|line| line[indent..-1]}.join("\n") + "\n"
225+
226+
return hsh
227+
end
203228

204229
def process_commit_log_data(data)
205230
in_message = false

lib/git/object.rb

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -235,10 +235,10 @@ def commit?
235235

236236
# see if this object has been initialized and do so if not
237237
def check_commit
238-
unless @tree
239-
data = @base.lib.commit_data(@objectish)
240-
set_commit(data)
241-
end
238+
return if @tree
239+
240+
data = @base.lib.commit_data(@objectish)
241+
set_commit(data)
242242
end
243243

244244
end
@@ -250,14 +250,41 @@ def initialize(base, sha, name)
250250
super(base, sha)
251251
@name = name
252252
@annotated = nil
253+
@loaded = false
254+
end
255+
256+
def annotated?
257+
@annotated ||= (@base.lib.object_type(self.name) == 'tag')
253258
end
254259

260+
def message
261+
check_tag()
262+
return @message
263+
end
264+
255265
def tag?
256266
true
257267
end
258268

259-
def annotated?
260-
@annotated ||= (@base.lib.object_type(self.name) == 'tag')
269+
def tagger
270+
check_tag()
271+
return @tagger
272+
end
273+
274+
private
275+
276+
def check_tag
277+
return if @loaded
278+
279+
if !self.annotated?
280+
@message = @tagger = nil
281+
else
282+
tdata = @base.lib.tag_data(@name)
283+
@message = tdata['message'].chomp
284+
@tagger = Git::Author.new(tdata['tagger'])
285+
end
286+
287+
@loaded = true
261288
end
262289

263290
end

tests/units/test_tags.rb

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ def test_tags
1111
in_temp_dir do |path|
1212
r1 = Git.clone(@wbare, 'repo1')
1313
r2 = Git.clone(@wbare, 'repo2')
14+
r1.config('user.name', 'Test User')
15+
r1.config('user.email', 'test@email.com')
16+
r2.config('user.name', 'Test User')
17+
r2.config('user.email', 'test@email.com')
1418

1519
assert_raise Git::GitTagNameDoesNotExist do
1620
r1.tag('first')
@@ -55,8 +59,18 @@ def test_tags
5559
r2.tag('third')
5660
end
5761

58-
assert_true(r2.tag('fourth').annotated?)
59-
assert_false(r2.tag('fifth').annotated?)
62+
tag1 = r2.tag('fourth')
63+
assert_true(tag1.annotated?)
64+
assert_equal(tag1.tagger.class, Git::Author)
65+
assert_equal(tag1.tagger.name, 'Test User')
66+
assert_equal(tag1.tagger.email, 'test@email.com')
67+
assert_true((Time.now - tag1.tagger.date) < 10)
68+
assert_equal(tag1.message, ' test message')
69+
70+
tag2 = r2.tag('fifth')
71+
assert_false(tag2.annotated?)
72+
assert_equal(tag2.tagger, nil)
73+
assert_equal(tag2.message, nil)
6074
end
6175
end
6276
end

0 commit comments

Comments
 (0)