aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNobuyoshi Nakada <nobu@ruby-lang.org>2021-01-21 01:25:56 +0900
committerNobuyoshi Nakada <nobu@ruby-lang.org>2021-01-24 16:46:15 +0900
commitbb570ce6d80d28cfc7131dcb72885eed2f989b30 (patch)
treec6c5cde79c6b074080a726b0712d43f9217ddd05
parent68e7dc532d8c658050fa513bbf6c80126832b070 (diff)
downloadruby-bb570ce6d80d28cfc7131dcb72885eed2f989b30.tar.gz
[ruby/rdoc] Support ChangeLog generated by `git log`
https://github.com/ruby/rdoc/commit/5e0a123ca1
-rw-r--r--lib/rdoc/parser/changelog.rb35
-rw-r--r--test/rdoc/test_rdoc_parser_changelog.rb56
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 <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>
@@ -309,6 +327,44 @@ Mon Dec 3 20:37:22 2012 Koichi Sasada <ko1@atdot.net>
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