|
1 | 1 | # frozen_string_literal: true |
2 | | -require 'time' |
3 | 2 |
|
4 | 3 | ## |
5 | 4 | # A ChangeLog file parser. |
@@ -106,14 +105,32 @@ def group_entries entries |
106 | 105 | entries.group_by do |title, _| |
107 | 106 | begin |
108 | 107 | time = @time_cache[title] |
109 | | - (time || Time.parse(title)).strftime '%Y-%m-%d' |
| 108 | + (time || parse_date(title)).strftime '%Y-%m-%d' |
110 | 109 | rescue NoMethodError, ArgumentError |
111 | 110 | time, = title.split ' ', 2 |
112 | | - Time.parse(time).strftime '%Y-%m-%d' |
| 111 | + parse_date(time).strftime '%Y-%m-%d' |
113 | 112 | end |
114 | 113 | end |
115 | 114 | end |
116 | 115 |
|
| 116 | + ## |
| 117 | + # Parse date in ISO-8601, RFC-2822, or default of Git |
| 118 | + |
| 119 | + def parse_date(date) |
| 120 | + case date |
| 121 | + when /\A\s*(\d+)-(\d+)-(\d+)(?: (\d+):(\d+):(\d+) *([-+]\d\d)(\d\d))?\b/ |
| 122 | + Time.new($1, $2, $3, $4, $5, $6, ("#{$7}:#{$8}" if $7)) |
| 123 | + when /\A\s*\w{3}, +(\d+) (\w{3}) (\d+) (\d+):(\d+):(\d+) *(?:([-+]\d\d)(\d\d))\b/ |
| 124 | + Time.new($3, $2, $1, $4, $5, $6, ("#{$7}:#{$8}" if $7)) |
| 125 | + when /\A\s*\w{3} (\w{3}) +(\d+) (\d+) (\d+):(\d+):(\d+) *(?:([-+]\d\d)(\d\d))\b/ |
| 126 | + Time.new($3, $1, $2, $4, $5, $6, ("#{$7}:#{$8}" if $7)) |
| 127 | + when /\A\s*\w{3} (\w{3}) +(\d+) (\d+):(\d+):(\d+) (\d+)\b/ |
| 128 | + Time.new($6, $1, $2, $3, $4, $5) |
| 129 | + else |
| 130 | + raise ArgumentError, "bad date: #{date}" |
| 131 | + end |
| 132 | + end |
| 133 | + |
117 | 134 | ## |
118 | 135 | # Parses the entries in the ChangeLog. |
119 | 136 | # |
@@ -145,19 +162,10 @@ def parse_entries |
145 | 162 | entry_name = $& |
146 | 163 |
|
147 | 164 | begin |
148 | | - time = Time.parse entry_name |
| 165 | + time = parse_date entry_name |
149 | 166 | @time_cache[entry_name] = time |
150 | | - # HACK Ruby 1.8 does not raise ArgumentError for Time.parse "Other" |
151 | | - entry_name = nil unless entry_name =~ /#{time.year}/ |
152 | | - rescue NoMethodError |
153 | | - # HACK Ruby 2.1.2 and earlier raises NoMethodError if time part is absent |
154 | | - entry_name.split ' ', 2 |
155 | 167 | rescue ArgumentError |
156 | | - if /out of range/ =~ $!.message |
157 | | - Time.parse(entry_name.split(' ', 2)[0]) rescue entry_name = nil |
158 | | - else |
159 | | - entry_name = nil |
160 | | - end |
| 168 | + entry_name = nil |
161 | 169 | end |
162 | 170 |
|
163 | 171 | entry_body = [] |
|
0 commit comments