t7501 (commit): modernize style
[git] / t / t7501-commit.sh
1 #!/bin/sh
2 #
3 # Copyright (c) 2007 Kristian Høgsberg <krh@redhat.com>
4 #
5
6 # FIXME: Test the various index usages, -i and -o, test reflog,
7 # signoff
8
9 test_description='git commit'
10 . ./test-lib.sh
11 . "$TEST_DIRECTORY/diff-lib.sh"
12
13 author='The Real Author <someguy@his.email.org>'
14
15 test_tick
16
17 test_expect_success 'initial status' '
18         echo bongo bongo >file &&
19         git add file &&
20         git status >actual &&
21         test_i18ngrep "Initial commit" actual
22 '
23
24 test_expect_success 'fail initial amend' '
25         test_must_fail git commit --amend
26 '
27
28 test_expect_success 'setup: initial commit' '
29         git commit -m initial
30 '
31
32 test_expect_success '-m and -F do not mix' '
33         test_must_fail git commit -m foo -m bar -F file
34 '
35
36 test_expect_success '-m and -C do not mix' '
37         test_must_fail git commit -C HEAD -m illegal
38 '
39
40 test_expect_success 'paths and -a do not mix' '
41         echo King of the bongo >file &&
42         test_must_fail git commit -m foo -a file
43 '
44
45 test_expect_success PERL 'can use paths with --interactive' '
46         echo bong-o-bong >file &&
47         # 2: update, 1:st path, that is all, 7: quit
48         ( echo 2; echo 1; echo; echo 7 ) |
49         git commit -m foo --interactive file &&
50         git reset --hard HEAD^
51 '
52
53 test_expect_success 'using invalid commit with -C' '
54         test_must_fail git commit -C bogus
55 '
56
57 test_expect_success 'nothing to commit' '
58         test_must_fail git commit -m initial
59 '
60
61 test_expect_success 'setup: non-initial commit' '
62         echo bongo bongo bongo >file &&
63         git commit -m next -a
64 '
65
66 test_expect_success 'commit message from non-existing file' '
67         echo more bongo: bongo bongo bongo bongo >file &&
68         test_must_fail git commit -F gah -a
69 '
70
71 test_expect_success 'empty commit message' '
72         # Empty except stray tabs and spaces on a few lines.
73         sed -e "s/@//g" >msg <<-\EOF &&
74                 @               @
75                 @@
76                 @  @
77                 @Signed-off-by: hula@
78         EOF
79         test_must_fail git commit -F msg -a
80 '
81
82 test_expect_success 'setup: commit message from file' '
83         echo this is the commit message, coming from a file >msg &&
84         git commit -F msg -a
85 '
86
87 test_expect_success 'amend commit' '
88         cat >editor <<-\EOF &&
89         #!/bin/sh
90         sed -e "s/a file/an amend commit/g" < "$1" > "$1-"
91         mv "$1-" "$1"
92         EOF
93         chmod 755 editor &&
94         EDITOR=./editor git commit --amend
95 '
96
97 test_expect_success '-m and -F do not mix' '
98         echo enough with the bongos >file &&
99         test_must_fail git commit -F msg -m amending .
100 '
101
102 test_expect_success 'using message from other commit' '
103         git commit -C HEAD^ .
104 '
105
106 test_expect_success 'editing message from other commit' '
107         cat >editor <<-\EOF &&
108         #!/bin/sh
109         sed -e "s/amend/older/g"  < "$1" > "$1-"
110         mv "$1-" "$1"
111         EOF
112         chmod 755 editor &&
113         echo hula hula >file &&
114         EDITOR=./editor git commit -c HEAD^ -a
115 '
116
117 test_expect_success 'message from stdin' '
118         echo silly new contents >file &&
119         echo commit message from stdin |
120         git commit -F - -a
121 '
122
123 test_expect_success 'overriding author from command line' '
124         echo gak >file &&
125         git commit -m author \
126                 --author "Rubber Duck <rduck@convoy.org>" -a >output 2>&1 &&
127         grep Rubber.Duck output
128 '
129
130 test_expect_success PERL 'interactive add' '
131         echo 7 |
132         git commit --interactive |
133         grep "What now"
134 '
135
136 test_expect_success PERL "commit --interactive doesn't change index if editor aborts" '
137         echo zoo >file &&
138         test_must_fail git diff --exit-code >diff1 &&
139         (echo u ; echo "*" ; echo q) |
140         (
141                 EDITOR=: &&
142                 export EDITOR &&
143                 test_must_fail git commit --interactive
144         ) &&
145         git diff >diff2 &&
146         compare_diff_patch diff1 diff2
147 '
148
149 test_expect_success 'editor not invoked if -F is given' '
150         cat >editor <<-\EOF &&
151         #!/bin/sh
152         sed -e s/good/bad/g <"$1" >"$1-"
153         mv "$1-" "$1"
154         EOF
155         chmod 755 editor &&
156
157         echo A good commit message. >msg &&
158         echo moo >file &&
159
160         EDITOR=./editor git commit -a -F msg &&
161         git show -s --pretty=format:%s >subject &&
162         grep -q good subject &&
163
164         echo quack >file &&
165         echo Another good message. |
166         EDITOR=./editor git commit -a -F - &&
167         git show -s --pretty=format:%s >subject &&
168         grep -q good subject
169 '
170
171 test_expect_success 'partial commit that involves removal (1)' '
172
173         git rm --cached file &&
174         mv file elif &&
175         git add elif &&
176         git commit -m "Partial: add elif" elif &&
177         git diff-tree --name-status HEAD^ HEAD >current &&
178         echo "A elif" >expected &&
179         test_cmp expected current
180
181 '
182
183 test_expect_success 'partial commit that involves removal (2)' '
184
185         git commit -m "Partial: remove file" file &&
186         git diff-tree --name-status HEAD^ HEAD >current &&
187         echo "D file" >expected &&
188         test_cmp expected current
189
190 '
191
192 test_expect_success 'partial commit that involves removal (3)' '
193
194         git rm --cached elif &&
195         echo elif >elif &&
196         git commit -m "Partial: modify elif" elif &&
197         git diff-tree --name-status HEAD^ HEAD >current &&
198         echo "M elif" >expected &&
199         test_cmp expected current
200
201 '
202
203 test_expect_success 'amend commit to fix author' '
204
205         oldtick=$GIT_AUTHOR_DATE &&
206         test_tick &&
207         git reset --hard &&
208         git cat-file -p HEAD |
209         sed -e "s/author.*/author $author $oldtick/" \
210                 -e "s/^\(committer.*> \).*$/\1$GIT_COMMITTER_DATE/" > \
211                 expected &&
212         git commit --amend --author="$author" &&
213         git cat-file -p HEAD > current &&
214         test_cmp expected current
215
216 '
217
218 test_expect_success 'amend commit to fix date' '
219
220         test_tick &&
221         newtick=$GIT_AUTHOR_DATE &&
222         git reset --hard &&
223         git cat-file -p HEAD |
224         sed -e "s/author.*/author $author $newtick/" \
225                 -e "s/^\(committer.*> \).*$/\1$GIT_COMMITTER_DATE/" > \
226                 expected &&
227         git commit --amend --date="$newtick" &&
228         git cat-file -p HEAD > current &&
229         test_cmp expected current
230
231 '
232
233 test_expect_success 'commit complains about bogus date' '
234         test_must_fail git commit --amend --date=10.11.2010
235 '
236
237 test_expect_success 'sign off (1)' '
238
239         echo 1 >positive &&
240         git add positive &&
241         git commit -s -m "thank you" &&
242         git cat-file commit HEAD | sed -e "1,/^\$/d" >actual &&
243         (
244                 echo thank you
245                 echo
246                 git var GIT_COMMITTER_IDENT |
247                 sed -e "s/>.*/>/" -e "s/^/Signed-off-by: /"
248         ) >expected &&
249         test_cmp expected actual
250
251 '
252
253 test_expect_success 'sign off (2)' '
254
255         echo 2 >positive &&
256         git add positive &&
257         existing="Signed-off-by: Watch This <watchthis@example.com>" &&
258         git commit -s -m "thank you
259
260 $existing" &&
261         git cat-file commit HEAD | sed -e "1,/^\$/d" >actual &&
262         (
263                 echo thank you
264                 echo
265                 echo $existing
266                 git var GIT_COMMITTER_IDENT |
267                 sed -e "s/>.*/>/" -e "s/^/Signed-off-by: /"
268         ) >expected &&
269         test_cmp expected actual
270
271 '
272
273 test_expect_success 'signoff gap' '
274
275         echo 3 >positive &&
276         git add positive &&
277         alt="Alt-RFC-822-Header: Value" &&
278         git commit -s -m "welcome
279
280 $alt" &&
281         git cat-file commit HEAD | sed -e "1,/^\$/d" > actual &&
282         (
283                 echo welcome
284                 echo
285                 echo $alt
286                 git var GIT_COMMITTER_IDENT |
287                 sed -e "s/>.*/>/" -e "s/^/Signed-off-by: /"
288         ) >expected &&
289         test_cmp expected actual
290 '
291
292 test_expect_success 'signoff gap 2' '
293
294         echo 4 >positive &&
295         git add positive &&
296         alt="fixed: 34" &&
297         git commit -s -m "welcome
298
299 We have now
300 $alt" &&
301         git cat-file commit HEAD | sed -e "1,/^\$/d" > actual &&
302         (
303                 echo welcome
304                 echo
305                 echo We have now
306                 echo $alt
307                 echo
308                 git var GIT_COMMITTER_IDENT |
309                 sed -e "s/>.*/>/" -e "s/^/Signed-off-by: /"
310         ) >expected &&
311         test_cmp expected actual
312 '
313
314 test_expect_success 'multiple -m' '
315
316         >negative &&
317         git add negative &&
318         git commit -m "one" -m "two" -m "three" &&
319         git cat-file commit HEAD | sed -e "1,/^\$/d" >actual &&
320         (
321                 echo one
322                 echo
323                 echo two
324                 echo
325                 echo three
326         ) >expected &&
327         test_cmp expected actual
328
329 '
330
331 test_expect_success 'amend commit to fix author' '
332
333         oldtick=$GIT_AUTHOR_DATE &&
334         test_tick &&
335         git reset --hard &&
336         git cat-file -p HEAD |
337         sed -e "s/author.*/author $author $oldtick/" \
338                 -e "s/^\(committer.*> \).*$/\1$GIT_COMMITTER_DATE/" > \
339                 expected &&
340         git commit --amend --author="$author" &&
341         git cat-file -p HEAD > current &&
342         test_cmp expected current
343
344 '
345
346 test_expect_success 'git commit <file> with dirty index' '
347         echo tacocat > elif &&
348         echo tehlulz > chz &&
349         git add chz &&
350         git commit elif -m "tacocat is a palindrome" &&
351         git show --stat | grep elif &&
352         git diff --cached | grep chz
353 '
354
355 test_expect_success 'same tree (single parent)' '
356
357         git reset --hard &&
358         test_must_fail git commit -m empty
359
360 '
361
362 test_expect_success 'same tree (single parent) --allow-empty' '
363
364         git commit --allow-empty -m "forced empty" &&
365         git cat-file commit HEAD | grep forced
366
367 '
368
369 test_expect_success 'same tree (merge and amend merge)' '
370
371         git checkout -b side HEAD^ &&
372         echo zero >zero &&
373         git add zero &&
374         git commit -m "add zero" &&
375         git checkout master &&
376
377         git merge -s ours side -m "empty ok" &&
378         git diff HEAD^ HEAD >actual &&
379         : >expected &&
380         test_cmp expected actual &&
381
382         git commit --amend -m "empty really ok" &&
383         git diff HEAD^ HEAD >actual &&
384         : >expected &&
385         test_cmp expected actual
386
387 '
388
389 test_expect_success 'amend using the message from another commit' '
390
391         git reset --hard &&
392         test_tick &&
393         git commit --allow-empty -m "old commit" &&
394         old=$(git rev-parse --verify HEAD) &&
395         test_tick &&
396         git commit --allow-empty -m "new commit" &&
397         new=$(git rev-parse --verify HEAD) &&
398         test_tick &&
399         git commit --allow-empty --amend -C "$old" &&
400         git show --pretty="format:%ad %s" "$old" >expected &&
401         git show --pretty="format:%ad %s" HEAD >actual &&
402         test_cmp expected actual
403
404 '
405
406 test_expect_success 'amend using the message from a commit named with tag' '
407
408         git reset --hard &&
409         test_tick &&
410         git commit --allow-empty -m "old commit" &&
411         old=$(git rev-parse --verify HEAD) &&
412         git tag -a -m "tag on old" tagged-old HEAD &&
413         test_tick &&
414         git commit --allow-empty -m "new commit" &&
415         new=$(git rev-parse --verify HEAD) &&
416         test_tick &&
417         git commit --allow-empty --amend -C tagged-old &&
418         git show --pretty="format:%ad %s" "$old" >expected &&
419         git show --pretty="format:%ad %s" HEAD >actual &&
420         test_cmp expected actual
421
422 '
423
424 test_expect_success 'amend can copy notes' '
425
426         git config notes.rewrite.amend true &&
427         git config notes.rewriteRef "refs/notes/*" &&
428         test_commit foo &&
429         git notes add -m"a note" &&
430         test_tick &&
431         git commit --amend -m"new foo" &&
432         test "$(git notes show)" = "a note"
433
434 '
435
436 test_done