* bug#19113: Generate a ChangeLog file from commit logs
2014-11-19 23:57 bug#19113: Generate a ChangeLog file from commit logs Paul Eggert
2014-11-20 15:51 ` Eli Zaretskii
2014-11-20 17:25 ` Pádraig Brady
@ 2015-01-12 7:38 ` Paul Eggert
2015-01-15 14:58 ` Stefan Monnier
2015-01-15 21:46 ` Glenn Morris
2015-03-21 2:37 ` Paul Eggert
3 siblings, 2 replies; 43+ messages in thread
From: Paul Eggert @ 2015-01-12 7:38 UTC (permalink / raw)
To: 19113
[-- Attachment #1: Type: text/plain, Size: 420 bytes --]
Attached is a proposed announcement for installing the patch (currently it
suggests a changeover date of January 21, but obviously that's adjustable),
along with updated copies of the rename patch (which should be applied to both
emacs-24 and master branches), a followup patch for the emacs-24 branch, and a
followup patch for the master branch. This all tries to address some (though
not all) the points raised.
[-- Attachment #2: announcement.txt --]
[-- Type: text/plain, Size: 1893 bytes --]
On January 21 we plan to change the procedure for committing changes to
the Emacs git repository, so that the ChangeLog file in the Emacs
distribution is generated automatically from git commit messages,
instead of being maintained manually as a near-copy of the commit
messages.
Because the ChangeLog file will no longer be fixed up by hand after
changes are installed, it will be more important to write good commit
messages. The suggested format is:
* The first line should be a brief summary without trailing period.
* The second line should be empty.
* Any general explanatory text should come next.
* Finally, the ChangeLog entries themselves should appear, in the
format specified by the GNU coding standards.
* Append a "Fixes: bug#NNNN" line if the change fixes a bug.
Lines should hold at most 78 characters. Here is an example commit
message:
Deactivate shifted region
Do not silently extend a region that is not highlighted;
this can happen after a shift.
* lisp/window.el (handle-select-window):
* src/frame.c (Fhandle_switch_frame, Fselected_frame):
Deactivate the mark.
Fixes: bug#19003
(The actual commit message should not be indented.)
- If you use Emacs VC, one way to format ChangeLog entries is to create
a top-level ChangeLog file, and update it with 'C-x 4 a' file as
usual. Do not register the ChangeLog file under git; instead, use
'C-c C-a' to insert its contents into into your *vc-log* buffer.
- Alternatively, you can use the GNU command vc-dwim (if installed)
to maintain commit messages in ChangeLog format. When you create a
source directory FOO, run the shell command 'cd FOO;
git-changelog-symlink-init' to create a symbolic link from ChangeLog
to .git/c/ChangeLog. Edit this ChangeLog via its symlink with Emacs
commands like 'C-x 4 a', and commit the change using the shell
command 'cd FOO; vc-dwim'.
[-- Attachment #3: rename.patch --]
[-- Type: text/x-patch, Size: 655 bytes --]
From 5a3b51993515fd3a22f23138369c8ebdb4e81664 Mon Sep 17 00:00:00 2001
From: Paul Eggert <eggert@cs.ucla.edu>
Date: Sun, 11 Jan 2015 22:38:14 -0800
Subject: [PATCH 1/2] Rename ChangeLogs for gitlog-to-changelog
This patch was implemented via the following shell commands:
find * -name ChangeLog |
sed 's,.*,git mv & &.1,
s, lisp/ChangeLog\.1$, lisp/ChangeLog.17,
s, lisp/erc/ChangeLog\.1$, lisp/erc/ChangeLog.09,
s, lisp/gnus/ChangeLog\.1$, lisp/gnus/ChangeLog.3,
s, lisp/mh-e/ChangeLog\.1$, lisp/mh-e/ChangeLog.2,
s, src/ChangeLog\.1$, src/ChangeLog.13,' |
sh
git commit -am"[this commit message]"
---
[body of patch elided in the interests of brevity]
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #4: changelog-emacs-24.patch --]
[-- Type: text/x-patch; name="changelog-emacs-24.patch", Size: 35850 bytes --]
From 6d589bea66874973e393f107d16f9e306e94b6af Mon Sep 17 00:00:00 2001
From: Paul Eggert <eggert@cs.ucla.edu>
Date: Sun, 11 Jan 2015 22:37:08 -0800
Subject: [PATCH] Generate a ChangeLog file from commit logs
Instead of having a ChangeLog file or files in the repository,
generate the ChangeLog file automatically from the git commit logs,
as part of the process of making a distribution.
* .gitignore: Add ChangeLog.
* Makefile.in (gen_origin): New macro.
(gen-ChangeLog): New rule.
* admin/admin.el (make-manuals-dist--1):
Don't treat ChangeLog specially.
* admin/make-tarball.txt, admin/notes/bugtracker:
* lisp/emacs-lisp/authors.el:
Add a FIXME comment.
* admin/merge-gnulib (GNULIB_MODULES): Add gitlog-to-changelog.
* admin/notes/repo: Add note about vc-dwim.
* admin/admin.el (add-release-logs, make-manuals-dist--1):
* build-aux/gitlog-to-changelog: New file, from Gnulib.
* build-aux/gitlog-to-emacslog: New file.
* lisp/calendar/icalendar.el, lisp/gnus/deuglify.el:
* lisp/emacs-lisp/gulp.el, lwlib/README, make-dist:
Adjust to renamed old ChangeLog files.
* build-aux/git-hooks/pre-commit: Disallow ChangeLog commits.
* etc/CONTRIBUTE: Adjust suggested procedures accordingly.
* make-dist: Use 'make gen-ChangeLog' to build top-level
ChangeLog in the distribution. Distribute gitlog-to-changelog.
Fixes: bug#19113
---
.gitignore | 1 +
Makefile.in | 8 +
admin/admin.el | 9 +-
admin/make-tarball.txt | 4 +
admin/merge-gnulib | 2 +-
admin/notes/bugtracker | 3 +-
admin/notes/repo | 12 +-
build-aux/git-hooks/pre-commit | 18 +-
build-aux/gitlog-to-changelog | 437 +++++++++++++++++++++++++++++++++++++++++
build-aux/gitlog-to-emacslog | 49 +++++
etc/CONTRIBUTE | 65 +++---
lisp/calendar/icalendar.el | 4 +-
lisp/emacs-lisp/authors.el | 5 +-
lisp/emacs-lisp/gulp.el | 2 +-
lisp/gnus/deuglify.el | 2 +-
lwlib/README | 2 +-
make-dist | 28 ++-
17 files changed, 595 insertions(+), 56 deletions(-)
create mode 100755 build-aux/gitlog-to-changelog
create mode 100755 build-aux/gitlog-to-emacslog
diff --git a/.gitignore b/.gitignore
index d326a35..ff57e6f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -233,6 +233,7 @@ info/dir
*~
.#*
\#*\#
+ChangeLog
[0-9]*.patch
# Built by 'make install'.
diff --git a/Makefile.in b/Makefile.in
index 4987cf6..9dd0580 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -1100,6 +1100,14 @@ bootstrap: bootstrap-clean FRC
$(MAKE) $(MFLAGS) MAKEFILE_NAME=force-Makefile force-Makefile
$(MAKE) $(MFLAGS) info all
+# The first revision to appear in the generated ChangeLog.
+gen_origin = 149749a1daea874283f83a882fb2e679d1417783
+# Convert git commit log to ChangeLog file. make-dist uses this.
+.PHONY: gen-ChangeLog
+gen-ChangeLog:
+ $(AM_V_GEN)distprefix=$(distprefix) srcprefix=$(srcdir)/ \
+ $(srcdir)/build-aux/gitlog-to-emacslog $(gen_origin)
+
.PHONY: check-declare
check-declare:
diff --git a/admin/admin.el b/admin/admin.el
index fcdb6cb..c273be4 100644
--- a/admin/admin.el
+++ b/admin/admin.el
@@ -28,10 +28,9 @@
(defvar add-log-time-format) ; in add-log
-;; Does this information need to be in every ChangeLog, as opposed to
-;; just the top-level one? Only if you allow changes the same
-;; day as the release.
-;; http://lists.gnu.org/archive/html/emacs-devel/2013-03/msg00161.html
+;; FIXME: Update this in the light of the fact that there's only
+;; one ChangeLog file now, at the top level, and it's generated from
+;; commit logs by 'make-dist'.
(defun add-release-logs (root version &optional date)
"Add \"Version VERSION released.\" change log entries in ROOT.
Root must be the root of an Emacs source tree.
@@ -650,7 +649,7 @@ style=\"text-align:left\">")
(copy-file "../doc/misc/texinfo.tex" stem)
(or (equal type "emacs") (copy-file "../doc/emacs/emacsver.texi" stem))
(dolist (file (directory-files (format "../doc/%s" type) t))
- (if (or (string-match-p "\\(\\.texi\\'\\|/ChangeLog\\|/README\\'\\)" file)
+ (if (or (string-match-p "\\(\\.texi\\'\\|/README\\'\\)" file)
(and (equal type "lispintro")
(string-match-p "\\.\\(eps\\|pdf\\)\\'" file)))
(copy-file file stem)))
diff --git a/admin/make-tarball.txt b/admin/make-tarball.txt
index 9603c61..c080014 100644
--- a/admin/make-tarball.txt
+++ b/admin/make-tarball.txt
@@ -2,6 +2,10 @@ Instructions to create pretest or release tarballs. -*- coding: utf-8 -*-
-- originally written by Gerd Moellmann, amended by Francesco Potortì
with the initial help of Eli Zaretskii
+FIXME: There is now just one ChangeLog file, at the top level,
+generated automatically from commit logs by 'make-dist'. The
+procedure below needs to be updated accordingly.
+
Steps to take before starting on the first pretest in any release sequence:
diff --git a/admin/merge-gnulib b/admin/merge-gnulib
index cfc1a34..09cf629 100755
--- a/admin/merge-gnulib
+++ b/admin/merge-gnulib
@@ -31,7 +31,7 @@ GNULIB_MODULES='
crypto/md5 crypto/sha1 crypto/sha256 crypto/sha512
dtoastr dtotimespec dup2 environ execinfo faccessat
fcntl fcntl-h fdatasync fdopendir filemode fstatat fsync
- getloadavg getopt-gnu gettime gettimeofday
+ getloadavg getopt-gnu gettime gettimeofday gitlog-to-changelog
intprops largefile lstat
manywarnings memrchr mkostemp mktime
pipe2 pselect pthread_sigmask putenv qacl readlink readlinkat
diff --git a/admin/notes/bugtracker b/admin/notes/bugtracker
index fd7bd08..9d03798 100644
--- a/admin/notes/bugtracker
+++ b/admin/notes/bugtracker
@@ -481,7 +481,8 @@ can see exactly what the fix was.
*** bug-reference-mode
Activate `bug-reference-mode' in ChangeLogs to get clickable links to
-the bug web-pages.
+the bug web-pages. FIXME: This may need to be updated in the light of
+the new policy of just one ChangeLog, at the top level.
*** Debian stuff
diff --git a/admin/notes/repo b/admin/notes/repo
index 46a9e08..a9da8fc 100644
--- a/admin/notes/repo
+++ b/admin/notes/repo
@@ -37,6 +37,15 @@ NEWS, MAINTAINERS, and FOR-RELEASE, or to indicate regeneration of
files such as 'configure'. "There is no need" means you don't have
to, but you can if you want to.
+** Using vc-dwim to maintain commit messages
+
+You can use vc-dwim to maintain commit messages in ChangeLog format.
+When you create a source directory FOO, run the shell command 'cd FOO;
+git-changelog-symlink-init' to create a symbolic link from ChangeLog
+to .git/c/ChangeLog. Edit this ChangeLog via its symlink with Emacs
+commands like 'C-x 4 a', and commit the change using the shell command
+'cd FOO; vc-dwim'. Type 'vc-dwim --help' for more info.
+
* Commit to the right branch
Development normally takes places on the trunk.
@@ -132,7 +141,8 @@ http://lists.gnu.org/archive/html/emacs-devel/2010-05/msg00262.html
* How to merge changes from emacs-24 to trunk
-[The section on git merge procedure has not yet been written]
+[The section on git merge procedure has not yet been written.
+Among other things, the ChangeLog file is now automatically generated.]
Inspect the change log entries (e.g. in case too many entries have been
included or whitespace between entries needs fixing). If someone made
diff --git a/build-aux/git-hooks/pre-commit b/build-aux/git-hooks/pre-commit
index d050c40..8bce1f5 100755
--- a/build-aux/git-hooks/pre-commit
+++ b/build-aux/git-hooks/pre-commit
@@ -34,13 +34,15 @@ if test "$nbadchars" -ne 0; then
exit 1
fi
-new_names=`$git_diff HEAD` || exit
-case "
-$new_names" in
- */-* | *'
-'-*)
- echo "File name component begins with '-'."
- exit 1;;
-esac
+for new_name in `$git_diff HEAD`; do
+ case $new_name in
+ -* | */-*)
+ echo "$new_name: File name component begins with '-'."
+ exit 1;;
+ ChangeLog | */ChangeLog)
+ echo "$new_name: Please use git commit messages, not ChangeLog files."
+ exit 1;;
+ esac
+done
exec git diff-index --check --cached HEAD --
diff --git a/build-aux/gitlog-to-changelog b/build-aux/gitlog-to-changelog
new file mode 100755
index 0000000..190f7b5
--- /dev/null
+++ b/build-aux/gitlog-to-changelog
@@ -0,0 +1,437 @@
+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 = '2014-11-20 17:25'; # 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-2014 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.
+ --no-cluster never cluster commit messages under the same date/author
+ header; the default is to cluster adjacent commit messages
+ if their headers are the same and neither commit message
+ contains multiple paragraphs.
+ --srcdir=DIR the root of the source tree, from which the .git/
+ directory can be derived.
+ --since=DATE convert only the logs since DATE;
+ the default is to convert all log entries.
+ --until=DATE convert only the logs older than DATE.
+ --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'
+ --strip-tab remove one additional leading TAB from commit message lines.
+ --strip-cherry-pick remove data inserted by "git cherry-pick";
+ this includes the "cherry picked from commit ..." line,
+ and the possible final "Conflicts:" paragraph.
+ --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
+
+SPECIAL SYNTAX:
+
+The following types of strings are interpreted specially when they appear
+at the beginning of a log message line. They are not copied to the output.
+
+ Copyright-paperwork-exempt: Yes
+ Append the "(tiny change)" notation to the usual "date name email"
+ ChangeLog header to mark a change that does not require a copyright
+ assignment.
+ Co-authored-by: Joe User <user\@example.com>
+ List the specified name and email address on a second
+ ChangeLog header, denoting a co-author.
+ Signed-off-by: Joe User <user\@example.com>
+ These lines are simply elided.
+
+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;
+}
+
+# git_dir_option $SRCDIR
+#
+# From $SRCDIR, the --git-dir option to pass to git (none if $SRCDIR
+# is undef). Return as a list (0 or 1 element).
+sub git_dir_option($)
+{
+ my ($srcdir) = @_;
+ my @res = ();
+ if (defined $srcdir)
+ {
+ my $qdir = shell_quote $srcdir;
+ my $cmd = "cd $qdir && git rev-parse --show-toplevel";
+ my $qcmd = shell_quote $cmd;
+ my $git_dir = qx($cmd);
+ defined $git_dir
+ or die "$ME: cannot run $qcmd: $!\n";
+ $? == 0
+ or die "$ME: $qcmd had unexpected exit code or signal ($?)\n";
+ chomp $git_dir;
+ push @res, "--git-dir=$git_dir/.git";
+ }
+ @res;
+}
+
+{
+ my $since_date;
+ my $until_date;
+ my $format_string = '%s%n%b%n';
+ my $amend_file;
+ my $append_dot = 0;
+ my $cluster = 1;
+ my $strip_tab = 0;
+ my $strip_cherry_pick = 0;
+ my $srcdir;
+ GetOptions
+ (
+ help => sub { usage 0 },
+ version => sub { print "$ME version $VERSION\n"; exit },
+ 'since=s' => \$since_date,
+ 'until=s' => \$until_date,
+ 'format=s' => \$format_string,
+ 'amend=s' => \$amend_file,
+ 'append-dot' => \$append_dot,
+ 'cluster!' => \$cluster,
+ 'strip-tab' => \$strip_tab,
+ 'strip-cherry-pick' => \$strip_cherry_pick,
+ 'srcdir=s' => \$srcdir,
+ ) or usage 1;
+
+ defined $since_date
+ and unshift @ARGV, "--since=$since_date";
+ defined $until_date
+ and unshift @ARGV, "--until=$until_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 = ('git',
+ git_dir_option $srcdir,
+ qw(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 = $_;
+ }
+
+ # Remove lines inserted by "git cherry-pick".
+ if ($strip_cherry_pick)
+ {
+ $rest =~ s/^\s*Conflicts:\n.*//sm;
+ $rest =~ s/^\s*\(cherry picked from commit [\da-f]+\)\n//m;
+ }
+
+ 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";
+
+ # Format 'Copyright-paperwork-exempt: Yes' as a standard ChangeLog
+ # `(tiny change)' annotation.
+ my $tiny = (grep (/^Copyright-paperwork-exempt:\s+[Yy]es$/, @line)
+ ? ' (tiny change)' : '');
+
+ my $date_line = sprintf "%s %s$tiny\n",
+ strftime ("%F", localtime ($1)), $2;
+
+ my @coauthors = grep /^Co-authored-by:.*$/, @line;
+ # Omit meta-data lines we've already interpreted.
+ @line = grep !/^(?:Signed-off-by:[ ].*>$
+ |Co-authored-by:[ ]
+ |Copyright-paperwork-exempt:[ ]
+ )/x, @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 clustering of commit messages has been disabled, 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 ( ! $cluster
+ || $date_line ne $prev_date_line
+ || "@coauthors" ne "@prev_coauthors"
+ || $multi_paragraph
+ || $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] .= '.';
+ }
+ }
+
+ # Remove one additional leading TAB from each line.
+ $strip_tab
+ and map { s/^\t// } @line;
+
+ # 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/build-aux/gitlog-to-emacslog b/build-aux/gitlog-to-emacslog
new file mode 100755
index 0000000..8ea8112
--- /dev/null
+++ b/build-aux/gitlog-to-emacslog
@@ -0,0 +1,49 @@
+#!/bin/sh
+
+# Convert git log output to ChangeLog format for GNU Emacs.
+
+# Copyright (C) 2014 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/>.
+
+LC_ALL=C
+export LC_ALL
+
+gen_origin=${1?}
+shift
+
+if test -d ${srcprefix}.git; then
+ gen_origin_date=`git log --pretty=format:%ci "$gen_origin"^! ` || exit
+ gen_start_year=`expr "$gen_origin_date" : '\([^-]*\)'` || exit
+ log_fix="${srcprefix}build-aux/git-log-fix"
+ test -e "$log_fix" && set -- "$@" --amend="$log_fix"
+
+ ${srcprefix}build-aux/gitlog-to-changelog "$@" $gen_origin^.. \
+ > ${distprefix}cl-t || exit
+
+ gen_end_year=`sed 's/-.*//; q' ${distprefix}cl-t`
+ if test "$gen_start_year" = "$gen_end_year"; then
+ year_range=$gen_start_year
+ else
+ year_range=$gen_start_year-$gen_end_year
+ fi
+
+ sed "1d
+ s/Copyright (C) [0-9]*-[0-9]*/Copyright (C) $year_range/
+ s/^# //
+ /http:/q
+ " Makefile.in >>${distprefix}cl-t &&
+ rm -f ${distprefix}ChangeLog &&
+ mv ${distprefix}cl-t ${distprefix}ChangeLog
+fi
diff --git a/etc/CONTRIBUTE b/etc/CONTRIBUTE
index 92b4c9e..51820c7 100644
--- a/etc/CONTRIBUTE
+++ b/etc/CONTRIBUTE
@@ -101,6 +101,16 @@ If your patch is not complete and you think it needs more discussion,
you might want to send it to emacs-devel@gnu.org instead. If you
revise your patch, send it as a followup to the initial topic.
+** Do not mix changes.
+
+If you send several unrelated changes together, we will ask you to
+separate them so we can consider each of the changes by itself.
+
+** Do not make formatting changes.
+
+Making cosmetic formatting changes (indentation, etc.) makes it harder
+to see what you have really changed.
+
** Description
For bug fixes, a description of the bug and how your patch fixes it.
@@ -109,20 +119,37 @@ For new features, a description of the feature and your implementation.
** ChangeLog
-A ChangeLog entry as plaintext (separate from the patch).
+A ChangeLog entry, which should be separate from the rest of the patch.
+
+Normally the git commit message should contain the ChangeLog entry,
+starting with a single short line explaining the change, then an empty
+line, then ChangeLog entries. Append a "Fixes:" line if the commit
+fixes a bug numbered at http://debbugs.gnu.org. Here is an indented
+example (the actual commit message should not be indented):
-See the existing ChangeLog files for format and content. Note that,
-unlike some other projects, we do require ChangeLogs also for
-documentation, i.e. Texinfo files.
+ Deactivate shifted region
+
+ Do not silently extend a region that is not highlighted;
+ this can happen after a shift.
+ * doc/emacs/mark.texi (Shift Selection): Document the change.
+ * lisp/window.el (handle-select-window):
+ * src/frame.c (Fhandle_switch_frame, Fselected_frame):
+ Deactivate the mark.
+ Fixes: bug#19003
+
+If you don't use git, the ChangeLog entry should be in plaintext and
+should be separate from the patch.
Ref: "Change Log Concepts" node of the GNU Coding Standards Info
-Manual, for how to write good log entries.
+Manual, for how to write good log entries. Unlike some other
+projects, we require ChangeLog entries also for documentation, i.e.,
+Texinfo files.
-When using git, commit messages should use ChangeLog format, with a
-single short line explaining the change, then an empty line, then
-unindented ChangeLog entries. (Essentially, a commit message should
-be a duplicate of what the patch adds to the ChangeLog files. We are
-planning to automate this better, to avoid the duplication.)
+If you use Emacs VC, one way to format ChangeLog entries is to create
+a top-level ChangeLog file, and update it with 'C-x 4 a' file as
+usual. Do not register the ChangeLog file under git; instead, use
+'C-c C-a' to insert its contents into into your *vc-log* buffer.
+Alternatively, you can use vc-dwim as described in ../admin/repo.
** The patch itself.
@@ -131,27 +158,17 @@ up-to-date (e.g. with 'git pull'). You can commit your changes
to a private branch and generate a patch from the master version
by using
git format-patch master
-Or you can leave your changes uncommitted and use
- git diff
With no repository, you can use
diff -u OLD NEW
+** Please reread your patch before submitting it.
+
** Mail format.
We prefer to get the patches as plain text, either inline (be careful
your mail client does not change line breaks) or as MIME attachments.
-
-** Please reread your patch before submitting it.
-
-** Do not mix changes.
-
-If you send several unrelated changes together, we will ask you to
-separate them so we can consider each of the changes by itself.
-
-** Do not make formatting changes.
-
-Making cosmetic formatting changes (indentation, etc) makes it harder
-to see what you have really changed.
+To send a git-format patch inline, you can use
+ git send-email 0001-FOO.patch
* Coding style and conventions.
diff --git a/lisp/calendar/icalendar.el b/lisp/calendar/icalendar.el
index 638f99f..ce6135e 100644
--- a/lisp/calendar/icalendar.el
+++ b/lisp/calendar/icalendar.el
@@ -39,7 +39,7 @@
;;; History:
-;; 0.07 onwards: see lisp/ChangeLog
+;; 0.07 onwards: see commit logs and ../ChangeLog*.
;; 0.06: (2004-10-06)
;; - Bugfixes regarding icalendar-import-format-*.
@@ -1047,7 +1047,7 @@ FExport diary data into iCalendar file: ")
(setq header (concat "\nBEGIN:VEVENT\nUID:"
(or uid
- (icalendar--create-uid entry-full
+ (icalendar--create-uid entry-full
contents)))))
(setq result (concat result header contents "\nEND:VEVENT")))
;; handle errors
diff --git a/lisp/emacs-lisp/authors.el b/lisp/emacs-lisp/authors.el
index e20ae95..e095be6 100644
--- a/lisp/emacs-lisp/authors.el
+++ b/lisp/emacs-lisp/authors.el
@@ -27,6 +27,9 @@
;; Use M-x authors RET to create an *Authors* buffer that can used as
;; or merged with Emacs's AUTHORS file.
+;; FIXME: This needs to modernized in the light of current practice,
+;; which generates a single top-level ChangeLog file from commit logs.
+
;;; Code:
(defvar authors-coding-system 'utf-8
@@ -75,7 +78,7 @@ files.")
("Gerd Möllmann" "Gerd Moellmann")
("Hallvard B. Furuseth" "Hallvard B Furuseth" "Hallvard Furuseth")
("Hrvoje Nikšić" "Hrvoje Niksic")
- ;; lisp/org/ChangeLog 2010-11-11.
+ ;; lisp/org/ChangeLog.1 2010-11-11.
(nil "aaa bbb")
(nil "Code Extracted") ; lisp/newcomment.el's "Author:" header
("Jaeyoun Chung" "Jae-youn Chung" "Jae-you Chung" "Chung Jae-youn")
diff --git a/lisp/emacs-lisp/gulp.el b/lisp/emacs-lisp/gulp.el
index ccefc09..b26f3f4 100644
--- a/lisp/emacs-lisp/gulp.el
+++ b/lisp/emacs-lisp/gulp.el
@@ -69,7 +69,7 @@ please send them to me ASAP.
Please don't send the whole file. Instead, please send a patch made with
`diff -c' that shows precisely the changes you would like me to install.
Also please include itemized change log entries for your changes;
-please use lisp/ChangeLog as a guide for the style and for what kinds
+please use lisp/ChangeLog* as a guide for the style and for what kinds
of information to include.
Thanks.")
diff --git a/lisp/gnus/deuglify.el b/lisp/gnus/deuglify.el
index 00d1ee9..92f2c00 100644
--- a/lisp/gnus/deuglify.el
+++ b/lisp/gnus/deuglify.el
@@ -188,7 +188,7 @@
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
-;; See ChangeLog for other changes.
+;; See commit log or ChangeLog* for other changes.
;;
;; Revision 1.5 2002/01/27 14:39:17 rscholz
;; * New variable `gnus-outlook-deuglify-no-wrap-chars' to inhibit
diff --git a/lwlib/README b/lwlib/README
index 25c72eb..ed7583d 100644
--- a/lwlib/README
+++ b/lwlib/README
@@ -4,4 +4,4 @@ library was written by Lucid, Inc and released under the terms of the
GPL version 1 (or later). It is not considered part of GNU Emacs.
This version of the library differs from the original as described in
-the ChangeLog file.
+the ChangeLog.1 file.
diff --git a/make-dist b/make-dist
index df5e505..20e49d1 100755
--- a/make-dist
+++ b/make-dist
@@ -278,13 +278,20 @@ fi
echo "Creating top directory: \`${tempdir}'"
mkdir ${tempdir}
+if test -d .git; then
+ echo "Making top-level ChangeLog"
+ make distprefix=${tempdir}/ gen-ChangeLog
+else
+ echo "No repository, so omitting top-level ChangeLog"
+fi
+
### We copy in the top-level files before creating the subdirectories in
### hopes that this will make the top-level files appear first in the
### tar file; this means that people can start reading the INSTALL and
### README while the rest of the tar file is still unpacking. Whoopee.
echo "Making links to top-level files"
ln INSTALL README BUGS ${tempdir}
-ln ChangeLog Makefile.in autogen.sh configure configure.ac ${tempdir}
+ln ChangeLog.*[0-9] Makefile.in autogen.sh configure configure.ac ${tempdir}
ln config.bat make-dist .dir-locals.el ${tempdir}
ln aclocal.m4 ${tempdir}
@@ -334,7 +341,7 @@ done
echo "Making links to \`leim' and its subdirectories"
(cd leim
ln makefile.w32-in ../${tempdir}/leim
- ln ChangeLog README ../${tempdir}/leim
+ ln ChangeLog.*[0-9] README ../${tempdir}/leim
ln CXTERM-DIC/README CXTERM-DIC/*.tit ../${tempdir}/leim/CXTERM-DIC
ln SKK-DIC/README SKK-DIC/SKK-JISYO.L ../${tempdir}/leim/SKK-DIC
ln MISC-DIC/README MISC-DIC/*.* ../${tempdir}/leim/MISC-DIC
@@ -345,6 +352,7 @@ echo "Making links to \`leim' and its subdirectories"
echo "Making links to \`build-aux'"
(cd build-aux
ln compile config.guess config.sub depcomp msys-to-w32 ../${tempdir}/build-aux
+ ln gitlog-to-changelog ../${tempdir}/build-aux
ln install-sh missing move-if-change ../${tempdir}/build-aux
ln update-copyright update-subdirs ../${tempdir}/build-aux
ln dir_top make-info-dir ../${tempdir}/build-aux)
@@ -361,7 +369,7 @@ echo "Making links to \`src'"
ln [a-zA-Z]*.[chm] ../${tempdir}/src
ln [a-zA-Z]*.in ../${tempdir}/src
ln [a-zA-Z]*.mk ../${tempdir}/src
- ln README ChangeLog ChangeLog.*[0-9] ../${tempdir}/src
+ ln README ChangeLog.*[0-9] ../${tempdir}/src
ln makefile.w32-in ../${tempdir}/src
ln .gdbinit .dbxinit ../${tempdir}/src
cd ../${tempdir}/src
@@ -383,7 +391,7 @@ echo "Making links to \`lib'"
echo "Making links to \`lib-src'"
(cd lib-src
ln [a-zA-Z]*.[ch] ../${tempdir}/lib-src
- ln ChangeLog Makefile.in README testfile ../${tempdir}/lib-src
+ ln ChangeLog.*[0-9] Makefile.in README testfile ../${tempdir}/lib-src
ln grep-changelog rcs2log ../${tempdir}/lib-src
ln makefile.w32-in ../${tempdir}/lib-src
ln update-game-score.exe.manifest ../${tempdir}/lib-src)
@@ -399,7 +407,7 @@ echo "Making links to \`nt'"
ln nmake.defs gmake.defs subdirs.el [a-z]*.bat [a-z]*.[ch] ../${tempdir}/nt
ln Makefile.in gnulib.mk ../${tempdir}/nt
ln mingw-cfg.site epaths.nt INSTALL.OLD ../${tempdir}/nt
- ln ChangeLog INSTALL README README.W32 makefile.w32-in ../${tempdir}/nt)
+ ln ChangeLog.*[0-9] INSTALL README README.W32 makefile.w32-in ../${tempdir}/nt)
echo "Making links to \`nt/inc' and its subdirectories"
for f in `find nt/inc -type f -name '[a-z]*.h'`; do
@@ -413,13 +421,13 @@ echo "Making links to \`nt/icons'"
echo "Making links to \`msdos'"
(cd msdos
- ln ChangeLog INSTALL README emacs.ico emacs.pif ../${tempdir}/msdos
+ ln ChangeLog.*[0-9] INSTALL README emacs.ico emacs.pif ../${tempdir}/msdos
ln depfiles.bat inttypes.h ../${tempdir}/msdos
ln is_exec.c sigaction.c mainmake.v2 sed*.inp ../${tempdir}/msdos)
echo "Making links to \`nextstep'"
(cd nextstep
- ln ChangeLog README INSTALL Makefile.in ../${tempdir}/nextstep)
+ ln ChangeLog.*[0-9] README INSTALL Makefile.in ../${tempdir}/nextstep)
echo "Making links to \`nextstep/templates'"
(cd nextstep/templates
@@ -440,12 +448,12 @@ echo "Making links to \`nextstep/GNUstep/Emacs.base/Resources'"
echo "Making links to \`oldXMenu'"
(cd oldXMenu
ln *.[ch] *.in ../${tempdir}/oldXMenu
- ln README ChangeLog ../${tempdir}/oldXMenu)
+ ln README ChangeLog.*[0-9] ../${tempdir}/oldXMenu)
echo "Making links to \`lwlib'"
(cd lwlib
ln *.[ch] *.in ../${tempdir}/lwlib
- ln README ChangeLog ../${tempdir}/lwlib)
+ ln README ChangeLog.*[0-9] ../${tempdir}/lwlib)
## It is important to distribute admin/ because it contains sources
## for generated lisp/international/uni-*.el files.
@@ -504,7 +512,7 @@ echo "Making links to \`doc/lispintro'"
echo "Making links to \`doc/man'"
(cd doc/man
- ln ChangeLog* *.1 ../../${tempdir}/doc/man
+ ln *.1 ../../${tempdir}/doc/man
cd ../../${tempdir}/doc/man)
### It would be nice if they could all be symlinks to top-level copy, but
--
2.1.0
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #5: changelog-master.patch --]
[-- Type: text/x-patch; name="changelog-master.patch", Size: 32263 bytes --]
From 071a20671bc7b01565243529f51eb2236a0e7134 Mon Sep 17 00:00:00 2001
From: Paul Eggert <eggert@cs.ucla.edu>
Date: Sun, 11 Jan 2015 22:42:09 -0800
Subject: [PATCH] Generate a ChangeLog file from commit logs
Instead of having a ChangeLog file or files in the repository,
generate the ChangeLog file automatically from the git commit logs,
as part of the process of making a distribution.
* .gitignore: Add ChangeLog.
* CONTRIBUTE: Adjust suggested procedures accordingly.
* Makefile.in (gen_origin): New macro.
(gen-ChangeLog): New rule.
* admin/admin.el (make-manuals-dist--1):
Don't treat ChangeLog specially.
* admin/make-tarball.txt, admin/notes/bugtracker, admin/notes/repo:
* lisp/emacs-lisp/authors.el:
Add a FIXME comment.
* admin/merge-gnulib (GNULIB_MODULES): Add gitlog-to-changelog.
* admin/admin.el (add-release-logs, make-manuals-dist--1):
* build-aux/git-hooks/pre-commit: Disallow ChangeLog commits.
* build-aux/gitlog-to-changelog: New file, from Gnulib.
* build-aux/gitlog-to-emacslog: New file.
* lisp/calendar/icalendar.el, lisp/gnus/deuglify.el:
* lisp/emacs-lisp/gulp.el, lwlib/README, make-dist:
Adjust to renamed old ChangeLog files.
* make-dist: Use 'make gen-ChangeLog' to build top-level
ChangeLog in the distribution. Distribute gitlog-to-changelog.
Fixes: bug#19113
---
.gitignore | 1 +
CONTRIBUTE | 57 ++++--
Makefile.in | 8 +
admin/admin.el | 9 +-
admin/authors.el | 5 +-
admin/make-tarball.txt | 4 +
admin/merge-gnulib | 2 +-
admin/notes/bugtracker | 3 +-
admin/notes/repo | 3 +-
build-aux/git-hooks/pre-commit | 18 +-
build-aux/gitlog-to-changelog | 437 +++++++++++++++++++++++++++++++++++++++++
build-aux/gitlog-to-emacslog | 49 +++++
lisp/calendar/icalendar.el | 2 +-
lisp/gnus/deuglify.el | 2 +-
lisp/obsolete/gulp.el | 2 +-
lwlib/README | 2 +-
make-dist | 16 +-
17 files changed, 578 insertions(+), 42 deletions(-)
create mode 100755 build-aux/gitlog-to-changelog
create mode 100755 build-aux/gitlog-to-emacslog
diff --git a/.gitignore b/.gitignore
index 9810c1d..67d28653 100644
--- a/.gitignore
+++ b/.gitignore
@@ -237,6 +237,7 @@ info/dir
*~
.#*
\#*\#
+ChangeLog
[0-9]*.patch
# Built by 'make install'.
diff --git a/CONTRIBUTE b/CONTRIBUTE
index 5cf015f..c5e36bd 100644
--- a/CONTRIBUTE
+++ b/CONTRIBUTE
@@ -27,10 +27,10 @@ advanced information.
Alternately, see admin/notes/git-workflow.
-If committing changes written by someone else, make the ChangeLog
-entry in their name, not yours. git distinguishes between the author
-and the committer; use the --author option on the commit command to
-specify the actual author; the committer defaults to you.
+If committing changes written by someone else, do so in their name,
+not yours. git distinguishes between the author and the committer;
+use the --author option on the commit command to specify the actual
+author; the committer defaults to you.
** commit messages
@@ -77,28 +77,29 @@ following modifications:
and have a reasonable chance of being read in the future, so it's
better that they have good presentation.
-- There are multiple ChangeLogs in the emacs source; roughly one per
- high-level directory. The ChangeLog entry for a commit belongs in the
- lowest ChangeLog that is higher than or at the same level as any file
- changed by the commit.
-
- Use the present tense; describe "what the change does", not "what
the change did".
-- Preferred form for several entries with the same content:
-
- * help.el (view-lossage):
- * kmacro.el (kmacro-edit-lossage):
- * edmacro.el (edit-kbd-macro): Fix docstring, lossage is now 300 keys.
-
- (Rather than anything involving "ditto" and suchlike.)
-
- If the commit fixes a bug, add a separate line
Fixes: bug#NNNN
where NNNN is the bug number.
+- Here is an example, showing the preferred form for several entries
+ with the same content:
+
+ Deactivate shifted region
+
+ Do not silently extend a region that is not highlighted;
+ this can happen after a shift.
+ * lisp/window.el (handle-select-window):
+ * src/frame.c (Fhandle_switch_frame, Fselected_frame):
+ Deactivate the mark.
+ Fixes: bug#19003
+
+ (Rather than anything involving "ditto" and suchlike.)
+
- In ChangeLog entries, there is no standard or recommended way to
identify revisions.
@@ -113,6 +114,19 @@ following modifications:
of files such as 'configure'. "There is no need" means you don't
have to, but you can if you want to.
+- If you use Emacs VC, one way to format ChangeLog entries is to create
+ a top-level ChangeLog file, and update it with 'C-x 4 a' file as
+ usual. Do not register the ChangeLog file under git; instead, use
+ 'C-c C-a' to insert its contents into into your *vc-log* buffer.
+
+- Alternatively, you can use the GNU command vc-dwim (if installed)
+ to maintain commit messages in ChangeLog format. When you create a
+ source directory FOO, run the shell command 'cd FOO;
+ git-changelog-symlink-init' to create a symbolic link from ChangeLog
+ to .git/c/ChangeLog. Edit this ChangeLog via its symlink with Emacs
+ commands like 'C-x 4 a', and commit the change using the shell
+ command 'cd FOO; vc-dwim'.
+
** branches
Development normally takes places on the trunk.
@@ -176,6 +190,15 @@ to the tracker at http://debbugs.gnu.org .
You can subscribe to the mailing lists, or see the list archives,
by following links from http://savannah.gnu.org/mail/?group=emacs .
+To send a git-format patch to the mailing list, which contains the
+most recent commit in your private repository, you can use a shell
+command like this:
+
+ git format-patch -1
+ git send-email 0001-*.patch
+
+Double-check the patch before sending it.
+
** Document your changes.
Any change that matters to end-users should have an entry in etc/NEWS.
diff --git a/Makefile.in b/Makefile.in
index 4cdd293..1c45f91 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -1087,6 +1087,14 @@ bootstrap: bootstrap-clean
$(MAKE) MAKEFILE_NAME=force-Makefile force-Makefile
$(MAKE) all
+# The first revision to appear in the generated ChangeLog.
+gen_origin = 149749a1daea874283f83a882fb2e679d1417783
+# Convert git commit log to ChangeLog file. make-dist uses this.
+.PHONY: gen-ChangeLog
+gen-ChangeLog:
+ $(AM_V_GEN)distprefix=$(distprefix) srcprefix=$(srcdir)/ \
+ $(srcdir)/build-aux/gitlog-to-emacslog $(gen_origin)
+
.PHONY: check-declare
check-declare:
diff --git a/admin/admin.el b/admin/admin.el
index 18ea4a4..3988977 100644
--- a/admin/admin.el
+++ b/admin/admin.el
@@ -28,10 +28,9 @@
(defvar add-log-time-format) ; in add-log
-;; Does this information need to be in every ChangeLog, as opposed to
-;; just the top-level one? Only if you allow changes the same
-;; day as the release.
-;; http://lists.gnu.org/archive/html/emacs-devel/2013-03/msg00161.html
+;; FIXME: Update this in the light of the fact that there's only
+;; one ChangeLog file now, at the top level, and it's generated from
+;; commit logs by 'make-dist'.
(defun add-release-logs (root version &optional date)
"Add \"Version VERSION released.\" change log entries in ROOT.
Root must be the root of an Emacs source tree.
@@ -601,7 +600,7 @@ style=\"text-align:left\">")
(copy-file "../doc/misc/texinfo.tex" stem)
(or (equal type "emacs") (copy-file "../doc/emacs/emacsver.texi" stem))
(dolist (file (directory-files (format "../doc/%s" type) t))
- (if (or (string-match-p "\\(\\.texi\\'\\|/ChangeLog\\|/README\\'\\)" file)
+ (if (or (string-match-p "\\(\\.texi\\'\\|/README\\'\\)" file)
(and (equal type "lispintro")
(string-match-p "\\.\\(eps\\|pdf\\)\\'" file)))
(copy-file file stem)))
diff --git a/admin/authors.el b/admin/authors.el
index afab6f0..de6088d 100644
--- a/admin/authors.el
+++ b/admin/authors.el
@@ -27,6 +27,9 @@
;; Use M-x authors RET to create an *Authors* buffer that can used as
;; or merged with Emacs's AUTHORS file.
+;; FIXME: This needs to modernized in the light of current practice,
+;; which generates a single top-level ChangeLog file from commit logs.
+
;;; Code:
(defvar authors-coding-system 'utf-8
@@ -76,7 +79,7 @@ files.")
("Gerd Möllmann" "Gerd Moellmann")
("Hallvard B. Furuseth" "Hallvard B Furuseth" "Hallvard Furuseth")
("Hrvoje Nikšić" "Hrvoje Niksic")
- ;; lisp/org/ChangeLog 2010-11-11.
+ ;; lisp/org/ChangeLog.1 2010-11-11.
(nil "aaa bbb")
(nil "Code Extracted") ; lisp/newcomment.el's "Author:" header
("Jaeyoun Chung" "Jae-youn Chung" "Jae-you Chung" "Chung Jae-youn")
diff --git a/admin/make-tarball.txt b/admin/make-tarball.txt
index 8f8b031..81f573f 100644
--- a/admin/make-tarball.txt
+++ b/admin/make-tarball.txt
@@ -2,6 +2,10 @@ Instructions to create pretest or release tarballs. -*- coding: utf-8 -*-
-- originally written by Gerd Moellmann, amended by Francesco Potortì
with the initial help of Eli Zaretskii
+FIXME: There is now just one ChangeLog file, at the top level,
+generated automatically from commit logs by 'make-dist'. The
+procedure below needs to be updated accordingly.
+
Steps to take before starting on the first pretest in any release sequence:
diff --git a/admin/merge-gnulib b/admin/merge-gnulib
index 9e2b10d..e63422b 100755
--- a/admin/merge-gnulib
+++ b/admin/merge-gnulib
@@ -31,7 +31,7 @@ GNULIB_MODULES='
crypto/md5 crypto/sha1 crypto/sha256 crypto/sha512
dtoastr dtotimespec dup2 environ execinfo faccessat
fcntl fcntl-h fdatasync fdopendir filemode fstatat fsync
- getloadavg getopt-gnu gettime gettimeofday
+ getloadavg getopt-gnu gettime gettimeofday gitlog-to-changelog
intprops largefile lstat
manywarnings memrchr mkostemp mktime
pipe2 pselect pthread_sigmask putenv qacl readlink readlinkat
diff --git a/admin/notes/bugtracker b/admin/notes/bugtracker
index fd7bd08..9d03798 100644
--- a/admin/notes/bugtracker
+++ b/admin/notes/bugtracker
@@ -481,7 +481,8 @@ can see exactly what the fix was.
*** bug-reference-mode
Activate `bug-reference-mode' in ChangeLogs to get clickable links to
-the bug web-pages.
+the bug web-pages. FIXME: This may need to be updated in the light of
+the new policy of just one ChangeLog, at the top level.
*** Debian stuff
diff --git a/admin/notes/repo b/admin/notes/repo
index 2d4cc2a..f76187f 100644
--- a/admin/notes/repo
+++ b/admin/notes/repo
@@ -47,7 +47,8 @@ removes a file, then remove the corresponding files by hand.
* How to merge changes from emacs-24 to trunk
-[The section on git merge procedure has not yet been written]
+[The section on git merge procedure has not yet been written.
+Among other things, the ChangeLog file is now automatically generated.]
Inspect the change log entries (e.g. in case too many entries have been
included or whitespace between entries needs fixing). If someone made
diff --git a/build-aux/git-hooks/pre-commit b/build-aux/git-hooks/pre-commit
index d050c40..8bce1f5 100755
--- a/build-aux/git-hooks/pre-commit
+++ b/build-aux/git-hooks/pre-commit
@@ -34,13 +34,15 @@ if test "$nbadchars" -ne 0; then
exit 1
fi
-new_names=`$git_diff HEAD` || exit
-case "
-$new_names" in
- */-* | *'
-'-*)
- echo "File name component begins with '-'."
- exit 1;;
-esac
+for new_name in `$git_diff HEAD`; do
+ case $new_name in
+ -* | */-*)
+ echo "$new_name: File name component begins with '-'."
+ exit 1;;
+ ChangeLog | */ChangeLog)
+ echo "$new_name: Please use git commit messages, not ChangeLog files."
+ exit 1;;
+ esac
+done
exec git diff-index --check --cached HEAD --
diff --git a/build-aux/gitlog-to-changelog b/build-aux/gitlog-to-changelog
new file mode 100755
index 0000000..190f7b5
--- /dev/null
+++ b/build-aux/gitlog-to-changelog
@@ -0,0 +1,437 @@
+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 = '2014-11-20 17:25'; # 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-2014 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.
+ --no-cluster never cluster commit messages under the same date/author
+ header; the default is to cluster adjacent commit messages
+ if their headers are the same and neither commit message
+ contains multiple paragraphs.
+ --srcdir=DIR the root of the source tree, from which the .git/
+ directory can be derived.
+ --since=DATE convert only the logs since DATE;
+ the default is to convert all log entries.
+ --until=DATE convert only the logs older than DATE.
+ --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'
+ --strip-tab remove one additional leading TAB from commit message lines.
+ --strip-cherry-pick remove data inserted by "git cherry-pick";
+ this includes the "cherry picked from commit ..." line,
+ and the possible final "Conflicts:" paragraph.
+ --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
+
+SPECIAL SYNTAX:
+
+The following types of strings are interpreted specially when they appear
+at the beginning of a log message line. They are not copied to the output.
+
+ Copyright-paperwork-exempt: Yes
+ Append the "(tiny change)" notation to the usual "date name email"
+ ChangeLog header to mark a change that does not require a copyright
+ assignment.
+ Co-authored-by: Joe User <user\@example.com>
+ List the specified name and email address on a second
+ ChangeLog header, denoting a co-author.
+ Signed-off-by: Joe User <user\@example.com>
+ These lines are simply elided.
+
+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;
+}
+
+# git_dir_option $SRCDIR
+#
+# From $SRCDIR, the --git-dir option to pass to git (none if $SRCDIR
+# is undef). Return as a list (0 or 1 element).
+sub git_dir_option($)
+{
+ my ($srcdir) = @_;
+ my @res = ();
+ if (defined $srcdir)
+ {
+ my $qdir = shell_quote $srcdir;
+ my $cmd = "cd $qdir && git rev-parse --show-toplevel";
+ my $qcmd = shell_quote $cmd;
+ my $git_dir = qx($cmd);
+ defined $git_dir
+ or die "$ME: cannot run $qcmd: $!\n";
+ $? == 0
+ or die "$ME: $qcmd had unexpected exit code or signal ($?)\n";
+ chomp $git_dir;
+ push @res, "--git-dir=$git_dir/.git";
+ }
+ @res;
+}
+
+{
+ my $since_date;
+ my $until_date;
+ my $format_string = '%s%n%b%n';
+ my $amend_file;
+ my $append_dot = 0;
+ my $cluster = 1;
+ my $strip_tab = 0;
+ my $strip_cherry_pick = 0;
+ my $srcdir;
+ GetOptions
+ (
+ help => sub { usage 0 },
+ version => sub { print "$ME version $VERSION\n"; exit },
+ 'since=s' => \$since_date,
+ 'until=s' => \$until_date,
+ 'format=s' => \$format_string,
+ 'amend=s' => \$amend_file,
+ 'append-dot' => \$append_dot,
+ 'cluster!' => \$cluster,
+ 'strip-tab' => \$strip_tab,
+ 'strip-cherry-pick' => \$strip_cherry_pick,
+ 'srcdir=s' => \$srcdir,
+ ) or usage 1;
+
+ defined $since_date
+ and unshift @ARGV, "--since=$since_date";
+ defined $until_date
+ and unshift @ARGV, "--until=$until_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 = ('git',
+ git_dir_option $srcdir,
+ qw(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 = $_;
+ }
+
+ # Remove lines inserted by "git cherry-pick".
+ if ($strip_cherry_pick)
+ {
+ $rest =~ s/^\s*Conflicts:\n.*//sm;
+ $rest =~ s/^\s*\(cherry picked from commit [\da-f]+\)\n//m;
+ }
+
+ 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";
+
+ # Format 'Copyright-paperwork-exempt: Yes' as a standard ChangeLog
+ # `(tiny change)' annotation.
+ my $tiny = (grep (/^Copyright-paperwork-exempt:\s+[Yy]es$/, @line)
+ ? ' (tiny change)' : '');
+
+ my $date_line = sprintf "%s %s$tiny\n",
+ strftime ("%F", localtime ($1)), $2;
+
+ my @coauthors = grep /^Co-authored-by:.*$/, @line;
+ # Omit meta-data lines we've already interpreted.
+ @line = grep !/^(?:Signed-off-by:[ ].*>$
+ |Co-authored-by:[ ]
+ |Copyright-paperwork-exempt:[ ]
+ )/x, @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 clustering of commit messages has been disabled, 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 ( ! $cluster
+ || $date_line ne $prev_date_line
+ || "@coauthors" ne "@prev_coauthors"
+ || $multi_paragraph
+ || $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] .= '.';
+ }
+ }
+
+ # Remove one additional leading TAB from each line.
+ $strip_tab
+ and map { s/^\t// } @line;
+
+ # 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/build-aux/gitlog-to-emacslog b/build-aux/gitlog-to-emacslog
new file mode 100755
index 0000000..8ea8112
--- /dev/null
+++ b/build-aux/gitlog-to-emacslog
@@ -0,0 +1,49 @@
+#!/bin/sh
+
+# Convert git log output to ChangeLog format for GNU Emacs.
+
+# Copyright (C) 2014 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/>.
+
+LC_ALL=C
+export LC_ALL
+
+gen_origin=${1?}
+shift
+
+if test -d ${srcprefix}.git; then
+ gen_origin_date=`git log --pretty=format:%ci "$gen_origin"^! ` || exit
+ gen_start_year=`expr "$gen_origin_date" : '\([^-]*\)'` || exit
+ log_fix="${srcprefix}build-aux/git-log-fix"
+ test -e "$log_fix" && set -- "$@" --amend="$log_fix"
+
+ ${srcprefix}build-aux/gitlog-to-changelog "$@" $gen_origin^.. \
+ > ${distprefix}cl-t || exit
+
+ gen_end_year=`sed 's/-.*//; q' ${distprefix}cl-t`
+ if test "$gen_start_year" = "$gen_end_year"; then
+ year_range=$gen_start_year
+ else
+ year_range=$gen_start_year-$gen_end_year
+ fi
+
+ sed "1d
+ s/Copyright (C) [0-9]*-[0-9]*/Copyright (C) $year_range/
+ s/^# //
+ /http:/q
+ " Makefile.in >>${distprefix}cl-t &&
+ rm -f ${distprefix}ChangeLog &&
+ mv ${distprefix}cl-t ${distprefix}ChangeLog
+fi
diff --git a/lisp/calendar/icalendar.el b/lisp/calendar/icalendar.el
index 452a672..da5d85e 100644
--- a/lisp/calendar/icalendar.el
+++ b/lisp/calendar/icalendar.el
@@ -39,7 +39,7 @@
;;; History:
-;; 0.07 onwards: see lisp/ChangeLog
+;; 0.07 onwards: see commit logs and ../ChangeLog*.
;; 0.06: (2004-10-06)
;; - Bugfixes regarding icalendar-import-format-*.
diff --git a/lisp/gnus/deuglify.el b/lisp/gnus/deuglify.el
index 00d1ee9..92f2c00 100644
--- a/lisp/gnus/deuglify.el
+++ b/lisp/gnus/deuglify.el
@@ -188,7 +188,7 @@
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
-;; See ChangeLog for other changes.
+;; See commit log or ChangeLog* for other changes.
;;
;; Revision 1.5 2002/01/27 14:39:17 rscholz
;; * New variable `gnus-outlook-deuglify-no-wrap-chars' to inhibit
diff --git a/lisp/obsolete/gulp.el b/lisp/obsolete/gulp.el
index 5ff99f2..f0223fa 100644
--- a/lisp/obsolete/gulp.el
+++ b/lisp/obsolete/gulp.el
@@ -70,7 +70,7 @@ please send them to me ASAP.
Please don't send the whole file. Instead, please send a patch made with
`diff -c' that shows precisely the changes you would like me to install.
Also please include itemized change log entries for your changes;
-please use lisp/ChangeLog as a guide for the style and for what kinds
+please use lisp/ChangeLog* as a guide for the style and for what kinds
of information to include.
Thanks.")
diff --git a/lwlib/README b/lwlib/README
index 25c72eb..ed7583d 100644
--- a/lwlib/README
+++ b/lwlib/README
@@ -4,4 +4,4 @@ library was written by Lucid, Inc and released under the terms of the
GPL version 1 (or later). It is not considered part of GNU Emacs.
This version of the library differs from the original as described in
-the ChangeLog file.
+the ChangeLog.1 file.
diff --git a/make-dist b/make-dist
index 4e05594..f66a0db 100755
--- a/make-dist
+++ b/make-dist
@@ -277,13 +277,20 @@ fi
echo "Creating top directory: \`${tempdir}'"
mkdir ${tempdir}
+if test -d .git; then
+ echo "Making top-level ChangeLog"
+ make distprefix=${tempdir}/ gen-ChangeLog
+else
+ echo "No repository, so omitting top-level ChangeLog"
+fi
+
### We copy in the top-level files before creating the subdirectories in
### hopes that this will make the top-level files appear first in the
### tar file; this means that people can start reading the INSTALL and
### README while the rest of the tar file is still unpacking. Whoopee.
echo "Making links to top-level files"
ln INSTALL README BUGS ${tempdir}
-ln ChangeLog Makefile.in autogen.sh configure configure.ac ${tempdir}
+ln ChangeLog.*[0-9] Makefile.in autogen.sh configure configure.ac ${tempdir}
ln config.bat make-dist .dir-locals.el ${tempdir}
ln aclocal.m4 ${tempdir}
@@ -333,7 +340,7 @@ done
echo "Making links to \`leim' and its subdirectories"
(cd leim
ln makefile.w32-in ../${tempdir}/leim
- ln ChangeLog README ../${tempdir}/leim
+ ln ChangeLog.*[0-9] README ../${tempdir}/leim
ln CXTERM-DIC/README CXTERM-DIC/*.tit ../${tempdir}/leim/CXTERM-DIC
ln SKK-DIC/README SKK-DIC/SKK-JISYO.L ../${tempdir}/leim/SKK-DIC
ln MISC-DIC/README MISC-DIC/*.* ../${tempdir}/leim/MISC-DIC
@@ -344,6 +351,7 @@ echo "Making links to \`leim' and its subdirectories"
echo "Making links to \`build-aux'"
(cd build-aux
ln compile config.guess config.sub depcomp msys-to-w32 ../${tempdir}/build-aux
+ ln gitlog-to-changelog ../${tempdir}/build-aux
ln install-sh missing move-if-change ../${tempdir}/build-aux
ln update-copyright update-subdirs ../${tempdir}/build-aux
ln dir_top make-info-dir ../${tempdir}/build-aux)
@@ -360,7 +368,7 @@ echo "Making links to \`src'"
ln [a-zA-Z]*.[chm] ../${tempdir}/src
ln [a-zA-Z]*.in ../${tempdir}/src
ln [a-zA-Z]*.mk ../${tempdir}/src
- ln README ChangeLog ChangeLog.*[0-9] ../${tempdir}/src
+ ln README ChangeLog.*[0-9] ../${tempdir}/src
ln makefile.w32-in ../${tempdir}/src
ln .gdbinit .dbxinit ../${tempdir}/src
cd ../${tempdir}/src
@@ -398,7 +406,7 @@ echo "Making links to \`nt'"
ln nmake.defs gmake.defs subdirs.el [a-z]*.bat [a-z]*.[ch] ../${tempdir}/nt
ln *.in gnulib.mk ../${tempdir}/nt
ln mingw-cfg.site epaths.nt INSTALL.OLD ../${tempdir}/nt
- ln ChangeLog INSTALL README README.W32 makefile.w32-in ../${tempdir}/nt)
+ ln ChangeLog.*[0-9] INSTALL README README.W32 makefile.w32-in ../${tempdir}/nt)
echo "Making links to \`nt/inc' and its subdirectories"
for f in `find nt/inc -type f -name '[a-z]*.h'`; do
--
2.1.0
^ permalink raw reply related [flat|nested] 43+ messages in thread
* bug#19113: Generate a ChangeLog file from commit logs
2014-11-19 23:57 bug#19113: Generate a ChangeLog file from commit logs Paul Eggert
` (2 preceding siblings ...)
2015-01-12 7:38 ` Paul Eggert
@ 2015-03-21 2:37 ` Paul Eggert
2015-03-21 8:33 ` Eli Zaretskii
` (2 more replies)
3 siblings, 3 replies; 43+ messages in thread
From: Paul Eggert @ 2015-03-21 2:37 UTC (permalink / raw)
To: 19113
[-- Attachment #1: Type: text/plain, Size: 939 bytes --]
I hacked on this a bit and came up with the attached files, which should be
improvements. 'announcement.txt' is a draft email to be sent to emacs-devel
about a week before the change. The two patch files have the same role as
before, and attempt to address the comments made in this thread.
It's now much easier to edit ChangeLog history: run 'make change-history' to
prepend newer commit messages to the file ChangeLog.1 (thus marking them as
older), edit ChangeLog.1 by hand, and then commit the result. Once ChangeLog.1
gets too big it should be easy to start working on ChangeLog.2.
I had trouble implementing Glenn's suggestion of using a '#' prefix to mark
ignorable commit messages, as Git typically uses '#' for its own purposes when
editing commit messages. I changed the prefix to '; ' and this worked better,
so I went with that. It should be easy to use any string that starts with a
character other than '#'.
[-- Attachment #2: announcement.txt --]
[-- Type: text/plain, Size: 2941 bytes --]
On [fill in the date here -- about a week from when this
announcement is made] we plan to change the procedure for
committing changes to the Emacs git repository, so that the
ChangeLog file in the Emacs distribution can be generated
automatically from git commit messages. Although you'll still be
able to edit ChangeLog history by running 'make change-history'
and then committing changes to a new top-level file (initially
'ChangeLog.1'), most commits shouldn't need to change any
ChangeLog* files and this should simplify merging.
The suggested format for commit messages will be changed slightly:
- File names should be relative to the top level, e.g.:
Deactivate shifted region
Do not silently extend an unhighlighted region;
this can happen after a shift.
* doc/emacs/mark.texi (Shift Selection): Document this.
* lisp/window.el (handle-select-window):
* src/frame.c (Fhandle_switch_frame, Fselected_frame):
Deactivate the mark.
Fixes: bug#19003
(The actual commit message should not be indented.)
- If the commit has authors other than yourself, the commit
message should contain a separate line like the following:
Co-authored-by: Joe Schmoe <j.schmoe@example.org>
- If the commit is a tiny change that is exempt from copyright
paperwork, the commit message should contain a separate line
like the following:
Copyright-paperwork-exempt: yes
- If the commit message should not appear in generated
ChangeLogs, its first line should start with "; ".
With the new approach there are multiple ways to format ChangeLog
entries as part of the process of creating a commit message:
- If you use Emacs VC, you can create a top-level ChangeLog file,
and update it with 'C-x 4 a' file as usual. Do not register
the ChangeLog file under git; instead, use 'C-c C-a' to insert
its contents into into your *vc-log* buffer.
- Alternatively, you can use the vc-dwim command to maintain
commit messages. When you create a source directory, run the
shell command 'git-changelog-symlink-init' to create a symbolic
link from ChangeLog to .git/c/ChangeLog. Edit this ChangeLog
via its symlink with Emacs commands like 'C-x 4 a', and commit
the change using the shell command 'vc-dwim --commit'. Type
'vc-dwim --help' for more.
The above will all be documented in the files CONTRIBUTE (for
ordinary commits) and admin/notes/repo (for commits that edit
ChangeLog history files).
This change will be installed on the master branch. Other
branches can adopt this change whenever convenient. The emacs-24
branch can continue to use the old procedure, and changes to
ChangeLog files in emacs-24 can be discarded by hand when merging
to master.
Although this new style of maintenance is common in other GNU
projects, Emacs has its own special needs and most likely there
will be glitches after the transition. We will do our best to
straighten out these problems as they occur.
[-- Attachment #3: 0001-Rename-ChangeLogs-for-gitlog-to-changelog.patch --]
[-- Type: text/x-patch, Size: 4923 bytes --]
From 443656eace2ae1c94a762b8a907f2c4b4e728258 Mon Sep 17 00:00:00 2001
From: Paul Eggert <eggert@cs.ucla.edu>
Date: Thu, 19 Mar 2015 19:00:29 -0700
Subject: [PATCH 1/2] Rename ChangeLogs for gitlog-to-changelog
This patch was implemented via the following shell commands:
find * -name ChangeLog |
sed 's,.*,git mv & &.1,
s, lisp/ChangeLog\.1$, lisp/ChangeLog.17,
s, lisp/erc/ChangeLog\.1$, lisp/erc/ChangeLog.09,
s, lisp/gnus/ChangeLog\.1$, lisp/gnus/ChangeLog.3,
s, lisp/mh-e/ChangeLog\.1$, lisp/mh-e/ChangeLog.2,
s, src/ChangeLog\.1$, src/ChangeLog.13,' |
sh
git commit -am"[this commit message]"
---
ChangeLog | 14669 --------------------
ChangeLog.1 | 14669 ++++++++++++++++++++
admin/ChangeLog | 2591 ----
admin/ChangeLog.1 | 2591 ++++
doc/emacs/ChangeLog | 10933 ---------------
doc/emacs/ChangeLog.1 | 10933 +++++++++++++++
doc/lispintro/ChangeLog | 796 --
doc/lispintro/ChangeLog.1 | 796 ++
doc/lispref/ChangeLog | 13982 -------------------
doc/lispref/ChangeLog.1 | 13982 +++++++++++++++++++
doc/man/ChangeLog | 194 -
doc/man/ChangeLog.1 | 194 +
doc/misc/ChangeLog | 12125 ----------------
doc/misc/ChangeLog.1 | 12125 ++++++++++++++++
etc/ChangeLog | 6888 ----------
etc/ChangeLog.1 | 6888 ++++++++++
leim/ChangeLog | 2596 ----
leim/ChangeLog.1 | 2596 ++++
lib-src/ChangeLog | 8616 ------------
lib-src/ChangeLog.1 | 8616 ++++++++++++
lisp/ChangeLog | 25796 ----------------------------------
lisp/ChangeLog.17 | 25796 ++++++++++++++++++++++++++++++++++
lisp/cedet/ChangeLog | 3478 -----
lisp/cedet/ChangeLog.1 | 3478 +++++
lisp/erc/ChangeLog | 772 --
lisp/erc/ChangeLog.09 | 772 ++
lisp/gnus/ChangeLog | 26293 -----------------------------------
lisp/gnus/ChangeLog.3 | 26293 +++++++++++++++++++++++++++++++++++
lisp/mh-e/ChangeLog | 3696 -----
lisp/mh-e/ChangeLog.2 | 3696 +++++
lisp/org/ChangeLog | 32851 --------------------------------------------
lisp/org/ChangeLog.1 | 32851 ++++++++++++++++++++++++++++++++++++++++++++
lisp/url/ChangeLog | 3087 -----
lisp/url/ChangeLog.1 | 3087 +++++
lwlib/ChangeLog | 1982 ---
lwlib/ChangeLog.1 | 1982 +++
msdos/ChangeLog | 1568 ---
msdos/ChangeLog.1 | 1568 +++
nextstep/ChangeLog | 330 -
nextstep/ChangeLog.1 | 330 +
nt/ChangeLog | 3561 -----
nt/ChangeLog.1 | 3561 +++++
oldXMenu/ChangeLog | 730 -
oldXMenu/ChangeLog.1 | 730 +
src/ChangeLog | 17766 ------------------------
src/ChangeLog.13 | 17766 ++++++++++++++++++++++++
test/ChangeLog | 2935 ----
test/ChangeLog.1 | 2935 ++++
48 files changed, 198235 insertions(+), 198235 deletions(-)
delete mode 100644 ChangeLog
create mode 100644 ChangeLog.1
delete mode 100644 admin/ChangeLog
create mode 100644 admin/ChangeLog.1
delete mode 100644 doc/emacs/ChangeLog
create mode 100644 doc/emacs/ChangeLog.1
delete mode 100644 doc/lispintro/ChangeLog
create mode 100644 doc/lispintro/ChangeLog.1
delete mode 100644 doc/lispref/ChangeLog
create mode 100644 doc/lispref/ChangeLog.1
delete mode 100644 doc/man/ChangeLog
create mode 100644 doc/man/ChangeLog.1
delete mode 100644 doc/misc/ChangeLog
create mode 100644 doc/misc/ChangeLog.1
delete mode 100644 etc/ChangeLog
create mode 100644 etc/ChangeLog.1
delete mode 100644 leim/ChangeLog
create mode 100644 leim/ChangeLog.1
delete mode 100644 lib-src/ChangeLog
create mode 100644 lib-src/ChangeLog.1
delete mode 100644 lisp/ChangeLog
create mode 100644 lisp/ChangeLog.17
delete mode 100644 lisp/cedet/ChangeLog
create mode 100644 lisp/cedet/ChangeLog.1
delete mode 100644 lisp/erc/ChangeLog
create mode 100644 lisp/erc/ChangeLog.09
delete mode 100644 lisp/gnus/ChangeLog
create mode 100644 lisp/gnus/ChangeLog.3
delete mode 100644 lisp/mh-e/ChangeLog
create mode 100644 lisp/mh-e/ChangeLog.2
delete mode 100644 lisp/org/ChangeLog
create mode 100644 lisp/org/ChangeLog.1
delete mode 100644 lisp/url/ChangeLog
create mode 100644 lisp/url/ChangeLog.1
delete mode 100644 lwlib/ChangeLog
create mode 100644 lwlib/ChangeLog.1
delete mode 100644 msdos/ChangeLog
create mode 100644 msdos/ChangeLog.1
delete mode 100644 nextstep/ChangeLog
create mode 100644 nextstep/ChangeLog.1
delete mode 100644 nt/ChangeLog
create mode 100644 nt/ChangeLog.1
delete mode 100644 oldXMenu/ChangeLog
create mode 100644 oldXMenu/ChangeLog.1
delete mode 100644 src/ChangeLog
create mode 100644 src/ChangeLog.13
delete mode 100644 test/ChangeLog
create mode 100644 test/ChangeLog.1
[The rest of this patch is long (about 14 MB) and is omitted here.
You can regenerate it by following the above instructions.]
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #4: 0002-Add-support-for-generating-a-ChangeLog-file-from-com.patch --]
[-- Type: text/x-patch; name="0002-Add-support-for-generating-a-ChangeLog-file-from-com.patch", Size: 50734 bytes --]
From e4068162684d9c3529d2ced881d1af226f23e446 Mon Sep 17 00:00:00 2001
From: Paul Eggert <eggert@cs.ucla.edu>
Date: Fri, 20 Mar 2015 12:18:52 -0700
Subject: [PATCH 2/2] Add support for generating a ChangeLog file from commit
logs.
* .gitignore: Add 'ChangeLog'.
* build-aux/gitlog-to-changelog: New file, from Gnulib.
* build-aux/gitlog-to-emacslog: New file.
* CONTRIBUTE: Document the revised workflow.
* Makefile.in (clean): Remove *.tmp and etc/*.tmp*
instead of just special cases.
(gen_origin): New var.
(ChangeLog, unchanged-history-files, change-history)
(change-history-commit): New rules.
* admin/admin.el (make-manuals-dist--1):
Don't worry about doc/ChangeLog.
* admin/authors.el: Add a FIXME.
* admin/make-tarball.txt:
* lisp/calendar/icalendar.el:
* lisp/gnus/deuglify.el:
* lisp/obsolete/gulp.el:
* lwlib/README:
Adjust to renamed ChangeLog history files.
* admin/merge-gnulib (GNULIB_MODULES): Add gitlog-to-changelog.
* admin/notes/repo: Call it 'master' a la Git, not 'trunk' a la Bzr.
Remove obsolete discussion of merging ChangeLog files.
New section "Maintaining ChangeLog history".
* build-aux/git-hooks/pre-commit:
Reject attempts to commit files named 'ChangeLog'.
* lib/gnulib.mk, m4/gnulib-comp.m4: Regenerate.
* make-dist: Make and distribute top-level ChangeLog if there's a
.git directory. Distribute the new ChangeLog history files
instead of scattered ChangeLog files. Distribute the new files
gitlog-to-changelog and gitlog-to-emacslog.
Fixes: bug#19113
---
.gitignore | 1 +
CONTRIBUTE | 85 ++++++--
Makefile.in | 32 ++-
admin/admin.el | 6 +-
admin/authors.el | 5 +-
admin/make-tarball.txt | 19 +-
admin/merge-gnulib | 2 +-
admin/notes/repo | 54 +++--
build-aux/git-hooks/pre-commit | 18 +-
build-aux/gitlog-to-changelog | 445 +++++++++++++++++++++++++++++++++++++++++
build-aux/gitlog-to-emacslog | 69 +++++++
lib/gnulib.mk | 9 +-
lisp/calendar/icalendar.el | 2 +-
lisp/gnus/deuglify.el | 2 +-
lisp/obsolete/gulp.el | 2 +-
lwlib/README | 2 +-
m4/gnulib-comp.m4 | 2 +
make-dist | 38 ++--
18 files changed, 705 insertions(+), 88 deletions(-)
create mode 100755 build-aux/gitlog-to-changelog
create mode 100755 build-aux/gitlog-to-emacslog
diff --git a/.gitignore b/.gitignore
index 9810c1d..67d28653 100644
--- a/.gitignore
+++ b/.gitignore
@@ -237,6 +237,7 @@ info/dir
*~
.#*
\#*\#
+ChangeLog
[0-9]*.patch
# Built by 'make install'.
diff --git a/CONTRIBUTE b/CONTRIBUTE
index 5cf015f..8821f68 100644
--- a/CONTRIBUTE
+++ b/CONTRIBUTE
@@ -32,21 +32,32 @@ entry in their name, not yours. git distinguishes between the author
and the committer; use the --author option on the commit command to
specify the actual author; the committer defaults to you.
-** commit messages
+** Commit messages
-When using git, commit messages should use ChangeLog format, with the
-following modifications:
+Typically, a patch creates ChangeLog entries by putting them into its
+commit message, not by changing a ChangeLog file. Here is an example
+commit message (indented):
-- Add a single short line explaining the change, then an empty line,
- then unindented ChangeLog entries.
+ Deactivate shifted region
- You can use various Emacs functions to ease this process; see (info
- "(emacs)Change Log Commands") or
- http://www.gnu.org/software/emacs/manual/html_node/emacs/Change-Log-Commands.html.
+ Do not silently extend a region that is not highlighted;
+ this can happen after a shift.
+ * doc/emacs/mark.texi (Shift Selection): Document the change.
+ * lisp/window.el (handle-select-window):
+ * src/frame.c (Fhandle_switch_frame, Fselected_frame):
+ Deactivate the mark.
+ Fixes: bug#19003
+
+The general format is as follows.
-- The summary line is limited to 72 characters (enforced by a commit
- hook). If you have trouble making that a good summary, add a
- paragraph below it, before the individual file descriptions.
+- Commit messages contain a single short line summarizing the change,
+ then an empty line, then unindented ChangeLog entries.
+
+- Limit lines to 78 characters; this is enforced by a commit hook.
+ It's nicer to limit the summary line to 50 characters; this isn't
+ enforced. If the change can't be summarized so briefly, add a
+ paragraph below the blank line, before the individual file
+ descriptions.
- If only a single file is changed, the summary line can be the normal
file first line (starting with the asterisk). Then there is no
@@ -57,8 +68,6 @@ following modifications:
the rationale for a change; that can be done in the commit message
between the summary line and the file entries.
-** ChangeLog notes
-
- Emacs generally follows the GNU coding standards when it comes to
ChangeLogs:
http://www.gnu.org/prep/standards/html_node/Change-Logs.html . One
@@ -77,23 +86,28 @@ following modifications:
and have a reasonable chance of being read in the future, so it's
better that they have good presentation.
-- There are multiple ChangeLogs in the emacs source; roughly one per
- high-level directory. The ChangeLog entry for a commit belongs in the
- lowest ChangeLog that is higher than or at the same level as any file
- changed by the commit.
-
- Use the present tense; describe "what the change does", not "what
the change did".
- Preferred form for several entries with the same content:
- * help.el (view-lossage):
- * kmacro.el (kmacro-edit-lossage):
- * edmacro.el (edit-kbd-macro): Fix docstring, lossage is now 300 keys.
+ * lisp/help.el (view-lossage):
+ * lisp/kmacro.el (kmacro-edit-lossage):
+ * lisp/edmacro.el (edit-kbd-macro): Fix docstring, lossage is now 300 keys.
(Rather than anything involving "ditto" and suchlike.)
-- If the commit fixes a bug, add a separate line
+- If the commit has authors other than yourself, the commit message
+ should contain a separate line like the following:
+
+ Co-authored-by: Joe Schmoe <j.schmoe@example.org>
+
+- If the commit is a tiny change that is exempt from copyright paperwork,
+ the commit message should contain a separate line like the following:
+
+ Copyright-paperwork-exempt: yes
+
+- If the commit fixes a bug, append a separate line
Fixes: bug#NNNN
@@ -113,6 +127,29 @@ following modifications:
of files such as 'configure'. "There is no need" means you don't
have to, but you can if you want to.
+- If a commit message's first line starts with "; ", the message is
+ ignored when generating ChangeLog history files via 'make changelog'
+ or via 'make change-history'. You can use "; " for minor commits
+ that do not need separate ChangeLog entries.
+
+** Generating ChangeLog entries
+
+- You can use various Emacs functions to ease the process of writing
+ ChangeLog entries; see (info "(emacs)Change Log Commands") or
+ http://www.gnu.org/software/emacs/manual/html_node/emacs/Change-Log-Commands.html.
+
+- If you use Emacs VC, one way to format ChangeLog entries is to create
+ a top-level ChangeLog file, and update it with 'C-x 4 a' file as
+ usual. Do not register the ChangeLog file under git; instead, use
+ 'C-c C-a' to insert its contents into into your *vc-log* buffer.
+
+- Alternatively, you can use the vc-dwim command to maintain commit
+ messages. When you create a source directory, run the shell command
+ 'git-changelog-symlink-init' to create a symbolic link from
+ ChangeLog to .git/c/ChangeLog. Edit this ChangeLog via its symlink
+ with Emacs commands like 'C-x 4 a', and commit the change using the
+ shell command 'vc-dwim --commit'. Type 'vc-dwim --help' for more.
+
** branches
Development normally takes places on the trunk.
@@ -176,6 +213,10 @@ to the tracker at http://debbugs.gnu.org .
You can subscribe to the mailing lists, or see the list archives,
by following links from http://savannah.gnu.org/mail/?group=emacs .
+To email a patch you can use a shell command like 'git format-patch -1'
+to create a file, and then attach the file to your email. This nicely
+packages the patch's commit message and changes.
+
** Document your changes.
Any change that matters to end-users should have an entry in etc/NEWS.
diff --git a/Makefile.in b/Makefile.in
index 4cdd293..dccb88d 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -833,7 +833,7 @@ clean: $(clean_dirs:=_clean)
for dir in test/automated; do \
[ ! -d $$dir ] || $(MAKE) -C $$dir clean; \
done
- -rm -f etc/emacs.tmpdesktop etc/emacs.tmpappdata
+ -rm -f *.tmp etc/*.tmp*
-rm -rf info-dir.*
### `bootclean'
@@ -1087,6 +1087,36 @@ bootstrap: bootstrap-clean
$(MAKE) MAKEFILE_NAME=force-Makefile force-Makefile
$(MAKE) all
+# The newest revision that should not appear in the generated ChangeLog.
+gen_origin = 13eb26ad38378e0063e9c9313c3ba8af666629dc
+# Convert git commit log to ChangeLog file. make-dist uses this.
+.PHONY: ChangeLog change-history unchanged-history-files
+ChangeLog:
+ $(AM_V_GEN)distprefix=$(distprefix) srcprefix=$(srcdir)/ \
+ $(srcdir)/build-aux/gitlog-to-emacslog $(gen_origin)
+
+# Check that history-relevant files match what's in the repository.
+# Otherwise, 'make change-history' might mess up the ChangeLog history files.
+unchanged-history-files:
+ x=$$(git diff-files --name-only ChangeLog.1 Makefile.in) && \
+ test -z "$$x"
+
+# Copy newer commit messages to the start of the ChangeLog history file,
+# and consider them to be older.
+change-history: ChangeLog unchanged-history-files
+ (sed '/^Copyright/,$$d' <ChangeLog && cat ChangeLog.1) >ChangeLog.1.tmp
+ new_origin=$$(git log --pretty=format:%H HEAD^!) && \
+ sed 's/^\(gen_origin *= *\).*/\1'"$$new_origin/" \
+ <Makefile.in >Makefile.in.tmp
+ mv ChangeLog.1.tmp ChangeLog.1
+ mv Makefile.in.tmp Makefile.in
+ $(MAKE) $@-commit
+
+# If 'make change-history' fails because ChangeLog.1 contains invalid text,
+# fix ChangeLog.1 by hand and run 'make change-history-commit'.
+change-history-commit:
+ git commit -m'; make $@' ChangeLog.1 Makefile.in
+
.PHONY: check-declare
check-declare:
diff --git a/admin/admin.el b/admin/admin.el
index 9bf503e..f7b9155 100644
--- a/admin/admin.el
+++ b/admin/admin.el
@@ -28,10 +28,6 @@
(defvar add-log-time-format) ; in add-log
-;; Does this information need to be in every ChangeLog, as opposed to
-;; just the top-level one? Only if you allow changes the same
-;; day as the release.
-;; http://lists.gnu.org/archive/html/emacs-devel/2013-03/msg00161.html
(defun add-release-logs (root version &optional date)
"Add \"Version VERSION released.\" change log entries in ROOT.
Root must be the root of an Emacs source tree.
@@ -601,7 +597,7 @@ style=\"text-align:left\">")
(copy-file "../doc/misc/texinfo.tex" stem)
(or (equal type "emacs") (copy-file "../doc/emacs/emacsver.texi" stem))
(dolist (file (directory-files (format "../doc/%s" type) t))
- (if (or (string-match-p "\\(\\.texi\\'\\|/ChangeLog\\|/README\\'\\)" file)
+ (if (or (string-match-p "\\(\\.texi\\'\\|/README\\'\\)" file)
(and (equal type "lispintro")
(string-match-p "\\.\\(eps\\|pdf\\)\\'" file)))
(copy-file file stem)))
diff --git a/admin/authors.el b/admin/authors.el
index d214ff2..8716785 100644
--- a/admin/authors.el
+++ b/admin/authors.el
@@ -27,6 +27,9 @@
;; Use M-x authors RET to create an *Authors* buffer that can used as
;; or merged with Emacs's AUTHORS file.
+;; FIXME: This needs to modernized in the light of current practice,
+;; which generates a single top-level ChangeLog file from commit logs.
+
;;; Code:
(defvar authors-coding-system 'utf-8
@@ -76,7 +79,7 @@ files.")
("Gerd Möllmann" "Gerd Moellmann")
("Hallvard B. Furuseth" "Hallvard B Furuseth" "Hallvard Furuseth")
("Hrvoje Nikšić" "Hrvoje Niksic")
- ;; lisp/org/ChangeLog 2010-11-11.
+ ;; lisp/org/ChangeLog.1 2010-11-11.
(nil "aaa bbb")
(nil "Code Extracted") ; lisp/newcomment.el's "Author:" header
("Jaeyoun Chung" "Jae-youn Chung" "Jae-you Chung" "Chung Jae-youn")
diff --git a/admin/make-tarball.txt b/admin/make-tarball.txt
index 8f8b031..2fe3b69 100644
--- a/admin/make-tarball.txt
+++ b/admin/make-tarball.txt
@@ -31,28 +31,30 @@ General steps (for each step, check for possible errors):
M-x authors RET
If there is an "*Authors Errors*" buffer, address the issues.
- If there was a ChangeLog typo, fix it. If a file was deleted or
- renamed, consider adding an appropriate entry to authors-ignored-files,
+ If there was a ChangeLog typo, run "make change-history" and then
+ fix ChangeLog.1. If a file was deleted or renamed, consider
+ adding an appropriate entry to authors-ignored-files,
authors-valid-file-names, or authors-renamed-files-alist.
If necessary, repeat M-x authors after making those changes.
Save the "*Authors*" buffer as etc/AUTHORS.
Check the diff looks reasonable. Maybe add entries to
authors-ambiguous-files or authors-aliases, and repeat.
- Commit any fixes to ChangeLogs or authors.el.
+ Commit any fixes to authors.el.
3. Set the version number (M-x load-file RET admin/admin.el RET, then
M-x set-version RET). For a release, add released ChangeLog
- entries (M-x add-release-logs RET).
+ entries (create a ChangeLog symlink a la vc-dwim, then run M-x
+ add-release-logs RET, then run the shell command 'vc-dwim --commit').
For a pretest, start at version .90. After .99, use .990 (so that
it sorts).
The final pretest should be a release candidate. Set the version
number to that of the actual release. Pick a date about a week
- from now when you intend to make the release. Use M-x add-release-logs
- to add the ChangeLog entries for that date to the tar file (but
- not yet to the repository). Name the tar file as
+ from now when you intend to make the release. Use vc-dwim and
+ M-x add-release-logs as described above to add the ChangeLog
+ entries for that date to the tar file. Name the tar file as
emacs-XX.Y-rc1.tar. If all goes well in the following week, you
can simply rename the file and use it for the actual release.
@@ -65,8 +67,7 @@ General steps (for each step, check for possible errors):
5. Copy lisp/loaddefs.el to lisp/ldefs-boot.el.
Commit etc/AUTHORS, lisp/ldefs-boot.el, and the files changed
- by M-x set-version. For a release, also commit the ChangeLog
- files in all directories.
+ by M-x set-version.
If someone else made a commit between step 1 and now,
you need to repeat from step 4 onwards. (You can commit the files
diff --git a/admin/merge-gnulib b/admin/merge-gnulib
index 9e2b10d..e63422b 100755
--- a/admin/merge-gnulib
+++ b/admin/merge-gnulib
@@ -31,7 +31,7 @@ GNULIB_MODULES='
crypto/md5 crypto/sha1 crypto/sha256 crypto/sha512
dtoastr dtotimespec dup2 environ execinfo faccessat
fcntl fcntl-h fdatasync fdopendir filemode fstatat fsync
- getloadavg getopt-gnu gettime gettimeofday
+ getloadavg getopt-gnu gettime gettimeofday gitlog-to-changelog
intprops largefile lstat
manywarnings memrchr mkostemp mktime
pipe2 pselect pthread_sigmask putenv qacl readlink readlinkat
diff --git a/admin/notes/repo b/admin/notes/repo
index 4f9dc59..e549e25 100644
--- a/admin/notes/repo
+++ b/admin/notes/repo
@@ -10,10 +10,10 @@ instructions.
* Install changes only on one branch, let them get merged elsewhere if needed.
In particular, install bug-fixes only on the release branch (if there
-is one) and let them get synced to the trunk; do not install them by
-hand on the trunk as well. E.g. if there is an active "emacs-24" branch
+is one) and let them get synced to the master; do not install them by
+hand on the master as well. E.g. if there is an active "emacs-24" branch
and you have a bug-fix appropriate for the next emacs-24.x release,
-install it only on the emacs-24 branch, not on the trunk as well.
+install it only on the emacs-24 branch, not on the master as well.
Installing things manually into more than one branch makes merges more
difficult.
@@ -21,10 +21,10 @@ difficult.
http://lists.gnu.org/archive/html/emacs-devel/2010-03/msg01124.html
The exception is, if you know that the change will be difficult to
-merge to the trunk (eg because the trunk code has changed a lot).
-In that case, it's helpful if you can apply the change to both trunk
+merge to the master (eg because the master code has changed a lot).
+In that case, it's helpful if you can apply the change to both master
and branch yourself (when committing the branch change, indicate
-in the commit log that it should not be merged to the trunk, by
+in the commit log that it should not be merged to the master, by
including the phrase "Not to be merged to master", or any other phrase
that matches "merge").
@@ -32,14 +32,14 @@ that matches "merge").
If your branch has only a single commit, or many different real
commits, it is fine to do a merge. If your branch has only a very
-small number of "real" commits, but several "merge from trunks", it is
-preferred that you take your branch's diff, apply it to the trunk, and
+small number of "real" commits, but several "merge from masters", it is
+preferred that you take your branch's diff, apply it to the master, and
commit directly, not merge. This keeps the history cleaner.
In general, when working on some feature in a separate branch, it is
-preferable not to merge from trunk until you are done with the
+preferable not to merge from master until you are done with the
feature. Unless you really need some change that was done on the
-trunk while you were developing on the branch, you don't really need
+master while you were developing on the branch, you don't really need
those merges; just merge once, when you are done with the feature, and
Bazaar will take care of the rest. Bazaar is much better in this than
CVS, so interim merges are unnecessary.
@@ -66,22 +66,14 @@ variable in admin/merge-gnulib before running it.
If you remove a gnulib module, or if a gnulib module
removes a file, then remove the corresponding files by hand.
-* How to merge changes from emacs-24 to trunk
+* How to merge changes from emacs-24 to master
-[The section on git merge procedure has not yet been written]
-
-Inspect the change log entries (e.g. in case too many entries have been
-included or whitespace between entries needs fixing). If someone made
-multiple change log entries on different days in the branch, you may
-wish to collapse them all to a single entry for that author in the
-trunk (because in the trunk they all appear under the same date).
-Obviously, if there are multiple changes to the same file by different
-authors, don't break the logical ordering in doing this.
+[The section on git merge procedure has not yet been written.]
You may see conflicts in autoload md5sums in comments. Strictly
speaking, the right thing to do is merge everything else, resolve the
-conflict by choosing either the trunk or branch version, then run
-`make -C lisp autoloads' to update the md5sums to the correct trunk
+conflict by choosing either the master or branch version, then run
+`make -C lisp autoloads' to update the md5sums to the correct master
value before committing.
* Re-adding a file that has been removed from the repository
@@ -124,3 +116,21 @@ again.
This is a semi-automated way to find the revision that introduced a bug.
Browse `git help bisect' for technical instructions.
+
+* Maintaining ChangeLog history
+
+Older ChangeLog entries are kept in history files named ChangeLog.1,
+ChangeLog.2, etc., and can be edited just as any other source files
+can. Newer ChangeLog entries are stored in the repository as commit
+messages, which cannot be edited directly.
+
+'make ChangeLog' copies newer ChangeLog entries into a file
+'ChangeLog' that is intended to be put into the distribution tarball.
+This ChangeLog file is not put into the repository.
+
+'make change-history' copies all newer ChangeLog entries into the
+start of the history file 'ChangeLog.1'. These ChangeLog entries are
+thereafter considered to be old, so later uses of 'make ChangeLog'
+and/or 'make change-history' will no longer copy the entries. To
+alter ChangeLog history, run 'make change-history', then edit
+'ChangeLog.1' manually and commit your changes.
diff --git a/build-aux/git-hooks/pre-commit b/build-aux/git-hooks/pre-commit
index d050c40..8bce1f5 100755
--- a/build-aux/git-hooks/pre-commit
+++ b/build-aux/git-hooks/pre-commit
@@ -34,13 +34,15 @@ if test "$nbadchars" -ne 0; then
exit 1
fi
-new_names=`$git_diff HEAD` || exit
-case "
-$new_names" in
- */-* | *'
-'-*)
- echo "File name component begins with '-'."
- exit 1;;
-esac
+for new_name in `$git_diff HEAD`; do
+ case $new_name in
+ -* | */-*)
+ echo "$new_name: File name component begins with '-'."
+ exit 1;;
+ ChangeLog | */ChangeLog)
+ echo "$new_name: Please use git commit messages, not ChangeLog files."
+ exit 1;;
+ esac
+done
exec git diff-index --check --cached HEAD --
diff --git a/build-aux/gitlog-to-changelog b/build-aux/gitlog-to-changelog
new file mode 100755
index 0000000..4fa4f29
--- /dev/null
+++ b/build-aux/gitlog-to-changelog
@@ -0,0 +1,445 @@
+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 = '2015-03-21 01:01'; # 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-2015 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.
+ --no-cluster never cluster commit messages under the same date/author
+ header; the default is to cluster adjacent commit messages
+ if their headers are the same and neither commit message
+ contains multiple paragraphs.
+ --srcdir=DIR the root of the source tree, from which the .git/
+ directory can be derived.
+ --since=DATE convert only the logs since DATE;
+ the default is to convert all log entries.
+ --until=DATE convert only the logs older than DATE.
+ --ignore-matching=PAT ignore commit messages whose first lines match PAT.
+ --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'
+ --strip-tab remove one additional leading TAB from commit message lines.
+ --strip-cherry-pick remove data inserted by "git cherry-pick";
+ this includes the "cherry picked from commit ..." line,
+ and the possible final "Conflicts:" paragraph.
+ --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
+
+SPECIAL SYNTAX:
+
+The following types of strings are interpreted specially when they appear
+at the beginning of a log message line. They are not copied to the output.
+
+ Copyright-paperwork-exempt: Yes
+ Append the "(tiny change)" notation to the usual "date name email"
+ ChangeLog header to mark a change that does not require a copyright
+ assignment.
+ Co-authored-by: Joe User <user\@example.com>
+ List the specified name and email address on a second
+ ChangeLog header, denoting a co-author.
+ Signed-off-by: Joe User <user\@example.com>
+ These lines are simply elided.
+
+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;
+}
+
+# git_dir_option $SRCDIR
+#
+# From $SRCDIR, the --git-dir option to pass to git (none if $SRCDIR
+# is undef). Return as a list (0 or 1 element).
+sub git_dir_option($)
+{
+ my ($srcdir) = @_;
+ my @res = ();
+ if (defined $srcdir)
+ {
+ my $qdir = shell_quote $srcdir;
+ my $cmd = "cd $qdir && git rev-parse --show-toplevel";
+ my $qcmd = shell_quote $cmd;
+ my $git_dir = qx($cmd);
+ defined $git_dir
+ or die "$ME: cannot run $qcmd: $!\n";
+ $? == 0
+ or die "$ME: $qcmd had unexpected exit code or signal ($?)\n";
+ chomp $git_dir;
+ push @res, "--git-dir=$git_dir/.git";
+ }
+ @res;
+}
+
+{
+ my $since_date;
+ my $until_date;
+ my $format_string = '%s%n%b%n';
+ my $amend_file;
+ my $append_dot = 0;
+ my $cluster = 1;
+ my $ignore_matching;
+ my $strip_tab = 0;
+ my $strip_cherry_pick = 0;
+ my $srcdir;
+ GetOptions
+ (
+ help => sub { usage 0 },
+ version => sub { print "$ME version $VERSION\n"; exit },
+ 'since=s' => \$since_date,
+ 'until=s' => \$until_date,
+ 'format=s' => \$format_string,
+ 'amend=s' => \$amend_file,
+ 'append-dot' => \$append_dot,
+ 'cluster!' => \$cluster,
+ 'ignore-matching=s' => \$ignore_matching,
+ 'strip-tab' => \$strip_tab,
+ 'strip-cherry-pick' => \$strip_cherry_pick,
+ 'srcdir=s' => \$srcdir,
+ ) or usage 1;
+
+ defined $since_date
+ and unshift @ARGV, "--since=$since_date";
+ defined $until_date
+ and unshift @ARGV, "--until=$until_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 = ('git',
+ git_dir_option $srcdir,
+ qw(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 = $_;
+ }
+
+ # Remove lines inserted by "git cherry-pick".
+ if ($strip_cherry_pick)
+ {
+ $rest =~ s/^\s*Conflicts:\n.*//sm;
+ $rest =~ s/^\s*\(cherry picked from commit [\da-f]+\)\n//m;
+ }
+
+ my @line = split /\s*\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";
+
+ # Format 'Copyright-paperwork-exempt: Yes' as a standard ChangeLog
+ # `(tiny change)' annotation.
+ my $tiny = (grep (/^Copyright-paperwork-exempt:\s+[Yy]es$/, @line)
+ ? ' (tiny change)' : '');
+
+ my $date_line = sprintf "%s %s$tiny\n",
+ strftime ("%F", localtime ($1)), $2;
+
+ my @coauthors = grep /^Co-authored-by:.*$/, @line;
+ # Omit meta-data lines we've already interpreted.
+ @line = grep !/^(?:Signed-off-by:[ ].*>$
+ |Co-authored-by:[ ]
+ |Copyright-paperwork-exempt:[ ]
+ )/x, @line;
+
+ # Remove leading and trailing blank lines.
+ if (@line)
+ {
+ while ($line[0] =~ /^\s*$/) { shift @line; }
+ while ($line[$#line] =~ /^\s*$/) { pop @line; }
+ }
+
+ # Ignore commits that match the --ignore-matching pattern, if specified.
+ if (! (defined $ignore_matching
+ && @line && $line[0] =~ /$ignore_matching/))
+ {
+ # 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 clustering of commit messages has been disabled, if this header
+ # would be different from the previous date/name/etc. header,
+ # or if this or the previous entry consists of two or more paragraphs,
+ # then print the header.
+ if ( ! $cluster
+ || $date_line ne $prev_date_line
+ || "@coauthors" ne "@prev_coauthors"
+ || $multi_paragraph
+ || $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] .= '.';
+ }
+ }
+
+ # Remove one additional leading TAB from each line.
+ $strip_tab
+ and map { s/^\t// } @line;
+
+ # 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/build-aux/gitlog-to-emacslog b/build-aux/gitlog-to-emacslog
new file mode 100755
index 0000000..553607a
--- /dev/null
+++ b/build-aux/gitlog-to-emacslog
@@ -0,0 +1,69 @@
+#!/bin/sh
+
+# Convert git log output to ChangeLog format for GNU Emacs.
+
+# Copyright (C) 2014-2015 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 Paul Eggert
+
+LC_ALL=C
+export LC_ALL
+
+gen_origin=${1?}
+
+# If this is not a Git repository, just generate an empty ChangeLog.
+test -d ${srcprefix}.git || {
+ # Remove any old ChangeLog, in case it is a vc-dwim symlink.
+ rm -f "${distprefix}ChangeLog" || exit
+ >"${distprefix}ChangeLog"
+ exit
+}
+
+# Use Gnulib's packaged ChangeLog generator.
+${srcprefix}build-aux/gitlog-to-changelog --ignore-matching='^; ' \
+ "$gen_origin.." >"${distprefix}ChangeLog.tmp" || exit
+
+if test -s "${distprefix}ChangeLog.tmp"; then
+
+ # Find the years covered by the generated ChangeLog, so that
+ # a proper copyright notice can be output.
+ years=`
+ sed -n 's/^\([0-9][0-9]*\).*/\1/p' "${distprefix}ChangeLog.tmp" |
+ sort -nu
+ `
+ start_year=
+ end_year=
+ for year in $years; do
+ : ${start_year:=$year}
+ end_year=$year
+ done
+
+ if test "$start_year" = "$end_year"; then
+ year_range=$start_year
+ else
+ year_range=$start_year-$end_year
+ fi
+
+ # Append a proper copyright notice.
+ sed "1d
+ s/\\(Copyright[ (C)]*\\)[0-9]*-[0-9]*/\\1$year_range/
+ s/^# //
+ /http:/q
+ " <Makefile.in >>"${distprefix}ChangeLog.tmp" || exit
+fi
+
+# Install the generated ChangeLog.
+mv -f "${distprefix}ChangeLog.tmp" "${distprefix}ChangeLog"
diff --git a/lib/gnulib.mk b/lib/gnulib.mk
index 7703cbf..273b018 100644
--- a/lib/gnulib.mk
+++ b/lib/gnulib.mk
@@ -21,7 +21,7 @@
# the same distribution terms as the rest of that program.
#
# Generated by gnulib-tool.
-# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --avoid=close --avoid=dup --avoid=fchdir --avoid=fstat --avoid=malloc-posix --avoid=msvc-inval --avoid=msvc-nothrow --avoid=open --avoid=openat-die --avoid=opendir --avoid=raise --avoid=save-cwd --avoid=select --avoid=sigprocmask --avoid=stdarg --avoid=stdbool --avoid=threadlib --makefile-name=gnulib.mk --conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca-opt binary-io byteswap c-ctype c-strcase careadlinkat close-stream count-one-bits count-trailing-zeros crypto/md5 crypto/sha1 crypto/sha256 crypto/sha512 dtoastr dtotimespec dup2 environ execinfo faccessat fcntl fcntl-h fdatasync fdopendir filemode fstatat fsync getloadavg getopt-gnu gettime gettimeofday intprops largefile lstat manywarnings memrchr mkostemp mktime pipe2 pselect pthread_sigmask putenv qacl readlink readlinkat sig2str socklen stat-time stdalign stddef stdio stpcpy strftime strtoimax strtoumax symlink sys_stat sys_time time time_r timer-time timespec-add timespec-sub unsetenv update-copyright utimens vla warnings
+# Reproduce by: gnulib-tool --import --dir=. --lib=libgnu --source-base=lib --m4-base=m4 --doc-base=doc --tests-base=tests --aux-dir=build-aux --avoid=close --avoid=dup --avoid=fchdir --avoid=fstat --avoid=malloc-posix --avoid=msvc-inval --avoid=msvc-nothrow --avoid=open --avoid=openat-die --avoid=opendir --avoid=raise --avoid=save-cwd --avoid=select --avoid=sigprocmask --avoid=stdarg --avoid=stdbool --avoid=threadlib --makefile-name=gnulib.mk --conditional-dependencies --no-libtool --macro-prefix=gl --no-vc-files alloca-opt binary-io byteswap c-ctype c-strcase careadlinkat close-stream count-one-bits count-trailing-zeros crypto/md5 crypto/sha1 crypto/sha256 crypto/sha512 dtoastr dtotimespec dup2 environ execinfo faccessat fcntl fcntl-h fdatasync fdopendir filemode fstatat fsync getloadavg getopt-gnu gettime gettimeofday gitlog-to-changelog intprops largefile lstat manywarnings memrchr mkostemp mktime pipe2 pselect pthread_sigmask putenv qacl readlink readlinkat sig2str socklen stat-time stdalign stddef stdio stpcpy strftime strtoimax strtoumax symlink sys_stat sys_time time time_r timer-time timespec-add timespec-sub unsetenv update-copyright utimens vla warnings
MOSTLYCLEANFILES += core *.stackdump
@@ -539,6 +539,13 @@ EXTRA_libgnu_a_SOURCES += gettimeofday.c
## end gnulib module gettimeofday
+## begin gnulib module gitlog-to-changelog
+
+
+EXTRA_DIST += $(top_srcdir)/build-aux/gitlog-to-changelog
+
+## end gnulib module gitlog-to-changelog
+
## begin gnulib module group-member
if gl_GNULIB_ENABLED_a9786850e999ae65a836a6041e8e5ed1
diff --git a/lisp/calendar/icalendar.el b/lisp/calendar/icalendar.el
index 452a672..da5d85e 100644
--- a/lisp/calendar/icalendar.el
+++ b/lisp/calendar/icalendar.el
@@ -39,7 +39,7 @@
;;; History:
-;; 0.07 onwards: see lisp/ChangeLog
+;; 0.07 onwards: see commit logs and ../ChangeLog*.
;; 0.06: (2004-10-06)
;; - Bugfixes regarding icalendar-import-format-*.
diff --git a/lisp/gnus/deuglify.el b/lisp/gnus/deuglify.el
index 00d1ee9..331b99b 100644
--- a/lisp/gnus/deuglify.el
+++ b/lisp/gnus/deuglify.el
@@ -188,7 +188,7 @@
;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;
-;; See ChangeLog for other changes.
+;; See commit log for other changes.
;;
;; Revision 1.5 2002/01/27 14:39:17 rscholz
;; * New variable `gnus-outlook-deuglify-no-wrap-chars' to inhibit
diff --git a/lisp/obsolete/gulp.el b/lisp/obsolete/gulp.el
index 5ff99f2..f0223fa 100644
--- a/lisp/obsolete/gulp.el
+++ b/lisp/obsolete/gulp.el
@@ -70,7 +70,7 @@ please send them to me ASAP.
Please don't send the whole file. Instead, please send a patch made with
`diff -c' that shows precisely the changes you would like me to install.
Also please include itemized change log entries for your changes;
-please use lisp/ChangeLog as a guide for the style and for what kinds
+please use lisp/ChangeLog* as a guide for the style and for what kinds
of information to include.
Thanks.")
diff --git a/lwlib/README b/lwlib/README
index 25c72eb..ed7583d 100644
--- a/lwlib/README
+++ b/lwlib/README
@@ -4,4 +4,4 @@ library was written by Lucid, Inc and released under the terms of the
GPL version 1 (or later). It is not considered part of GNU Emacs.
This version of the library differs from the original as described in
-the ChangeLog file.
+the ChangeLog.1 file.
diff --git a/m4/gnulib-comp.m4 b/m4/gnulib-comp.m4
index 949dd0e..f32a4dd 100644
--- a/m4/gnulib-comp.m4
+++ b/m4/gnulib-comp.m4
@@ -85,6 +85,7 @@ AC_DEFUN([gl_EARLY],
# Code from module gettext-h:
# Code from module gettime:
# Code from module gettimeofday:
+ # Code from module gitlog-to-changelog:
# Code from module group-member:
# Code from module include_next:
# Code from module intprops:
@@ -810,6 +811,7 @@ AC_DEFUN([gltests_LIBSOURCES], [
# This macro records the list of files which have been installed by
# gnulib-tool and may be removed by future gnulib-tool invocations.
AC_DEFUN([gl_FILE_LIST], [
+ build-aux/gitlog-to-changelog
build-aux/snippet/_Noreturn.h
build-aux/snippet/arg-nonnull.h
build-aux/snippet/c++defs.h
diff --git a/make-dist b/make-dist
index 4e05594..1c7ce59 100755
--- a/make-dist
+++ b/make-dist
@@ -277,13 +277,20 @@ fi
echo "Creating top directory: \`${tempdir}'"
mkdir ${tempdir}
+if test -d .git; then
+ echo "Making top-level ChangeLog"
+ make distprefix=${tempdir}/ ChangeLog
+else
+ echo "No repository, so omitting top-level ChangeLog"
+fi
+
### We copy in the top-level files before creating the subdirectories in
### hopes that this will make the top-level files appear first in the
### tar file; this means that people can start reading the INSTALL and
### README while the rest of the tar file is still unpacking. Whoopee.
echo "Making links to top-level files"
ln INSTALL README BUGS ${tempdir}
-ln ChangeLog Makefile.in autogen.sh configure configure.ac ${tempdir}
+ln ChangeLog.*[0-9] Makefile.in autogen.sh configure configure.ac ${tempdir}
ln config.bat make-dist .dir-locals.el ${tempdir}
ln aclocal.m4 ${tempdir}
@@ -333,7 +340,7 @@ done
echo "Making links to \`leim' and its subdirectories"
(cd leim
ln makefile.w32-in ../${tempdir}/leim
- ln ChangeLog README ../${tempdir}/leim
+ ln ChangeLog.*[0-9] README ../${tempdir}/leim
ln CXTERM-DIC/README CXTERM-DIC/*.tit ../${tempdir}/leim/CXTERM-DIC
ln SKK-DIC/README SKK-DIC/SKK-JISYO.L ../${tempdir}/leim/SKK-DIC
ln MISC-DIC/README MISC-DIC/*.* ../${tempdir}/leim/MISC-DIC
@@ -344,6 +351,7 @@ echo "Making links to \`leim' and its subdirectories"
echo "Making links to \`build-aux'"
(cd build-aux
ln compile config.guess config.sub depcomp msys-to-w32 ../${tempdir}/build-aux
+ ln gitlog-to-changelog gitlog-to-emacslog ../${tempdir}/build-aux
ln install-sh missing move-if-change ../${tempdir}/build-aux
ln update-copyright update-subdirs ../${tempdir}/build-aux
ln dir_top make-info-dir ../${tempdir}/build-aux)
@@ -360,7 +368,7 @@ echo "Making links to \`src'"
ln [a-zA-Z]*.[chm] ../${tempdir}/src
ln [a-zA-Z]*.in ../${tempdir}/src
ln [a-zA-Z]*.mk ../${tempdir}/src
- ln README ChangeLog ChangeLog.*[0-9] ../${tempdir}/src
+ ln README ChangeLog.*[0-9] ../${tempdir}/src
ln makefile.w32-in ../${tempdir}/src
ln .gdbinit .dbxinit ../${tempdir}/src
cd ../${tempdir}/src
@@ -382,7 +390,7 @@ echo "Making links to \`lib'"
echo "Making links to \`lib-src'"
(cd lib-src
ln [a-zA-Z]*.[ch] ../${tempdir}/lib-src
- ln ChangeLog Makefile.in README ../${tempdir}/lib-src
+ ln ChangeLog.*[0-9] Makefile.in README ../${tempdir}/lib-src
ln rcs2log ../${tempdir}/lib-src
ln makefile.w32-in ../${tempdir}/lib-src
ln update-game-score.exe.manifest ../${tempdir}/lib-src)
@@ -398,7 +406,7 @@ echo "Making links to \`nt'"
ln nmake.defs gmake.defs subdirs.el [a-z]*.bat [a-z]*.[ch] ../${tempdir}/nt
ln *.in gnulib.mk ../${tempdir}/nt
ln mingw-cfg.site epaths.nt INSTALL.OLD ../${tempdir}/nt
- ln ChangeLog INSTALL README README.W32 makefile.w32-in ../${tempdir}/nt)
+ ln ChangeLog.*[0-9] INSTALL README README.W32 makefile.w32-in ../${tempdir}/nt)
echo "Making links to \`nt/inc' and its subdirectories"
for f in `find nt/inc -type f -name '[a-z]*.h'`; do
@@ -412,13 +420,13 @@ echo "Making links to \`nt/icons'"
echo "Making links to \`msdos'"
(cd msdos
- ln ChangeLog INSTALL README emacs.ico emacs.pif ../${tempdir}/msdos
+ ln ChangeLog.*[0-9] INSTALL README emacs.ico emacs.pif ../${tempdir}/msdos
ln depfiles.bat inttypes.h ../${tempdir}/msdos
ln mainmake.v2 sed*.inp ../${tempdir}/msdos)
echo "Making links to \`nextstep'"
(cd nextstep
- ln ChangeLog README INSTALL Makefile.in ../${tempdir}/nextstep)
+ ln ChangeLog.*[0-9] README INSTALL Makefile.in ../${tempdir}/nextstep)
echo "Making links to \`nextstep/templates'"
(cd nextstep/templates
@@ -439,12 +447,12 @@ echo "Making links to \`nextstep/GNUstep/Emacs.base/Resources'"
echo "Making links to \`oldXMenu'"
(cd oldXMenu
ln *.[ch] *.in *.mk ../${tempdir}/oldXMenu
- ln README ChangeLog ../${tempdir}/oldXMenu)
+ ln README ChangeLog.*[0-9] ../${tempdir}/oldXMenu)
echo "Making links to \`lwlib'"
(cd lwlib
ln *.[ch] *.in *.mk ../${tempdir}/lwlib
- ln README ChangeLog ../${tempdir}/lwlib)
+ ln README ChangeLog.*[0-9] ../${tempdir}/lwlib)
## It is important to distribute admin/ because it contains sources
## for generated lisp/international/uni-*.el files.
@@ -484,27 +492,29 @@ ln `find info -type f -print` ${tempdir}/info
echo "Making links to \`doc/emacs'"
(cd doc/emacs
- ln *.texi *.in makefile.w32-in ChangeLog* ../../${tempdir}/doc/emacs)
+ ln *.texi *.in makefile.w32-in ChangeLog.*[0-9] ../../${tempdir}/doc/emacs)
echo "Making links to \`doc/misc'"
(cd doc/misc
- ln *.texi *.tex *.in makefile.w32-in gnus-news.el ChangeLog* ../../${tempdir}/doc/misc)
+ ln *.texi *.tex *.in makefile.w32-in gnus-news.el ChangeLog.*[0-9] \
+ ../../${tempdir}/doc/misc)
echo "Making links to \`doc/lispref'"
(cd doc/lispref
- ln *.texi *.in makefile.w32-in README ChangeLog* ../../${tempdir}/doc/lispref
+ ln *.texi *.in makefile.w32-in README ChangeLog.*[0-9] \
+ ../../${tempdir}/doc/lispref
ln spellfile ../../${tempdir}/doc/lispref
ln two-volume.make two-volume-cross-refs.txt ../../${tempdir}/doc/lispref)
echo "Making links to \`doc/lispintro'"
(cd doc/lispintro
ln *.texi *.in makefile.w32-in *.eps *.pdf ../../${tempdir}/doc/lispintro
- ln README ChangeLog* ../../${tempdir}/doc/lispintro
+ ln README ChangeLog.*[0-9] ../../${tempdir}/doc/lispintro
cd ../../${tempdir}/doc/lispintro)
echo "Making links to \`doc/man'"
(cd doc/man
- ln ChangeLog* *.1 *.in ../../${tempdir}/doc/man
+ ln *.*[0-9] *.in ../../${tempdir}/doc/man
cd ../../${tempdir}/doc/man
rm -f emacs.1)
--
2.1.0
^ permalink raw reply related [flat|nested] 43+ messages in thread