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