1#!/bin/sh
2
3test_description='git am running'
4
5. ./test-lib.sh
6
7test_expect_success 'setup: messages' '
8 cat >msg <<-\EOF &&
9 second
10
11 Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, sed diam nonumy
12 eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
13 voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita
14 kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem
15 ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod
16 tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At
17 vero eos et accusam et justo duo dolores et ea rebum.
18
19 EOF
20 qz_to_tab_space <<-\EOF >>msg &&
21 QDuis autem vel eum iriure dolor in hendrerit in vulputate velit
22 Qesse molestie consequat, vel illum dolore eu feugiat nulla facilisis
23 Qat vero eros et accumsan et iusto odio dignissim qui blandit
24 Qpraesent luptatum zzril delenit augue duis dolore te feugait nulla
25 Qfacilisi.
26 EOF
27 cat >>msg <<-\EOF &&
28
29 Lorem ipsum dolor sit amet,
30 consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut
31 laoreet dolore magna aliquam erat volutpat.
32
33 git
34 ---
35 +++
36
37 Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit
38 lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure
39 dolor in hendrerit in vulputate velit esse molestie consequat, vel illum
40 dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio
41 dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te
42 feugait nulla facilisi.
43 EOF
44
45 cat >failmail <<-\EOF &&
46 From foo@example.com Fri May 23 10:43:49 2008
47 From: foo@example.com
48 To: bar@example.com
49 Subject: Re: [RFC/PATCH] git-foo.sh
50 Date: Fri, 23 May 2008 05:23:42 +0200
51
52 Sometimes we have to find out that there'\''s nothing left.
53
54 EOF
55
56 cat >pine <<-\EOF &&
57 From MAILER-DAEMON Fri May 23 10:43:49 2008
58 Date: 23 May 2008 05:23:42 +0200
59 From: Mail System Internal Data <MAILER-DAEMON@example.com>
60 Subject: DON'\''T DELETE THIS MESSAGE -- FOLDER INTERNAL DATA
61 Message-ID: <foo-0001@example.com>
62
63 This text is part of the internal format of your mail folder, and is not
64 a real message. It is created automatically by the mail system software.
65 If deleted, important folder data will be lost, and it will be re-created
66 with the data reset to initial values.
67
68 EOF
69
70 cat >scissors-msg <<-\EOF &&
71 Test git-am with scissors line
72
73 This line should be included in the commit message.
74 EOF
75
76 cat - scissors-msg >no-scissors-msg <<-\EOF &&
77 This line should not be included in the commit message with --scissors enabled.
78
79 - - >8 - - remove everything above this line - - >8 - -
80
81 EOF
82
83 signoff="Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>"
84'
85
86test_expect_success setup '
87 echo hello >file &&
88 git add file &&
89 test_tick &&
90 git commit -m first &&
91 git tag first &&
92
93 echo world >>file &&
94 git add file &&
95 test_tick &&
96 git commit -s -F msg &&
97 git tag second &&
98
99 git format-patch --stdout first >patch1 &&
100 {
101 echo "Message-Id: <1226501681-24923-1-git-send-email-bda@mnsspb.ru>" &&
102 echo "X-Fake-Field: Line One" &&
103 echo "X-Fake-Field: Line Two" &&
104 echo "X-Fake-Field: Line Three" &&
105 git format-patch --stdout first | sed -e "1d"
106 } > patch1.eml &&
107 {
108 echo "X-Fake-Field: Line One" &&
109 echo "X-Fake-Field: Line Two" &&
110 echo "X-Fake-Field: Line Three" &&
111 git format-patch --stdout first | sed -e "1d"
112 } | append_cr >patch1-crlf.eml &&
113 {
114 printf "%255s\\n" ""
115 echo "X-Fake-Field: Line One" &&
116 echo "X-Fake-Field: Line Two" &&
117 echo "X-Fake-Field: Line Three" &&
118 git format-patch --stdout first | sed -e "1d"
119 } > patch1-ws.eml &&
120 {
121 sed -ne "1p" msg &&
122 echo &&
123 echo "From: $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL>" &&
124 echo "Date: $GIT_AUTHOR_DATE" &&
125 echo &&
126 sed -e "1,2d" msg &&
127 echo &&
128 echo "Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>" &&
129 echo "---" &&
130 git diff-tree --no-commit-id --stat -p second
131 } >patch1-stgit.eml &&
132 mkdir stgit-series &&
133 cp patch1-stgit.eml stgit-series/patch &&
134 {
135 echo "# This series applies on GIT commit $(git rev-parse first)" &&
136 echo "patch"
137 } >stgit-series/series &&
138 {
139 echo "# HG changeset patch" &&
140 echo "# User $GIT_AUTHOR_NAME <$GIT_AUTHOR_EMAIL>" &&
141 echo "# Date $test_tick 25200" &&
142 echo "# $(git show --pretty="%aD" -s second)" &&
143 echo "# Node ID $_z40" &&
144 echo "# Parent $_z40" &&
145 cat msg &&
146 echo &&
147 echo "Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>" &&
148 echo &&
149 git diff-tree --no-commit-id -p second
150 } >patch1-hg.eml &&
151
152
153 echo scissors-file >scissors-file &&
154 git add scissors-file &&
155 git commit -F scissors-msg &&
156 git tag scissors &&
157 git format-patch --stdout scissors^ >scissors-patch.eml &&
158 git reset --hard HEAD^ &&
159
160 echo no-scissors-file >no-scissors-file &&
161 git add no-scissors-file &&
162 git commit -F no-scissors-msg &&
163 git tag no-scissors &&
164 git format-patch --stdout no-scissors^ >no-scissors-patch.eml &&
165 git reset --hard HEAD^ &&
166
167 sed -n -e "3,\$p" msg >file &&
168 git add file &&
169 test_tick &&
170 git commit -m third &&
171
172 git format-patch --stdout first >patch2 &&
173
174 git checkout -b lorem &&
175 sed -n -e "11,\$p" msg >file &&
176 head -n 9 msg >>file &&
177 test_tick &&
178 git commit -a -m "moved stuff" &&
179
180 echo goodbye >another &&
181 git add another &&
182 test_tick &&
183 git commit -m "added another file" &&
184
185 git format-patch --stdout master >lorem-move.patch &&
186 git format-patch --no-prefix --stdout master >lorem-zero.patch &&
187
188 git checkout -b rename &&
189 git mv file renamed &&
190 git commit -m "renamed a file" &&
191
192 git format-patch -M --stdout lorem >rename.patch &&
193
194 git reset --soft lorem^ &&
195 git commit -m "renamed a file and added another" &&
196
197 git format-patch -M --stdout lorem^ >rename-add.patch &&
198
199 # reset time
200 sane_unset test_tick &&
201 test_tick
202'
203
204test_expect_success 'am applies patch correctly' '
205 rm -fr .git/rebase-apply &&
206 git reset --hard &&
207 git checkout first &&
208 test_tick &&
209 git am <patch1 &&
210 test_path_is_missing .git/rebase-apply &&
211 git diff --exit-code second &&
212 test "$(git rev-parse second)" = "$(git rev-parse HEAD)" &&
213 test "$(git rev-parse second^)" = "$(git rev-parse HEAD^)"
214'
215
216test_expect_success 'am fails if index is dirty' '
217 test_when_finished "rm -f dirtyfile" &&
218 rm -fr .git/rebase-apply &&
219 git reset --hard &&
220 git checkout first &&
221 echo dirtyfile >dirtyfile &&
222 git add dirtyfile &&
223 test_must_fail git am patch1 &&
224 test_path_is_dir .git/rebase-apply &&
225 test_cmp_rev first HEAD
226'
227
228test_expect_success 'am applies patch e-mail not in a mbox' '
229 rm -fr .git/rebase-apply &&
230 git reset --hard &&
231 git checkout first &&
232 git am patch1.eml &&
233 test_path_is_missing .git/rebase-apply &&
234 git diff --exit-code second &&
235 test "$(git rev-parse second)" = "$(git rev-parse HEAD)" &&
236 test "$(git rev-parse second^)" = "$(git rev-parse HEAD^)"
237'
238
239test_expect_success 'am applies patch e-mail not in a mbox with CRLF' '
240 rm -fr .git/rebase-apply &&
241 git reset --hard &&
242 git checkout first &&
243 git am patch1-crlf.eml &&
244 test_path_is_missing .git/rebase-apply &&
245 git diff --exit-code second &&
246 test "$(git rev-parse second)" = "$(git rev-parse HEAD)" &&
247 test "$(git rev-parse second^)" = "$(git rev-parse HEAD^)"
248'
249
250test_expect_success 'am applies patch e-mail with preceding whitespace' '
251 rm -fr .git/rebase-apply &&
252 git reset --hard &&
253 git checkout first &&
254 git am patch1-ws.eml &&
255 test_path_is_missing .git/rebase-apply &&
256 git diff --exit-code second &&
257 test "$(git rev-parse second)" = "$(git rev-parse HEAD)" &&
258 test "$(git rev-parse second^)" = "$(git rev-parse HEAD^)"
259'
260
261test_expect_success 'am applies stgit patch' '
262 rm -fr .git/rebase-apply &&
263 git checkout -f first &&
264 git am patch1-stgit.eml &&
265 test_path_is_missing .git/rebase-apply &&
266 git diff --exit-code second &&
267 test_cmp_rev second HEAD &&
268 test_cmp_rev second^ HEAD^
269'
270
271test_expect_success 'am --patch-format=stgit applies stgit patch' '
272 rm -fr .git/rebase-apply &&
273 git checkout -f first &&
274 git am --patch-format=stgit <patch1-stgit.eml &&
275 test_path_is_missing .git/rebase-apply &&
276 git diff --exit-code second &&
277 test_cmp_rev second HEAD &&
278 test_cmp_rev second^ HEAD^
279'
280
281test_expect_success 'am applies stgit series' '
282 rm -fr .git/rebase-apply &&
283 git checkout -f first &&
284 git am stgit-series/series &&
285 test_path_is_missing .git/rebase-apply &&
286 git diff --exit-code second &&
287 test_cmp_rev second HEAD &&
288 test_cmp_rev second^ HEAD^
289'
290
291test_expect_success 'am applies hg patch' '
292 rm -fr .git/rebase-apply &&
293 git checkout -f first &&
294 git am patch1-hg.eml &&
295 test_path_is_missing .git/rebase-apply &&
296 git diff --exit-code second &&
297 test_cmp_rev second HEAD &&
298 test_cmp_rev second^ HEAD^
299'
300
301test_expect_success 'am --patch-format=hg applies hg patch' '
302 rm -fr .git/rebase-apply &&
303 git checkout -f first &&
304 git am --patch-format=hg <patch1-hg.eml &&
305 test_path_is_missing .git/rebase-apply &&
306 git diff --exit-code second &&
307 test_cmp_rev second HEAD &&
308 test_cmp_rev second^ HEAD^
309'
310
311test_expect_success 'am with applypatch-msg hook' '
312 test_when_finished "rm -f .git/hooks/applypatch-msg" &&
313 rm -fr .git/rebase-apply &&
314 git reset --hard &&
315 git checkout first &&
316 mkdir -p .git/hooks &&
317 write_script .git/hooks/applypatch-msg <<-\EOF &&
318 cat "$1" >actual-msg &&
319 echo hook-message >"$1"
320 EOF
321 git am patch1 &&
322 test_path_is_missing .git/rebase-apply &&
323 git diff --exit-code second &&
324 echo hook-message >expected &&
325 git log -1 --format=format:%B >actual &&
326 test_cmp expected actual &&
327 git log -1 --format=format:%B second >expected &&
328 test_cmp expected actual-msg
329'
330
331test_expect_success 'am with failing applypatch-msg hook' '
332 test_when_finished "rm -f .git/hooks/applypatch-msg" &&
333 rm -fr .git/rebase-apply &&
334 git reset --hard &&
335 git checkout first &&
336 mkdir -p .git/hooks &&
337 write_script .git/hooks/applypatch-msg <<-\EOF &&
338 exit 1
339 EOF
340 test_must_fail git am patch1 &&
341 test_path_is_dir .git/rebase-apply &&
342 git diff --exit-code first &&
343 test_cmp_rev first HEAD
344'
345
346test_expect_success 'am with pre-applypatch hook' '
347 test_when_finished "rm -f .git/hooks/pre-applypatch" &&
348 rm -fr .git/rebase-apply &&
349 git reset --hard &&
350 git checkout first &&
351 mkdir -p .git/hooks &&
352 write_script .git/hooks/pre-applypatch <<-\EOF &&
353 git diff first >diff.actual
354 exit 0
355 EOF
356 git am patch1 &&
357 test_path_is_missing .git/rebase-apply &&
358 git diff --exit-code second &&
359 test_cmp_rev second HEAD &&
360 git diff first..second >diff.expected &&
361 test_cmp diff.expected diff.actual
362'
363
364test_expect_success 'am with failing pre-applypatch hook' '
365 test_when_finished "rm -f .git/hooks/pre-applypatch" &&
366 rm -fr .git/rebase-apply &&
367 git reset --hard &&
368 git checkout first &&
369 mkdir -p .git/hooks &&
370 write_script .git/hooks/pre-applypatch <<-\EOF &&
371 exit 1
372 EOF
373 test_must_fail git am patch1 &&
374 test_path_is_dir .git/rebase-apply &&
375 git diff --exit-code second &&
376 test_cmp_rev first HEAD
377'
378
379test_expect_success 'am with post-applypatch hook' '
380 test_when_finished "rm -f .git/hooks/post-applypatch" &&
381 rm -fr .git/rebase-apply &&
382 git reset --hard &&
383 git checkout first &&
384 mkdir -p .git/hooks &&
385 write_script .git/hooks/post-applypatch <<-\EOF &&
386 git rev-parse HEAD >head.actual
387 git diff second >diff.actual
388 exit 0
389 EOF
390 git am patch1 &&
391 test_path_is_missing .git/rebase-apply &&
392 test_cmp_rev second HEAD &&
393 git rev-parse second >head.expected &&
394 test_cmp head.expected head.actual &&
395 git diff second >diff.expected &&
396 test_cmp diff.expected diff.actual
397'
398
399test_expect_success 'am with failing post-applypatch hook' '
400 test_when_finished "rm -f .git/hooks/post-applypatch" &&
401 rm -fr .git/rebase-apply &&
402 git reset --hard &&
403 git checkout first &&
404 mkdir -p .git/hooks &&
405 write_script .git/hooks/post-applypatch <<-\EOF &&
406 git rev-parse HEAD >head.actual
407 exit 1
408 EOF
409 git am patch1 &&
410 test_path_is_missing .git/rebase-apply &&
411 git diff --exit-code second &&
412 test_cmp_rev second HEAD &&
413 git rev-parse second >head.expected &&
414 test_cmp head.expected head.actual
415'
416
417test_expect_success 'am --scissors cuts the message at the scissors line' '
418 rm -fr .git/rebase-apply &&
419 git reset --hard &&
420 git checkout second &&
421 git am --scissors scissors-patch.eml &&
422 test_path_is_missing .git/rebase-apply &&
423 git diff --exit-code scissors &&
424 test_cmp_rev scissors HEAD
425'
426
427test_expect_success 'am --no-scissors overrides mailinfo.scissors' '
428 rm -fr .git/rebase-apply &&
429 git reset --hard &&
430 git checkout second &&
431 test_config mailinfo.scissors true &&
432 git am --no-scissors no-scissors-patch.eml &&
433 test_path_is_missing .git/rebase-apply &&
434 git diff --exit-code no-scissors &&
435 test_cmp_rev no-scissors HEAD
436'
437
438test_expect_success 'setup: new author and committer' '
439 GIT_AUTHOR_NAME="Another Thor" &&
440 GIT_AUTHOR_EMAIL="a.thor@example.com" &&
441 GIT_COMMITTER_NAME="Co M Miter" &&
442 GIT_COMMITTER_EMAIL="c.miter@example.com" &&
443 export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_COMMITTER_NAME GIT_COMMITTER_EMAIL
444'
445
446compare () {
447 a=$(git cat-file commit "$2" | grep "^$1 ") &&
448 b=$(git cat-file commit "$3" | grep "^$1 ") &&
449 test "$a" = "$b"
450}
451
452test_expect_success 'am changes committer and keeps author' '
453 test_tick &&
454 rm -fr .git/rebase-apply &&
455 git reset --hard &&
456 git checkout first &&
457 git am patch2 &&
458 test_path_is_missing .git/rebase-apply &&
459 test "$(git rev-parse master^^)" = "$(git rev-parse HEAD^^)" &&
460 git diff --exit-code master..HEAD &&
461 git diff --exit-code master^..HEAD^ &&
462 compare author master HEAD &&
463 compare author master^ HEAD^ &&
464 test "$GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>" = \
465 "$(git log -1 --pretty=format:"%cn <%ce>" HEAD)"
466'
467
468test_expect_success 'am --signoff adds Signed-off-by: line' '
469 rm -fr .git/rebase-apply &&
470 git reset --hard &&
471 git checkout -b master2 first &&
472 git am --signoff <patch2 &&
473 printf "%s\n" "$signoff" >expected &&
474 echo "Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>" >>expected &&
475 git cat-file commit HEAD^ | grep "Signed-off-by:" >actual &&
476 test_cmp expected actual &&
477 echo "Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>" >expected &&
478 git cat-file commit HEAD | grep "Signed-off-by:" >actual &&
479 test_cmp expected actual
480'
481
482test_expect_success 'am stays in branch' '
483 echo refs/heads/master2 >expected &&
484 git symbolic-ref HEAD >actual &&
485 test_cmp expected actual
486'
487
488test_expect_success 'am --signoff does not add Signed-off-by: line if already there' '
489 git format-patch --stdout HEAD^ >patch3 &&
490 sed -e "/^Subject/ s,\[PATCH,Re: Re: Re: & 1/5 v2] [foo," patch3 >patch4 &&
491 rm -fr .git/rebase-apply &&
492 git reset --hard &&
493 git checkout HEAD^ &&
494 git am --signoff patch4 &&
495 git cat-file commit HEAD >actual &&
496 test $(grep -c "^Signed-off-by:" actual) -eq 1
497'
498
499test_expect_success 'am without --keep removes Re: and [PATCH] stuff' '
500 git rev-parse HEAD >expected &&
501 git rev-parse master2 >actual &&
502 test_cmp expected actual
503'
504
505test_expect_success 'am --keep really keeps the subject' '
506 rm -fr .git/rebase-apply &&
507 git reset --hard &&
508 git checkout HEAD^ &&
509 git am --keep patch4 &&
510 test_path_is_missing .git/rebase-apply &&
511 git cat-file commit HEAD >actual &&
512 grep "Re: Re: Re: \[PATCH 1/5 v2\] \[foo\] third" actual
513'
514
515test_expect_success 'am --keep-non-patch really keeps the non-patch part' '
516 rm -fr .git/rebase-apply &&
517 git reset --hard &&
518 git checkout HEAD^ &&
519 git am --keep-non-patch patch4 &&
520 test_path_is_missing .git/rebase-apply &&
521 git cat-file commit HEAD >actual &&
522 grep "^\[foo\] third" actual
523'
524
525test_expect_success 'setup am -3' '
526 rm -fr .git/rebase-apply &&
527 git reset --hard &&
528 git checkout -b base3way master2 &&
529 sed -n -e "3,\$p" msg >file &&
530 head -n 9 msg >>file &&
531 git add file &&
532 test_tick &&
533 git commit -m "copied stuff"
534'
535
536test_expect_success 'am -3 falls back to 3-way merge' '
537 rm -fr .git/rebase-apply &&
538 git reset --hard &&
539 git checkout -b lorem2 base3way &&
540 git am -3 lorem-move.patch &&
541 test_path_is_missing .git/rebase-apply &&
542 git diff --exit-code lorem
543'
544
545test_expect_success 'am -3 -p0 can read --no-prefix patch' '
546 rm -fr .git/rebase-apply &&
547 git reset --hard &&
548 git checkout -b lorem3 base3way &&
549 git am -3 -p0 lorem-zero.patch &&
550 test_path_is_missing .git/rebase-apply &&
551 git diff --exit-code lorem
552'
553
554test_expect_success 'am can rename a file' '
555 grep "^rename from" rename.patch &&
556 rm -fr .git/rebase-apply &&
557 git reset --hard &&
558 git checkout lorem^0 &&
559 git am rename.patch &&
560 test_path_is_missing .git/rebase-apply &&
561 git update-index --refresh &&
562 git diff --exit-code rename
563'
564
565test_expect_success 'am -3 can rename a file' '
566 grep "^rename from" rename.patch &&
567 rm -fr .git/rebase-apply &&
568 git reset --hard &&
569 git checkout lorem^0 &&
570 git am -3 rename.patch &&
571 test_path_is_missing .git/rebase-apply &&
572 git update-index --refresh &&
573 git diff --exit-code rename
574'
575
576test_expect_success 'am -3 can rename a file after falling back to 3-way merge' '
577 grep "^rename from" rename-add.patch &&
578 rm -fr .git/rebase-apply &&
579 git reset --hard &&
580 git checkout lorem^0 &&
581 git am -3 rename-add.patch &&
582 test_path_is_missing .git/rebase-apply &&
583 git update-index --refresh &&
584 git diff --exit-code rename
585'
586
587test_expect_success 'am -3 -q is quiet' '
588 rm -fr .git/rebase-apply &&
589 git checkout -f lorem2 &&
590 git reset base3way --hard &&
591 git am -3 -q lorem-move.patch >output.out 2>&1 &&
592 ! test -s output.out
593'
594
595test_expect_success 'am pauses on conflict' '
596 rm -fr .git/rebase-apply &&
597 git reset --hard &&
598 git checkout lorem2^^ &&
599 test_must_fail git am lorem-move.patch &&
600 test -d .git/rebase-apply
601'
602
603test_expect_success 'am --skip works' '
604 echo goodbye >expected &&
605 git am --skip &&
606 test_path_is_missing .git/rebase-apply &&
607 git diff --exit-code lorem2^^ -- file &&
608 test_cmp expected another
609'
610
611test_expect_success 'am --abort removes a stray directory' '
612 mkdir .git/rebase-apply &&
613 git am --abort &&
614 test_path_is_missing .git/rebase-apply
615'
616
617test_expect_success 'am refuses patches when paused' '
618 rm -fr .git/rebase-apply &&
619 git reset --hard &&
620 git checkout lorem2^^ &&
621
622 test_must_fail git am lorem-move.patch &&
623 test_path_is_dir .git/rebase-apply &&
624 test_cmp_rev lorem2^^ HEAD &&
625
626 test_must_fail git am <lorem-move.patch &&
627 test_path_is_dir .git/rebase-apply &&
628 test_cmp_rev lorem2^^ HEAD
629'
630
631test_expect_success 'am --resolved works' '
632 echo goodbye >expected &&
633 rm -fr .git/rebase-apply &&
634 git reset --hard &&
635 git checkout lorem2^^ &&
636 test_must_fail git am lorem-move.patch &&
637 test -d .git/rebase-apply &&
638 echo resolved >>file &&
639 git add file &&
640 git am --resolved &&
641 test_path_is_missing .git/rebase-apply &&
642 test_cmp expected another
643'
644
645test_expect_success 'am --resolved fails if index has no changes' '
646 rm -fr .git/rebase-apply &&
647 git reset --hard &&
648 git checkout lorem2^^ &&
649 test_must_fail git am lorem-move.patch &&
650 test_path_is_dir .git/rebase-apply &&
651 test_cmp_rev lorem2^^ HEAD &&
652 test_must_fail git am --resolved &&
653 test_path_is_dir .git/rebase-apply &&
654 test_cmp_rev lorem2^^ HEAD
655'
656
657test_expect_success 'am --resolved fails if index has unmerged entries' '
658 rm -fr .git/rebase-apply &&
659 git reset --hard &&
660 git checkout second &&
661 test_must_fail git am -3 lorem-move.patch &&
662 test_path_is_dir .git/rebase-apply &&
663 test_cmp_rev second HEAD &&
664 test_must_fail git am --resolved >err &&
665 test_path_is_dir .git/rebase-apply &&
666 test_cmp_rev second HEAD &&
667 test_i18ngrep "still have unmerged paths" err
668'
669
670test_expect_success 'am takes patches from a Pine mailbox' '
671 rm -fr .git/rebase-apply &&
672 git reset --hard &&
673 git checkout first &&
674 cat pine patch1 | git am &&
675 test_path_is_missing .git/rebase-apply &&
676 git diff --exit-code master^..HEAD
677'
678
679test_expect_success 'am fails on mail without patch' '
680 rm -fr .git/rebase-apply &&
681 git reset --hard &&
682 test_must_fail git am <failmail &&
683 git am --abort &&
684 test_path_is_missing .git/rebase-apply
685'
686
687test_expect_success 'am fails on empty patch' '
688 rm -fr .git/rebase-apply &&
689 git reset --hard &&
690 echo "---" >>failmail &&
691 test_must_fail git am <failmail &&
692 git am --skip &&
693 test_path_is_missing .git/rebase-apply
694'
695
696test_expect_success 'am works from stdin in subdirectory' '
697 rm -fr subdir &&
698 rm -fr .git/rebase-apply &&
699 git reset --hard &&
700 git checkout first &&
701 (
702 mkdir -p subdir &&
703 cd subdir &&
704 git am <../patch1
705 ) &&
706 git diff --exit-code second
707'
708
709test_expect_success 'am works from file (relative path given) in subdirectory' '
710 rm -fr subdir &&
711 rm -fr .git/rebase-apply &&
712 git reset --hard &&
713 git checkout first &&
714 (
715 mkdir -p subdir &&
716 cd subdir &&
717 git am ../patch1
718 ) &&
719 git diff --exit-code second
720'
721
722test_expect_success 'am works from file (absolute path given) in subdirectory' '
723 rm -fr subdir &&
724 rm -fr .git/rebase-apply &&
725 git reset --hard &&
726 git checkout first &&
727 P=$(pwd) &&
728 (
729 mkdir -p subdir &&
730 cd subdir &&
731 git am "$P/patch1"
732 ) &&
733 git diff --exit-code second
734'
735
736test_expect_success 'am --committer-date-is-author-date' '
737 rm -fr .git/rebase-apply &&
738 git reset --hard &&
739 git checkout first &&
740 test_tick &&
741 git am --committer-date-is-author-date patch1 &&
742 git cat-file commit HEAD | sed -e "/^\$/q" >head1 &&
743 sed -ne "/^author /s/.*> //p" head1 >at &&
744 sed -ne "/^committer /s/.*> //p" head1 >ct &&
745 test_cmp at ct
746'
747
748test_expect_success 'am without --committer-date-is-author-date' '
749 rm -fr .git/rebase-apply &&
750 git reset --hard &&
751 git checkout first &&
752 test_tick &&
753 git am patch1 &&
754 git cat-file commit HEAD | sed -e "/^\$/q" >head1 &&
755 sed -ne "/^author /s/.*> //p" head1 >at &&
756 sed -ne "/^committer /s/.*> //p" head1 >ct &&
757 ! test_cmp at ct
758'
759
760# This checks for +0000 because TZ is set to UTC and that should
761# show up when the current time is used. The date in message is set
762# by test_tick that uses -0700 timezone; if this feature does not
763# work, we will see that instead of +0000.
764test_expect_success 'am --ignore-date' '
765 rm -fr .git/rebase-apply &&
766 git reset --hard &&
767 git checkout first &&
768 test_tick &&
769 git am --ignore-date patch1 &&
770 git cat-file commit HEAD | sed -e "/^\$/q" >head1 &&
771 sed -ne "/^author /s/.*> //p" head1 >at &&
772 grep "+0000" at
773'
774
775test_expect_success 'am into an unborn branch' '
776 git rev-parse first^{tree} >expected &&
777 rm -fr .git/rebase-apply &&
778 git reset --hard &&
779 rm -fr subdir &&
780 mkdir subdir &&
781 git format-patch --numbered-files -o subdir -1 first &&
782 (
783 cd subdir &&
784 git init &&
785 git am 1
786 ) &&
787 (
788 cd subdir &&
789 git rev-parse HEAD^{tree} >../actual
790 ) &&
791 test_cmp expected actual
792'
793
794test_expect_success 'am newline in subject' '
795 rm -fr .git/rebase-apply &&
796 git reset --hard &&
797 git checkout first &&
798 test_tick &&
799 sed -e "s/second/second \\\n foo/" patch1 >patchnl &&
800 git am <patchnl >output.out 2>&1 &&
801 test_i18ngrep "^Applying: second \\\n foo$" output.out
802'
803
804test_expect_success 'am -q is quiet' '
805 rm -fr .git/rebase-apply &&
806 git reset --hard &&
807 git checkout first &&
808 test_tick &&
809 git am -q <patch1 >output.out 2>&1 &&
810 ! test -s output.out
811'
812
813test_expect_success 'am empty-file does not infloop' '
814 rm -fr .git/rebase-apply &&
815 git reset --hard &&
816 touch empty-file &&
817 test_tick &&
818 test_must_fail git am empty-file 2>actual &&
819 echo Patch format detection failed. >expected &&
820 test_i18ncmp expected actual
821'
822
823test_expect_success 'am --message-id really adds the message id' '
824 rm -fr .git/rebase-apply &&
825 git reset --hard &&
826 git checkout HEAD^ &&
827 git am --message-id patch1.eml &&
828 test_path_is_missing .git/rebase-apply &&
829 git cat-file commit HEAD | tail -n1 >actual &&
830 grep Message-Id patch1.eml >expected &&
831 test_cmp expected actual
832'
833
834test_expect_success 'am.messageid really adds the message id' '
835 rm -fr .git/rebase-apply &&
836 git reset --hard &&
837 git checkout HEAD^ &&
838 test_config am.messageid true &&
839 git am patch1.eml &&
840 test_path_is_missing .git/rebase-apply &&
841 git cat-file commit HEAD | tail -n1 >actual &&
842 grep Message-Id patch1.eml >expected &&
843 test_cmp expected actual
844'
845
846test_expect_success 'am --message-id -s signs off after the message id' '
847 rm -fr .git/rebase-apply &&
848 git reset --hard &&
849 git checkout HEAD^ &&
850 git am -s --message-id patch1.eml &&
851 test_path_is_missing .git/rebase-apply &&
852 git cat-file commit HEAD | tail -n2 | head -n1 >actual &&
853 grep Message-Id patch1.eml >expected &&
854 test_cmp expected actual
855'
856
857test_done