[PATCH] Fix "git-rev-list" revision range parsing
[git] / git-applypatch.sh
1 #!/bin/sh
2 ##
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.
6 ##
7 ## The arguments are:
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
12 ##
13 . git-sh-setup || die "Not a git archive."
14
15 final=.dotest/final-commit
16 ##
17 ## If this file exists, we ask before applying
18 ##
19 query_apply=.dotest/.query_apply
20
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
24
25
26 MSGFILE=$1
27 PATCHFILE=$2
28 INFO=$3
29 SIGNOFF=$4
30 EDIT=${VISUAL:-${EDITOR:-vi}}
31
32 export GIT_AUTHOR_NAME="$(sed -n '/^Author/ s/Author: //p' .dotest/info)"
33 export GIT_AUTHOR_EMAIL="$(sed -n '/^Email/ s/Email: //p' .dotest/info)"
34 export GIT_AUTHOR_DATE="$(sed -n '/^Date/ s/Date: //p' .dotest/info)"
35 export SUBJECT="$(sed -n '/^Subject/ s/Subject: //p' .dotest/info)"
36
37 if test '' != "$SIGNOFF"
38 then
39         if test -f "$SIGNOFF"
40         then
41                 SIGNOFF=`cat "$SIGNOFF"` || exit
42         elif case "$SIGNOFF" in yes | true | me | please) : ;; *) false ;; esac
43         then
44                 SIGNOFF=`git-var GIT_COMMITTER_IDENT | sed -e '
45                                 s/>.*/>/
46                                 s/^/Signed-off-by: /'
47                 `
48         else
49                 SIGNOFF=
50         fi
51         if test '' != "$SIGNOFF"
52         then
53                 LAST_SIGNED_OFF_BY=`
54                         sed -ne '/^Signed-off-by: /p' "$MSGFILE" |
55                         tail -n 1
56                 `
57                 test "$LAST_SIGNED_OFF_BY" = "$SIGNOFF" ||
58                 echo "$SIGNOFF" >>"$MSGFILE"
59         fi
60 fi
61
62 patch_header=
63 test -f "$keep_subject" || patch_header='[PATCH] '
64
65 {
66         echo "$patch_header$SUBJECT"
67         if test -s "$MSGFILE"
68         then
69                 echo
70                 cat "$MSGFILE"
71         fi
72 } >"$final"
73
74 interactive=yes
75 test -f "$query_apply" || interactive=no
76
77 while [ "$interactive" = yes ]; do
78         echo "Commit Body is:"
79         echo "--------------------------"
80         cat "$final"
81         echo "--------------------------"
82         echo -n "Apply? [y]es/[n]o/[e]dit/[a]ccept all "
83         read reply
84         case "$reply" in
85                 y|Y) interactive=no;;
86                 n|N) exit 2;;   # special value to tell dotest to keep going
87                 e|E) "$EDIT" "$final";;
88                 a|A) rm -f "$query_apply"
89                      interactive=no ;;
90         esac
91 done
92
93 if test -x "$GIT_DIR"/hooks/applypatch-msg
94 then
95         "$GIT_DIR"/hooks/applypatch-msg "$final" || exit
96 fi
97
98 echo
99 echo Applying "'$SUBJECT'"
100 echo
101
102 git-apply --index "$PATCHFILE" || exit 1
103
104 if test -x "$GIT_DIR"/hooks/pre-applypatch
105 then
106         "$GIT_DIR"/hooks/pre-applypatch || exit
107 fi
108
109 tree=$(git-write-tree) || exit 1
110 echo Wrote tree $tree
111 commit=$(git-commit-tree $tree -p $(cat "$GIT_DIR"/HEAD) < "$final") || exit 1
112 echo Committed: $commit
113 echo $commit > "$GIT_DIR"/HEAD
114
115 if test -x "$GIT_DIR"/hooks/post-applypatch
116 then
117         "$GIT_DIR"/hooks/post-applypatch
118 fi