gcc/contrib/prepare-commit-msg
Marc Poulhiès f3f6ff7b16 mklog: handle Signed-off-by, minor cleanup
Consider Signed-off-by lines as part of the ending of the initial
commit to avoid having these in the middle of the log when the
changelog part is injected after.

This is particularly usefull with:

 $ git gcc-commit-mklog --amend -s

that can be used to create the changelog and add the Signed-off-by line.

Also applies most of the shellcheck suggestions on the
prepare-commit-msg hook.

contrib/ChangeLog:

	* mklog.py: Leave SOB lines after changelog.
	* prepare-commit-msg: Apply most shellcheck suggestions.

Signed-off-by: Marc Poulhiès <dkm@kataplop.net>
2023-09-04 21:43:36 +02:00

81 lines
2.4 KiB
Bash
Executable file

#!/bin/sh
# Copyright (C) 2020-2023 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
# We might be on a branch before the file was added.
if ! [ -x contrib/mklog.py ]; then exit 0; fi
# 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^"
if [ "$(git config gcc-config.mklog-hook-type)" = "smart-amend" ]; then
# Check if the existing message still describes the staged changes.
f=$(mktemp /tmp/git-commit.XXXXXX) || exit 1
git log -1 --pretty=email HEAD > "$f"
printf '\n---\n\n' >> "$f"
git $cmd >> "$f"
if contrib/gcc-changelog/git_email.py "$f" >/dev/null 2>&1; then
# Existing commit message is still OK for amended commit.
rm "$f"
exit 0
fi
rm "$f"
fi
else
cmd="diff --cached"
fi
else
# Do nothing for merge or squash.
exit 0
fi
# Save diff to a file if requested.
DIFF_FILE=$(git config gcc-config.diff-file)
if [ -n "$DIFF_FILE" ]; then
tee="tee $DIFF_FILE"
else
tee="cat"
fi
git $cmd | $tee | git gcc-mklog -c "$COMMIT_MSG_FILE"