]> granicus.if.org Git - linux-pam/commitdiff
Generate ChangeLog from git log
authorDmitry V. Levin <ldv@altlinux.org>
Thu, 27 Oct 2011 14:55:55 +0000 (14:55 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Thu, 27 Oct 2011 14:55:55 +0000 (14:55 +0000)
* .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.

.gitignore
ChangeLog-CVS [moved from ChangeLog with 99% similarity]
Makefile.am
README-hacking [new file with mode: 0644]
autogen.sh
gitlog-to-changelog [new file with mode: 0755]

index b9ddd1b906029bb12fe0f92320275c12f93412d5..92a8849848151517949faaa30d0cb4a6a1c204af 100644 (file)
@@ -24,3 +24,4 @@ missing
 depcomp
 ylwrap
 Linux-PAM-*.tar.*
+/ChangeLog
similarity index 99%
rename from ChangeLog
rename to ChangeLog-CVS
index d7d808b0f11e450708356a8448aac92df51bab88..47b54cea8b8f389761b410315123b4a052810823 100644 (file)
--- a/ChangeLog
@@ -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
index 2d41b87de60919ebcd0c659e13f5b2af99b3f2fd..4384758bc8551750d2bce11532c21ba3d4669a50 100644 (file)
@@ -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 (file)
index 0000000..d370094
--- /dev/null
@@ -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.
index 050c861f47946418d0414dd41cdbe5ff417ce739..f3a28013cb19f5a7b2b2d555338f0f70bb4afe18 100755 (executable)
@@ -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 (executable)
index 0000000..4612d38
--- /dev/null
@@ -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: