1 1.1 mrg #!/bin/sh 2 1.1 mrg 3 1.1.1.2 mrg # Copyright (C) 2020-2024 Free Software Foundation, Inc. 4 1.1 mrg # 5 1.1 mrg # This file is part of GCC. 6 1.1 mrg # 7 1.1 mrg # GCC is free software; you can redistribute it and/or modify 8 1.1 mrg # it under the terms of the GNU General Public License as published by 9 1.1 mrg # the Free Software Foundation; either version 3, or (at your option) 10 1.1 mrg # any later version. 11 1.1 mrg # 12 1.1 mrg # GCC is distributed in the hope that it will be useful, 13 1.1 mrg # but WITHOUT ANY WARRANTY; without even the implied warranty of 14 1.1 mrg # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 1.1 mrg # GNU General Public License for more details. 16 1.1 mrg # 17 1.1 mrg # You should have received a copy of the GNU General Public License 18 1.1 mrg # along with GCC; see the file COPYING. If not, write to 19 1.1 mrg # the Free Software Foundation, 51 Franklin Street, Fifth Floor, 20 1.1 mrg # Boston, MA 02110-1301, USA. 21 1.1 mrg 22 1.1 mrg COMMIT_MSG_FILE=$1 23 1.1 mrg COMMIT_SOURCE=$2 24 1.1 mrg SHA1=$3 25 1.1 mrg 26 1.1 mrg # We might be on a branch before the file was added. 27 1.1 mrg if ! [ -x contrib/mklog.py ]; then exit 0; fi 28 1.1 mrg 29 1.1 mrg # Can't do anything if $COMMIT_MSG_FILE isn't a file. 30 1.1 mrg if ! [ -f "$COMMIT_MSG_FILE" ]; then exit 0; fi 31 1.1 mrg 32 1.1 mrg # Don't do anything unless requested to. 33 1.1 mrg if [ -z "$GCC_FORCE_MKLOG" ]; then exit 0; fi 34 1.1 mrg 35 1.1.1.2 mrg if [ -z "$COMMIT_SOURCE" ] || [ "$COMMIT_SOURCE" = template ]; then 36 1.1 mrg # No source or "template" means new commit. 37 1.1 mrg cmd="diff --cached" 38 1.1 mrg 39 1.1.1.2 mrg elif [ "$COMMIT_SOURCE" = message ]; then 40 1.1 mrg # "message" means -m; assume a new commit if there are any changes staged. 41 1.1 mrg if ! git diff --cached --quiet; then 42 1.1 mrg cmd="diff --cached" 43 1.1 mrg else 44 1.1 mrg cmd="diff --cached HEAD^" 45 1.1 mrg fi 46 1.1 mrg 47 1.1.1.2 mrg elif [ "$COMMIT_SOURCE" = commit ]; then 48 1.1 mrg # The message of an existing commit. If it's HEAD, assume --amend; 49 1.1 mrg # otherwise, assume a new commit with -C. 50 1.1.1.2 mrg if [ "$SHA1" = HEAD ]; then 51 1.1 mrg cmd="diff --cached HEAD^" 52 1.1 mrg if [ "$(git config gcc-config.mklog-hook-type)" = "smart-amend" ]; then 53 1.1 mrg # Check if the existing message still describes the staged changes. 54 1.1 mrg f=$(mktemp /tmp/git-commit.XXXXXX) || exit 1 55 1.1.1.2 mrg git log -1 --pretty=email HEAD > "$f" 56 1.1.1.2 mrg printf '\n---\n\n' >> "$f" 57 1.1.1.2 mrg git $cmd >> "$f" 58 1.1 mrg if contrib/gcc-changelog/git_email.py "$f" >/dev/null 2>&1; then 59 1.1 mrg # Existing commit message is still OK for amended commit. 60 1.1.1.2 mrg rm "$f" 61 1.1 mrg exit 0 62 1.1 mrg fi 63 1.1.1.2 mrg rm "$f" 64 1.1 mrg fi 65 1.1 mrg else 66 1.1 mrg cmd="diff --cached" 67 1.1 mrg fi 68 1.1 mrg else 69 1.1 mrg # Do nothing for merge or squash. 70 1.1 mrg exit 0 71 1.1 mrg fi 72 1.1 mrg 73 1.1 mrg # Save diff to a file if requested. 74 1.1 mrg DIFF_FILE=$(git config gcc-config.diff-file) 75 1.1.1.2 mrg if [ -n "$DIFF_FILE" ]; then 76 1.1 mrg tee="tee $DIFF_FILE" 77 1.1 mrg else 78 1.1 mrg tee="cat" 79 1.1 mrg fi 80 1.1 mrg 81 1.1.1.2 mrg git $cmd | $tee | git gcc-mklog -c "$COMMIT_MSG_FILE" 82