3 ## applypatch takes four file arguments, and uses those to
4 ## apply the unpacked patch (surprise surprise) that they
5 ## represent to the current tree.
8 ## $1 - file with commit message
9 ## $2 - file with the actual patch
10 ## $3 - "info" file with Author, email and subject
11 ## $4 - optional file containing signoff to add
13 . git-sh-setup || die
"Not a git archive."
15 final
=.dotest
/final-commit
17 ## If this file exists, we ask before applying
19 query_apply
=.dotest
/.query_apply
21 ## We do not munge the first line of the commit message too much
22 ## if this file exists.
23 keep_subject
=.dotest
/.keep_subject
30 EDIT
=${VISUAL:-${EDITOR:-vi}}
32 export GIT_AUTHOR_NAME
="$(sed -n '/^Author/ s/Author: //p' "$INFO")"
33 export GIT_AUTHOR_EMAIL
="$(sed -n '/^Email/ s/Email: //p' "$INFO")"
34 export GIT_AUTHOR_DATE
="$(sed -n '/^Date/ s/Date: //p' "$INFO")"
35 export SUBJECT
="$(sed -n '/^Subject/ s/Subject: //p' "$INFO")"
37 if test '' != "$SIGNOFF"
41 SIGNOFF
=`cat "$SIGNOFF"` ||
exit
42 elif case "$SIGNOFF" in yes | true | me | please
) : ;; *) false
;; esac
44 SIGNOFF
=`git-var GIT_COMMITTER_IDENT | sed -e '
51 if test '' != "$SIGNOFF"
54 sed -ne '/^Signed-off-by: /p' "$MSGFILE" |
57 test "$LAST_SIGNED_OFF_BY" = "$SIGNOFF" ||
{
58 test '' = "$LAST_SIGNED_OFF_BY" && echo
65 test -f "$keep_subject" || patch_header
='[PATCH] '
68 echo "$patch_header$SUBJECT"
77 test -f "$query_apply" || interactive
=no
79 while [ "$interactive" = yes ]; do
80 echo "Commit Body is:"
81 echo "--------------------------"
83 echo "--------------------------"
84 echo -n "Apply? [y]es/[n]o/[e]dit/[a]ccept all "
88 n|N
) exit 2;; # special value to tell dotest to keep going
89 e|E
) "$EDIT" "$final";;
90 a|A
) rm -f "$query_apply"
95 if test -x "$GIT_DIR"/hooks
/applypatch-msg
97 "$GIT_DIR"/hooks
/applypatch-msg
"$final" ||
exit
101 echo Applying
"'$SUBJECT'"
104 git-apply
--index "$PATCHFILE" ||
{
105 # Here if we know which revision the patch applies to,
106 # we create a temporary working tree and index, apply the
107 # patch, and attempt 3-way merge with the resulting tree.
111 if test -x "$GIT_DIR"/hooks
/pre-applypatch
113 "$GIT_DIR"/hooks
/pre-applypatch ||
exit
116 tree
=$
(git-write-tree
) ||
exit 1
117 echo Wrote tree
$tree
118 parent
=$
(git-rev-parse
--verify HEAD
) &&
119 commit
=$
(git-commit-tree
$tree -p $parent <"$final") ||
exit 1
120 echo Committed
: $commit
121 git-update-ref HEAD
$commit $parent ||
exit
123 if test -x "$GIT_DIR"/hooks
/post-applypatch
125 "$GIT_DIR"/hooks
/post-applypatch