1
+#!/bin/sh
2
+
3
+test_description='prepare-commit-msg hook'
4
+
5
+. ./test-lib.sh
6
+
7
+test_expect_success 'with no hook' '
8
+
9
+ echo "foo" > file &&
10
+ git add file &&
11
+ git commit -m "first"
12
+
13
+'
14
+
15
+# set up fake editor for interactive editing
16
+cat > fake-editor <<'EOF'
17
+#!/bin/sh
18
+exit 0
19
+EOF
20
+chmod +x fake-editor
21
+FAKE_EDITOR="$(pwd)/fake-editor"
22
+export FAKE_EDITOR
23
+
24
+# now install hook that always succeeds and adds a message
25
+HOOKDIR="$(git rev-parse --git-dir)/hooks"
26
+HOOK="$HOOKDIR/prepare-commit-msg"
27
+mkdir -p "$HOOKDIR"
28
+cat > "$HOOK" <<'EOF'
29
+#!/bin/sh
30
+if test "$2" = commit; then
31
+ source=$(git-rev-parse "$3")
32
+else
33
+ source=${2-default}
34
+fi
35
+if test "$GIT_EDITOR" = :; then
36
+ sed -e "1s/.*/$source (no editor)/" "$1" > msg.tmp
37
+else
38
+ sed -e "1s/.*/$source/" "$1" > msg.tmp
39
+fi
40
+mv msg.tmp "$1"
41
+exit 0
42
+EOF
43
+chmod +x "$HOOK"
44
+
45
+echo dummy template > "$(git rev-parse --git-dir)/template"
46
+
47
+test_expect_success 'with hook (-m)' '
48
+
49
+ echo "more" >> file &&
50
+ git add file &&
51
+ git commit -m "more" &&
52
+ test "`git log -1 --pretty=format:%s`" = "message (no editor)"
53
+
54
+'
55
+
56
+test_expect_success 'with hook (-m editor)' '
57
+
58
+ echo "more" >> file &&
59
+ git add file &&
60
+ GIT_EDITOR="$FAKE_EDITOR" git commit -e -m "more more" &&
61
+ test "`git log -1 --pretty=format:%s`" = message
62
+
63
+'
64
+
65
+test_expect_success 'with hook (-t)' '
66
+
67
+ echo "more" >> file &&
68
+ git add file &&
69
+ git commit -t "$(git rev-parse --git-dir)/template" &&
70
+ test "`git log -1 --pretty=format:%s`" = template
71
+
72
+'
73
+
74
+test_expect_success 'with hook (-F)' '
75
+
76
+ echo "more" >> file &&
77
+ git add file &&
78
+ (echo more | git commit -F -) &&
79
+ test "`git log -1 --pretty=format:%s`" = "message (no editor)"
80
+
81
+'
82
+
83
+test_expect_success 'with hook (-F editor)' '
84
+
85
+ echo "more" >> file &&
86
+ git add file &&
87
+ (echo more more | GIT_EDITOR="$FAKE_EDITOR" git commit -e -F -) &&
88
+ test "`git log -1 --pretty=format:%s`" = message
89
+
90
+'
91
+
92
+test_expect_success 'with hook (-C)' '
93
+
94
+ head=`git rev-parse HEAD` &&
95
+ echo "more" >> file &&
96
+ git add file &&
97
+ git commit -C $head &&
98
+ test "`git log -1 --pretty=format:%s`" = "$head (no editor)"
99
+
100
+'
101
+
102
+test_expect_success 'with hook (editor)' '
103
+
104
+ echo "more more" >> file &&
105
+ git add file &&
106
+ GIT_EDITOR="$FAKE_EDITOR" git commit &&
107
+ test "`git log -1 --pretty=format:%s`" = default
108
+
109
+'
110
+
111
+test_expect_success 'with hook (--amend)' '
112
+
113
+ head=`git rev-parse HEAD` &&
114
+ echo "more" >> file &&
115
+ git add file &&
116
+ GIT_EDITOR="$FAKE_EDITOR" git commit --amend &&
117
+ test "`git log -1 --pretty=format:%s`" = "$head"
118
+
119
+'
120
+
121
+test_expect_success 'with hook (-c)' '
122
+
123
+ head=`git rev-parse HEAD` &&
124
+ echo "more" >> file &&
125
+ git add file &&
126
+ GIT_EDITOR="$FAKE_EDITOR" git commit -c $head &&
127
+ test "`git log -1 --pretty=format:%s`" = "$head"
128
+
129
+'
130
+
131
+cat > "$HOOK" <<'EOF'
132
+#!/bin/sh
133
+exit 1
134
+EOF
135
+
136
+test_expect_success 'with failing hook' '
137
+
138
+ head=`git rev-parse HEAD` &&
139
+ echo "more" >> file &&
140
+ git add file &&
141
+ ! GIT_EDITOR="$FAKE_EDITOR" git commit -c $head
142
+
143
+'
144
+
145
+test_expect_success 'with failing hook (--no-verify)' '
146
+
147
+ head=`git rev-parse HEAD` &&
148
+ echo "more" >> file &&
149
+ git add file &&
150
+ ! GIT_EDITOR="$FAKE_EDITOR" git commit --no-verify -c $head
151
+
152
+'
153
+
154
+
155
+test_done