# HG changeset patch # User Jim Meyering # Date 1324826076 -3600 # Node ID 2f7f593f246d7634902224fe62bb4f579c44f77e # Parent 70c5842a280f7837441f282ccd90aa4dfe5cca49 gitlog-to-changelog: do not clump multi-paragraph entries Identical header lines (date,name,email+coauthors) are suppressed, thus putting all entries with those same characteristics under a single header. However, when a log entry consists of two or more paragraphs, it may not be clear where it starts and ends. This change makes it so that such an entry is always separated from others by a header line, even when that header would otherwise be suppressed. * build-aux/gitlog-to-changelog: Implement the above. Inspired by a related request from Stefano Lattarini in http://thread.gmane.org/gmane.comp.lib.gnulib.bugs/29456 diff --git a/ChangeLog b/ChangeLog --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,17 @@ +2011-12-25 Jim Meyering + + gitlog-to-changelog: do not clump multi-paragraph entries + Identical header lines (date,name,email+coauthors) are suppressed, + thus putting all entries with those same characteristics under + a single header. However, when a log entry consists of two or + more paragraphs, it may not be clear where it starts and ends. + This change makes it so that such an entry is always separated + from others by a header line, even when that header would + otherwise be suppressed. + * build-aux/gitlog-to-changelog: Implement the above. + Inspired by a related request from Stefano Lattarini in + http://thread.gmane.org/gmane.comp.lib.gnulib.bugs/29456 + 2011-12-25 Paul Eggert announce-gen: fix `cmd' typo in diagnostic diff --git a/build-aux/gitlog-to-changelog b/build-aux/gitlog-to-changelog --- a/build-aux/gitlog-to-changelog +++ b/build-aux/gitlog-to-changelog @@ -3,7 +3,7 @@ if 0; # Convert git log output to ChangeLog format. -my $VERSION = '2011-11-02 07:53'; # UTC +my $VERSION = '2011-12-24 18:51'; # UTC # The definition above must lie within the first 8 lines in order # for the Emacs time-stamp write hook (at end) to update it. # If you change this file with Emacs, please let the write hook @@ -199,6 +199,7 @@ or die ("$ME: failed to run `". quoted_cmd (@cmd) ."': $!\n" . "(Is your Git too old? Version 1.5.1 or later is required.)\n"); + my $prev_multi_paragraph; my $prev_date_line = ''; my @prev_coauthors = (); while (1) @@ -248,12 +249,25 @@ $author_line =~ /^(\d+) (.*>)$/ or die "$ME:$.: Invalid line " . "(expected date/author/email):\n$author_line\n"; + my $date_line = sprintf "%s $2\n", strftime ("%F", localtime ($1)); - my $date_line = sprintf "%s $2\n", strftime ("%F", localtime ($1)); + my @coauthors = grep /^Co-authored-by:.*$/, @line; + # Omit "Co-authored-by..." and "Signed-off-by..." lines. + @line = grep !/^Signed-off-by: .*>$/, @line; + @line = grep !/^Co-authored-by: /, @line; + + # Remove leading and trailing blank lines. + if (@line) + { + while ($line[0] =~ /^\s*$/) { shift @line; } + while ($line[$#line] =~ /^\s*$/) { pop @line; } + } + + # Record whether there are two or more paragraphs. + my $multi_paragraph = grep /^\s*$/, @line; # Format 'Co-authored-by: A U Thor ' lines in # standard multi-author ChangeLog format. - my @coauthors = grep /^Co-authored-by:.*$/, @line; for (@coauthors) { s/^Co-authored-by:\s*/\t /; @@ -264,9 +278,13 @@ . substr ($_, 5) . "\n"; } - # If this header would be the same as the previous date/name/email/ - # coauthors header, then arrange not to print it. - if ($date_line ne $prev_date_line or "@coauthors" ne "@prev_coauthors") + # If this header would be different from the previous date/name/email/ + # coauthors header, or if this or the previous entry consists of two + # or more paragraphs, then print the header. + if ($date_line ne $prev_date_line + or "@coauthors" ne "@prev_coauthors" + or $multi_paragraph + or $prev_multi_paragraph) { $prev_date_line eq '' or print "\n"; @@ -276,17 +294,7 @@ } $prev_date_line = $date_line; @prev_coauthors = @coauthors; - - # Omit "Co-authored-by..." and "Signed-off-by..." lines. - @line = grep !/^Signed-off-by: .*>$/, @line; - @line = grep !/^Co-authored-by: /, @line; - - # Remove leading and trailing blank lines. - if (@line) - { - while ($line[0] =~ /^\s*$/) { shift @line; } - while ($line[$#line] =~ /^\s*$/) { pop @line; } - } + $prev_multi_paragraph = $multi_paragraph; # If there were any lines if (@line == 0)