Skip to content

Commit bd7dfb2

Browse files
committed
Support ChangeLog generated by git log
1 parent b54160f commit bd7dfb2

File tree

2 files changed

+91
-0
lines changed

2 files changed

+91
-0
lines changed

lib/rdoc/parser/changelog.rb

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,12 @@ def group_entries entries
131131

132132
def parse_entries
133133
@time_cache ||= {}
134+
135+
if /\A(?:.*\n){,3}commit\s/ =~ @content
136+
class << self; prepend Git; end
137+
return parse_entries
138+
end
139+
134140
entries = []
135141
entry_name = nil
136142
entry_body = []
@@ -190,6 +196,7 @@ def parse_entries
190196

191197
def scan
192198
@time_cache = {}
199+
193200
entries = parse_entries
194201
grouped_entries = group_entries entries
195202

@@ -200,5 +207,33 @@ def scan
200207
@top_level
201208
end
202209

210+
module Git
211+
def parse_entries
212+
entries = []
213+
214+
@content.scan(/^commit\s+(\h+)\n *Author: *(.+)\n *Date: *(.+)\n\n((?: {4}.*\n+)*)/) do
215+
entry_name, author, date, entry_body = $1, $2, $3, $4.gsub(/^ {4}/, '')
216+
if /(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+) *([-+]\d\d)(\d\d)/ =~ date
217+
time = Time.new($1, $2, $3, $4, $5, $6, "#{$7}:#{$8}")
218+
@time_cache[entry_name] = time
219+
entries << [entry_name, [author, date, entry_body]]
220+
end
221+
end
222+
223+
entries
224+
end
225+
226+
def create_entries entries
227+
# git log entries have no strictly itemized style like the old
228+
# style, just assume Markdown.
229+
entries.map do |entry, (author, date, body)|
230+
list = RDoc::Markup::List.new(:NOTE)
231+
author = RDoc::Markup::Paragraph.new(author)
232+
list << RDoc::Markup::ListItem.new(date, author)
233+
RDoc::Markdown.parse(body).parts.each {|b| list << b}
234+
list
235+
end
236+
end
237+
end
203238
end
204239

test/rdoc/test_rdoc_parser_changelog.rb

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,24 @@ def test_parse_entries_gnu
270270
assert_equal expected, parser.parse_entries
271271
end
272272

273+
def test_parse_entries_git
274+
parser = util_parser <<-ChangeLog
275+
#{""}commit 709bed2afaee50e2ce803f87bf1ee8291bea41e3
276+
Author: git <[email protected]>
277+
Date: 2021-01-21 01:03:52 +0900
278+
279+
* 2021-01-21 [ci skip]
280+
ChangeLog
281+
282+
expected = [
283+
[ "709bed2afaee50e2ce803f87bf1ee8291bea41e3",
284+
[ "git <[email protected]>",
285+
"2021-01-21 01:03:52 +0900",
286+
"* 2021-01-21 [ci skip]\n"]]]
287+
288+
assert_equal expected, parser.parse_entries
289+
end
290+
273291
def test_scan
274292
parser = util_parser <<-ChangeLog
275293
Tue Dec 4 08:32:10 2012 Eric Hodel <[email protected]>
@@ -309,6 +327,44 @@ def test_scan
309327
assert_equal expected, @top_level.comment
310328
end
311329

330+
def test_scan_git
331+
parser = util_parser <<-ChangeLog
332+
#{""}commit 709bed2afaee50e2ce803f87bf1ee8291bea41e3
333+
Author: git <[email protected]>
334+
Date: 2021-01-21 01:03:52 +0900
335+
336+
* 2021-01-21 [ci skip]
337+
338+
#{""}commit a8dc5156e183489c5121fb1759bda5d9406d9175
339+
Author: git <[email protected]>
340+
Date: 2021-01-20 01:58:26 +0900
341+
342+
* 2021-01-20 [ci skip]
343+
ChangeLog
344+
345+
parser.scan
346+
347+
expected = doc(
348+
head(1, File.basename(@tempfile.path)),
349+
blank_line,
350+
head(2, '2021-01-21'),
351+
blank_line,
352+
list(:NOTE,
353+
item('2021-01-21 01:03:52 +0900',
354+
para('git <[email protected]>')),
355+
list(:BULLET, item(nil, para('2021-01-21 [ci skip]')))),
356+
head(2, '2021-01-20'),
357+
blank_line,
358+
list(:NOTE,
359+
item('2021-01-20 01:58:26 +0900',
360+
para('git <[email protected]>')),
361+
list(:BULLET, item(nil, para('2021-01-20 [ci skip]')))))
362+
363+
expected.file = @top_level
364+
365+
assert_equal expected, @top_level.comment
366+
end
367+
312368
def util_parser content = ''
313369
RDoc::Parser::ChangeLog.new \
314370
@top_level, @tempfile.path, content, @options, @stats

0 commit comments

Comments
 (0)