#!/bin/sh
##
## apply_parsed_patch takes four files and uses those to apply the
## unpacked patch that they represent to the current tree.
##
## The arguments are:
##	$1 - working directory
##
final=$1/final-commit
confirm_apply=$1/.confirm_apply
MSGFILE=$1/msg-clean
PATCHFILE=$1/patch
FILES=$1/files
INFO=$1/info
EDIT=${VISUAL:-$EDITOR}
EDIT=${EDIT:-vi}

export GIT_AUTHOR_NAME="$(sed -n '/^Author/ s/Author: //p' $INFO)"
export GIT_AUTHOR_EMAIL="$(sed -n '/^Email/ s/Email: //p' $INFO)"
export GIT_AUTHOR_DATE="$(sed -n '/^Date/ s/Date: //p' $INFO)"
export SUBJECT="$(sed -n '/^Subject/ s/Subject: //p' $INFO)"
[ -z "$SUBJECT" ] && SUBJECT="$(head -n1 $MSGFILE)"
[ -z "$GIT_AUTHOR_NAME" ] && GIT_AUTHOR_NAME="$GIT_COMMITTER_NAME"
[ -z "$GIT_AUTHOR_EMAIL" ] && GIT_AUTHOR_EMAIL="$GIT_COMMITTER_EMAIL"

awk "
	BEGIN { have_signoff = 0 }
	(/^Signed-off-by: +${SIGNOFF_STRING}$/) { have_signoff = 1 }
	{ print }
	END { if (!have_signoff) print \"Signed-off-by: ${SIGNOFF_STRING}\n\" }
" $MSGFILE > $final

doit=0
[ -f $confirm_apply ] || doit=1

while [ $doit -eq 0 ]; do
	echo "From: $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL>"
	echo "By: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>"
	echo "Commit Body is:"
	echo "--------------------------"
	cat $final
	echo "--------------------------"
	echo -n "Apply? [y]es/[n]o/[e]dit/[a]ccept all "
	read reply
	case $reply in
		y|Y) doit=1;;
		n|N) GIT_AUTHOR_NAME="$GIT_COMMITTER_NAME"
		     GIT_AUTHOR_EMAIL="$GIT_COMMITTER_EMAIL"
		     exit 2;;	# special value to tell dotest to keep going
		e|E) $EDIT $final;;
		a|A) rm -f $confirm_apply
		     doit=1;;
	esac
done

echo
echo Applying "'$SUBJECT'"
echo

git-check-files $(cat $FILES) || exit 1
git-checkout-cache -q $(cat $FILES) || exit 1
patch -E -u --no-backup-if-mismatch -f -p1 --fuzz=0 --input=$PATCHFILE || exit 1
git-update-cache --add --remove $(cat $FILES) || exit 1
tree=$(git-write-tree) || exit 1
echo Wrote tree $tree
commit=$(git-commit-tree $tree -p $(cat .git/HEAD) < $final) || exit 1
echo Committed: $commit
echo $commit > .git/HEAD

GIT_AUTHOR_NAME="$GIT_COMMITTER_NAME"
GIT_AUTHOR_EMAIL="$GIT_COMMITTER_EMAIL"
