From bd7dfb2ffdc4c34c792f8af2b8cafc765189f629 Mon Sep 17 00:00:00 2001 From: Nobuyoshi Nakada Date: Thu, 21 Jan 2021 01:25:56 +0900 Subject: [PATCH] Support ChangeLog generated by `git log` --- lib/rdoc/parser/changelog.rb | 35 ++++++++++++++++ test/rdoc/test_rdoc_parser_changelog.rb | 56 +++++++++++++++++++++++++ 2 files changed, 91 insertions(+) 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 @@ 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 = [] @@ -190,6 +196,7 @@ def parse_entries def scan @time_cache = {} + entries = parse_entries grouped_entries = group_entries entries @@ -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 diff --git a/test/rdoc/test_rdoc_parser_changelog.rb b/test/rdoc/test_rdoc_parser_changelog.rb index d93cb7deca..2bd2f1bdf7 100644 --- a/test/rdoc/test_rdoc_parser_changelog.rb +++ b/test/rdoc/test_rdoc_parser_changelog.rb @@ -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 + Date: 2021-01-21 01:03:52 +0900 + + * 2021-01-21 [ci skip] +ChangeLog + + expected = [ + [ "709bed2afaee50e2ce803f87bf1ee8291bea41e3", + [ "git ", + "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 @@ -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 + Date: 2021-01-21 01:03:52 +0900 + + * 2021-01-21 [ci skip] + +#{""}commit a8dc5156e183489c5121fb1759bda5d9406d9175 + Author: git + 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 ')), + 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 ')), + 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