]> git.ipfire.org Git - thirdparty/git.git/blame - t/t4150-am.sh
Merge branch 'jk/clone-b'
[thirdparty/git.git] / t / t4150-am.sh
CommitLineData
d3a7b8f5
SB
1#!/bin/sh
2
3test_description='git am running'
4
5. ./test-lib.sh
6
7cat >msg <<EOF
8second
9
10Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, sed diam nonumy
11eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
12voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita
13kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem
14ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod
15tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At
16vero eos et accusam et justo duo dolores et ea rebum.
17
18 Duis autem vel eum iriure dolor in hendrerit in vulputate velit
19 esse molestie consequat, vel illum dolore eu feugiat nulla facilisis
20 at vero eros et accumsan et iusto odio dignissim qui blandit
21 praesent luptatum zzril delenit augue duis dolore te feugait nulla
22 facilisi.
23
24
25Lorem ipsum dolor sit amet,
26consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut
27laoreet dolore magna aliquam erat volutpat.
28
29 git
30 ---
31 +++
32
33Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit
34lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure
35dolor in hendrerit in vulputate velit esse molestie consequat, vel illum
36dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio
37dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te
38feugait nulla facilisi.
39EOF
40
41cat >failmail <<EOF
42From foo@example.com Fri May 23 10:43:49 2008
43From: foo@example.com
44To: bar@example.com
45Subject: Re: [RFC/PATCH] git-foo.sh
46Date: Fri, 23 May 2008 05:23:42 +0200
47
48Sometimes we have to find out that there's nothing left.
49
50EOF
51
52cat >pine <<EOF
53From MAILER-DAEMON Fri May 23 10:43:49 2008
54Date: 23 May 2008 05:23:42 +0200
55From: Mail System Internal Data <MAILER-DAEMON@example.com>
56Subject: DON'T DELETE THIS MESSAGE -- FOLDER INTERNAL DATA
57Message-ID: <foo-0001@example.com>
58
59This text is part of the internal format of your mail folder, and is not
60a real message. It is created automatically by the mail system software.
61If deleted, important folder data will be lost, and it will be re-created
62with the data reset to initial values.
63
64EOF
65
66echo "Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>" >expected
67
68test_expect_success setup '
69 echo hello >file &&
70 git add file &&
71 test_tick &&
72 git commit -m first &&
73 git tag first &&
74 echo world >>file &&
75 git add file &&
76 test_tick &&
77 git commit -s -F msg &&
78 git tag second &&
79 git format-patch --stdout first >patch1 &&
0fcb2caf
JH
80 {
81 echo "X-Fake-Field: Line One" &&
82 echo "X-Fake-Field: Line Two" &&
83 echo "X-Fake-Field: Line Three" &&
84 git format-patch --stdout first | sed -e "1d"
85 } > patch1.eml &&
d3a7b8f5
SB
86 sed -n -e "3,\$p" msg >file &&
87 git add file &&
88 test_tick &&
89 git commit -m third &&
90 git format-patch --stdout first >patch2 &&
91 git checkout -b lorem &&
92 sed -n -e "11,\$p" msg >file &&
93 head -n 9 msg >>file &&
94 test_tick &&
95 git commit -a -m "moved stuff" &&
96 echo goodbye >another &&
97 git add another &&
98 test_tick &&
99 git commit -m "added another file" &&
100 git format-patch --stdout master >lorem-move.patch
101'
102
103# reset time
104unset test_tick
105test_tick
106
107test_expect_success 'am applies patch correctly' '
108 git checkout first &&
109 test_tick &&
110 git am <patch1 &&
51ef1daa 111 ! test -d .git/rebase-apply &&
d3a7b8f5
SB
112 test -z "$(git diff second)" &&
113 test "$(git rev-parse second)" = "$(git rev-parse HEAD)" &&
114 test "$(git rev-parse second^)" = "$(git rev-parse HEAD^)"
0fcb2caf
JH
115'
116
117test_expect_success 'am applies patch e-mail not in a mbox' '
118 git checkout first &&
119 git am patch1.eml &&
120 ! test -d .git/rebase-apply &&
121 test -z "$(git diff second)" &&
122 test "$(git rev-parse second)" = "$(git rev-parse HEAD)" &&
123 test "$(git rev-parse second^)" = "$(git rev-parse HEAD^)"
d3a7b8f5
SB
124'
125
126GIT_AUTHOR_NAME="Another Thor"
127GIT_AUTHOR_EMAIL="a.thor@example.com"
3b2eb186 128GIT_COMMITTER_NAME="Co M Miter"
d3a7b8f5
SB
129GIT_COMMITTER_EMAIL="c.miter@example.com"
130export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_COMMITTER_NAME GIT_COMMITTER_EMAIL
131
132compare () {
133 test "$(git cat-file commit "$2" | grep "^$1 ")" = \
134 "$(git cat-file commit "$3" | grep "^$1 ")"
135}
136
137test_expect_success 'am changes committer and keeps author' '
138 test_tick &&
139 git checkout first &&
140 git am patch2 &&
51ef1daa 141 ! test -d .git/rebase-apply &&
d3a7b8f5
SB
142 test "$(git rev-parse master^^)" = "$(git rev-parse HEAD^^)" &&
143 test -z "$(git diff master..HEAD)" &&
144 test -z "$(git diff master^..HEAD^)" &&
145 compare author master HEAD &&
146 compare author master^ HEAD^ &&
147 test "$GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>" = \
148 "$(git log -1 --pretty=format:"%cn <%ce>" HEAD)"
149'
150
151test_expect_success 'am --signoff adds Signed-off-by: line' '
152 git checkout -b master2 first &&
153 git am --signoff <patch2 &&
154 echo "Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>" >>expected &&
155 git cat-file commit HEAD^ | grep "Signed-off-by:" >actual &&
156 test_cmp actual expected &&
157 echo "Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>" >expected &&
158 git cat-file commit HEAD | grep "Signed-off-by:" >actual &&
159 test_cmp actual expected
160'
161
162test_expect_success 'am stays in branch' '
163 test "refs/heads/master2" = "$(git symbolic-ref HEAD)"
164'
165
166test_expect_success 'am --signoff does not add Signed-off-by: line if already there' '
167 git format-patch --stdout HEAD^ >patch3 &&
168 sed -e "/^Subject/ s,\[PATCH,Re: Re: Re: & 1/5 v2," patch3 >patch4
169 git checkout HEAD^ &&
170 git am --signoff patch4 &&
171 test "$(git cat-file commit HEAD | grep -c "^Signed-off-by:")" -eq 1
172'
173
174test_expect_success 'am without --keep removes Re: and [PATCH] stuff' '
175 test "$(git rev-parse HEAD)" = "$(git rev-parse master2)"
176'
177
178test_expect_success 'am --keep really keeps the subject' '
179 git checkout HEAD^ &&
180 git am --keep patch4 &&
51ef1daa 181 ! test -d .git/rebase-apply &&
3604e7c5 182 git cat-file commit HEAD |
87539416 183 fgrep "Re: Re: Re: [PATCH 1/5 v2] third"
d3a7b8f5
SB
184'
185
186test_expect_success 'am -3 falls back to 3-way merge' '
187 git checkout -b lorem2 master2 &&
188 sed -n -e "3,\$p" msg >file &&
189 head -n 9 msg >>file &&
190 git add file &&
191 test_tick &&
192 git commit -m "copied stuff" &&
193 git am -3 lorem-move.patch &&
51ef1daa 194 ! test -d .git/rebase-apply &&
d3a7b8f5
SB
195 test -z "$(git diff lorem)"
196'
197
0e987a12
SB
198test_expect_success 'am -3 -q is quiet' '
199 git reset master2 --hard &&
200 sed -n -e "3,\$p" msg >file &&
201 head -n 9 msg >>file &&
202 git add file &&
203 test_tick &&
204 git commit -m "copied stuff" &&
205 git am -3 -q lorem-move.patch > output.out 2>&1 &&
206 ! test -s output.out
207'
208
d3a7b8f5
SB
209test_expect_success 'am pauses on conflict' '
210 git checkout lorem2^^ &&
d492b31c 211 test_must_fail git am lorem-move.patch &&
51ef1daa 212 test -d .git/rebase-apply
d3a7b8f5
SB
213'
214
215test_expect_success 'am --skip works' '
216 git am --skip &&
51ef1daa 217 ! test -d .git/rebase-apply &&
d3a7b8f5
SB
218 test -z "$(git diff lorem2^^ -- file)" &&
219 test goodbye = "$(cat another)"
220'
221
222test_expect_success 'am --resolved works' '
223 git checkout lorem2^^ &&
d492b31c 224 test_must_fail git am lorem-move.patch &&
51ef1daa 225 test -d .git/rebase-apply &&
d3a7b8f5
SB
226 echo resolved >>file &&
227 git add file &&
228 git am --resolved &&
51ef1daa 229 ! test -d .git/rebase-apply &&
d3a7b8f5
SB
230 test goodbye = "$(cat another)"
231'
232
233test_expect_success 'am takes patches from a Pine mailbox' '
234 git checkout first &&
235 cat pine patch1 | git am &&
51ef1daa 236 ! test -d .git/rebase-apply &&
d3a7b8f5
SB
237 test -z "$(git diff master^..HEAD)"
238'
239
240test_expect_success 'am fails on mail without patch' '
d492b31c 241 test_must_fail git am <failmail &&
51ef1daa 242 rm -r .git/rebase-apply/
d3a7b8f5
SB
243'
244
245test_expect_success 'am fails on empty patch' '
246 echo "---" >>failmail &&
d492b31c 247 test_must_fail git am <failmail &&
d3a7b8f5 248 git am --skip &&
51ef1daa 249 ! test -d .git/rebase-apply
d3a7b8f5
SB
250'
251
8ec00d05
SB
252test_expect_success 'am works from stdin in subdirectory' '
253 rm -fr subdir &&
254 git checkout first &&
255 (
256 mkdir -p subdir &&
257 cd subdir &&
258 git am <../patch1
259 ) &&
260 test -z "$(git diff second)"
261'
262
263test_expect_success 'am works from file (relative path given) in subdirectory' '
264 rm -fr subdir &&
265 git checkout first &&
266 (
267 mkdir -p subdir &&
268 cd subdir &&
269 git am ../patch1
270 ) &&
271 test -z "$(git diff second)"
272'
273
274test_expect_success 'am works from file (absolute path given) in subdirectory' '
275 rm -fr subdir &&
276 git checkout first &&
277 P=$(pwd) &&
278 (
279 mkdir -p subdir &&
280 cd subdir &&
281 git am "$P/patch1"
282 ) &&
283 test -z "$(git diff second)"
284'
285
3f01ad66
JH
286test_expect_success 'am --committer-date-is-author-date' '
287 git checkout first &&
288 test_tick &&
289 git am --committer-date-is-author-date patch1 &&
290 git cat-file commit HEAD | sed -e "/^$/q" >head1 &&
291 at=$(sed -ne "/^author /s/.*> //p" head1) &&
292 ct=$(sed -ne "/^committer /s/.*> //p" head1) &&
293 test "$at" = "$ct"
294'
295
296test_expect_success 'am without --committer-date-is-author-date' '
297 git checkout first &&
298 test_tick &&
299 git am patch1 &&
300 git cat-file commit HEAD | sed -e "/^$/q" >head1 &&
301 at=$(sed -ne "/^author /s/.*> //p" head1) &&
302 ct=$(sed -ne "/^committer /s/.*> //p" head1) &&
303 test "$at" != "$ct"
304'
305
a79ec62d
NS
306# This checks for +0000 because TZ is set to UTC and that should
307# show up when the current time is used. The date in message is set
308# by test_tick that uses -0700 timezone; if this feature does not
309# work, we will see that instead of +0000.
310test_expect_success 'am --ignore-date' '
311 git checkout first &&
312 test_tick &&
313 git am --ignore-date patch1 &&
314 git cat-file commit HEAD | sed -e "/^$/q" >head1 &&
315 at=$(sed -ne "/^author /s/.*> //p" head1) &&
316 echo "$at" | grep "+0000"
317'
318
f79d4c8a
NS
319test_expect_success 'am into an unborn branch' '
320 rm -fr subdir &&
321 mkdir -p subdir &&
322 git format-patch --numbered-files -o subdir -1 first &&
323 (
324 cd subdir &&
325 git init &&
326 git am 1
327 ) &&
328 result=$(
329 cd subdir && git rev-parse HEAD^{tree}
330 ) &&
331 test "z$result" = "z$(git rev-parse first^{tree})"
332'
333
b3c32ead
SB
334test_expect_success 'am newline in subject' '
335 git checkout first &&
336 test_tick &&
337 sed -e "s/second/second \\\n foo/" patch1 > patchnl &&
338 git am < patchnl > output.out 2>&1 &&
339 grep "^Applying: second \\\n foo$" output.out
340'
341
0e987a12
SB
342test_expect_success 'am -q is quiet' '
343 git checkout first &&
344 test_tick &&
345 git am -q < patch1 > output.out 2>&1 &&
346 ! test -s output.out
347'
348
d3a7b8f5 349test_done