#!/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"