|
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