3 test_description
='git am running'
10 Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, sed diam nonumy
11 eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam
12 voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita
13 kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem
14 ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod
15 tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At
16 vero eos et accusam et justo duo dolores et ea rebum.
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
25 Lorem ipsum dolor sit amet,
26 consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut
27 laoreet dolore magna aliquam erat volutpat.
33 Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit
34 lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure
35 dolor in hendrerit in vulputate velit esse molestie consequat, vel illum
36 dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio
37 dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te
38 feugait nulla facilisi.
42 From foo@example.com Fri May 23 10:43:49 2008
45 Subject: Re: [RFC/PATCH] git-foo.sh
46 Date: Fri, 23 May 2008 05:23:42 +0200
48 Sometimes we have to find out that there's nothing left.
53 From MAILER-DAEMON Fri May 23 10:43:49 2008
54 Date: 23 May 2008 05:23:42 +0200
55 From: Mail System Internal Data <MAILER-DAEMON@example.com>
56 Subject: DON'T DELETE THIS MESSAGE -- FOLDER INTERNAL DATA
57 Message-ID: <foo-0001@example.com>
59 This text is part of the internal format of your mail folder, and is not
60 a real message. It is created automatically by the mail system software.
61 If deleted, important folder data will be lost, and it will be re-created
62 with the data reset to initial values.
66 echo "Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>" >expected
68 test_expect_success setup
'
72 git commit -m first &&
77 git commit -s -F msg &&
79 git format-patch --stdout first >patch1 &&
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"
86 sed -n -e "3,\$p" msg >file &&
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 &&
95 git commit -a -m "moved stuff" &&
96 echo goodbye >another &&
99 git commit -m "added another file" &&
100 git format-patch --stdout master >lorem-move.patch
107 test_expect_success
'am applies patch correctly' '
108 git checkout first &&
111 ! test -d .git/rebase-apply &&
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^)"
117 test_expect_success
'am applies patch e-mail not in a mbox' '
118 git checkout first &&
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^)"
126 GIT_AUTHOR_NAME
="Another Thor"
127 GIT_AUTHOR_EMAIL
="a.thor@example.com"
128 GIT_COMMITTER_NAME
="Co M Miter"
129 GIT_COMMITTER_EMAIL
="c.miter@example.com"
130 export GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_COMMITTER_NAME GIT_COMMITTER_EMAIL
133 test "$(git cat-file commit "$2" | grep "^
$1 ")" = \
134 "$(git cat-file commit "$3" | grep "^
$1 ")"
137 test_expect_success
'am changes committer and keeps author' '
139 git checkout first &&
141 ! test -d .git/rebase-apply &&
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)"
151 test_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
162 test_expect_success
'am stays in branch' '
163 test "refs/heads/master2" = "$(git symbolic-ref HEAD)"
166 test_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
174 test_expect_success
'am without --keep removes Re: and [PATCH] stuff' '
175 test "$(git rev-parse HEAD)" = "$(git rev-parse master2)"
178 test_expect_success
'am --keep really keeps the subject' '
179 git checkout HEAD^ &&
180 git am --keep patch4 &&
181 ! test -d .git/rebase-apply &&
182 git cat-file commit HEAD |
183 fgrep "Re: Re: Re: [PATCH 1/5 v2] third"
186 test_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 &&
192 git commit -m "copied stuff" &&
193 git am -3 lorem-move.patch &&
194 ! test -d .git/rebase-apply &&
195 test -z "$(git diff lorem)"
198 test_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 &&
204 git commit -m "copied stuff" &&
205 git am -3 -q lorem-move.patch > output.out 2>&1 &&
209 test_expect_success
'am pauses on conflict' '
210 git checkout lorem2^^ &&
211 test_must_fail git am lorem-move.patch &&
212 test -d .git/rebase-apply
215 test_expect_success
'am --skip works' '
217 ! test -d .git/rebase-apply &&
218 test -z "$(git diff lorem2^^ -- file)" &&
219 test goodbye = "$(cat another)"
222 test_expect_success
'am --resolved works' '
223 git checkout lorem2^^ &&
224 test_must_fail git am lorem-move.patch &&
225 test -d .git/rebase-apply &&
226 echo resolved >>file &&
229 ! test -d .git/rebase-apply &&
230 test goodbye = "$(cat another)"
233 test_expect_success
'am takes patches from a Pine mailbox' '
234 git checkout first &&
235 cat pine patch1 | git am &&
236 ! test -d .git/rebase-apply &&
237 test -z "$(git diff master^..HEAD)"
240 test_expect_success
'am fails on mail without patch' '
241 test_must_fail git am <failmail &&
242 rm -r .git/rebase-apply/
245 test_expect_success
'am fails on empty patch' '
246 echo "---" >>failmail &&
247 test_must_fail git am <failmail &&
249 ! test -d .git/rebase-apply
252 test_expect_success
'am works from stdin in subdirectory' '
254 git checkout first &&
260 test -z "$(git diff second)"
263 test_expect_success
'am works from file (relative path given) in subdirectory' '
265 git checkout first &&
271 test -z "$(git diff second)"
274 test_expect_success
'am works from file (absolute path given) in subdirectory' '
276 git checkout first &&
283 test -z "$(git diff second)"
286 test_expect_success
'am --committer-date-is-author-date' '
287 git checkout first &&
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) &&
296 test_expect_success
'am without --committer-date-is-author-date' '
297 git checkout first &&
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) &&
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.
310 test_expect_success
'am --ignore-date' '
311 git checkout first &&
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"
319 test_expect_success
'am into an unborn branch' '
322 git format-patch --numbered-files -o subdir -1 first &&
329 cd subdir && git rev-parse HEAD^{tree}
331 test "z$result" = "z$(git rev-parse first^{tree})"
334 test_expect_success
'am newline in subject' '
335 git checkout first &&
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
342 test_expect_success
'am -q is quiet' '
343 git checkout first &&
345 git am -q < patch1 > output.out 2>&1 &&