Generate 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.
(CHANGELOG_HISTORY_INDEX_MAX, CHANGELOG_N, gen_origin): New vars.
(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
xwidget_mvp
Paul Eggert 2015-04-07 00:00:55 -07:00
parent dd1404cca3
commit 2346856168
18 changed files with 717 additions and 89 deletions

1
.gitignore vendored
View File

@ -237,6 +237,7 @@ info/dir
*~
.#*
\#*\#
ChangeLog
[0-9]*.patch
# Built by 'make install'.

View File

@ -32,22 +32,33 @@ 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):
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
The general format is as follows.
- Start with a single unindented summary line explaining the change,
then an empty line, then unindented ChangeLog entries.
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.
- Limit lines in commit messages to 78 characters, unless they consist
of a single word of at most 140 characters. If you have trouble
fitting the summary into 78 characters, add a summarizing paragraph
below the empty line and before the individual file descriptions.
of a single word of at most 140 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 after the empty line and 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
@ -63,8 +74,6 @@ following modifications:
- Commit messages should not contain the "Signed-off-by:" lines that
are used in some other projects.
** 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
@ -83,25 +92,30 @@ 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.
(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:
Fixes: bug#NNNN
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
where NNNN is the bug number.
@ -119,6 +133,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.
@ -182,6 +219,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.

View File

@ -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,44 @@ 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 = 9d56a21e6a696ad19ac65c4b405aeca44785884a
# 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)
# The ChangeLog history files are called ChangeLog.1, ChangeLog.2, ...,
# ChangeLog.$(CHANGELOG_HISTORY_INDEX_MAX). $(CHANGELOG_N) stands for
# the newest (highest-numbered) ChangeLog history file.
CHANGELOG_HISTORY_INDEX_MAX = 1
CHANGELOG_N = ChangeLog.$(CHANGELOG_HISTORY_INDEX_MAX)
# 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_N) 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_N)) \
>$(CHANGELOG_N).tmp
new_origin=$$(git log --pretty=format:%H HEAD^!) && \
sed 's/^\(gen_origin *= *\).*/\1'"$$new_origin/" \
<Makefile.in >Makefile.in.tmp
mv $(CHANGELOG_N).tmp $(CHANGELOG_N)
mv Makefile.in.tmp Makefile.in
$(MAKE) $@-commit
# If 'make change-history' fails because the newest ChangeLog history
# file contains invalid text, fix the file by hand and then run
# 'make change-history-commit'.
change-history-commit:
git commit -m'; make $@' $(CHANGELOG_N) Makefile.in
.PHONY: check-declare
check-declare:

View File

@ -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)))

View File

@ -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")

View File

@ -31,28 +31,33 @@ 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,
authors-valid-file-names, or authors-renamed-files-alist.
If there was a ChangeLog typo, run "make change-history" and then
fix the newest ChangeLog history file. 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
do not commit the entries to the repository until the actual release).
from now when you intend to make the release. Use vc-dwim and
M-x add-release-logs as described above to add commit messages
that will appear in the tarball's automatically-generated ChangeLog
file as entries for that date.
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. If you need another release candidate, remember
@ -67,8 +72,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

View File

@ -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

View File

@ -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 newest ChangeLog history file. 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
the ChangeLog history files manually and commit your changes.

View File

@ -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 --

445
build-aux/gitlog-to-changelog Executable file
View File

@ -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:

69
build-aux/gitlog-to-emacslog Executable file
View File

@ -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"

View File

@ -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

View File

@ -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-*.

View File

@ -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

View File

@ -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.")

View File

@ -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.

View File

@ -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

View File

@ -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)