3 test_description='git am running'
7 test_expect_success 'setup: messages' '
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.
20 q_to_tab <<-\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
29 Lorem ipsum dolor sit amet,
30 consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut
31 laoreet dolore magna aliquam erat volutpat.
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.
45 cat >failmail <<-\EOF &&
46 From foo@example.com Fri May 23 10:43:49 2008
49 Subject: Re: [RFC/PATCH] git-foo.sh
50 Date: Fri, 23 May 2008 05:23:42 +0200
52 Sometimes we have to find out that there'\''s nothing left.
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>
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.
70 signoff="Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>"
73 test_expect_success setup '
77 git commit -m first &&
83 git commit -s -F msg &&
86 git format-patch --stdout first >patch1 &&
88 echo "X-Fake-Field: Line One" &&
89 echo "X-Fake-Field: Line Two" &&
90 echo "X-Fake-Field: Line Three" &&
91 git format-patch --stdout first | sed -e "1d"
94 echo "X-Fake-Field: Line One" &&
95 echo "X-Fake-Field: Line Two" &&
96 echo "X-Fake-Field: Line Three" &&
97 git format-patch --stdout first | sed -e "1d"
98 } | append_cr >patch1-crlf.eml &&
100 sed -n -e "3,\$p" msg >file &&
103 git commit -m third &&
105 git format-patch --stdout first >patch2 &&
107 git checkout -b lorem &&
108 sed -n -e "11,\$p" msg >file &&
109 head -n 9 msg >>file &&
111 git commit -a -m "moved stuff" &&
113 echo goodbye >another &&
116 git commit -m "added another file" &&
118 git format-patch --stdout master >lorem-move.patch &&
120 git checkout -b rename &&
121 git mv file renamed &&
122 git commit -m "renamed a file" &&
124 git format-patch -M --stdout lorem >rename.patch &&
126 git reset --soft lorem^ &&
127 git commit -m "renamed a file and added another" &&
129 git format-patch -M --stdout lorem^ >rename-add.patch &&
136 test_expect_success 'am applies patch correctly' '
137 rm -fr .git/rebase-apply &&
139 git checkout first &&
142 ! test -d .git/rebase-apply &&
143 git diff --exit-code second &&
144 test "$(git rev-parse second)" = "$(git rev-parse HEAD)" &&
145 test "$(git rev-parse second^)" = "$(git rev-parse HEAD^)"
148 test_expect_success 'am applies patch e-mail not in a mbox' '
149 rm -fr .git/rebase-apply &&
151 git checkout first &&
153 ! test -d .git/rebase-apply &&
154 git diff --exit-code second &&
155 test "$(git rev-parse second)" = "$(git rev-parse HEAD)" &&
156 test "$(git rev-parse second^)" = "$(git rev-parse HEAD^)"
159 test_expect_success 'am applies patch e-mail not in a mbox with CRLF' '
160 rm -fr .git/rebase-apply &&
162 git checkout first &&
163 git am patch1-crlf.eml &&
164 ! test -d .git/rebase-apply &&
165 git diff --exit-code second &&
166 test "$(git rev-parse second)" = "$(git rev-parse HEAD)" &&
167 test "$(git rev-parse second^)" = "$(git rev-parse HEAD^)"
170 test_expect_success 'setup: new author and committer' '
171 GIT_AUTHOR_NAME="Another Thor" &&
172 GIT_AUTHOR_EMAIL="a.thor@example.com" &&
173 GIT_COMMITTER_NAME="Co M Miter" &&
174 GIT_COMMITTER_EMAIL="c.miter@example.com" &&
175 export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_COMMITTER_NAME GIT_COMMITTER_EMAIL
179 a=$(git cat-file commit "$2" | grep "^$1 ") &&
180 b=$(git cat-file commit "$3" | grep "^$1 ") &&
184 test_expect_success 'am changes committer and keeps author' '
186 rm -fr .git/rebase-apply &&
188 git checkout first &&
190 ! test -d .git/rebase-apply &&
191 test "$(git rev-parse master^^)" = "$(git rev-parse HEAD^^)" &&
192 git diff --exit-code master..HEAD &&
193 git diff --exit-code master^..HEAD^ &&
194 compare author master HEAD &&
195 compare author master^ HEAD^ &&
196 test "$GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>" = \
197 "$(git log -1 --pretty=format:"%cn <%ce>" HEAD)"
200 test_expect_success 'am --signoff adds Signed-off-by: line' '
201 rm -fr .git/rebase-apply &&
203 git checkout -b master2 first &&
204 git am --signoff <patch2 &&
205 printf "%s\n" "$signoff" >expected &&
206 echo "Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>" >>expected &&
207 git cat-file commit HEAD^ | grep "Signed-off-by:" >actual &&
208 test_cmp expected actual &&
209 echo "Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>" >expected &&
210 git cat-file commit HEAD | grep "Signed-off-by:" >actual &&
211 test_cmp expected actual
214 test_expect_success 'am stays in branch' '
215 echo refs/heads/master2 >expected &&
216 git symbolic-ref HEAD >actual &&
217 test_cmp expected actual
220 test_expect_success 'am --signoff does not add Signed-off-by: line if already there' '
221 git format-patch --stdout HEAD^ >patch3 &&
222 sed -e "/^Subject/ s,\[PATCH,Re: Re: Re: & 1/5 v2," patch3 >patch4
223 rm -fr .git/rebase-apply &&
225 git checkout HEAD^ &&
226 git am --signoff patch4 &&
227 git cat-file commit HEAD >actual &&
228 test $(grep -c "^Signed-off-by:" actual) -eq 1
231 test_expect_success 'am without --keep removes Re: and [PATCH] stuff' '
232 git rev-parse HEAD >expected &&
233 git rev-parse master2 >actual &&
234 test_cmp expected actual
237 test_expect_success 'am --keep really keeps the subject' '
238 rm -fr .git/rebase-apply &&
240 git checkout HEAD^ &&
241 git am --keep patch4 &&
242 ! test -d .git/rebase-apply &&
243 git cat-file commit HEAD >actual &&
244 grep "Re: Re: Re: \[PATCH 1/5 v2\] third" actual
247 test_expect_success 'am -3 falls back to 3-way merge' '
248 rm -fr .git/rebase-apply &&
250 git checkout -b lorem2 master2 &&
251 sed -n -e "3,\$p" msg >file &&
252 head -n 9 msg >>file &&
255 git commit -m "copied stuff" &&
256 git am -3 lorem-move.patch &&
257 ! test -d .git/rebase-apply &&
258 git diff --exit-code lorem
261 test_expect_success 'am can rename a file' '
262 grep "^rename from" rename.patch &&
263 rm -fr .git/rebase-apply &&
265 git checkout lorem^0 &&
266 git am rename.patch &&
267 ! test -d .git/rebase-apply &&
268 git update-index --refresh &&
269 git diff --exit-code rename
272 test_expect_success 'am -3 can rename a file' '
273 grep "^rename from" rename.patch &&
274 rm -fr .git/rebase-apply &&
276 git checkout lorem^0 &&
277 git am -3 rename.patch &&
278 ! test -d .git/rebase-apply &&
279 git update-index --refresh &&
280 git diff --exit-code rename
283 test_expect_success 'am -3 can rename a file after falling back to 3-way merge' '
284 grep "^rename from" rename-add.patch &&
285 rm -fr .git/rebase-apply &&
287 git checkout lorem^0 &&
288 git am -3 rename-add.patch &&
289 ! test -d .git/rebase-apply &&
290 git update-index --refresh &&
291 git diff --exit-code rename
294 test_expect_success 'am -3 -q is quiet' '
295 rm -fr .git/rebase-apply &&
296 git checkout -f lorem2 &&
297 git reset master2 --hard &&
298 sed -n -e "3,\$p" msg >file &&
299 head -n 9 msg >>file &&
302 git commit -m "copied stuff" &&
303 git am -3 -q lorem-move.patch >output.out 2>&1 &&
307 test_expect_success 'am pauses on conflict' '
308 rm -fr .git/rebase-apply &&
310 git checkout lorem2^^ &&
311 test_must_fail git am lorem-move.patch &&
312 test -d .git/rebase-apply
315 test_expect_success 'am --skip works' '
316 echo goodbye >expected &&
318 ! test -d .git/rebase-apply &&
319 git diff --exit-code lorem2^^ -- file &&
320 test_cmp expected another
323 test_expect_success 'am --resolved works' '
324 echo goodbye >expected &&
325 rm -fr .git/rebase-apply &&
327 git checkout lorem2^^ &&
328 test_must_fail git am lorem-move.patch &&
329 test -d .git/rebase-apply &&
330 echo resolved >>file &&
333 ! test -d .git/rebase-apply &&
334 test_cmp expected another
337 test_expect_success 'am takes patches from a Pine mailbox' '
338 rm -fr .git/rebase-apply &&
340 git checkout first &&
341 cat pine patch1 | git am &&
342 ! test -d .git/rebase-apply &&
343 git diff --exit-code master^..HEAD
346 test_expect_success 'am fails on mail without patch' '
347 rm -fr .git/rebase-apply &&
349 test_must_fail git am <failmail &&
351 ! test -d .git/rebase-apply
354 test_expect_success 'am fails on empty patch' '
355 rm -fr .git/rebase-apply &&
357 echo "---" >>failmail &&
358 test_must_fail git am <failmail &&
360 ! test -d .git/rebase-apply
363 test_expect_success 'am works from stdin in subdirectory' '
365 rm -fr .git/rebase-apply &&
367 git checkout first &&
373 git diff --exit-code second
376 test_expect_success 'am works from file (relative path given) in subdirectory' '
378 rm -fr .git/rebase-apply &&
380 git checkout first &&
386 git diff --exit-code second
389 test_expect_success 'am works from file (absolute path given) in subdirectory' '
391 rm -fr .git/rebase-apply &&
393 git checkout first &&
400 git diff --exit-code second
403 test_expect_success 'am --committer-date-is-author-date' '
404 rm -fr .git/rebase-apply &&
406 git checkout first &&
408 git am --committer-date-is-author-date patch1 &&
409 git cat-file commit HEAD | sed -e "/^\$/q" >head1 &&
410 sed -ne "/^author /s/.*> //p" head1 >at &&
411 sed -ne "/^committer /s/.*> //p" head1 >ct &&
415 test_expect_success 'am without --committer-date-is-author-date' '
416 rm -fr .git/rebase-apply &&
418 git checkout first &&
421 git cat-file commit HEAD | sed -e "/^\$/q" >head1 &&
422 sed -ne "/^author /s/.*> //p" head1 >at &&
423 sed -ne "/^committer /s/.*> //p" head1 >ct &&
427 # This checks for +0000 because TZ is set to UTC and that should
428 # show up when the current time is used. The date in message is set
429 # by test_tick that uses -0700 timezone; if this feature does not
430 # work, we will see that instead of +0000.
431 test_expect_success 'am --ignore-date' '
432 rm -fr .git/rebase-apply &&
434 git checkout first &&
436 git am --ignore-date patch1 &&
437 git cat-file commit HEAD | sed -e "/^\$/q" >head1 &&
438 sed -ne "/^author /s/.*> //p" head1 >at &&
442 test_expect_success 'am into an unborn branch' '
443 git rev-parse first^{tree} >expected &&
444 rm -fr .git/rebase-apply &&
448 git format-patch --numbered-files -o subdir -1 first &&
456 git rev-parse HEAD^{tree} >../actual
458 test_cmp expected actual
461 test_expect_success 'am newline in subject' '
462 rm -fr .git/rebase-apply &&
464 git checkout first &&
466 sed -e "s/second/second \\\n foo/" patch1 >patchnl &&
467 git am <patchnl >output.out 2>&1 &&
468 grep "^Applying: second \\\n foo$" output.out
471 test_expect_success 'am -q is quiet' '
472 rm -fr .git/rebase-apply &&
474 git checkout first &&
476 git am -q <patch1 >output.out 2>&1 &&