Skip to content

Commit

Permalink
Support ChangeLog generated by git log
Browse files Browse the repository at this point in the history
  • Loading branch information
nobu committed Jan 22, 2021
1 parent 9d04064 commit 5e0a123
Show file tree
Hide file tree
Showing 2 changed files with 91 additions and 0 deletions.
35 changes: 35 additions & 0 deletions lib/rdoc/parser/changelog.rb
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,12 @@ def group_entries entries

def parse_entries
@time_cache ||= {}

if /\A(?:.*\n){,3}commit\s/ =~ @content
class << self; prepend Git; end
return parse_entries
end

entries = []
entry_name = nil
entry_body = []
Expand Down Expand Up @@ -190,6 +196,7 @@ def parse_entries

def scan
@time_cache = {}

entries = parse_entries
grouped_entries = group_entries entries

Expand All @@ -200,5 +207,33 @@ def scan
@top_level
end

module Git
def parse_entries
entries = []

@content.scan(/^commit\s+(\h+)\n *Author: *(.+)\n *Date: *(.+)\n\n((?: {4}.*\n+)*)/) do
entry_name, author, date, entry_body = $1, $2, $3, $4.gsub(/^ {4}/, '')
if /(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+) *([-+]\d\d)(\d\d)/ =~ date
time = Time.new($1, $2, $3, $4, $5, $6, "#{$7}:#{$8}")
@time_cache[entry_name] = time
entries << [entry_name, [author, date, entry_body]]
end
end

entries
end

def create_entries entries
# git log entries have no strictly itemized style like the old
# style, just assume Markdown.
entries.map do |entry, (author, date, body)|
list = RDoc::Markup::List.new(:NOTE)
author = RDoc::Markup::Paragraph.new(author)
list << RDoc::Markup::ListItem.new(date, author)
RDoc::Markdown.parse(body).parts.each {|b| list << b}
list
end
end
end
end

56 changes: 56 additions & 0 deletions test/rdoc/test_rdoc_parser_changelog.rb
Original file line number Diff line number Diff line change
Expand Up @@ -270,6 +270,24 @@ def test_parse_entries_gnu
assert_equal expected, parser.parse_entries
end

def test_parse_entries_git
parser = util_parser <<-ChangeLog
commit\ 709bed2afaee50e2ce803f87bf1ee8291bea41e3
Author: git <svn-admin@ruby-lang.org>
Date: 2021-01-21 01:03:52 +0900
* 2021-01-21 [ci skip]
ChangeLog

expected = [
[ "709bed2afaee50e2ce803f87bf1ee8291bea41e3",
[ "git <svn-admin@ruby-lang.org>",
"2021-01-21 01:03:52 +0900",
"* 2021-01-21 [ci skip]\n"]]]

assert_equal expected, parser.parse_entries
end

def test_scan
parser = util_parser <<-ChangeLog
Tue Dec 4 08:32:10 2012 Eric Hodel <drbrain@segment7.net>
Expand Down Expand Up @@ -309,6 +327,44 @@ def test_scan
assert_equal expected, @top_level.comment
end

def test_scan_git
parser = util_parser <<-ChangeLog
commit\ 709bed2afaee50e2ce803f87bf1ee8291bea41e3
Author: git <svn-admin@ruby-lang.org>
Date: 2021-01-21 01:03:52 +0900
* 2021-01-21 [ci skip]
commit\ a8dc5156e183489c5121fb1759bda5d9406d9175
Author: git <svn-admin@ruby-lang.org>
Date: 2021-01-20 01:58:26 +0900
* 2021-01-20 [ci skip]
ChangeLog

parser.scan

expected = doc(
head(1, File.basename(@tempfile.path)),
blank_line,
head(2, '2021-01-21'),
blank_line,
list(:NOTE,
item('2021-01-21 01:03:52 +0900',
para('git <svn-admin@ruby-lang.org>')),
list(:BULLET, item(nil, para('2021-01-21 [ci skip]')))),
head(2, '2021-01-20'),
blank_line,
list(:NOTE,
item('2021-01-20 01:58:26 +0900',
para('git <svn-admin@ruby-lang.org>')),
list(:BULLET, item(nil, para('2021-01-20 [ci skip]')))))

expected.file = @top_level

assert_equal expected, @top_level.comment
end

def util_parser content = ''
RDoc::Parser::ChangeLog.new \
@top_level, @tempfile.path, content, @options, @stats
Expand Down

0 comments on commit 5e0a123

Please sign in to comment.