mailinfo: barf and exist upon nested multipart.
[git.git] / tools / git-applypatch
index 5a3a44b..e5bc3c0 100755 (executable)
 ##     $3 - "info" file with Author, email and subject
 ##     $4 - optional file containing signoff to add
 ##
-signoff="$4"
+. git-sh-setup-script || die "Not a git archive."
+
 final=.dotest/final-commit
 ##
 ## If this file exists, we ask before applying
 ##
 query_apply=.dotest/.query_apply
+
+## We do not munge the first line of the commit message too much
+## if this file exists.
+keep_subject=.dotest/.keep_subject
+
+
 MSGFILE=$1
 PATCHFILE=$2
 INFO=$3
-EDIT=${VISUAL:-$EDITOR}
-EDIT=${EDIT:-vi}
+SIGNOFF=$4
+EDIT=${VISUAL:-${EDITOR:-vi}}
 
 export GIT_AUTHOR_NAME="$(sed -n '/^Author/ s/Author: //p' .dotest/info)"
 export GIT_AUTHOR_EMAIL="$(sed -n '/^Email/ s/Email: //p' .dotest/info)"
 export GIT_AUTHOR_DATE="$(sed -n '/^Date/ s/Date: //p' .dotest/info)"
 export SUBJECT="$(sed -n '/^Subject/ s/Subject: //p' .dotest/info)"
 
-if [ -n "$signoff" -a -f "$signoff" ]; then
-       cat $signoff >> $MSGFILE
+if test '' != "$SIGNOFF"
+then
+       if test -f "$SIGNOFF"
+       then
+               SIGNOFF=`cat "$SIGNOFF"` || exit
+       elif case "$SIGNOFF" in yes | true | me | please) : ;; *) false ;; esac
+       then
+               SIGNOFF=`git-var GIT_COMMITTER_IDENT | sed -e '
+                               s/>.*/>/
+                               s/^/Signed-off-by: /'
+               `
+       else
+               SIGNOFF=
+       fi
+       if test '' != "$SIGNOFF"
+       then
+               LAST_SIGNED_OFF_BY=`
+                       sed -ne '/^Signed-off-by: /p' "$MSGFILE" |
+                       tail -n 1
+               `
+               test "$LAST_SIGNED_OFF_BY" = "$SIGNOFF" ||
+               echo "$SIGNOFF" >>"$MSGFILE"
+       fi
 fi
 
-(echo "[PATCH] $SUBJECT" ; if [ -s $MSGFILE ]; then echo ; cat $MSGFILE; fi ) > $final
+patch_header=
+test -f "$keep_subject" || patch_header='[PATCH] '
+
+{
+       echo "$patch_header$SUBJECT"
+       if test -s "$MSGFILE"
+       then
+               echo
+               cat "$MSGFILE"
+       fi
+} >"$final"
 
-f=0
-[ -f $query_apply ] || f=1
+interactive=yes
+test -f "$query_apply" || interactive=no
 
-while [ $f -eq 0 ]; do
+while [ "$interactive" = yes ]; do
        echo "Commit Body is:"
        echo "--------------------------"
-       cat $final
+       cat "$final"
        echo "--------------------------"
        echo -n "Apply? [y]es/[n]o/[e]dit/[a]ccept all "
        read reply
-       case $reply in
-               y|Y) f=1;;
+       case "$reply" in
+               y|Y) interactive=no;;
                n|N) exit 2;;   # special value to tell dotest to keep going
-               e|E) $EDIT $final;;
-               a|A) rm -f $query_apply
-                    f=1;;
+               e|E) "$EDIT" "$final";;
+               a|A) rm -f "$query_apply"
+                    interactive=no ;;
        esac
 done
 
+if test -x "$GIT_DIR"/hooks/applypatch-msg
+then
+       "$GIT_DIR"/hooks/applypatch-msg "$final" || exit
+fi
+
 echo
 echo Applying "'$SUBJECT'"
 echo
 
-git-apply --index $PATCHFILE || exit 1
+git-apply --index "$PATCHFILE" || exit 1
+
+if test -x "$GIT_DIR"/hooks/pre-applypatch
+then
+       "$GIT_DIR"/hooks/pre-applypatch || exit
+fi
+
 tree=$(git-write-tree) || exit 1
 echo Wrote tree $tree
-commit=$(git-commit-tree $tree -p $(cat .git/HEAD) < $final) || exit 1
+commit=$(git-commit-tree $tree -p $(cat "$GIT_DIR"/HEAD) < "$final") || exit 1
 echo Committed: $commit
-echo $commit > .git/HEAD
+echo $commit > "$GIT_DIR"/HEAD
+
+if test -x "$GIT_DIR"/hooks/post-applypatch
+then
+       "$GIT_DIR"/hooks/post-applypatch
+fi