mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2024-11-24 07:20:37 +00:00
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
This commit is contained in:
parent
dd1404cca3
commit
2346856168
1
.gitignore
vendored
1
.gitignore
vendored
@ -237,6 +237,7 @@ info/dir
|
||||
*~
|
||||
.#*
|
||||
\#*\#
|
||||
ChangeLog
|
||||
[0-9]*.patch
|
||||
|
||||
# Built by 'make install'.
|
||||
|
85
CONTRIBUTE
85
CONTRIBUTE
@ -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.
|
||||
|
40
Makefile.in
40
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,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:
|
||||
|
@ -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)))
|
||||
|
@ -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")
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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.
|
||||
|
@ -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
445
build-aux/gitlog-to-changelog
Executable 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
69
build-aux/gitlog-to-emacslog
Executable 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"
|
@ -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
|
||||
|
@ -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-*.
|
||||
|
@ -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
|
||||
|
@ -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.")
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
|
38
make-dist
38
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)
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user