diff options
author | Dmitry V. Levin <ldv@altlinux.org> | 2011-10-27 14:55:55 +0000 |
---|---|---|
committer | Dmitry V. Levin <ldv@altlinux.org> | 2011-10-27 14:55:55 +0000 |
commit | 790ffe6e011bc7721d687ab4ac6419eb18c72624 (patch) | |
tree | d0de67369e5bc22c291571741fa69d10a0c6f1a6 | |
parent | a03bf70cc3c6fc0992dc6a8e56b10649e56bf553 (diff) | |
download | pam-790ffe6e011bc7721d687ab4ac6419eb18c72624.tar.gz pam-790ffe6e011bc7721d687ab4ac6419eb18c72624.tar.bz2 pam-790ffe6e011bc7721d687ab4ac6419eb18c72624.zip |
Generate ChangeLog from git log
* .gitignore: Add ChangeLog
* ChangeLog: Rename to ChangeLog-CVS.
* Makefile.am (gen-changelog): New rule.
(dist-hook, .PHONY): Depend on it.
(EXTRA_DIST): Add ChangeLog-CVS.
* README-hacking: New file.
* gitlog-to-changelog: Import from gnulib.
* autogen.sh: Create empty ChangeLog file to make automake strictness
check happy. Use automated "autoreconf -fiv" instead of manual
invocations of various autotools.
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | ChangeLog-CVS (renamed from ChangeLog) | 5 | ||||
-rw-r--r-- | Makefile.am | 17 | ||||
-rw-r--r-- | README-hacking | 17 | ||||
-rwxr-xr-x | autogen.sh | 9 | ||||
-rwxr-xr-x | gitlog-to-changelog | 213 |
6 files changed, 255 insertions, 7 deletions
@@ -24,3 +24,4 @@ missing depcomp ylwrap Linux-PAM-*.tar.* +/ChangeLog diff --git a/ChangeLog b/ChangeLog-CVS index d7d808b0..47b54cea 100644 --- a/ChangeLog +++ b/ChangeLog-CVS @@ -1,3 +1,8 @@ +2011-10-26 Dmitry V. Levin <ldv@altlinux.org> + + NB: ChangeLog file is no longer manually maintained. + See README-hacking for details. + 2011-10-25 Thorsten Kukuk <kukuk@thkukuk.de> * release version 1.1.5 diff --git a/Makefile.am b/Makefile.am index 2d41b87d..4384758b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -13,7 +13,7 @@ endif CLEANFILES = *~ EXTRA_DIST = config.rpath mkinstalldirs pgp.keys.asc CHANGELOG \ - Copyright Make.xml.rules + ChangeLog-CVS Copyright Make.xml.rules ACLOCAL_AMFLAGS = -I m4 @@ -35,3 +35,18 @@ xtests: make -C xtests xtests .PHONY: xtests + +gen_changelog_start_date = 2011-10-26 +gen-ChangeLog: + if test -d .git; then \ + ( $(top_srcdir)/gitlog-to-changelog --append-dot \ + --since=$(gen_changelog_start_date) && \ + echo && echo && \ + echo 'See ChangeLog-CVS for earlier changes.' \ + ) > $(distdir)/ChangeLog.new && \ + rm -f $(distdir)/ChangeLog && \ + mv $(distdir)/ChangeLog.new $(distdir)/ChangeLog; \ + fi + +dist-hook: gen-ChangeLog +.PHONY: gen-ChangeLog diff --git a/README-hacking b/README-hacking new file mode 100644 index 00000000..d3700943 --- /dev/null +++ b/README-hacking @@ -0,0 +1,17 @@ +No more ChangeLog file +====================== +Do not create or modify the ChangeLog files. Starting at 2011-10-26, the +policy changed. Before, we would insert the exact same text (or worse, +sometimes slightly differing) into both the ChangeLog file and the commit +log. Now we put that information only in the commit log, and generate +the ChangeLog file from logs at "make dist" time. As such, there are +strict requirements on the form of the commit log messages. + + +Commit log requirements +======================= +Each commit log should always start with a one-line summary, the second +line should be blank, and the remaining lines are usually ChangeLog-style +entries for all affected files, except the leading TABs which should +be omitted. It's OK to write a few lines of prose describing the change, +when the summary and ChangeLog entries don't give enough of the big picture. @@ -1,8 +1,5 @@ #!/bin/sh -x -aclocal -I m4 --install --force -autoheader -libtoolize --force --automake --copy -automake --add-missing --copy -autoreconf -chmod 755 configure +umask 022 +touch ChangeLog +autoreconf -fiv diff --git a/gitlog-to-changelog b/gitlog-to-changelog new file mode 100755 index 00000000..4612d389 --- /dev/null +++ b/gitlog-to-changelog @@ -0,0 +1,213 @@ +eval '(exit $?0)' && eval 'exec perl -wS "$0" ${1+"$@"}' + & eval 'exec perl -wS "$0" $argv:q' + if 0; +# Convert git log output to ChangeLog format. + +my $VERSION = '2011-10-31 16:06'; # 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 +# do its job. Otherwise, update this string manually. + +# Copyright (C) 2008-2011 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see <http://www.gnu.org/licenses/>. + +# Written by Jim Meyering + +use strict; +use warnings; +use Getopt::Long; +use POSIX qw(strftime); + +(my $ME = $0) =~ s|.*/||; + +# use File::Coda; # http://meyering.net/code/Coda/ +END { + defined fileno STDOUT or return; + close STDOUT and return; + warn "$ME: failed to close standard output: $!\n"; + $? ||= 1; +} + +sub usage ($) +{ + my ($exit_code) = @_; + my $STREAM = ($exit_code == 0 ? *STDOUT : *STDERR); + if ($exit_code != 0) + { + print $STREAM "Try `$ME --help' for more information.\n"; + } + else + { + print $STREAM <<EOF; +Usage: $ME [OPTIONS] [ARGS] + +Convert git log output to ChangeLog format. If present, any ARGS +are passed to "git log". To avoid ARGS being parsed as options to +$ME, they may be preceded by '--'. + +OPTIONS: + + --since=DATE convert only the logs since DATE; + the default is to convert all log entries. + --format=FMT set format string for commit subject and body; + see 'man git-log' for the list of format metacharacters; + the default is '%s%n%b%n' + --append-dot append a dot to the first line of each commit message if + there is no other punctuation or blank at the end. + + --help display this help and exit + --version output version information and exit + +EXAMPLE: + + $ME --since=2008-01-01 > ChangeLog + $ME -- -n 5 foo > last-5-commits-to-branch-foo + +EOF + } + exit $exit_code; +} + +# If the string $S is a well-behaved file name, simply return it. +# If it contains white space, quotes, etc., quote it, and return the new string. +sub shell_quote($) +{ + my ($s) = @_; + if ($s =~ m![^\w+/.,-]!) + { + # Convert each single quote to '\'' + $s =~ s/\'/\'\\\'\'/g; + # Then single quote the string. + $s = "'$s'"; + } + return $s; +} + +sub quoted_cmd(@) +{ + return join (' ', map {shell_quote $_} @_); +} + +{ + my $since_date; + my $format_string = '%s%n%b%n'; + my $append_dot = 0; + GetOptions + ( + help => sub { usage 0 }, + version => sub { print "$ME version $VERSION\n"; exit }, + 'since=s' => \$since_date, + 'format=s' => \$format_string, + 'append-dot' => \$append_dot, + ) or usage 1; + + defined $since_date + and unshift @ARGV, "--since=$since_date"; + + my @cmd = (qw (git log --log-size), + '--pretty=format:%ct %an <%ae>%n%n'.$format_string, @ARGV); + open PIPE, '-|', @cmd + 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_date_line = ''; + while (1) + { + defined (my $in = <PIPE>) + or last; + $in =~ /^log size (\d+)$/ + or die "$ME:$.: Invalid line (expected log size):\n$in"; + my $log_nbytes = $1; + + my $log; + my $n_read = read PIPE, $log, $log_nbytes; + $n_read == $log_nbytes + or die "$ME:$.: unexpected EOF\n"; + + my @line = split "\n", $log; + my $author_line = shift @line; + defined $author_line + or die "$ME:$.: unexpected EOF\n"; + $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)); + # If this line would be the same as the previous date/name/email + # line, then arrange not to print it. + if ($date_line ne $prev_date_line) + { + $prev_date_line eq '' + or print "\n"; + print $date_line; + } + $prev_date_line = $date_line; + + # Omit "Signed-off-by..." lines. + @line = grep !/^Signed-off-by: .*>$/, @line; + + # Remove leading and trailing blank lines. + if (@line) + { + while ($line[0] =~ /^\s*$/) { shift @line; } + while ($line[$#line] =~ /^\s*$/) { pop @line; } + } + + # If there were any lines + if (@line == 0) + { + warn "$ME: warning: empty commit message:\n $date_line\n"; + } + else + { + if ($append_dot) + { + # If the first line of the message has enough room, then + if (length $line[0] < 72) + { + # append a dot if there is no other punctuation or blank + # at the end. + $line[0] =~ /[[:punct:]\s]$/ + or $line[0] .= '.'; + } + } + + # Prefix each non-empty line with a TAB. + @line = map { length $_ ? "\t$_" : '' } @line; + + print "\n", join ("\n", @line), "\n"; + } + + defined ($in = <PIPE>) + or last; + $in ne "\n" + and die "$ME:$.: unexpected line:\n$in"; + } + + close PIPE + or die "$ME: error closing pipe from " . quoted_cmd (@cmd) . "\n"; + # FIXME-someday: include $PROCESS_STATUS in the diagnostic +} + +# Local Variables: +# mode: perl +# indent-tabs-mode: nil +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "my $VERSION = '" +# time-stamp-format: "%:y-%02m-%02d %02H:%02M" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "'; # UTC" +# End: |