diff options
author | Nobuyoshi Nakada <[email protected]> | 2021-01-21 01:25:56 +0900 |
---|---|---|
committer | Nobuyoshi Nakada <[email protected]> | 2021-01-24 16:46:15 +0900 |
commit | bb570ce6d80d28cfc7131dcb72885eed2f989b30 (patch) | |
tree | c6c5cde79c6b074080a726b0712d43f9217ddd05 | |
parent | 68e7dc532d8c658050fa513bbf6c80126832b070 (diff) |
[ruby/rdoc] Support ChangeLog generated by `git log`
https://github.com/ruby/rdoc/commit/5e0a123ca1
-rw-r--r-- | lib/rdoc/parser/changelog.rb | 35 | ||||
-rw-r--r-- | test/rdoc/test_rdoc_parser_changelog.rb | 56 |
2 files changed, 91 insertions, 0 deletions
diff --git a/lib/rdoc/parser/changelog.rb b/lib/rdoc/parser/changelog.rb index 167892f543..3634b6a6eb 100644 --- a/lib/rdoc/parser/changelog.rb +++ b/lib/rdoc/parser/changelog.rb @@ -131,6 +131,12 @@ class RDoc::Parser::ChangeLog < RDoc::Parser 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 = [] @@ -190,6 +196,7 @@ class RDoc::Parser::ChangeLog < RDoc::Parser def scan @time_cache = {} + entries = parse_entries grouped_entries = group_entries entries @@ -200,5 +207,33 @@ class RDoc::Parser::ChangeLog < RDoc::Parser @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 diff --git a/test/rdoc/test_rdoc_parser_changelog.rb b/test/rdoc/test_rdoc_parser_changelog.rb index d93cb7deca..33e59ac077 100644 --- a/test/rdoc/test_rdoc_parser_changelog.rb +++ b/test/rdoc/test_rdoc_parser_changelog.rb @@ -270,6 +270,24 @@ Other note that will be ignored assert_equal expected, parser.parse_entries end + def test_parse_entries_git + parser = util_parser <<-ChangeLog +commit\ 709bed2afaee50e2ce803f87bf1ee8291bea41e3 + Author: git <[email protected]> + Date: 2021-01-21 01:03:52 +0900 + + * 2021-01-21 [ci skip] +ChangeLog + + expected = [ + [ "709bed2afaee50e2ce803f87bf1ee8291bea41e3", + [ "git <[email protected]>", + "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 <[email protected]> @@ -309,6 +327,44 @@ Mon Dec 3 20:37:22 2012 Koichi Sasada <[email protected]> assert_equal expected, @top_level.comment end + def test_scan_git + parser = util_parser <<-ChangeLog +commit\ 709bed2afaee50e2ce803f87bf1ee8291bea41e3 + Author: git <[email protected]> + Date: 2021-01-21 01:03:52 +0900 + + * 2021-01-21 [ci skip] + +commit\ a8dc5156e183489c5121fb1759bda5d9406d9175 + Author: git <[email protected]> + 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 <[email protected]>')), + 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 <[email protected]>')), + 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 |