From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id 2H4sCU8x/F92FAAAWB0awg (envelope-from ) for ; Mon, 11 Jan 2021 06:06:55 -0500 Received: by simark.ca (Postfix, from userid 112) id 22F541EEEF; Mon, 11 Jan 2021 06:06:55 -0500 (EST) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on simark.ca X-Spam-Level: X-Spam-Status: No, score=0.2 required=5.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,MAILING_LIST_MULTI,RDNS_NONE,URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.2 Received: from sourceware.org (unknown [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id 2E8CA1E4F4 for ; Mon, 11 Jan 2021 06:06:53 -0500 (EST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id D83A4384603D; Mon, 11 Jan 2021 11:06:52 +0000 (GMT) Received: from mail-wr1-x432.google.com (mail-wr1-x432.google.com [IPv6:2a00:1450:4864:20::432]) by sourceware.org (Postfix) with ESMTPS id 052173861810 for ; Mon, 11 Jan 2021 11:06:48 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 052173861810 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=embecosm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=andrew.burgess@embecosm.com Received: by mail-wr1-x432.google.com with SMTP id c5so15921155wrp.6 for ; Mon, 11 Jan 2021 03:06:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=embecosm.com; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to; bh=jFToPinMjFlFyJ0JN8oWiYAiMPZ1ZSZSHMt9BnfELcg=; b=YRe5+jP72naQiKR9ENtFKhbFk04/JsWarr9Q6OqizJJfRhrmFgF7W+BDCYv7kofqIA UGgqD6sZ44t6rKWAbL6vTruXJXa51D4MrhSHr5Lm4Znq/f7JVueSyTCToAqi0aBKOrXR i49WXBjlvPKp7/B8FVkD2oKAtlIGuv0X/D5eIvj/AQ5ga5VwZrC+TD/Npep/od/RZe75 g8+uajzcKAB2ONU1NUP/cjm06J3GebIIb3EHZIuDNnZdvQicTplF60PsmgMaYBpLOXLj 0p4c8D7mxUU4Io9p65q6+48d+rewmuD8j44tkOJTVmXBmKG2JyB3Fngy1Zs/iJRlcPTk wapQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to; bh=jFToPinMjFlFyJ0JN8oWiYAiMPZ1ZSZSHMt9BnfELcg=; b=b1KapfOd1SSN9CFCaXoiwE1E61mYExhI/GsVv6bUf1xVyEE38BH1lV5F7JXnCBbZDh /VuIAn4KzmgNGpkBHLM6Uzl36Obb3+N9fsa3f1okQP51SCE3RfqEcOPqrWG0dThXzUmE bcxD8S/Mw2Kg9HmeWc0nGXKAXoQMlNpzWn96TFik03khb3WpjGH+ZL/7okiyFnFTpTwX 6tXveSmHwhKBF0CbGc14tAOysNO3j/s2+lGaAJ32S2LwtsGy2elEGqnhvEfD4ymNsqch nx2VVgxA3Z2fHnAF0tJ2pQycJX7GBOJC5Ldo2KsaEWDJ56WZu6mH7sMY8PoNLh/9uxj2 nvgA== X-Gm-Message-State: AOAM533WU0mz/xOQ4CnThtmVtymZ/Pn9PCyOrVoLTbabwlS4gxFFdg/b A32Fz8gY4i9QT7z79YiM0f7z1g== X-Google-Smtp-Source: ABdhPJzqfNPKI3iSS0XkFxZOC1M5AomeeF9r0EdVmRd1IXFNPPpk2TqrBv8unX6Nt4FEigccZkglpQ== X-Received: by 2002:adf:ee10:: with SMTP id y16mr15950222wrn.296.1610363206841; Mon, 11 Jan 2021 03:06:46 -0800 (PST) Received: from localhost (host86-166-129-230.range86-166.btcentralplus.com. [86.166.129.230]) by smtp.gmail.com with ESMTPSA id l11sm23503675wrt.23.2021.01.11.03.06.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 11 Jan 2021 03:06:46 -0800 (PST) Date: Mon, 11 Jan 2021 11:06:45 +0000 From: Andrew Burgess To: Mike Frysinger Subject: Re: [PATCH 2/3] gnulib: import gitlog-to-changelog Message-ID: <20210111110645.GD1151657@embecosm.com> References: <20210110033752.6002-1-vapier@gentoo.org> <20210110033752.6002-2-vapier@gentoo.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20210110033752.6002-2-vapier@gentoo.org> X-Operating-System: Linux/5.8.13-100.fc31.x86_64 (x86_64) X-Uptime: 11:05:51 up 33 days, 15:50, X-Editor: GNU Emacs [ http://www.gnu.org/software/emacs ] X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: gdb-patches@sourceware.org Errors-To: gdb-patches-bounces@sourceware.org Sender: "Gdb-patches" * Mike Frysinger via Gdb-patches [2021-01-09 22:37:51 -0500]: > This is going to be used to generate ChangeLog files. Please see my feedback on patch 3/3. Thanks, Andrew > > gnulib/: > > * update-gnulib.sh (IMPORTED_GNULIB_MODULES): Add gitlog-to-changelog. > * Makefile.in, configure: Regenerate. > * import/Makefile.am, import/Makefile.in: Regenerate. > * import/m4/gnulib-cache.m4: Regenerate. > * import/m4/gnulib-comp.m4: Regenerate. > * import/extra/gitlog-to-changelog: New file. > --- > gnulib/Makefile.in | 2 +- > gnulib/configure | 1 + > gnulib/import/Makefile.am | 8 + > gnulib/import/Makefile.in | 14 +- > gnulib/import/extra/gitlog-to-changelog | 515 ++++++++++++++++++++++++ > gnulib/import/m4/gnulib-cache.m4 | 2 + > gnulib/import/m4/gnulib-comp.m4 | 2 + > gnulib/update-gnulib.sh | 1 + > 8 files changed, 538 insertions(+), 7 deletions(-) > create mode 100755 gnulib/import/extra/gitlog-to-changelog > > diff --git a/gnulib/Makefile.in b/gnulib/Makefile.in > index c1c216809446..69161b1f7ed5 100644 > --- a/gnulib/Makefile.in > +++ b/gnulib/Makefile.in > @@ -14,7 +14,7 @@ > > @SET_MAKE@ > > -# Copyright (C) 2019-2020 Free Software Foundation, Inc. > +# Copyright (C) 2019-2021 Free Software Foundation, Inc. > > # This file is part of GDB. > > diff --git a/gnulib/configure b/gnulib/configure > index 6c58a46e42ed..e4191103af58 100644 > --- a/gnulib/configure > +++ b/gnulib/configure > @@ -6608,6 +6608,7 @@ fi > # Code from module getrandom: > # Code from module gettext-h: > # Code from module gettimeofday: > + # Code from module gitlog-to-changelog: > # Code from module glob: > # Code from module glob-h: > # Code from module hard-locale: > diff --git a/gnulib/import/Makefile.am b/gnulib/import/Makefile.am > index 84de424a1734..48a642febdcc 100644 > --- a/gnulib/import/Makefile.am > +++ b/gnulib/import/Makefile.am > @@ -43,6 +43,7 @@ > # frexpl \ > # getcwd \ > # gettimeofday \ > +# gitlog-to-changelog \ > # glob \ > # inet_ntop \ > # inttypes \ > @@ -703,6 +704,13 @@ EXTRA_libgnu_a_SOURCES += gettimeofday.c > > ## end gnulib module gettimeofday > > +## begin gnulib module gitlog-to-changelog > + > + > +EXTRA_DIST += $(top_srcdir)/import/extra/gitlog-to-changelog > + > +## end gnulib module gitlog-to-changelog > + > ## begin gnulib module glob > > > diff --git a/gnulib/import/Makefile.in b/gnulib/import/Makefile.in > index 476cde8dd57e..7c61a29499af 100644 > --- a/gnulib/import/Makefile.in > +++ b/gnulib/import/Makefile.in > @@ -57,6 +57,7 @@ > # frexpl \ > # getcwd \ > # gettimeofday \ > +# gitlog-to-changelog \ > # glob \ > # inet_ntop \ > # inttypes \ > @@ -1689,12 +1690,13 @@ EXTRA_DIST = m4/gnulib-cache.m4 alloca.c alloca.in.h arpa_inet.in.h \ > fnmatch.c fnmatch_loop.c fnmatch.in.h fpucw.h frexp.c frexp.c \ > frexpl.c fstat.c stat-w32.c stat-w32.h at-func.c fstatat.c \ > getcwd.c getcwd-lgpl.c getdtablesize.c getlogin_r.c \ > - getrandom.c gettimeofday.c glob.c glob_internal.h \ > - glob_pattern_p.c globfree.c glob-libc.h glob.in.h \ > - hard-locale.h inet_ntop.c intprops.h inttypes.in.h isblank.c \ > - float+.h isnan.c isnand-nolibm.h isnand.c float+.h isnan.c \ > - isnanl-nolibm.h isnanl.c cdefs.h libc-config.h limits.in.h \ > - localcharset.h locale.in.h localtime-buffer.c \ > + getrandom.c gettimeofday.c \ > + $(top_srcdir)/import/extra/gitlog-to-changelog glob.c \ > + glob_internal.h glob_pattern_p.c globfree.c glob-libc.h \ > + glob.in.h hard-locale.h inet_ntop.c intprops.h inttypes.in.h \ > + isblank.c float+.h isnan.c isnand-nolibm.h isnand.c float+.h \ > + isnan.c isnanl-nolibm.h isnanl.c cdefs.h libc-config.h \ > + limits.in.h localcharset.h locale.in.h localtime-buffer.c \ > localtime-buffer.h lstat.c malloc.c malloca.h math.in.h \ > lc-charset-dispatch.c lc-charset-dispatch.h \ > mbrtowc-impl-utf8.h mbrtowc-impl.h mbrtowc.c mbtowc-lock.c \ > diff --git a/gnulib/import/extra/gitlog-to-changelog b/gnulib/import/extra/gitlog-to-changelog > new file mode 100755 > index 000000000000..be8082e7ffd9 > --- /dev/null > +++ b/gnulib/import/extra/gitlog-to-changelog > @@ -0,0 +1,515 @@ > +#!/bin/sh > +#! -*-perl-*- > + > +# Convert git log output to ChangeLog format. > + > +# Copyright (C) 2008-2020 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 > + > +# This is a prologue that allows to run a perl script as an executable > +# on systems that are compliant to a POSIX version before POSIX:2017. > +# On such systems, the usual invocation of an executable through execlp() > +# or execvp() fails with ENOEXEC if it is a script that does not start > +# with a #! line. The script interpreter mentioned in the #! line has > +# to be /bin/sh, because on GuixSD systems that is the only program that > +# has a fixed file name. The second line is essential for perl and is > +# also useful for editing this file in Emacs. The next two lines below > +# are valid code in both sh and perl. When executed by sh, they re-execute > +# the script through the perl program found in $PATH. The '-x' option > +# is essential as well; without it, perl would re-execute the script > +# through /bin/sh. When executed by perl, the next two lines are a no-op. > +eval 'exec perl -wSx "$0" "$@"' > + if 0; > + > +my $VERSION = '2020-04-04 15:07'; # 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. > + > +use strict; > +use warnings; > +use Getopt::Long; > +use POSIX qw(strftime); > + > +(my $ME = $0) =~ s|.*/||; > + > +# use File::Coda; # https://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 < +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. > + --ignore-line=PAT ignore lines of commit messages that 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 > + 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 =~ /^([[:xdigit:]]{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 $ignore_line; > + 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, > + 'ignore-line=s' => \$ignore_line, > + '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 = (); > + my @skipshas = (); > + 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 =~ /^[[:xdigit:]]{40}$/ > + or die "$ME:$.: invalid SHA1: $sha\n"; > + > + my $skipflag = 0; > + if (@skipshas) > + { > + foreach(@skipshas) > + { > + if ($sha =~ /^$_/) > + { > + $skipflag = $_; > + last; > + } > + } > + } > + > + # 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 /[ \t]*\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|Tiny-change):\s+[Yy]es$/, @line) > + ? ' (tiny change)' : ''); > + > + my $date_line = sprintf "%s %s$tiny\n", > + strftime ("%Y-%m-%d", 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:[ ] > + |Tiny-change:[ ] > + )/x, @line; > + > + # Remove leading and trailing blank lines. > + if (@line) > + { > + while ($line[0] =~ /^\s*$/) { shift @line; } > + while ($line[$#line] =~ /^\s*$/) { pop @line; } > + } > + > + # Handle Emacs gitmerge.el "skipped" commits. > + # Yes, this should be controlled by an option. So sue me. > + if ( grep /^(; )?Merge from /, @line ) > + { > + my $found = 0; > + foreach (@line) > + { > + if (grep /^The following commit.*skipped:$/, $_) > + { > + $found = 1; > + ## Reset at each merge to reduce chance of false matches. > + @skipshas = (); > + next; > + } > + if ($found && $_ =~ /^([[:xdigit:]]{7,}) [^ ]/) > + { > + push ( @skipshas, $1 ); > + } > + } > + } > + > + # Ignore commits that match the --ignore-matching pattern, if specified. > + if (defined $ignore_matching && @line && $line[0] =~ /$ignore_matching/) > + { > + $skipflag = 1; > + } > + elsif ($skipflag) > + { > + ## Perhaps only warn if a pattern matches more than once? > + warn "$ME: warning: skipping $sha due to $skipflag\n"; > + } > + > + if (! $skipflag) > + { > + if (defined $ignore_line && @line) > + { > + @line = grep ! /$ignore_line/, @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/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 = ) > + 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 'before-save-hook 'time-stamp) > +# time-stamp-line-limit: 50 > +# time-stamp-start: "my $VERSION = '" > +# time-stamp-format: "%:y-%02m-%02d %02H:%02M" > +# time-stamp-time-zone: "UTC0" > +# time-stamp-end: "'; # UTC" > +# End: > diff --git a/gnulib/import/m4/gnulib-cache.m4 b/gnulib/import/m4/gnulib-cache.m4 > index db95504cc6ad..c0b6d4119466 100644 > --- a/gnulib/import/m4/gnulib-cache.m4 > +++ b/gnulib/import/m4/gnulib-cache.m4 > @@ -48,6 +48,7 @@ > # frexpl \ > # getcwd \ > # gettimeofday \ > +# gitlog-to-changelog \ > # glob \ > # inet_ntop \ > # inttypes \ > @@ -89,6 +90,7 @@ gl_MODULES([ > frexpl > getcwd > gettimeofday > + gitlog-to-changelog > glob > inet_ntop > inttypes > diff --git a/gnulib/import/m4/gnulib-comp.m4 b/gnulib/import/m4/gnulib-comp.m4 > index 8c2c28ec932f..61d60db35954 100644 > --- a/gnulib/import/m4/gnulib-comp.m4 > +++ b/gnulib/import/m4/gnulib-comp.m4 > @@ -103,6 +103,7 @@ AC_DEFUN([gl_EARLY], > # Code from module getrandom: > # Code from module gettext-h: > # Code from module gettimeofday: > + # Code from module gitlog-to-changelog: > # Code from module glob: > # Code from module glob-h: > # Code from module hard-locale: > @@ -907,6 +908,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/update-copyright > lib/_Noreturn.h > lib/alloca.c > diff --git a/gnulib/update-gnulib.sh b/gnulib/update-gnulib.sh > index e9b377ca4759..4820277e5fa9 100755 > --- a/gnulib/update-gnulib.sh > +++ b/gnulib/update-gnulib.sh > @@ -40,6 +40,7 @@ IMPORTED_GNULIB_MODULES="\ > frexpl \ > getcwd \ > gettimeofday \ > + gitlog-to-changelog \ > glob \ > inet_ntop > inttypes \ > -- > 2.28.0 >