| #!/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 |
| |
| # 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 ! [ -z "$DIFF_FILE" ]; then |
| tee="tee $DIFF_FILE" |
| else |
| tee="cat" |
| fi |
| |
| git $cmd | $tee | git gcc-mklog $GCC_MKLOG_ARGS -c "$COMMIT_MSG_FILE" |