From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Paul Eggert Newsgroups: gmane.emacs.bugs Subject: bug#19113: Generate a ChangeLog file from commit logs Date: Tue, 25 Nov 2014 21:38:28 -0800 Organization: UCLA Computer Science Department Message-ID: <54756754.5090103@cs.ucla.edu> References: <546D2E75.6090701@cs.ucla.edu> <837fyp7tvi.fsf@gnu.org> <546E2899.4050702@cs.ucla.edu> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------030405010302090401070900" X-Trace: ger.gmane.org 1416980366 7130 80.91.229.3 (26 Nov 2014 05:39:26 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Wed, 26 Nov 2014 05:39:26 +0000 (UTC) Cc: 19113@debbugs.gnu.org To: Eli Zaretskii Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Wed Nov 26 06:39:21 2014 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1XtVJw-0007Dt-UG for geb-bug-gnu-emacs@m.gmane.org; Wed, 26 Nov 2014 06:39:21 +0100 Original-Received: from localhost ([::1]:60537 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XtVJu-00034r-2j for geb-bug-gnu-emacs@m.gmane.org; Wed, 26 Nov 2014 00:39:18 -0500 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:53774) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XtVJj-0002sh-BX for bug-gnu-emacs@gnu.org; Wed, 26 Nov 2014 00:39:11 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XtVJe-0004C1-VH for bug-gnu-emacs@gnu.org; Wed, 26 Nov 2014 00:39:07 -0500 Original-Received: from debbugs.gnu.org ([140.186.70.43]:48322) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XtVJe-0004Bx-RP for bug-gnu-emacs@gnu.org; Wed, 26 Nov 2014 00:39:02 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.80) (envelope-from ) id 1XtVJe-000788-8z for bug-gnu-emacs@gnu.org; Wed, 26 Nov 2014 00:39:02 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Paul Eggert Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Wed, 26 Nov 2014 05:39:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 19113 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch Original-Received: via spool by 19113-submit@debbugs.gnu.org id=B19113.141698032327381 (code B ref 19113); Wed, 26 Nov 2014 05:39:01 +0000 Original-Received: (at 19113) by debbugs.gnu.org; 26 Nov 2014 05:38:43 +0000 Original-Received: from localhost ([127.0.0.1]:45535 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1XtVJI-00077U-Ms for submit@debbugs.gnu.org; Wed, 26 Nov 2014 00:38:43 -0500 Original-Received: from smtp.cs.ucla.edu ([131.179.128.62]:54232) by debbugs.gnu.org with esmtp (Exim 4.80) (envelope-from ) id 1XtVJB-00077H-PV for 19113@debbugs.gnu.org; Wed, 26 Nov 2014 00:38:37 -0500 Original-Received: from localhost (localhost.localdomain [127.0.0.1]) by smtp.cs.ucla.edu (Postfix) with ESMTP id 03180A6002A; Tue, 25 Nov 2014 21:38:33 -0800 (PST) X-Virus-Scanned: amavisd-new at smtp.cs.ucla.edu Original-Received: from smtp.cs.ucla.edu ([127.0.0.1]) by localhost (smtp.cs.ucla.edu [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id otpv+0gKXFsX; Tue, 25 Nov 2014 21:38:28 -0800 (PST) Original-Received: from [192.168.1.9] (pool-71-177-17-123.lsanca.dsl-w.verizon.net [71.177.17.123]) by smtp.cs.ucla.edu (Postfix) with ESMTPSA id 9FD1839E801A; Tue, 25 Nov 2014 21:38:28 -0800 (PST) User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.2.0 In-Reply-To: <546E2899.4050702@cs.ucla.edu> X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.15 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 140.186.70.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.bugs:96600 Archived-At: This is a multi-part message in MIME format. --------------030405010302090401070900 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Paul Eggert wrote: > combine the existing ChangeLogs (there is > about 24 MB worth) into a single ChangeLog.1 file at the top level. I implemented this, along with some other fixes (notably, getting a proper copyright notice into the generated ChangeLog file), and am attaching the corresponding patches. I would like to install this into the emacs-24 branch and then merge that into the master. There are three patches. Patches 1 and 3 are so large that I'm just attaching summaries here. (Patch 1 is essentially the same as before.) You can get the full patches temporarily from here: http://cs.ucla.edu/~eggert/emacs/ --------------030405010302090401070900 Content-Type: text/x-diff; name="0001-Rename-old-ChangeLog-files-to-prepare-for-gitlog-to-.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="0001-Rename-old-ChangeLog-files-to-prepare-for-gitlog-to-.pa"; filename*1="tch" >From 000e1d91eebfae0049fc621cdea82650d9eb041e Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Tue, 18 Nov 2014 20:27:43 -0800 Subject: [PATCH 1/3] Rename old ChangeLog files to prepare for gitlog-to-changelog. --- ChangeLog | 13680 ------------------ ChangeLog.1 | 13680 ++++++++++++++++++ admin/ChangeLog | 2267 --- admin/ChangeLog.1 | 2267 +++ doc/emacs/ChangeLog | 10750 --------------- doc/emacs/ChangeLog.1 | 10750 +++++++++++++++ doc/lispintro/ChangeLog | 763 -- doc/lispintro/ChangeLog.1 | 763 ++ doc/lispref/ChangeLog | 13400 ------------------ doc/lispref/ChangeLog.1 | 13400 ++++++++++++++++++ doc/man/ChangeLog | 183 - doc/man/ChangeLog.1 | 183 + doc/misc/ChangeLog | 11781 ---------------- doc/misc/ChangeLog.1 | 11781 ++++++++++++++++ etc/ChangeLog | 6547 --------- etc/ChangeLog.1 | 6547 +++++++++ leim/ChangeLog | 2557 ---- leim/ChangeLog.1 | 2557 ++++ lib-src/ChangeLog | 8258 ----------- lib-src/ChangeLog.1 | 8258 +++++++++++ lisp/ChangeLog | 16597 ---------------------- lisp/ChangeLog.17 | 16597 ++++++++++++++++++++++ lisp/cedet/ChangeLog | 3088 ----- lisp/cedet/ChangeLog.1 | 3088 +++++ lisp/erc/ChangeLog | 720 - lisp/erc/ChangeLog.09 | 720 + lisp/gnus/ChangeLog | 25527 ---------------------------------- lisp/gnus/ChangeLog.3 | 25527 ++++++++++++++++++++++++++++++++++ lisp/mh-e/ChangeLog | 3692 ----- lisp/mh-e/ChangeLog.2 | 3692 +++++ lisp/org/ChangeLog | 32802 -------------------------------------------- lisp/org/ChangeLog.1 | 32802 ++++++++++++++++++++++++++++++++++++++++++++ lisp/url/ChangeLog | 2970 ---- lisp/url/ChangeLog.1 | 2970 ++++ lwlib/ChangeLog | 1878 --- lwlib/ChangeLog.1 | 1878 +++ msdos/ChangeLog | 1553 --- msdos/ChangeLog.1 | 1553 +++ nextstep/ChangeLog | 299 - nextstep/ChangeLog.1 | 299 + nt/ChangeLog | 3443 ----- nt/ChangeLog.1 | 3443 +++++ oldXMenu/ChangeLog | 684 - oldXMenu/ChangeLog.1 | 684 + src/ChangeLog | 11241 --------------- src/ChangeLog.13 | 11241 +++++++++++++++ test/ChangeLog | 1983 --- test/ChangeLog.1 | 1983 +++ 48 files changed, 176663 insertions(+), 176663 deletions(-) delete mode 100644 ChangeLog create mode 100644 ChangeLog.1 delete mode 100644 admin/ChangeLog create mode 100644 admin/ChangeLog.1 delete mode 100644 doc/emacs/ChangeLog create mode 100644 doc/emacs/ChangeLog.1 delete mode 100644 doc/lispintro/ChangeLog create mode 100644 doc/lispintro/ChangeLog.1 delete mode 100644 doc/lispref/ChangeLog create mode 100644 doc/lispref/ChangeLog.1 delete mode 100644 doc/man/ChangeLog create mode 100644 doc/man/ChangeLog.1 delete mode 100644 doc/misc/ChangeLog create mode 100644 doc/misc/ChangeLog.1 delete mode 100644 etc/ChangeLog create mode 100644 etc/ChangeLog.1 delete mode 100644 leim/ChangeLog create mode 100644 leim/ChangeLog.1 delete mode 100644 lib-src/ChangeLog create mode 100644 lib-src/ChangeLog.1 delete mode 100644 lisp/ChangeLog create mode 100644 lisp/ChangeLog.17 delete mode 100644 lisp/cedet/ChangeLog create mode 100644 lisp/cedet/ChangeLog.1 delete mode 100644 lisp/erc/ChangeLog create mode 100644 lisp/erc/ChangeLog.09 delete mode 100644 lisp/gnus/ChangeLog create mode 100644 lisp/gnus/ChangeLog.3 delete mode 100644 lisp/mh-e/ChangeLog create mode 100644 lisp/mh-e/ChangeLog.2 delete mode 100644 lisp/org/ChangeLog create mode 100644 lisp/org/ChangeLog.1 delete mode 100644 lisp/url/ChangeLog create mode 100644 lisp/url/ChangeLog.1 delete mode 100644 lwlib/ChangeLog create mode 100644 lwlib/ChangeLog.1 delete mode 100644 msdos/ChangeLog create mode 100644 msdos/ChangeLog.1 delete mode 100644 nextstep/ChangeLog create mode 100644 nextstep/ChangeLog.1 delete mode 100644 nt/ChangeLog create mode 100644 nt/ChangeLog.1 delete mode 100644 oldXMenu/ChangeLog create mode 100644 oldXMenu/ChangeLog.1 delete mode 100644 src/ChangeLog create mode 100644 src/ChangeLog.13 delete mode 100644 test/ChangeLog create mode 100644 test/ChangeLog.1 [The actual patch is about 12 MB and is elided here. The following shell commands implement the patch: find * -name ChangeLog | sed 's,.*,git mv & &.1, s, lisp/ChangeLog\.1$, lisp/ChangeLog.17, s, lisp/erc/ChangeLog\.1$, lisp/erc/ChangeLog.09, s, lisp/gnus/ChangeLog\.1$, lisp/gnus/ChangeLog.3, s, lisp/mh-e/ChangeLog\.1$, lisp/mh-e/ChangeLog.2, s, src/ChangeLog\.1$, src/ChangeLog.13,' | sh git commit -am'Rename old ChangeLog files to prepare for gitlog-to-changelog.' ] --------------030405010302090401070900 Content-Type: text/x-diff; name="0002-Generate-a-ChangeLog-file-from-commit-logs.patch" Content-Transfer-Encoding: 8bit Content-Disposition: attachment; filename="0002-Generate-a-ChangeLog-file-from-commit-logs.patch" >From 26c6884d2ea40d4c04ceaeb4cf3462e73bb96f5c Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Wed, 19 Nov 2014 14:41:42 -0800 Subject: [PATCH 2/3] Generate a ChangeLog file from commit logs. Instead of having a ChangeLog file or files in the repository, generate the ChangeLog file automatically from the git commit logs, as part of the process of making a distribution. The new procedure has been tested with vc-dwim, and this commit was generated by vc-dwim. Also, 'make dist woriks'. However, I haven't tested other ways to create change log entries nor have I tested the entire release process, and no doubt further work is needed. * .gitignore: Add ChangeLog. * Makefile.in (gen_origin): New macro. (gen-ChangeLog): New rule. * admin/admin.el (make-manuals-dist--1): Don't treat ChangeLog specially. * admin/merge-gnulib (GNULIB_MODULES): Add gitlog-to-changelog. * admin/notes/repo: Add note about vc-dwim. * admin/admin.el (add-release-logs, make-manuals-dist--1): * admin/make-tarball.txt, admin/notes/bugtracker: * lisp/emacs-lisp/authors.el: Add a FIXME comment. * build-aux/gitlog-to-changelog: New file, from Gnulib. * build-aux/gitlog-to-emacslog: New file. * lisp/calendar/icalendar.el, lisp/gnus/deuglify.el: * lisp/emacs-lisp/gulp.el, lwlib/README, make-dist: Adjust to renamed old ChangeLog files. * make-dist: Use 'make gen-ChangeLog' to build top-level ChangeLog in the distribution. --- .gitignore | 1 + Makefile.in | 8 + admin/admin.el | 9 +- admin/make-tarball.txt | 4 + admin/merge-gnulib | 2 +- admin/notes/bugtracker | 3 +- admin/notes/repo | 13 +- build-aux/gitlog-to-changelog | 432 ++++++++++++++++++++++++++++++++++++++++++ build-aux/gitlog-to-emacslog | 48 +++++ lisp/calendar/icalendar.el | 4 +- lisp/emacs-lisp/authors.el | 5 +- lisp/emacs-lisp/gulp.el | 2 +- lisp/gnus/deuglify.el | 2 +- lwlib/README | 2 +- make-dist | 26 ++- 15 files changed, 538 insertions(+), 23 deletions(-) create mode 100755 build-aux/gitlog-to-changelog create mode 100755 build-aux/gitlog-to-emacslog diff --git a/.gitignore b/.gitignore index 989bbb0..27f3e03 100644 --- a/.gitignore +++ b/.gitignore @@ -230,6 +230,7 @@ info/dir *.rej *~ .#* +ChangeLog [0-9]*.patch # Built by 'make install'. diff --git a/Makefile.in b/Makefile.in index 4391c2c..50477c8 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1100,6 +1100,14 @@ bootstrap: bootstrap-clean FRC $(MAKE) $(MFLAGS) MAKEFILE_NAME=force-Makefile force-Makefile $(MAKE) $(MFLAGS) info all +# The first revision to appear in the generated ChangeLog. +gen_origin = 000e1d91eebfae0049fc621cdea82650d9eb041e +# Convert git commit log to ChangeLog file. make-dist uses this. +.PHONY: gen-ChangeLog +gen-ChangeLog: + $(AM_V_GEN)distprefix=$(distprefix) srcprefix=$(srcdir)/ \ + $(srcdir)/build-aux/gitlog-to-emacslog $(gen_origin) + .PHONY: check-declare check-declare: diff --git a/admin/admin.el b/admin/admin.el index 48e083d..d3aa583 100644 --- a/admin/admin.el +++ b/admin/admin.el @@ -28,10 +28,9 @@ (defvar add-log-time-format) ; in add-log -;; Does this information need to be in every ChangeLog, as opposed to -;; just the top-level one? Only if you allow changes the same -;; day as the release. -;; http://lists.gnu.org/archive/html/emacs-devel/2013-03/msg00161.html +;; FIXME: Update this in the light of the fact that there's only +;; one ChangeLog file now, at the top level, and it's generated from +;; commit logs by 'make-dist'. (defun add-release-logs (root version &optional date) "Add \"Version VERSION released.\" change log entries in ROOT. Root must be the root of an Emacs source tree. @@ -650,7 +649,7 @@ style=\"text-align:left\">") (copy-file "../doc/misc/texinfo.tex" stem) (or (equal type "emacs") (copy-file "../doc/emacs/emacsver.texi" stem)) (dolist (file (directory-files (format "../doc/%s" type) t)) - (if (or (string-match-p "\\(\\.texi\\'\\|/ChangeLog\\|/README\\'\\)" file) + (if (or (string-match-p "\\(\\.texi\\'\\|/README\\'\\)" file) (and (equal type "lispintro") (string-match-p "\\.\\(eps\\|pdf\\)\\'" file))) (copy-file file stem))) diff --git a/admin/make-tarball.txt b/admin/make-tarball.txt index 9603c61..c080014 100644 --- a/admin/make-tarball.txt +++ b/admin/make-tarball.txt @@ -2,6 +2,10 @@ Instructions to create pretest or release tarballs. -*- coding: utf-8 -*- -- originally written by Gerd Moellmann, amended by Francesco Potortì with the initial help of Eli Zaretskii +FIXME: There is now just one ChangeLog file, at the top level, +generated automatically from commit logs by 'make-dist'. The +procedure below needs to be updated accordingly. + Steps to take before starting on the first pretest in any release sequence: diff --git a/admin/merge-gnulib b/admin/merge-gnulib index 6c0dffb..dc33349 100755 --- a/admin/merge-gnulib +++ b/admin/merge-gnulib @@ -31,7 +31,7 @@ GNULIB_MODULES=' crypto/md5 crypto/sha1 crypto/sha256 crypto/sha512 dtoastr dtotimespec dup2 environ execinfo faccessat fcntl fcntl-h fdatasync fdopendir filemode fstatat fsync - getloadavg getopt-gnu gettime gettimeofday + getloadavg getopt-gnu gettime gettimeofday gitlog-to-changelog intprops largefile lstat manywarnings memrchr mkostemp mktime pipe2 pselect pthread_sigmask putenv qacl readlink readlinkat diff --git a/admin/notes/bugtracker b/admin/notes/bugtracker index fd7bd08..9d03798 100644 --- a/admin/notes/bugtracker +++ b/admin/notes/bugtracker @@ -481,7 +481,8 @@ can see exactly what the fix was. *** bug-reference-mode Activate `bug-reference-mode' in ChangeLogs to get clickable links to -the bug web-pages. +the bug web-pages. FIXME: This may need to be updated in the light of +the new policy of just one ChangeLog, at the top level. *** Debian stuff diff --git a/admin/notes/repo b/admin/notes/repo index 46a9e08..d077896 100644 --- a/admin/notes/repo +++ b/admin/notes/repo @@ -37,6 +37,16 @@ NEWS, MAINTAINERS, and FOR-RELEASE, or to indicate regeneration of files such as 'configure'. "There is no need" means you don't have to, but you can if you want to. +** Using vc-dwim to maintain commit messages + +You can use vc-dwim to maintain commit messages in ChangeLog format. +When you create a source directory FOO, run the shell command 'cd FOO; +git-changelog-symlink-init' to create a symbolic link from ChangeLog +to .git/c/ChangeLog. Edit this ChangeLog via its symlink with Emacs +commands like add-change-log-entry-other-window, and commit the change +using the shell command 'cd FOO; vc-dwim'. Type 'vc-dwim --help' for +more info. + * Commit to the right branch Development normally takes places on the trunk. @@ -132,7 +142,8 @@ http://lists.gnu.org/archive/html/emacs-devel/2010-05/msg00262.html * How to merge changes from emacs-24 to trunk -[The section on git merge procedure has not yet been written] +[The section on git merge procedure has not yet been written. +Among other things, the ChangeLog file is now automatically generated.] Inspect the change log entries (e.g. in case too many entries have been included or whitespace between entries needs fixing). If someone made diff --git a/build-aux/gitlog-to-changelog b/build-aux/gitlog-to-changelog new file mode 100755 index 0000000..78afff4 --- /dev/null +++ b/build-aux/gitlog-to-changelog @@ -0,0 +1,432 @@ +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 = '2012-07-29 06:11'; # UTC +# The definition above must lie within the first 8 lines in order +# for the Emacs time-stamp write hook (at end) to update it. +# If you change this file with Emacs, please let the write hook +# do its job. Otherwise, update this string manually. + +# Copyright (C) 2008-2014 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# 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 < 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 + List the specified name and email address on a second + ChangeLog header, denoting a co-author. + Signed-off-by: Joe User + These lines are simply elided. + +In a FILE specified via --amend, comment lines (starting with "#") are ignored. +FILE must consist of 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 , + +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 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 = )) + { + $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 $format_string = '%s%n%b%n'; + my $amend_file; + my $append_dot = 0; + my $cluster = 1; + my $strip_tab = 0; + my $strip_cherry_pick = 0; + my $srcdir; + GetOptions + ( + help => sub { usage 0 }, + version => sub { print "$ME version $VERSION\n"; exit }, + 'since=s' => \$since_date, + 'format=s' => \$format_string, + 'amend=s' => \$amend_file, + 'append-dot' => \$append_dot, + 'cluster!' => \$cluster, + 'strip-tab' => \$strip_tab, + 'strip-cherry-pick' => \$strip_cherry_pick, + 'srcdir=s' => \$srcdir, + ) or usage 1; + + defined $since_date + and unshift @ARGV, "--since=$since_date"; + + # 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 = ) + or last; + $in =~ /^log size (\d+)$/ + or die "$ME:$.: Invalid line (expected log size):\n$in"; + my $log_nbytes = $1; + + my $log; + my $n_read = read PIPE, $log, $log_nbytes; + $n_read == $log_nbytes + or die "$ME:$.: unexpected EOF\n"; + + # Extract leading hash. + my ($sha, $rest) = split ':', $log, 2; + defined $sha + or die "$ME:$.: malformed log entry\n"; + $sha =~ /^[0-9a-fA-F]{40}$/ + or die "$ME:$.: invalid SHA1: $sha\n"; + + # If this commit's log requires any transformation, do it now. + my $code = $amend_code->{$sha}; + if (defined $code) + { + eval 'use Safe'; + my $s = new Safe; + # Put the unpreprocessed entry into "$_". + $_ = $rest; + + # Let $code operate on it, safely. + my $r = $s->reval("$code") + or die "$ME:$.:$sha: failed to eval \"$code\":\n$@\n"; + + # Note that we've used this entry. + delete $amend_code->{$sha}; + + # Update $rest upon success. + $rest = $_; + } + + # Remove lines inserted by "git cherry-pick". + if ($strip_cherry_pick) + { + $rest =~ s/^\s*Conflicts:\n.*//sm; + $rest =~ s/^\s*\(cherry picked from commit [\da-f]+\)\n//m; + } + + my @line = split "\n", $rest; + my $author_line = shift @line; + defined $author_line + or die "$ME:$.: unexpected EOF\n"; + $author_line =~ /^(\d+) (.*>)$/ + or die "$ME:$.: Invalid line " + . "(expected date/author/email):\n$author_line\n"; + + # Format 'Copyright-paperwork-exempt: Yes' as a standard ChangeLog + # `(tiny change)' annotation. + my $tiny = (grep (/^Copyright-paperwork-exempt:\s+[Yy]es$/, @line) + ? ' (tiny change)' : ''); + + my $date_line = sprintf "%s %s$tiny\n", + strftime ("%F", localtime ($1)), $2; + + my @coauthors = grep /^Co-authored-by:.*$/, @line; + # Omit meta-data lines we've already interpreted. + @line = grep !/^(?:Signed-off-by:[ ].*>$ + |Co-authored-by:[ ] + |Copyright-paperwork-exempt:[ ] + )/x, @line; + + # Remove leading and trailing blank lines. + if (@line) + { + while ($line[0] =~ /^\s*$/) { shift @line; } + while ($line[$#line] =~ /^\s*$/) { pop @line; } + } + + # Record whether there are two or more paragraphs. + my $multi_paragraph = grep /^\s*$/, @line; + + # Format 'Co-authored-by: A U Thor ' lines in + # standard multi-author ChangeLog format. + for (@coauthors) + { + s/^Co-authored-by:\s*/\t /; + s/\s*/ + or warn "$ME: warning: missing email address for " + . substr ($_, 5) . "\n"; + } + + # If clustering of commit messages has been disabled, if this header + # would be different from the previous date/name/email/coauthors header, + # or if this or the previous entry consists of two or more paragraphs, + # then print the header. + if ( ! $cluster + || $date_line ne $prev_date_line + || "@coauthors" ne "@prev_coauthors" + || $multi_paragraph + || $prev_multi_paragraph) + { + $prev_date_line eq '' + or print "\n"; + print $date_line; + @coauthors + and print join ("\n", @coauthors), "\n"; + } + $prev_date_line = $date_line; + @prev_coauthors = @coauthors; + $prev_multi_paragraph = $multi_paragraph; + + # If there were any lines + if (@line == 0) + { + warn "$ME: warning: empty commit message:\n $date_line\n"; + } + else + { + if ($append_dot) + { + # If the first line of the message has enough room, then + if (length $line[0] < 72) + { + # append a dot if there is no other punctuation or blank + # at the end. + $line[0] =~ /[[:punct:]\s]$/ + or $line[0] .= '.'; + } + } + + # Remove one additional leading TAB from each line. + $strip_tab + and map { s/^\t// } @line; + + # Prefix each non-empty line with a TAB. + @line = map { length $_ ? "\t$_" : '' } @line; + + print "\n", join ("\n", @line), "\n"; + } + + defined ($in = ) + or last; + $in ne "\n" + and die "$ME:$.: unexpected line:\n$in"; + } + + close PIPE + or die "$ME: error closing pipe from " . quoted_cmd (@cmd) . "\n"; + # FIXME-someday: include $PROCESS_STATUS in the diagnostic + + # Complain about any unused entry in the --amend=F specified file. + my $fail = 0; + foreach my $sha (keys %$amend_code) + { + warn "$ME:$amend_file: unused entry: $sha\n"; + $fail = 1; + } + + exit $fail; +} + +# Local Variables: +# mode: perl +# indent-tabs-mode: nil +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "my $VERSION = '" +# time-stamp-format: "%:y-%02m-%02d %02H:%02M" +# time-stamp-time-zone: "UTC" +# time-stamp-end: "'; # UTC" +# End: diff --git a/build-aux/gitlog-to-emacslog b/build-aux/gitlog-to-emacslog new file mode 100755 index 0000000..cc0f409 --- /dev/null +++ b/build-aux/gitlog-to-emacslog @@ -0,0 +1,48 @@ +#!/bin/sh + +# Convert git log output to ChangeLog format for GNU Emacs. + +# Copyright (C) 2014 Free Software Foundation, Inc. + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +LC_ALL=C +export LC_ALL + +gen_origin=${1?} + +if test -d ${srcprefix}.git; then + gen_origin_date=`git log --pretty=format:%ci "$gen_origin"^! ` || exit + gen_start_year=`expr "$gen_origin_date" : '\([^-]*\)'` || exit + log_fix="${srcprefix}build-aux/git-log-fix" + test -e "$log_fix" && set -- "$@" --amend="$log_fix" + + ${srcprefix}build-aux/gitlog-to-changelog $gen_origin^.. \ + > ${distprefix}cl-t || exit + + gen_end_year=`sed 's/-.*//; q' ${distprefix}cl-t` + if test "$gen_start_year" = "$gen_end_year"; then + year_range=$gen_start_year + else + year_range=$gen_start_year-$gen_end_year + fi + + sed "1d + s/Copyright (C) [0-9]*-[0-9]*/Copyright (C) $year_range/ + s/^# // + /http:/q + " Makefile.in >>${distprefix}cl-t && + rm -f ${distprefix}ChangeLog && + mv ${distprefix}cl-t ${distprefix}ChangeLog +fi diff --git a/lisp/calendar/icalendar.el b/lisp/calendar/icalendar.el index 4ba4869..18aeb61 100644 --- a/lisp/calendar/icalendar.el +++ b/lisp/calendar/icalendar.el @@ -39,7 +39,7 @@ ;;; History: -;; 0.07 onwards: see lisp/ChangeLog +;; 0.07 onwards: see commit logs and ../ChangeLog*. ;; 0.06: (2004-10-06) ;; - Bugfixes regarding icalendar-import-format-*. @@ -1047,7 +1047,7 @@ FExport diary data into iCalendar file: ") (setq header (concat "\nBEGIN:VEVENT\nUID:" (or uid - (icalendar--create-uid entry-full + (icalendar--create-uid entry-full contents))))) (setq result (concat result header contents "\nEND:VEVENT"))) ;; handle errors diff --git a/lisp/emacs-lisp/authors.el b/lisp/emacs-lisp/authors.el index 51bd415..c53feee 100644 --- a/lisp/emacs-lisp/authors.el +++ b/lisp/emacs-lisp/authors.el @@ -27,6 +27,9 @@ ;; Use M-x authors RET to create an *Authors* buffer that can used as ;; or merged with Emacs's AUTHORS file. +;; FIXME: This needs to modernized in the light of current practice, +;; which generates a single top-level ChangeLog file from commit logs. + ;;; Code: (defvar authors-coding-system 'utf-8 @@ -75,7 +78,7 @@ files.") ("Gerd Möllmann" "Gerd Moellmann") ("Hallvard B. Furuseth" "Hallvard B Furuseth" "Hallvard Furuseth") ("Hrvoje Nikšić" "Hrvoje Niksic") - ;; lisp/org/ChangeLog 2010-11-11. + ;; lisp/org/ChangeLog.1 2010-11-11. (nil "aaa bbb") (nil "Code Extracted") ; lisp/newcomment.el's "Author:" header ("Jaeyoun Chung" "Jae-youn Chung" "Jae-you Chung" "Chung Jae-youn") diff --git a/lisp/emacs-lisp/gulp.el b/lisp/emacs-lisp/gulp.el index d0a89b3..2d0314b 100644 --- a/lisp/emacs-lisp/gulp.el +++ b/lisp/emacs-lisp/gulp.el @@ -69,7 +69,7 @@ please send them to me ASAP. Please don't send the whole file. Instead, please send a patch made with `diff -c' that shows precisely the changes you would like me to install. Also please include itemized change log entries for your changes; -please use lisp/ChangeLog as a guide for the style and for what kinds +please use lisp/ChangeLog* as a guide for the style and for what kinds of information to include. Thanks.") diff --git a/lisp/gnus/deuglify.el b/lisp/gnus/deuglify.el index 7a0f613..a28a255 100644 --- a/lisp/gnus/deuglify.el +++ b/lisp/gnus/deuglify.el @@ -188,7 +188,7 @@ ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; -;; See ChangeLog for other changes. +;; See commit log or ChangeLog* for other changes. ;; ;; Revision 1.5 2002/01/27 14:39:17 rscholz ;; * New variable `gnus-outlook-deuglify-no-wrap-chars' to inhibit diff --git a/lwlib/README b/lwlib/README index 25c72eb..ed7583d 100644 --- a/lwlib/README +++ b/lwlib/README @@ -4,4 +4,4 @@ library was written by Lucid, Inc and released under the terms of the GPL version 1 (or later). It is not considered part of GNU Emacs. This version of the library differs from the original as described in -the ChangeLog file. +the ChangeLog.1 file. diff --git a/make-dist b/make-dist index aed5b17..30dacda 100755 --- a/make-dist +++ b/make-dist @@ -278,13 +278,20 @@ fi echo "Creating top directory: \`${tempdir}'" mkdir ${tempdir} +if test -d .git; then + echo "Making top-level ChangeLog" + make distprefix=${tempdir}/ gen-ChangeLog +else + echo "No repository, so omitting top-level ChangeLog" +fi + ### We copy in the top-level files before creating the subdirectories in ### hopes that this will make the top-level files appear first in the ### tar file; this means that people can start reading the INSTALL and ### README while the rest of the tar file is still unpacking. Whoopee. echo "Making links to top-level files" ln INSTALL README BUGS ${tempdir} -ln ChangeLog Makefile.in autogen.sh configure configure.ac ${tempdir} +ln ChangeLog.*[0-9] Makefile.in autogen.sh configure configure.ac ${tempdir} ln config.bat make-dist .dir-locals.el ${tempdir} ln aclocal.m4 ${tempdir} @@ -334,7 +341,7 @@ done echo "Making links to \`leim' and its subdirectories" (cd leim ln makefile.w32-in ../${tempdir}/leim - ln ChangeLog README ../${tempdir}/leim + ln ChangeLog.*[0-9] README ../${tempdir}/leim ln CXTERM-DIC/README CXTERM-DIC/*.tit ../${tempdir}/leim/CXTERM-DIC ln SKK-DIC/README SKK-DIC/SKK-JISYO.L ../${tempdir}/leim/SKK-DIC ln MISC-DIC/README MISC-DIC/*.* ../${tempdir}/leim/MISC-DIC @@ -345,6 +352,7 @@ echo "Making links to \`leim' and its subdirectories" echo "Making links to \`build-aux'" (cd build-aux ln compile config.guess config.sub depcomp msys-to-w32 ../${tempdir}/build-aux + ln gitlog-to-changelog ../${tempdir}/build-aux ln install-sh missing move-if-change ../${tempdir}/build-aux ln update-copyright update-subdirs ../${tempdir}/build-aux ln dir_top make-info-dir ../${tempdir}/build-aux) @@ -361,7 +369,7 @@ echo "Making links to \`src'" ln [a-zA-Z]*.[chm] ../${tempdir}/src ln [a-zA-Z]*.in ../${tempdir}/src ln [a-zA-Z]*.mk ../${tempdir}/src - ln README ChangeLog ChangeLog.*[0-9] ../${tempdir}/src + ln README ChangeLog.*[0-9] ../${tempdir}/src ln makefile.w32-in ../${tempdir}/src ln .gdbinit .dbxinit ../${tempdir}/src cd ../${tempdir}/src @@ -383,7 +391,7 @@ echo "Making links to \`lib'" echo "Making links to \`lib-src'" (cd lib-src ln [a-zA-Z]*.[ch] ../${tempdir}/lib-src - ln ChangeLog Makefile.in README testfile ../${tempdir}/lib-src + ln ChangeLog.*[0-9] Makefile.in README testfile ../${tempdir}/lib-src ln grep-changelog rcs2log ../${tempdir}/lib-src ln makefile.w32-in ../${tempdir}/lib-src ln update-game-score.exe.manifest ../${tempdir}/lib-src) @@ -399,7 +407,7 @@ echo "Making links to \`nt'" ln nmake.defs gmake.defs subdirs.el [a-z]*.bat [a-z]*.[ch] ../${tempdir}/nt ln Makefile.in gnulib.mk ../${tempdir}/nt ln mingw-cfg.site epaths.nt INSTALL.OLD ../${tempdir}/nt - ln ChangeLog INSTALL README README.W32 makefile.w32-in ../${tempdir}/nt) + ln ChangeLog.*[0-9] INSTALL README README.W32 makefile.w32-in ../${tempdir}/nt) echo "Making links to \`nt/inc' and its subdirectories" for f in `find nt/inc -type f -name '[a-z]*.h'`; do @@ -413,13 +421,13 @@ echo "Making links to \`nt/icons'" echo "Making links to \`msdos'" (cd msdos - ln ChangeLog INSTALL README emacs.ico emacs.pif ../${tempdir}/msdos + ln ChangeLog.*[0-9] INSTALL README emacs.ico emacs.pif ../${tempdir}/msdos ln depfiles.bat inttypes.h ../${tempdir}/msdos ln is_exec.c sigaction.c mainmake.v2 sed*.inp ../${tempdir}/msdos) echo "Making links to \`nextstep'" (cd nextstep - ln ChangeLog README INSTALL Makefile.in ../${tempdir}/nextstep) + ln ChangeLog.*[0-9] README INSTALL Makefile.in ../${tempdir}/nextstep) echo "Making links to \`nextstep/templates'" (cd nextstep/templates @@ -440,12 +448,12 @@ echo "Making links to \`nextstep/GNUstep/Emacs.base/Resources'" echo "Making links to \`oldXMenu'" (cd oldXMenu ln *.[ch] *.in ../${tempdir}/oldXMenu - ln README ChangeLog ../${tempdir}/oldXMenu) + ln README ChangeLog.*[0-9] ../${tempdir}/oldXMenu) echo "Making links to \`lwlib'" (cd lwlib ln *.[ch] *.in ../${tempdir}/lwlib - ln README ChangeLog ../${tempdir}/lwlib) + ln README ChangeLog.*[0-9] ../${tempdir}/lwlib) ## It is important to distribute admin/ because it contains sources ## for generated lisp/international/uni-*.el files. -- 1.9.3 --------------030405010302090401070900 Content-Type: text/x-diff; name="0003-Combine-all-historical-ChangeLogs-into-ChangeLog.1.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename*0="0003-Combine-all-historical-ChangeLogs-into-ChangeLog.1.patc"; filename*1="h" >From 51bae646c79a78d4fb0cfa8e4851ecd32e543012 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Tue, 25 Nov 2014 12:47:44 -0800 Subject: [PATCH 3/3] Combine all historical ChangeLogs into ChangeLog.1. --- ChangeLog.1 | 645849 ++++++++++++++++++++++++++++++++++++++++++- admin/ChangeLog.1 | 2267 - doc/emacs/ChangeLog.1 | 10750 - doc/lispintro/ChangeLog.1 | 763 - doc/lispref/ChangeLog.1 | 13400 - doc/man/ChangeLog.1 | 183 - doc/misc/ChangeLog.1 | 11781 - etc/ChangeLog.1 | 6547 - leim/ChangeLog.1 | 2557 - lib-src/ChangeLog.1 | 8258 - lisp/ChangeLog.1 | 3262 - lisp/ChangeLog.10 | 23559 -- lisp/ChangeLog.11 | 14339 - lisp/ChangeLog.12 | 33352 --- lisp/ChangeLog.13 | 16715 -- lisp/ChangeLog.14 | 20565 -- lisp/ChangeLog.15 | 22820 -- lisp/ChangeLog.16 | 25242 -- lisp/ChangeLog.17 | 16597 -- lisp/ChangeLog.2 | 4010 - lisp/ChangeLog.3 | 12451 - lisp/ChangeLog.4 | 8952 - lisp/ChangeLog.5 | 9286 - lisp/ChangeLog.6 | 8039 - lisp/ChangeLog.7 | 23128 -- lisp/ChangeLog.8 | 10010 - lisp/ChangeLog.9 | 20703 -- lisp/cedet/ChangeLog.1 | 3088 - lisp/erc/ChangeLog.01 | 1056 - lisp/erc/ChangeLog.02 | 2620 - lisp/erc/ChangeLog.03 | 2163 - lisp/erc/ChangeLog.04 | 2094 - lisp/erc/ChangeLog.05 | 1240 - lisp/erc/ChangeLog.06 | 1454 - lisp/erc/ChangeLog.07 | 836 - lisp/erc/ChangeLog.08 | 429 - lisp/erc/ChangeLog.09 | 720 - lisp/gnus/ChangeLog.1 | 3724 - lisp/gnus/ChangeLog.2 | 18569 -- lisp/gnus/ChangeLog.3 | 25527 -- lisp/mh-e/ChangeLog.1 | 11441 - lisp/mh-e/ChangeLog.2 | 3692 - lisp/org/ChangeLog.1 | 32802 --- lisp/url/ChangeLog.1 | 2970 - lwlib/ChangeLog.1 | 1878 - msdos/ChangeLog.1 | 1553 - nextstep/ChangeLog.1 | 299 - nt/ChangeLog.1 | 3443 - oldXMenu/ChangeLog.1 | 684 - src/ChangeLog.1 | 3539 - src/ChangeLog.10 | 27930 -- src/ChangeLog.11 | 31403 --- src/ChangeLog.12 | 22954 -- src/ChangeLog.13 | 11241 - src/ChangeLog.2 | 4789 - src/ChangeLog.3 | 16521 -- src/ChangeLog.4 | 6924 - src/ChangeLog.5 | 7166 - src/ChangeLog.6 | 5376 - src/ChangeLog.7 | 11109 - src/ChangeLog.8 | 13997 - src/ChangeLog.9 | 13312 - test/ChangeLog.1 | 1983 - 63 files changed, 637286 insertions(+), 638625 deletions(-) delete mode 100644 admin/ChangeLog.1 delete mode 100644 doc/emacs/ChangeLog.1 delete mode 100644 doc/lispintro/ChangeLog.1 delete mode 100644 doc/lispref/ChangeLog.1 delete mode 100644 doc/man/ChangeLog.1 delete mode 100644 doc/misc/ChangeLog.1 delete mode 100644 etc/ChangeLog.1 delete mode 100644 leim/ChangeLog.1 delete mode 100644 lib-src/ChangeLog.1 delete mode 100644 lisp/ChangeLog.1 delete mode 100644 lisp/ChangeLog.10 delete mode 100644 lisp/ChangeLog.11 delete mode 100644 lisp/ChangeLog.12 delete mode 100644 lisp/ChangeLog.13 delete mode 100644 lisp/ChangeLog.14 delete mode 100644 lisp/ChangeLog.15 delete mode 100644 lisp/ChangeLog.16 delete mode 100644 lisp/ChangeLog.17 delete mode 100644 lisp/ChangeLog.2 delete mode 100644 lisp/ChangeLog.3 delete mode 100644 lisp/ChangeLog.4 delete mode 100644 lisp/ChangeLog.5 delete mode 100644 lisp/ChangeLog.6 delete mode 100644 lisp/ChangeLog.7 delete mode 100644 lisp/ChangeLog.8 delete mode 100644 lisp/ChangeLog.9 delete mode 100644 lisp/cedet/ChangeLog.1 delete mode 100644 lisp/erc/ChangeLog.01 delete mode 100644 lisp/erc/ChangeLog.02 delete mode 100644 lisp/erc/ChangeLog.03 delete mode 100644 lisp/erc/ChangeLog.04 delete mode 100644 lisp/erc/ChangeLog.05 delete mode 100644 lisp/erc/ChangeLog.06 delete mode 100644 lisp/erc/ChangeLog.07 delete mode 100644 lisp/erc/ChangeLog.08 delete mode 100644 lisp/erc/ChangeLog.09 delete mode 100644 lisp/gnus/ChangeLog.1 delete mode 100644 lisp/gnus/ChangeLog.2 delete mode 100644 lisp/gnus/ChangeLog.3 delete mode 100644 lisp/mh-e/ChangeLog.1 delete mode 100644 lisp/mh-e/ChangeLog.2 delete mode 100644 lisp/org/ChangeLog.1 delete mode 100644 lisp/url/ChangeLog.1 delete mode 100644 lwlib/ChangeLog.1 delete mode 100644 msdos/ChangeLog.1 delete mode 100644 nextstep/ChangeLog.1 delete mode 100644 nt/ChangeLog.1 delete mode 100644 oldXMenu/ChangeLog.1 delete mode 100644 src/ChangeLog.1 delete mode 100644 src/ChangeLog.10 delete mode 100644 src/ChangeLog.11 delete mode 100644 src/ChangeLog.12 delete mode 100644 src/ChangeLog.13 delete mode 100644 src/ChangeLog.2 delete mode 100644 src/ChangeLog.3 delete mode 100644 src/ChangeLog.4 delete mode 100644 src/ChangeLog.5 delete mode 100644 src/ChangeLog.6 delete mode 100644 src/ChangeLog.7 delete mode 100644 src/ChangeLog.8 delete mode 100644 src/ChangeLog.9 delete mode 100644 test/ChangeLog.1 [The actual patch is about 48 MB and is elided here. The following shell script implements the patch:] #!/bin/sh export LC_ALL=C logs=$(find * -name 'ChangeLog.*' | sort -t. -k1,1 -k2n) gawk ' BEGINFILE { prefix = FILENAME sub(/[^/]*$/, "", prefix) } !/^[^\t0-9]/ { if (/^\tCopyright [(]/) { next } if (/^\tInc\./) { next } line = $0 if (/^\t\* / && $0 !~ ("^\\t\\* " prefix)) { line_end = substr(line, 1, 3) prefix substr(line, 4) line = "" while (match(line_end, /^[^(:,]*, /)) { pos = RLENGTH line = line substr(line_end, 1, pos) prefix line_end = substr(line_end, pos + 1) } line = line line_end } if (/^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][[:space:]]/) { if (accum) print accum accum = FILENAME " " line } else if (line || prevline) { accum = accum "\1" line } prevline = $0 } END { print accum } ' $logs | sort -s -k2,2r -k1 | sed 's/^[^ ]* //' | tr '\1' '\n' | sed 's/[[:space:]]*$//' >ChangeLog.new cat >>ChangeLog.new <<'EOF' ;; Local Variables: ;; coding: utf-8 ;; End: Copyright (C) 1985-2014 Free Software Foundation, Inc. This file is part of GNU Emacs. GNU Emacs 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. GNU Emacs 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 GNU Emacs. If not, see . EOF for log in $logs; do test "$log" = ChangeLog.1 && continue git rm $log done cp ChangeLog.new ChangeLog.1 git add ChangeLog.1 git commit -m'Combine all historical ChangeLogs into ChangeLog.1.' --------------030405010302090401070900--