summaryrefslogtreecommitdiff
path: root/contrib
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2020-05-22 18:40:35 -0400
committerMartin Liska <mliska@suse.cz>2020-05-26 08:38:24 +0200
commit757dbb59c1f2cd88c84a6dc7dc038e4da750b035 (patch)
treeb23b29e0cb81510b99e04b750ae88adb70a0a4e0 /contrib
parentb8e5f22671e900d9c7757f6289cc10d0c4fd0f03 (diff)
gcc-git: Add prepare-commit-msg hook.
This patch introduces a prepare-commit-msg hook that appends a ChangeLog skeleton to a commit message when the GCC_FORCE_MKLOG environment variable is set, and a 'git commit-mklog' command set that variable while running 'git commit'. contrib/ChangeLog: * prepare-commit-msg: New file. * gcc-git-customization.sh: Install it. Add commit-mklog alias. * mklog.py: Add new option -c which appends to a ChangeLog file.
Diffstat (limited to 'contrib')
-rwxr-xr-xcontrib/gcc-git-customization.sh13
-rwxr-xr-xcontrib/mklog.py23
-rwxr-xr-xcontrib/prepare-commit-msg57
3 files changed, 92 insertions, 1 deletions
diff --git a/contrib/gcc-git-customization.sh b/contrib/gcc-git-customization.sh
index 7a950ae5f38..dcc42683fa6 100755
--- a/contrib/gcc-git-customization.sh
+++ b/contrib/gcc-git-customization.sh
@@ -30,6 +30,8 @@ git config alias.gcc-backport '!f() { rev=$1; git cherry-pick -x $@; } ; f'
git config alias.gcc-mklog '!f() { "`git rev-parse --show-toplevel`/contrib/mklog.py" $@; } ; f'
+git config alias.commit-mklog '!f() { GCC_FORCE_MKLOG=1 git commit "$@"; }; f'
+
# Make diff on MD files use "(define" as a function marker.
# Use this in conjunction with a .gitattributes file containing
# *.md diff=md
@@ -127,6 +129,17 @@ echo "(local branches starting <prefix>/ can be pushed directly to your"
ask "personal area on the gcc server)" $old_pfx new_pfx
git config "gcc-config.userpfx" "$new_pfx"
+echo
+ask "Install prepare-commit-msg git hook for 'git commit-mklog' alias" yes dohook
+if [ "x$dohook" = xyes ]; then
+ hookdir=`git rev-parse --git-path hooks`
+ if [ -f "$hookdir/prepare-commit-msg" ]; then
+ echo " Moving existing prepare-commit-msg hook to prepare-commit-msg.bak"
+ mv "$hookdir/prepare-commit-msg" "$hookdir/prepare-commit-msg.bak"
+ fi
+ install -c "`git rev-parse --show-toplevel`/contrib/prepare-commit-msg" "$hookdir"
+fi
+
# Scan the existing settings to see if there are any we need to rewrite.
vendors=$(git config --get-all "remote.${upstream}.fetch" "refs/vendors/" | sed -r "s:.*refs/vendors/([^/]+)/.*:\1:" | sort | uniq)
url=$(git config --get "remote.${upstream}.url")
diff --git a/contrib/mklog.py b/contrib/mklog.py
index 7a19b5d0949..fb58661b5eb 100755
--- a/contrib/mklog.py
+++ b/contrib/mklog.py
@@ -30,6 +30,7 @@ import argparse
import os
import re
import sys
+from itertools import takewhile
import requests
@@ -221,6 +222,9 @@ if __name__ == '__main__':
help='Do not generate function names in ChangeLogs')
parser.add_argument('-p', '--fill-up-bug-titles', action='store_true',
help='Download title of mentioned PRs')
+ parser.add_argument('-c', '--changelog',
+ help='Append the ChangeLog to a git commit message '
+ 'file')
args = parser.parse_args()
if args.input == '-':
args.input = None
@@ -229,4 +233,21 @@ if __name__ == '__main__':
data = input.read()
output = generate_changelog(data, args.no_functions,
args.fill_up_bug_titles)
- print(output, end='')
+ if args.changelog:
+ lines = open(args.changelog).read().split('\n')
+ start = list(takewhile(lambda l: not l.startswith('#'), lines))
+ end = lines[len(start):]
+ with open(args.changelog, 'w') as f:
+ if start:
+ # appent empty line
+ if start[-1] != '':
+ start.append('')
+ else:
+ # append 2 empty lines
+ start = 2 * ['']
+ f.write('\n'.join(start))
+ f.write('\n')
+ f.write(output)
+ f.write('\n'.join(end))
+ else:
+ print(output, end='')
diff --git a/contrib/prepare-commit-msg b/contrib/prepare-commit-msg
new file mode 100755
index 00000000000..820dacc7e42
--- /dev/null
+++ b/contrib/prepare-commit-msg
@@ -0,0 +1,57 @@
+#!/bin/sh
+
+# Copyright (C) 2020 Free Software Foundation, Inc.
+#
+# This file is part of GCC.
+#
+# GCC 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, or (at your option)
+# any later version.
+#
+# GCC 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 GCC; see the file COPYING. If not, write to
+# the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+# Boston, MA 02110-1301, USA.
+
+COMMIT_MSG_FILE=$1
+COMMIT_SOURCE=$2
+SHA1=$3
+
+# Can't do anything if $COMMIT_MSG_FILE isn't a file.
+if ! [ -f "$COMMIT_MSG_FILE" ]; then exit 0; fi
+
+# Don't do anything unless requested to.
+if [ -z "$GCC_FORCE_MKLOG" ]; then exit 0; fi
+
+if [ -z "$COMMIT_SOURCE" ] || [ $COMMIT_SOURCE = template ]; then
+ # No source or "template" means new commit.
+ cmd="diff --cached"
+
+elif [ $COMMIT_SOURCE = message ]; then
+ # "message" means -m; assume a new commit if there are any changes staged.
+ if ! git diff --cached --quiet; then
+ cmd="diff --cached"
+ else
+ cmd="diff --cached HEAD^"
+ fi
+
+elif [ $COMMIT_SOURCE = commit ]; then
+ # The message of an existing commit. If it's HEAD, assume --amend;
+ # otherwise, assume a new commit with -C.
+ if [ $SHA1 = HEAD ]; then
+ cmd="diff --cached HEAD^"
+ else
+ cmd="diff --cached"
+ fi
+else
+ # Do nothing for merge or squash.
+ exit 0
+fi
+
+git $cmd | git gcc-mklog -c "$COMMIT_MSG_FILE"