summaryrefslogtreecommitdiff
path: root/mu-aux/gencl
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org>2017-04-03 21:47:00 +0300
committerSergey Poznyakoff <gray@gnu.org>2017-04-03 21:55:46 +0300
commit7ed1178111e1a266b8a14ca806f7bcf84f8caf70 (patch)
treeb6b6bf8d40b73be8d5f1b07c38bc25b866f720df /mu-aux/gencl
parentcaac7dea4cb65a8bed723d705bb6a0b89cf13da1 (diff)
downloadmailutils-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-xmu-aux/gencl78
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;
9use Data::Dumper; 9use Data::Dumper;
10use threads; 10use threads;
11use Thread::Queue; 11use Thread::Queue;
12use Time::ParseDate;
13use Safe; 12use Safe;
14use Pod::Usage; 13use Pod::Usage;
15use Pod::Man; 14use Pod::Man;
@@ -25,15 +24,9 @@ my $strip_cherry_pick;
25my $amend_file; 24my $amend_file;
26my %amendment; 25my %amendment;
27my $append_dot; 26my $append_dot;
27my $ignore_errors;
28 28
29sub set_date { 29my $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
44B<gencl> 37B<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
102Force recreating the ChangeLog, even if no new commits were added to the 96Force recreating the ChangeLog, even if no new commits were added to the
103repository since its creation. 97repository since its creation.
98
99=item B<-i>, B<--ignore-errors>
100
101Ignore non-fatal errors. With this option in effect, B<gencl> exits with
102code 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
111Convert only the logs since I<DATE>. See B<Time::ParseDate>(3), for 110Convert only the logs since I<DATE> (B<YYYY-MM-DD>).
112a list of valid I<DATE> formats.
113 111
114=item B<--until=>I<DATE> 112=item B<--until=>I<DATE>
115 113
116Convert only the logs until I<DATE>. See B<Time::ParseDate>(3), for 114Convert only the logs until I<DATE> (B<YYYY-MM-DD>).
117a 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
138Success.
139
140=item B<1>
141
142Fatal error.
143
144=item B<2>
145
146Non-fatal error. The B<--ignore-errors> (B<-i>) option instructs B<gencl>
147to 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
165The following B<gitlab-to-changelog> options are not implemented: B<--cluster>, 181The following B<gitlab-to-changelog> options are not implemented: B<--cluster>,
166B<--ignore-matching>, B<--ignore_line>. 182B<--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
214if (! -d '.git') { 231if (! -d '.git') {
@@ -218,9 +235,12 @@ if (! -d '.git') {
218read_amend_file($amend_file) if $amend_file; 235read_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
222create_changelog(); 241create_changelog();
223 242$exit_status = 0 if $ignore_errors;
243exit $exit_status;
224 244
225sub toplevel_entry { 245sub 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