diff options
author | Stefano Lattarini <stefano.lattarini@gmail.com> | 2011-12-27 23:24:39 +0100 |
---|---|---|
committer | Stefano Lattarini <stefano.lattarini@gmail.com> | 2011-12-27 23:24:39 +0100 |
commit | 4eb17acdd0f880faf94ddec41a2c063ebbcf993b (patch) | |
tree | 5af3712fa7b2b5b3b889d7ab5e9009f3261d340e | |
parent | 07cee987e8b87aa78d641cd30fcb3b1d1c8c54fb (diff) | |
parent | f533e9d43dfe84f0e1706855bdd49579df5c4f5b (diff) | |
download | automake-4eb17acdd0f880faf94ddec41a2c063ebbcf993b.tar.gz |
Merge branch 'maint'
* maint:
fix: last ChangeLog entry
tests: drop unnecessary requirement in 'subpkg.test'
gitlog-to-changelog: new auxiliary script, synced from gnulib
docs: "aclocal --install -I /abs/dir" actually copies files
docs: fix node names for automake and aclocal invocations
-rw-r--r-- | ChangeLog | 74 | ||||
-rw-r--r-- | Makefile.am | 1 | ||||
-rw-r--r-- | NEWS | 6 | ||||
-rw-r--r-- | doc/automake.texi | 9 | ||||
-rw-r--r-- | lib/Makefile.am | 2 | ||||
-rwxr-xr-x | lib/gitlog-to-changelog | 353 | ||||
-rw-r--r-- | tests/aclocal-install-absdir.test | 35 | ||||
-rw-r--r-- | tests/list-of-tests.mk | 1 | ||||
-rwxr-xr-x | tests/subpkg.test | 2 |
9 files changed, 476 insertions, 7 deletions
@@ -1,5 +1,79 @@ 2011-12-27 Stefano Lattarini <stefano.lattarini@gmail.com> + tests: drop unnecessary requirement in 'subpkg.test' + * tests/subpkg.test ($required): Drop "bison", it is not required + anymore since commit `v1.11-502-g7e5ae80'. + +2011-12-27 Stefano Lattarini <stefano.lattarini@gmail.com> + + gitlog-to-changelog: new auxiliary script, synced from gnulib + + We have plans to stop maintaining a version-controlled ChangeLog + file in the Automake repository, and instead begin to generate it + automatically from the git log messages. To do so, we will use + the `gitlog-to-changelog' script from gnulib. + + * lib/gitlog-to-changelog: New, synced from gnulib. + * Makefile.am (fetch): Fetch and sync it. + * lib/Makefile.am (EXTRA_DIST): Distribute it. + +2011-12-27 Stefano Lattarini <stefano.lattarini@gmail.com> + + docs: "aclocal --install -I /abs/dir" actually copies files + + This change is for automake bug#8407. + + In the past, there had been some debate and confusion about + whether "aclocal --install" should copy third-party .m4 files + in the first directory passed to the `-I' option even when + such directory was given as an absolute path, or whether it + was better to do so only for directories specified with a + relative path. + + The rationale for this latter behaviour was that, before the + existence of the `ACLOCAL_PATH' variable, the only way (a poor + way, I might add) for a common user to extend the search path + of a system-wide installation of aclocal was to export something + like ACLOCAL="aclocal -I /my/extra/macros" in the environment. + Today, the correct way to proceed is undoubtedly through the + use of ACLOCAL_PATH, so we can settle the question once and for + all, and start verifying the correct behaviour of `-I' with a + new test. + + * tests/aclocal-install-absdir.test: New test. + * tests/Makefile.am (TESTS): Add it. + * doc/automake.texi (aclocal Options): Be more explicit about + this part of `--install' semantics. + +2011-12-26 Stefano Lattarini <stefano.lattarini@gmail.com> + + docs: fix node names for automake and aclocal invocations + + With the older node names, an "info automake" command issued + from the command line would have opened the node about the + invocation of the automake program, rather than the Top node + of the automake documentation. To invoke the Top node, one + had to issue the command "info Automake" instead (note the + different capitalization). This was suboptimal, and certainly + confusing. + + With this change, "info automake" will open the Top node of the + automake documentation; to access the nodes about the invocation + of the automake and aclocal program, one has now to issue "info + automake-invocation" and "info aclocal-invocation" respectively. + + This change fixes automake bug#8071. + + See also commits `v2.61a-22-ge9215d1' and `v2.61a-72-g8c07b48' in + the autoconf git repository, which tackled a similar issue. + + * doc/automake.texi (@direntry): Rename nodes `aclocal' and + `automake' to `aclocal-invocation' and `automake-invocation' + respectively. + * NEWS: Update. + +2011-12-27 Stefano Lattarini <stefano.lattarini@gmail.com> + regex: remove obsolete macro AM_WITH_REGEX Today, practically nobody uses the GNU rx library, which, according to its own website <http://www.gnu.org/software/rx/rx.html>, has diff --git a/Makefile.am b/Makefile.am index a24dc76b6..bf2eeb69e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -873,6 +873,7 @@ fetch: $(WGET_SV_GIT_CF)config.sub -O config.sub && \ $(WGET_SV_CVS)texinfo/texinfo/doc/texinfo.tex -O texinfo.tex && \ $(WGET_SV_GIT_GL)doc/INSTALL -O INSTALL && \ + $(WGET_SV_GIT_GL)build-aux/gitlog-to-changelog -O gitlog-to-changelog && \ $(WGET_GCC)config-ml.in -O config-ml.in && \ $(WGET_GCC)symlink-tree -O symlink-tree) ## Don't exit after test because we want to give as many errors as @@ -103,6 +103,12 @@ New in 1.11a: - The `dist' and `dist-all' targets now can run compressors in parallel. + - In the Automake info documentation, the Top node and the nodes about + the invocation of the automake and aclocal programs have been renamed; + now, calling "info automake" will open the Top node, while calling + "info automake-invocation" and "info aclocal-invocation" will access + the nodes about the invocation of respectively automake and aclocal. + - Automake is now distributed as a gzip-compressed and an xz-compressed tarball. Previously, bzip2 was used instead of xz. diff --git a/doc/automake.texi b/doc/automake.texi index 62dcfba60..4afada93f 100644 --- a/doc/automake.texi +++ b/doc/automake.texi @@ -38,9 +38,6 @@ section entitled ``GNU Free Documentation License.'' @end quotation @end copying -@c info Automake points to the Automake package's documentation -@c info automake points to the automake script's documentation -@c (Autoconf has a similar setup.) @dircategory Software development @direntry * Automake: (automake). Making GNU standards-compliant Makefiles. @@ -48,8 +45,8 @@ section entitled ``GNU Free Documentation License.'' @dircategory Individual utilities @direntry -* aclocal: (automake)Invoking aclocal. Generating aclocal.m4. -* automake: (automake)Invoking Automake. Generating Makefile.in. +* aclocal-invocation: (automake)Invoking aclocal. Generating aclocal.m4. +* automake-invocation: (automake)Invoking Automake. Generating Makefile.in. @end direntry @titlepage @@ -3278,6 +3275,8 @@ Add the directory @var{dir} to the list of directories searched for Install system-wide third-party macros into the first directory specified with @samp{-I @var{dir}} instead of copying them in the output file. +@c The following semantics is checked by `aclocal-install-absdir.test'. +Note that this will happen also if @var{dir} is an absolute path. @cindex serial number and @option{--install} When this option is used, and only when this option is used, diff --git a/lib/Makefile.am b/lib/Makefile.am index b48428da7..426c63d15 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -44,7 +44,7 @@ dist_script_DATA = \ tap-driver.sh \ tap-driver.pl -EXTRA_DIST = gnupload +EXTRA_DIST = gnupload gitlog-to-changelog install-data-hook: @$(POST_INSTALL) diff --git a/lib/gitlog-to-changelog b/lib/gitlog-to-changelog new file mode 100755 index 000000000..ee1ac87a6 --- /dev/null +++ b/lib/gitlog-to-changelog @@ -0,0 +1,353 @@ +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-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 +# 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: + + --amend=FILE FILE maps from an SHA1 to perl code (i.e., s/old/new/) that + makes a change to SHA1's commit log text or metadata. + --append-dot append a dot to the first line of each commit message if + there is no other punctuation or blank at the end. + --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' + + --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 + +In a FILE specified via --amend, comment lines (starting with "#") are ignored. +FILE must consist of <SHA,CODE+> pairs where SHA is a 40-byte SHA1 (alone on +a line) referring to a commit in the current project, and CODE refers to one +or more consecutive lines of Perl code. Pairs must be separated by one or +more blank line. + +Here is sample input for use with --amend=FILE, from coreutils: + +3a169f4c5d9159283548178668d2fae6fced3030 +# fix typo in title: +s/all tile types/all file types/ + +1379ed974f1fa39b12e2ffab18b3f7a607082202 +# Due to a bug in vc-dwim, I mis-attributed a patch by Paul to myself. +# Change the author to be Paul. Note the escaped "@": +s,Jim .*>,Paul Eggert <eggert\@cs.ucla.edu>, + +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 $_} @_); +} + +# Parse file F. +# Comment lines (starting with "#") are ignored. +# F must consist of <SHA,CODE+> pairs where SHA is a 40-byte SHA1 +# (alone on a line) referring to a commit in the current project, and +# CODE refers to one or more consecutive lines of Perl code. +# Pairs must be separated by one or more blank line. +sub parse_amend_file($) +{ + my ($f) = @_; + + open F, '<', $f + or die "$ME: $f: failed to open for reading: $!\n"; + + my $fail; + my $h = {}; + my $in_code = 0; + my $sha; + while (defined (my $line = <F>)) + { + $line =~ /^\#/ + and next; + chomp $line; + $line eq '' + and $in_code = 0, next; + + if (!$in_code) + { + $line =~ /^([0-9a-fA-F]{40})$/ + or (warn "$ME: $f:$.: invalid line; expected an SHA1\n"), + $fail = 1, next; + $sha = lc $1; + $in_code = 1; + exists $h->{$sha} + and (warn "$ME: $f:$.: duplicate SHA1\n"), + $fail = 1, next; + } + else + { + $h->{$sha} ||= ''; + $h->{$sha} .= "$line\n"; + } + } + close F; + + $fail + and exit 1; + + return $h; +} + +{ + my $since_date; + my $format_string = '%s%n%b%n'; + my $amend_file; + 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, + 'amend=s' => \$amend_file, + 'append-dot' => \$append_dot, + ) or usage 1; + + + defined $since_date + and unshift @ARGV, "--since=$since_date"; + + # This is a hash that maps an SHA1 to perl code (i.e., s/old/new/) + # that makes a correction in the log or attribution of that commit. + my $amend_code = defined $amend_file ? parse_amend_file $amend_file : {}; + + my @cmd = (qw (git log --log-size), + '--pretty=format:%H:%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_multi_paragraph; + my $prev_date_line = ''; + my @prev_coauthors = (); + 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"; + + # Extract leading hash. + my ($sha, $rest) = split ':', $log, 2; + defined $sha + or die "$ME:$.: malformed log entry\n"; + $sha =~ /^[0-9a-fA-F]{40}$/ + or die "$ME:$.: invalid SHA1: $sha\n"; + + # If this commit's log requires any transformation, do it now. + my $code = $amend_code->{$sha}; + if (defined $code) + { + eval 'use Safe'; + my $s = new Safe; + # Put the unpreprocessed entry into "$_". + $_ = $rest; + + # Let $code operate on it, safely. + my $r = $s->reval("$code") + or die "$ME:$.:$sha: failed to eval \"$code\":\n$@\n"; + + # Note that we've used this entry. + delete $amend_code->{$sha}; + + # Update $rest upon success. + $rest = $_; + } + + my @line = split "\n", $rest; + 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)); + + 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 <email@example.com>' lines in + # standard multi-author ChangeLog format. + for (@coauthors) + { + s/^Co-authored-by:\s*/\t /; + s/\s*</ </; + + /<.*?@.*\..*>/ + or warn "$ME: warning: missing email address for " + . substr ($_, 5) . "\n"; + } + + # 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"; + print $date_line; + @coauthors + and print join ("\n", @coauthors), "\n"; + } + $prev_date_line = $date_line; + @prev_coauthors = @coauthors; + $prev_multi_paragraph = $multi_paragraph; + + # 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 + + # Complain about any unused entry in the --amend=F specified file. + my $fail = 0; + foreach my $sha (keys %$amend_code) + { + warn "$ME:$amend_file: unused entry: $sha\n"; + $fail = 1; + } + + exit $fail; +} + +# 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: diff --git a/tests/aclocal-install-absdir.test b/tests/aclocal-install-absdir.test new file mode 100644 index 000000000..1a642b5fd --- /dev/null +++ b/tests/aclocal-install-absdir.test @@ -0,0 +1,35 @@ +#! /bin/sh +# Copyright (C) 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 2, 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/>. + +# Make sure "aclocal --install" install files also in directories +# passed to `-I' as absolute paths. Now that we support the +# ACLOCAL_PATH variable, it is clear that this is the right thing +# to do. See also automake bug#8407. + +. ./defs || Exit 1 + +set -e + +mkdir loc sys + +echo 'AM_DUMMY_MACRO' >> configure.in +echo 'AC_DEFUN([AM_DUMMY_MACRO], [:])' >> sys/foo.m4 + +cwd=`pwd` || fatal_ "cannot get current working directory" +env ACLOCAL_PATH="$cwd/sys" $ACLOCAL --verbose --install -I "$cwd/loc" +diff sys/foo.m4 loc/foo.m4 + +: diff --git a/tests/list-of-tests.mk b/tests/list-of-tests.mk index 841935504..6ccca5dc3 100644 --- a/tests/list-of-tests.mk +++ b/tests/list-of-tests.mk @@ -48,6 +48,7 @@ acloca21.test \ acloca22.test \ acloca23.test \ aclocal-acdir.test \ +aclocal-install-absdir.test \ aclocal-print-acdir.test \ aclocal-path.test \ aclocal-path-install.test \ diff --git a/tests/subpkg.test b/tests/subpkg.test index eb6d81a69..658a8e53f 100755 --- a/tests/subpkg.test +++ b/tests/subpkg.test @@ -17,7 +17,7 @@ # Check subpackage handling. -required='cc yacc' +required=cc . ./defs || Exit 1 mkdir m4 |