1#!/bin/sh
2
3test_description='commit-msg hook'
4
5. ./test-lib.sh
6
7test_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
16cat > fake-editor <<'EOF'
17#!/bin/sh
18cp FAKE_MSG "$1"
19exit 0
20EOF
21chmod +x fake-editor
22FAKE_EDITOR="$(pwd)/fake-editor"
23export FAKE_EDITOR
24
25test_expect_success 'with no hook (editor)' '
26
27 echo "more foo" >> file &&
28 git add file &&
29 echo "more foo" > FAKE_MSG &&
30 GIT_EDITOR="$FAKE_EDITOR" git commit
31
32'
33
34test_expect_success '--no-verify with no hook' '
35
36 echo "bar" > file &&
37 git add file &&
38 git commit --no-verify -m "bar"
39
40'
41
42test_expect_success '--no-verify with no hook (editor)' '
43
44 echo "more bar" > file &&
45 git add file &&
46 echo "more bar" > FAKE_MSG &&
47 GIT_EDITOR="$FAKE_EDITOR" git commit --no-verify
48
49'
50
51# now install hook that always succeeds
52HOOKDIR="$(git rev-parse --git-dir)/hooks"
53HOOK="$HOOKDIR/commit-msg"
54mkdir -p "$HOOKDIR"
55cat > "$HOOK" <<EOF
56#!/bin/sh
57exit 0
58EOF
59chmod +x "$HOOK"
60
61test_expect_success 'with succeeding hook' '
62
63 echo "more" >> file &&
64 git add file &&
65 git commit -m "more"
66
67'
68
69test_expect_success 'with succeeding hook (editor)' '
70
71 echo "more more" >> file &&
72 git add file &&
73 echo "more more" > FAKE_MSG &&
74 GIT_EDITOR="$FAKE_EDITOR" git commit
75
76'
77
78test_expect_success '--no-verify with succeeding hook' '
79
80 echo "even more" >> file &&
81 git add file &&
82 git commit --no-verify -m "even more"
83
84'
85
86test_expect_success '--no-verify with succeeding hook (editor)' '
87
88 echo "even more more" >> file &&
89 git add file &&
90 echo "even more more" > FAKE_MSG &&
91 GIT_EDITOR="$FAKE_EDITOR" git commit --no-verify
92
93'
94
95# now a hook that fails
96cat > "$HOOK" <<EOF
97#!/bin/sh
98exit 1
99EOF
100
101test_expect_success 'with failing hook' '
102
103 echo "another" >> file &&
104 git add file &&
105 ! git commit -m "another"
106
107'
108
109test_expect_success 'with failing hook (editor)' '
110
111 echo "more another" >> file &&
112 git add file &&
113 echo "more another" > FAKE_MSG &&
114 ! (GIT_EDITOR="$FAKE_EDITOR" git commit)
115
116'
117
118test_expect_success '--no-verify with failing hook' '
119
120 echo "stuff" >> file &&
121 git add file &&
122 git commit --no-verify -m "stuff"
123
124'
125
126test_expect_success '--no-verify with failing hook (editor)' '
127
128 echo "more stuff" >> file &&
129 git add file &&
130 echo "more stuff" > FAKE_MSG &&
131 GIT_EDITOR="$FAKE_EDITOR" git commit --no-verify
132
133'
134
135chmod -x "$HOOK"
136test_expect_success 'with non-executable hook' '
137
138 echo "content" >> file &&
139 git add file &&
140 git commit -m "content"
141
142'
143
144test_expect_success 'with non-executable hook (editor)' '
145
146 echo "content again" >> file &&
147 git add file &&
148 echo "content again" > FAKE_MSG &&
149 GIT_EDITOR="$FAKE_EDITOR" git commit -m "content again"
150
151'
152
153test_expect_success '--no-verify with non-executable hook' '
154
155 echo "more content" >> file &&
156 git add file &&
157 git commit --no-verify -m "more content"
158
159'
160
161test_expect_success '--no-verify with non-executable hook (editor)' '
162
163 echo "even more content" >> file &&
164 git add file &&
165 echo "even more content" > FAKE_MSG &&
166 GIT_EDITOR="$FAKE_EDITOR" git commit --no-verify
167
168'
169
170# now a hook that edits the commit message
171cat > "$HOOK" <<'EOF'
172#!/bin/sh
173echo "new message" > "$1"
174exit 0
175EOF
176chmod +x "$HOOK"
177
178commit_msg_is () {
179 test "`git log --pretty=format:%s%b -1`" = "$1"
180}
181
182test_expect_success 'hook edits commit message' '
183
184 echo "additional" >> file &&
185 git add file &&
186 git commit -m "additional" &&
187 commit_msg_is "new message"
188
189'
190
191test_expect_success 'hook edits commit message (editor)' '
192
193 echo "additional content" >> file &&
194 git add file &&
195 echo "additional content" > FAKE_MSG &&
196 GIT_EDITOR="$FAKE_EDITOR" git commit &&
197 commit_msg_is "new message"
198
199'
200
201test_expect_success "hook doesn't edit commit message" '
202
203 echo "plus" >> file &&
204 git add file &&
205 git commit --no-verify -m "plus" &&
206 commit_msg_is "plus"
207
208'
209
210test_expect_success "hook doesn't edit commit message (editor)" '
211
212 echo "more plus" >> file &&
213 git add file &&
214 echo "more plus" > FAKE_MSG &&
215 GIT_EDITOR="$FAKE_EDITOR" git commit --no-verify &&
216 commit_msg_is "more plus"
217
218'
219
220test_done