diff options
author | Sergey Poznyakoff <gray@gnu.org> | 2017-04-03 21:47:00 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org> | 2017-04-03 21:55:46 +0300 |
commit | 7ed1178111e1a266b8a14ca806f7bcf84f8caf70 (patch) | |
tree | b6b6bf8d40b73be8d5f1b07c38bc25b866f720df /mu-aux/gencl | |
parent | caac7dea4cb65a8bed723d705bb6a0b89cf13da1 (diff) | |
download | mailutils-7ed1178111e1a266b8a14ca806f7bcf84f8caf70.tar.gz mailutils-7ed1178111e1a266b8a14ca806f7bcf84f8caf70.tar.bz2 |
Minor improvements in gencl
* mu-aux/gencl: Don't use Time::ParseDate.
Work over bug in Text::Wrap 2012.0818.
New option --ignore-errors (-i).
Ensure consistent error code.
* Makefile.am (dist-hook): Relax checking for intermediate releases.
Diffstat (limited to 'mu-aux/gencl')
-rwxr-xr-x | mu-aux/gencl | 78 |
1 files changed, 54 insertions, 24 deletions
diff --git a/mu-aux/gencl b/mu-aux/gencl index f124cacde..82ebcce68 100755 --- a/mu-aux/gencl +++ b/mu-aux/gencl | |||
@@ -9,7 +9,6 @@ use Text::Wrap; | |||
9 | use Data::Dumper; | 9 | use Data::Dumper; |
10 | use threads; | 10 | use threads; |
11 | use Thread::Queue; | 11 | use Thread::Queue; |
12 | use Time::ParseDate; | ||
13 | use Safe; | 12 | use Safe; |
14 | use Pod::Usage; | 13 | use Pod::Usage; |
15 | use Pod::Man; | 14 | use Pod::Man; |
@@ -25,15 +24,9 @@ my $strip_cherry_pick; | |||
25 | my $amend_file; | 24 | my $amend_file; |
26 | my %amendment; | 25 | my %amendment; |
27 | my $append_dot; | 26 | my $append_dot; |
27 | my $ignore_errors; | ||
28 | 28 | ||
29 | sub set_date { | 29 | my $exit_status = 0; |
30 | my ($time, $err) = parsedate($_[1], PREFER_PAST => 1, UK => 1); | ||
31 | unless (defined($time)) { | ||
32 | print STDERR "--$_[0]=$_[1]: $err\n"; | ||
33 | exit(1); | ||
34 | } | ||
35 | return strftime('%Y-%m-%d', localtime($time)); | ||
36 | } | ||
37 | 30 | ||
38 | =head1 NAME | 31 | =head1 NAME |
39 | 32 | ||
@@ -42,7 +35,7 @@ gencl - generate ChangeLog from git log output | |||
42 | =head1 SYNOPSIS | 35 | =head1 SYNOPSIS |
43 | 36 | ||
44 | B<gencl> | 37 | B<gencl> |
45 | [B<-fv>] | 38 | [B<-fiv>] |
46 | [B<-a> I<FILE>] | 39 | [B<-a> I<FILE>] |
47 | [B<-F> I<FILE>] | 40 | [B<-F> I<FILE>] |
48 | [B<--amend=>I<FILE>] | 41 | [B<--amend=>I<FILE>] |
@@ -50,6 +43,7 @@ B<gencl> | |||
50 | [B<--append=>I<FILE>] | 43 | [B<--append=>I<FILE>] |
51 | [B<--file=>I<FILE>] | 44 | [B<--file=>I<FILE>] |
52 | [B<--force>] | 45 | [B<--force>] |
46 | [B<--ignore-errors>] | ||
53 | [B<--since=>I<DATE>] | 47 | [B<--since=>I<DATE>] |
54 | [B<--strip-cherry-pick>] | 48 | [B<--strip-cherry-pick>] |
55 | [B<--until=>I<DATE>] | 49 | [B<--until=>I<DATE>] |
@@ -101,6 +95,11 @@ Create I<FILE> instead of the B<ChangeLog>. | |||
101 | 95 | ||
102 | Force recreating the ChangeLog, even if no new commits were added to the | 96 | Force recreating the ChangeLog, even if no new commits were added to the |
103 | repository since its creation. | 97 | repository since its creation. |
98 | |||
99 | =item B<-i>, B<--ignore-errors> | ||
100 | |||
101 | Ignore non-fatal errors. With this option in effect, B<gencl> exits with | ||
102 | code 0 even if some errors were encountered while running. | ||
104 | 103 | ||
105 | =item B<-v>, B<--verbose> | 104 | =item B<-v>, B<--verbose> |
106 | 105 | ||
@@ -108,13 +107,11 @@ Increase output verbosity. | |||
108 | 107 | ||
109 | =item B<--since=>I<DATE> | 108 | =item B<--since=>I<DATE> |
110 | 109 | ||
111 | Convert only the logs since I<DATE>. See B<Time::ParseDate>(3), for | 110 | Convert only the logs since I<DATE> (B<YYYY-MM-DD>). |
112 | a list of valid I<DATE> formats. | ||
113 | 111 | ||
114 | =item B<--until=>I<DATE> | 112 | =item B<--until=>I<DATE> |
115 | 113 | ||
116 | Convert only the logs until I<DATE>. See B<Time::ParseDate>(3), for | 114 | Convert only the logs until I<DATE> (B<YYYY-MM-DD>). |
117 | a list of valid I<DATE> formats. | ||
118 | 115 | ||
119 | =item B<--strip-cherry-pick> | 116 | =item B<--strip-cherry-pick> |
120 | 117 | ||
@@ -132,6 +129,25 @@ punctuation the end. | |||
132 | 129 | ||
133 | =back | 130 | =back |
134 | 131 | ||
132 | =head1 EXIT CODES | ||
133 | |||
134 | =over 4 | ||
135 | |||
136 | =item B<0> | ||
137 | |||
138 | Success. | ||
139 | |||
140 | =item B<1> | ||
141 | |||
142 | Fatal error. | ||
143 | |||
144 | =item B<2> | ||
145 | |||
146 | Non-fatal error. The B<--ignore-errors> (B<-i>) option instructs B<gencl> | ||
147 | to exit with code B<0>, instead of B<2>. | ||
148 | |||
149 | =back | ||
150 | |||
135 | =head1 DIFFERENCES FROM GITLOG-TO-CHANGELOG | 151 | =head1 DIFFERENCES FROM GITLOG-TO-CHANGELOG |
136 | 152 | ||
137 | =over 4 | 153 | =over 4 |
@@ -163,7 +179,7 @@ Each entry is reformatted using B<Text::Wrap>. | |||
163 | =item 6 | 179 | =item 6 |
164 | 180 | ||
165 | The following B<gitlab-to-changelog> options are not implemented: B<--cluster>, | 181 | The following B<gitlab-to-changelog> options are not implemented: B<--cluster>, |
166 | B<--ignore-matching>, B<--ignore_line>. | 182 | B<--ignore-matching>, B<--ignore-line>. |
167 | 183 | ||
168 | =back | 184 | =back |
169 | 185 | ||
@@ -204,11 +220,12 @@ GetOptions( | |||
204 | 'file|F=s' => \$changelog_file, | 220 | 'file|F=s' => \$changelog_file, |
205 | 'force|f' => \$force, | 221 | 'force|f' => \$force, |
206 | 'verbose|v' => \$verbose, | 222 | 'verbose|v' => \$verbose, |
207 | 'since=s' => sub { $since_date = set_date(@_) }, | 223 | 'since=s' => \$since_date, |
208 | 'until=s' => sub { $until_date = set_date(@_) }, | 224 | 'until=s' => \$until_date, |
209 | 'strip-cherry-pick' => \$strip_cherry_pick, | 225 | 'strip-cherry-pick' => \$strip_cherry_pick, |
210 | 'amend=s' => \$amend_file, | 226 | 'amend=s' => \$amend_file, |
211 | 'append-dot' => \$append_dot | 227 | 'append-dot' => \$append_dot, |
228 | 'ignore-errors|i' => \$ignore_errors | ||
212 | ) or exit(1); | 229 | ) or exit(1); |
213 | 230 | ||
214 | if (! -d '.git') { | 231 | if (! -d '.git') { |
@@ -218,9 +235,12 @@ if (! -d '.git') { | |||
218 | read_amend_file($amend_file) if $amend_file; | 235 | read_amend_file($amend_file) if $amend_file; |
219 | 236 | ||
220 | $Text::Wrap::columns = 72; | 237 | $Text::Wrap::columns = 72; |
221 | 238 | # Work over bug #79766 in Text::Wrap | |
239 | $Text::Wrap::huge = 'overflow' if $Text::Wrap::VERSION eq '2012.0818'; | ||
240 | |||
222 | create_changelog(); | 241 | create_changelog(); |
223 | 242 | $exit_status = 0 if $ignore_errors; | |
243 | exit $exit_status; | ||
224 | 244 | ||
225 | sub toplevel_entry { | 245 | sub toplevel_entry { |
226 | my ($hash, $date) = split / /, | 246 | my ($hash, $date) = split / /, |
@@ -303,6 +323,7 @@ sub read_amend_file { | |||
303 | if (exists($amendment{$hash})) { | 323 | if (exists($amendment{$hash})) { |
304 | warn "$file:$.: duplicate SHA1 hash"; | 324 | warn "$file:$.: duplicate SHA1 hash"; |
305 | warn $amendment{$hash}{locus} . ": previously defined here"; | 325 | warn $amendment{$hash}{locus} . ": previously defined here"; |
326 | $exit_status = 2; | ||
306 | } | 327 | } |
307 | $code = ''; | 328 | $code = ''; |
308 | $locus = "$file:$."; | 329 | $locus = "$file:$."; |
@@ -313,6 +334,7 @@ sub read_amend_file { | |||
313 | } else { | 334 | } else { |
314 | warn "$file:$.: expected SHA1, but found $_" | 335 | warn "$file:$.: expected SHA1, but found $_" |
315 | unless $silent; | 336 | unless $silent; |
337 | $exit_status = 2; | ||
316 | $silent = 1; | 338 | $silent = 1; |
317 | } | 339 | } |
318 | } elsif ($state == STATE_HASH) { | 340 | } elsif ($state == STATE_HASH) { |
@@ -348,6 +370,7 @@ sub tokenize_gitlog { | |||
348 | my %ent = (); | 370 | my %ent = (); |
349 | unless (/^log size (\d+)/) { | 371 | unless (/^log size (\d+)/) { |
350 | warn "unexpected input: '$_'"; | 372 | warn "unexpected input: '$_'"; |
373 | $exit_status = 2; | ||
351 | next; | 374 | next; |
352 | } | 375 | } |
353 | my $size = $1; | 376 | my $size = $1; |
@@ -369,6 +392,7 @@ sub tokenize_gitlog { | |||
369 | } else { | 392 | } else { |
370 | warn "$.:$ent{hash}: failed to eval \"$code\" on \"$_\": \n$@\n"; | 393 | warn "$.:$ent{hash}: failed to eval \"$code\" on \"$_\": \n$@\n"; |
371 | warn $amendment{$ent{hash}}{locus} . ": code was defined here"; | 394 | warn $amendment{$ent{hash}}{locus} . ": code was defined here"; |
395 | $exit_status = 2; | ||
372 | } | 396 | } |
373 | } | 397 | } |
374 | 398 | ||
@@ -433,10 +457,12 @@ sub tokenize_gitlog { | |||
433 | $line =~ s/^.*://; | 457 | $line =~ s/^.*://; |
434 | push @unused, [ $line, $ref->{locus}, $hash ]; | 458 | push @unused, [ $line, $ref->{locus}, $hash ]; |
435 | } | 459 | } |
436 | foreach my $ent (sort { $a->[0] <=> $b->[0] } @unused) { | 460 | if (@unused) { |
437 | warn "$ent->[1]: unused entry: $ent->[2]\n"; | 461 | $exit_status = 2; |
462 | foreach my $ent (sort { $a->[0] <=> $b->[0] } @unused) { | ||
463 | warn "$ent->[1]: unused entry: $ent->[2]\n"; | ||
464 | } | ||
438 | } | 465 | } |
439 | |||
440 | print STDERR "tokenize_gitlog finished\n" if $verbose > 1; | 466 | print STDERR "tokenize_gitlog finished\n" if $verbose > 1; |
441 | } | 467 | } |
442 | 468 | ||
@@ -492,7 +518,10 @@ sub create_changelog { | |||
492 | my $cvt_thr = threads->create(\&convert_entry, $q); | 518 | my $cvt_thr = threads->create(\&convert_entry, $q); |
493 | $tok_thr->join(); | 519 | $tok_thr->join(); |
494 | $cvt_thr->join(); | 520 | $cvt_thr->join(); |
495 | 521 | if ($tok_thr->error() || $cvt_thr->error()) { | |
522 | exit 1; | ||
523 | } | ||
524 | |||
496 | # Print additional files | 525 | # Print additional files |
497 | foreach my $file (@append_files) { | 526 | foreach my $file (@append_files) { |
498 | if (open(my $in, '<', $file)) { | 527 | if (open(my $in, '<', $file)) { |
@@ -505,6 +534,7 @@ sub create_changelog { | |||
505 | close $in; | 534 | close $in; |
506 | } else |