3 # Copyright (c) 2006 Junio C Hamano
6 test_description='various format-patch tests'
9 . "$TEST_DIRECTORY"/lib-terminal.sh
11 test_expect_success setup '
13 for i in 1 2 3 4 5 6 7 8 9 10; do echo "$i"; done >file &&
17 git commit -m Initial &&
18 git checkout -b side &&
20 for i in 1 2 5 6 A B C 7 8 9 10; do echo "$i"; done >file &&
23 git commit -m "Side changes #1" &&
25 for i in D E F; do echo "$i"; done >>file &&
26 git update-index file &&
28 git commit -m "Side changes #2" &&
31 for i in 5 6 1 2 3 A 4 B C 7 8 9 10 D E F; do echo "$i"; done >file &&
32 git update-index file &&
34 git commit -m "Side changes #3 with \\n backslash-n in it." &&
36 git checkout master &&
37 git diff-tree -p C2 | git apply --index &&
39 git commit -m "Master accepts moral equivalent of #2"
43 test_expect_success "format-patch --ignore-if-in-upstream" '
45 git format-patch --stdout master..side >patch0 &&
46 cnt=$(grep "^From " patch0 | wc -l) &&
51 test_expect_success "format-patch --ignore-if-in-upstream" '
53 git format-patch --stdout \
54 --ignore-if-in-upstream master..side >patch1 &&
55 cnt=$(grep "^From " patch1 | wc -l) &&
60 test_expect_success "format-patch --ignore-if-in-upstream handles tags" '
61 git tag -a v1 -m tag side &&
62 git tag -a v2 -m tag master &&
63 git format-patch --stdout --ignore-if-in-upstream v2..v1 >patch1 &&
64 cnt=$(grep "^From " patch1 | wc -l) &&
68 test_expect_success "format-patch doesn't consider merge commits" '
70 git checkout -b slave master &&
71 echo "Another line" >>file &&
73 git commit -am "Slave change #1" &&
74 echo "Yet another line" >>file &&
76 git commit -am "Slave change #2" &&
77 git checkout -b merger master &&
79 git merge --no-ff slave &&
80 cnt=$(git format-patch -3 --stdout | grep "^From " | wc -l) &&
84 test_expect_success "format-patch result applies" '
86 git checkout -b rebuild-0 master &&
88 cnt=$(git rev-list master.. | wc -l) &&
92 test_expect_success "format-patch --ignore-if-in-upstream result applies" '
94 git checkout -b rebuild-1 master &&
96 cnt=$(git rev-list master.. | wc -l) &&
100 test_expect_success 'commit did not screw up the log message' '
102 git cat-file commit side | grep "^Side .* with .* backslash-n"
106 test_expect_success 'format-patch did not screw up the log message' '
108 grep "^Subject: .*Side changes #3 with .* backslash-n" patch0 &&
109 grep "^Subject: .*Side changes #3 with .* backslash-n" patch1
113 test_expect_success 'replay did not screw up the log message' '
115 git cat-file commit rebuild-1 | grep "^Side .* with .* backslash-n"
119 test_expect_success 'extra headers' '
121 git config format.headers "To: R E Cipient <rcipient@example.com>
123 git config --add format.headers "Cc: S E Cipient <scipient@example.com>
125 git format-patch --stdout master..side > patch2 &&
126 sed -e "/^\$/q" patch2 > hdrs2 &&
127 grep "^To: R E Cipient <rcipient@example.com>\$" hdrs2 &&
128 grep "^Cc: S E Cipient <scipient@example.com>\$" hdrs2
132 test_expect_success 'extra headers without newlines' '
134 git config --replace-all format.headers "To: R E Cipient <rcipient@example.com>" &&
135 git config --add format.headers "Cc: S E Cipient <scipient@example.com>" &&
136 git format-patch --stdout master..side >patch3 &&
137 sed -e "/^\$/q" patch3 > hdrs3 &&
138 grep "^To: R E Cipient <rcipient@example.com>\$" hdrs3 &&
139 grep "^Cc: S E Cipient <scipient@example.com>\$" hdrs3
143 test_expect_success 'extra headers with multiple To:s' '
145 git config --replace-all format.headers "To: R E Cipient <rcipient@example.com>" &&
146 git config --add format.headers "To: S E Cipient <scipient@example.com>" &&
147 git format-patch --stdout master..side > patch4 &&
148 sed -e "/^\$/q" patch4 > hdrs4 &&
149 grep "^To: R E Cipient <rcipient@example.com>,\$" hdrs4 &&
150 grep "^ *S E Cipient <scipient@example.com>\$" hdrs4
153 test_expect_success 'additional command line cc (ascii)' '
155 git config --replace-all format.headers "Cc: R E Cipient <rcipient@example.com>" &&
156 git format-patch --cc="S E Cipient <scipient@example.com>" --stdout master..side | sed -e "/^\$/q" >patch5 &&
157 grep "^Cc: R E Cipient <rcipient@example.com>,\$" patch5 &&
158 grep "^ *S E Cipient <scipient@example.com>\$" patch5
161 test_expect_failure 'additional command line cc (rfc822)' '
163 git config --replace-all format.headers "Cc: R E Cipient <rcipient@example.com>" &&
164 git format-patch --cc="S. E. Cipient <scipient@example.com>" --stdout master..side | sed -e "/^\$/q" >patch5 &&
165 grep "^Cc: R E Cipient <rcipient@example.com>,\$" patch5 &&
166 grep "^ *\"S. E. Cipient\" <scipient@example.com>\$" patch5
169 test_expect_success 'command line headers' '
171 git config --unset-all format.headers &&
172 git format-patch --add-header="Cc: R E Cipient <rcipient@example.com>" --stdout master..side | sed -e "/^\$/q" >patch6 &&
173 grep "^Cc: R E Cipient <rcipient@example.com>\$" patch6
176 test_expect_success 'configuration headers and command line headers' '
178 git config --replace-all format.headers "Cc: R E Cipient <rcipient@example.com>" &&
179 git format-patch --add-header="Cc: S E Cipient <scipient@example.com>" --stdout master..side | sed -e "/^\$/q" >patch7 &&
180 grep "^Cc: R E Cipient <rcipient@example.com>,\$" patch7 &&
181 grep "^ *S E Cipient <scipient@example.com>\$" patch7
184 test_expect_success 'command line To: header (ascii)' '
186 git config --unset-all format.headers &&
187 git format-patch --to="R E Cipient <rcipient@example.com>" --stdout master..side | sed -e "/^\$/q" >patch8 &&
188 grep "^To: R E Cipient <rcipient@example.com>\$" patch8
191 test_expect_failure 'command line To: header (rfc822)' '
193 git format-patch --to="R. E. Cipient <rcipient@example.com>" --stdout master..side | sed -e "/^\$/q" >patch8 &&
194 grep "^To: \"R. E. Cipient\" <rcipient@example.com>\$" patch8
197 test_expect_failure 'command line To: header (rfc2047)' '
199 git format-patch --to="R Ä Cipient <rcipient@example.com>" --stdout master..side | sed -e "/^\$/q" >patch8 &&
200 grep "^To: =?UTF-8?q?R=20=C3=84=20Cipient?= <rcipient@example.com>\$" patch8
203 test_expect_success 'configuration To: header (ascii)' '
205 git config format.to "R E Cipient <rcipient@example.com>" &&
206 git format-patch --stdout master..side | sed -e "/^\$/q" >patch9 &&
207 grep "^To: R E Cipient <rcipient@example.com>\$" patch9
210 test_expect_failure 'configuration To: header (rfc822)' '
212 git config format.to "R. E. Cipient <rcipient@example.com>" &&
213 git format-patch --stdout master..side | sed -e "/^\$/q" >patch9 &&
214 grep "^To: \"R. E. Cipient\" <rcipient@example.com>\$" patch9
217 test_expect_failure 'configuration To: header (rfc2047)' '
219 git config format.to "R Ä Cipient <rcipient@example.com>" &&
220 git format-patch --stdout master..side | sed -e "/^\$/q" >patch9 &&
221 grep "^To: =?UTF-8?q?R=20=C3=84=20Cipient?= <rcipient@example.com>\$" patch9
224 # check_patch <patch>: Verify that <patch> looks like a half-sane
225 # patch email to avoid a false positive with !grep
227 grep -e "^From:" "$1" &&
228 grep -e "^Date:" "$1" &&
229 grep -e "^Subject:" "$1"
232 test_expect_success 'format.from=false' '
234 git -c format.from=false format-patch --stdout master..side |
235 sed -e "/^\$/q" >patch &&
237 ! grep "^From: C O Mitter <committer@example.com>\$" patch
240 test_expect_success 'format.from=true' '
242 git -c format.from=true format-patch --stdout master..side |
243 sed -e "/^\$/q" >patch &&
245 grep "^From: C O Mitter <committer@example.com>\$" patch
248 test_expect_success 'format.from with address' '
250 git -c format.from="F R Om <from@example.com>" format-patch --stdout master..side |
251 sed -e "/^\$/q" >patch &&
253 grep "^From: F R Om <from@example.com>\$" patch
256 test_expect_success '--no-from overrides format.from' '
258 git -c format.from="F R Om <from@example.com>" format-patch --no-from --stdout master..side |
259 sed -e "/^\$/q" >patch &&
261 ! grep "^From: F R Om <from@example.com>\$" patch
264 test_expect_success '--from overrides format.from' '
266 git -c format.from="F R Om <from@example.com>" format-patch --from --stdout master..side |
267 sed -e "/^\$/q" >patch &&
269 ! grep "^From: F R Om <from@example.com>\$" patch
272 test_expect_success '--no-to overrides config.to' '
274 git config --replace-all format.to \
275 "R E Cipient <rcipient@example.com>" &&
276 git format-patch --no-to --stdout master..side |
277 sed -e "/^\$/q" >patch10 &&
278 check_patch patch10 &&
279 ! grep "^To: R E Cipient <rcipient@example.com>\$" patch10
282 test_expect_success '--no-to and --to replaces config.to' '
284 git config --replace-all format.to \
285 "Someone <someone@out.there>" &&
286 git format-patch --no-to --to="Someone Else <else@out.there>" \
287 --stdout master..side |
288 sed -e "/^\$/q" >patch11 &&
289 check_patch patch11 &&
290 ! grep "^To: Someone <someone@out.there>\$" patch11 &&
291 grep "^To: Someone Else <else@out.there>\$" patch11
294 test_expect_success '--no-cc overrides config.cc' '
296 git config --replace-all format.cc \
297 "C E Cipient <rcipient@example.com>" &&
298 git format-patch --no-cc --stdout master..side |
299 sed -e "/^\$/q" >patch12 &&
300 check_patch patch12 &&
301 ! grep "^Cc: C E Cipient <rcipient@example.com>\$" patch12
304 test_expect_success '--no-add-header overrides config.headers' '
306 git config --replace-all format.headers \
307 "Header1: B E Cipient <rcipient@example.com>" &&
308 git format-patch --no-add-header --stdout master..side |
309 sed -e "/^\$/q" >patch13 &&
310 check_patch patch13 &&
311 ! grep "^Header1: B E Cipient <rcipient@example.com>\$" patch13
314 test_expect_success 'multiple files' '
318 git format-patch -o patches/ master &&
319 ls patches/0001-Side-changes-1.patch patches/0002-Side-changes-2.patch patches/0003-Side-changes-3-with-n-backslash-n-in-it.patch
322 test_expect_success 'reroll count' '
324 git format-patch -o patches --cover-letter --reroll-count 4 master..side >list &&
325 ! grep -v "^patches/v4-000[0-3]-" list &&
326 sed -n -e "/^Subject: /p" $(cat list) >subjects &&
327 ! grep -v "^Subject: \[PATCH v4 [0-3]/3\] " subjects
330 test_expect_success 'reroll count (-v)' '
332 git format-patch -o patches --cover-letter -v4 master..side >list &&
333 ! grep -v "^patches/v4-000[0-3]-" list &&
334 sed -n -e "/^Subject: /p" $(cat list) >subjects &&
335 ! grep -v "^Subject: \[PATCH v4 [0-3]/3\] " subjects
341 (git format-patch --stdout "$@"; echo $? > status.out) |
342 # Prints everything between the Message-ID and In-Reply-To,
343 # and replaces all Message-ID-lookalikes by a sequence number
345 if (/^(message-id|references|in-reply-to)/i) {
351 $h{$1}=$i++ if (/<([^>]+)>/ and !exists $h{$1});
352 for $k (keys %h) {s/$k/$h{$k}/};
355 print "---\n" if /^From /i;
357 test 0 = "$(cat status.out)" &&
358 test_cmp "$expect" actual
361 cat >> expect.no-threading <<EOF
367 test_expect_success 'no threading' '
369 check_threading expect.no-threading master
372 cat > expect.thread <<EOF
385 test_expect_success 'thread' '
386 check_threading expect.thread --thread master
389 cat > expect.in-reply-to <<EOF
404 test_expect_success 'thread in-reply-to' '
405 check_threading expect.in-reply-to --in-reply-to="<test.message>" \
409 cat > expect.cover-letter <<EOF
426 test_expect_success 'thread cover-letter' '
427 check_threading expect.cover-letter --cover-letter --thread master
430 cat > expect.cl-irt <<EOF
452 test_expect_success 'thread cover-letter in-reply-to' '
453 check_threading expect.cl-irt --cover-letter \
454 --in-reply-to="<test.message>" --thread master
457 test_expect_success 'thread explicit shallow' '
458 check_threading expect.cl-irt --cover-letter \
459 --in-reply-to="<test.message>" --thread=shallow master
462 cat > expect.deep <<EOF
476 test_expect_success 'thread deep' '
477 check_threading expect.deep --thread=deep master
480 cat > expect.deep-irt <<EOF
498 test_expect_success 'thread deep in-reply-to' '
499 check_threading expect.deep-irt --thread=deep \
500 --in-reply-to="<test.message>" master
503 cat > expect.deep-cl <<EOF
523 test_expect_success 'thread deep cover-letter' '
524 check_threading expect.deep-cl --cover-letter --thread=deep master
527 cat > expect.deep-cl-irt <<EOF
552 test_expect_success 'thread deep cover-letter in-reply-to' '
553 check_threading expect.deep-cl-irt --cover-letter \
554 --in-reply-to="<test.message>" --thread=deep master
557 test_expect_success 'thread via config' '
558 test_config format.thread true &&
559 check_threading expect.thread master
562 test_expect_success 'thread deep via config' '
563 test_config format.thread deep &&
564 check_threading expect.deep master
567 test_expect_success 'thread config + override' '
568 test_config format.thread deep &&
569 check_threading expect.thread --thread master
572 test_expect_success 'thread config + --no-thread' '
573 test_config format.thread deep &&
574 check_threading expect.no-threading --no-thread master
577 test_expect_success 'excessive subject' '
581 for i in 5 6 1 2 3 A 4 B C 7 8 9 10 D E F; do echo "$i"; done >>file &&
582 git update-index file &&
583 git commit -m "This is an excessively long subject line for a message due to the habit some projects have of not having a short, one-line subject at the start of the commit message, but rather sticking a whole paragraph right at the start as the only thing in the commit message. It had better not become the filename for the patch." &&
584 git format-patch -o patches/ master..side &&
585 ls patches/0004-This-is-an-excessively-long-subject-line-for-a-messa.patch
588 test_expect_success 'cover-letter inherits diff options' '
592 git format-patch --no-renames --cover-letter -1 &&
593 check_patch 0000-cover-letter.patch &&
594 ! grep "file => foo .* 0 *\$" 0000-cover-letter.patch &&
595 git format-patch --cover-letter -1 -M &&
596 grep "file => foo .* 0 *\$" 0000-cover-letter.patch
601 This is an excessively long subject line for a message due to the
602 habit some projects have of not having a short, one-line subject at
603 the start of the commit message, but rather sticking a whole
604 paragraph right at the start as the only thing in the commit
605 message. It had better not become the filename for the patch.
610 test_expect_success 'shortlog of cover-letter wraps overly-long onelines' '
612 git format-patch --cover-letter -2 &&
613 sed -e "1,/A U Thor/d" -e "/^\$/q" < 0000-cover-letter.patch > output &&
614 test_cmp expect output
619 index 40f36c6..2dc5c23 100644
630 test_expect_success 'format-patch respects -U' '
632 git format-patch -U4 -2 &&
633 sed -e "1,/^diff/d" -e "/^+5/q" \
634 <0001-This-is-an-excessively-long-subject-line-for-a-messa.patch \
636 test_cmp expect output
642 diff --git a/file b/file
643 index 40f36c6..2dc5c23 100644
653 test_expect_success 'format-patch -p suppresses stat' '
655 git format-patch -p -2 &&
656 sed -e "1,/^\$/d" -e "/^+5/q" < 0001-This-is-an-excessively-long-subject-line-for-a-messa.patch > output &&
657 test_cmp expect output
661 test_expect_success 'format-patch from a subdirectory (1)' '
672 echo "Oops? $filename"
679 test_expect_success 'format-patch from a subdirectory (2)' '
684 git format-patch -1 -o ..
690 echo "Oops? $filename"
694 basename=$(expr "$filename" : ".*/\(.*\)") &&
695 test -f "sub/$basename"
698 test_expect_success 'format-patch from a subdirectory (3)' '
704 git format-patch -1 -o "$TRASH_DIRECTORY"
706 basename=$(expr "$filename" : ".*/\(.*\)") &&
710 test_expect_success 'format-patch --in-reply-to' '
711 git format-patch -1 --stdout --in-reply-to "baz@foo.bar" > patch8 &&
712 grep "^In-Reply-To: <baz@foo.bar>" patch8 &&
713 grep "^References: <baz@foo.bar>" patch8
716 test_expect_success 'format-patch --signoff' '
717 git format-patch -1 --signoff --stdout >out &&
718 grep "^Signed-off-by: $GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>" out
721 test_expect_success 'format-patch --notes --signoff' '
722 git notes --ref test add -m "test message" HEAD &&
723 git format-patch -1 --signoff --stdout --notes=test >out &&
724 # Three dashes must come after S-o-b
725 ! sed "/^Signed-off-by: /q" out | grep "test message" &&
726 sed "1,/^Signed-off-by: /d" out | grep "test message" &&
727 # Notes message must come after three dashes
728 ! sed "/^---$/q" out | grep "test message" &&
729 sed "1,/^---$/d" out | grep "test message"
732 echo "fatal: --name-only does not make sense" > expect.name-only
733 echo "fatal: --name-status does not make sense" > expect.name-status
734 echo "fatal: --check does not make sense" > expect.check
736 test_expect_success 'options no longer allowed for format-patch' '
737 test_must_fail git format-patch --name-only 2> output &&
738 test_i18ncmp expect.name-only output &&
739 test_must_fail git format-patch --name-status 2> output &&
740 test_i18ncmp expect.name-status output &&
741 test_must_fail git format-patch --check 2> output &&
742 test_i18ncmp expect.check output'
744 test_expect_success 'format-patch --numstat should produce a patch' '
745 git format-patch --numstat --stdout master..side > output &&
746 test 5 = $(grep "^diff --git a/" output | wc -l)'
748 test_expect_success 'format-patch -- <path>' '
749 git format-patch master..side -- file 2>error &&
750 ! grep "Use .--" error
753 test_expect_success 'format-patch --ignore-if-in-upstream HEAD' '
754 git format-patch --ignore-if-in-upstream HEAD
757 git_version="$(git --version | sed "s/.* //")"
760 printf "%s\n%s\n\n" "-- " "${1:-$git_version}"
763 test_expect_success 'format-patch default signature' '
764 git format-patch --stdout -1 | tail -n 3 >output &&
766 test_cmp expect output
769 test_expect_success 'format-patch --signature' '
770 git format-patch --stdout --signature="my sig" -1 | tail -n 3 >output &&
771 signature "my sig" >expect &&
772 test_cmp expect output
775 test_expect_success 'format-patch with format.signature config' '
776 git config format.signature "config sig" &&
777 git format-patch --stdout -1 >output &&
778 grep "config sig" output
781 test_expect_success 'format-patch --signature overrides format.signature' '
782 git config format.signature "config sig" &&
783 git format-patch --stdout --signature="overrides" -1 >output &&
784 ! grep "config sig" output &&
785 grep "overrides" output
788 test_expect_success 'format-patch --no-signature ignores format.signature' '
789 git config format.signature "config sig" &&
790 git format-patch --stdout --signature="my sig" --no-signature \
792 check_patch output &&
793 ! grep "config sig" output &&
794 ! grep "my sig" output &&
795 ! grep "^-- \$" output
798 test_expect_success 'format-patch --signature --cover-letter' '
799 git config --unset-all format.signature &&
800 git format-patch --stdout --signature="my sig" --cover-letter \
802 grep "my sig" output &&
803 test 2 = $(grep "my sig" output | wc -l)
806 test_expect_success 'format.signature="" suppresses signatures' '
807 git config format.signature "" &&
808 git format-patch --stdout -1 >output &&
809 check_patch output &&
810 ! grep "^-- \$" output
813 test_expect_success 'format-patch --no-signature suppresses signatures' '
814 git config --unset-all format.signature &&
815 git format-patch --stdout --no-signature -1 >output &&
816 check_patch output &&
817 ! grep "^-- \$" output
820 test_expect_success 'format-patch --signature="" suppresses signatures' '
821 git format-patch --stdout --signature="" -1 >output &&
822 check_patch output &&
823 ! grep "^-- \$" output
826 test_expect_success 'prepare mail-signature input' '
827 cat >mail-signature <<-\EOF
829 Test User <test.email@kernel.org>
830 http://git.kernel.org/cgit/git/git.git
832 git.kernel.org/?p=git/git.git;a=summary
837 test_expect_success '--signature-file=file works' '
838 git format-patch --stdout --signature-file=mail-signature -1 >output &&
839 check_patch output &&
840 sed -e "1,/^-- \$/d" <output >actual &&
842 cat mail-signature && echo
844 test_cmp expect actual
847 test_expect_success 'format.signaturefile works' '
848 test_config format.signaturefile mail-signature &&
849 git format-patch --stdout -1 >output &&
850 check_patch output &&
851 sed -e "1,/^-- \$/d" <output >actual &&
853 cat mail-signature && echo
855 test_cmp expect actual
858 test_expect_success '--no-signature suppresses format.signaturefile ' '
859 test_config format.signaturefile mail-signature &&
860 git format-patch --stdout --no-signature -1 >output &&
861 check_patch output &&
862 ! grep "^-- \$" output
865 test_expect_success '--signature-file overrides format.signaturefile' '
866 cat >other-mail-signature <<-\EOF &&
867 Use this other signature instead of mail-signature.
869 test_config format.signaturefile mail-signature &&
870 git format-patch --stdout \
871 --signature-file=other-mail-signature -1 >output &&
872 check_patch output &&
873 sed -e "1,/^-- \$/d" <output >actual &&
875 cat other-mail-signature && echo
877 test_cmp expect actual
880 test_expect_success '--signature overrides format.signaturefile' '
881 test_config format.signaturefile mail-signature &&
882 git format-patch --stdout --signature="my sig" -1 >output &&
883 check_patch output &&
887 test_expect_success TTY 'format-patch --stdout paginates' '
889 test_terminal env GIT_PAGER="wc >pager_used" git format-patch --stdout --all &&
890 test_path_is_file pager_used
893 test_expect_success TTY 'format-patch --stdout pagination can be disabled' '
895 test_terminal env GIT_PAGER="wc >pager_used" git --no-pager format-patch --stdout --all &&
896 test_terminal env GIT_PAGER="wc >pager_used" git -c "pager.format-patch=false" format-patch --stdout --all &&
897 test_path_is_missing pager_used &&
898 test_path_is_missing .git/pager_used
901 test_expect_success 'format-patch handles multi-line subjects' '
903 echo content >>file &&
904 for i in one two three; do echo $i; done >msg &&
907 git format-patch -o patches -1 &&
908 grep ^Subject: patches/0001-one.patch >actual &&
909 echo "Subject: [PATCH] one two three" >expect &&
910 test_cmp expect actual
913 test_expect_success 'format-patch handles multi-line encoded subjects' '
915 echo content >>file &&
916 for i in en två tre; do echo $i; done >msg &&
919 git format-patch -o patches -1 &&
920 grep ^Subject: patches/0001-en.patch >actual &&
921 echo "Subject: [PATCH] =?UTF-8?q?en=20tv=C3=A5=20tre?=" >expect &&
922 test_cmp expect actual
926 M64=$M8$M8$M8$M8$M8$M8$M8$M8
927 M512=$M64$M64$M64$M64$M64$M64$M64$M64
929 Subject: [PATCH] foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo
930 bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar
931 foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo
932 bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar
933 foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo
934 bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar
935 foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar foo bar
937 test_expect_success 'format-patch wraps extremely long subject (ascii)' '
938 echo content >>file &&
940 git commit -m "$M512" &&
941 git format-patch --stdout -1 >patch &&
942 sed -n "/^Subject/p; /^ /p; /^$/q" <patch >subject &&
943 test_cmp expect subject
947 M64=$M8$M8$M8$M8$M8$M8$M8$M8
948 M512=$M64$M64$M64$M64$M64$M64$M64$M64
950 Subject: [PATCH] =?UTF-8?q?f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f?=
951 =?UTF-8?q?=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar?=
952 =?UTF-8?q?=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20?=
953 =?UTF-8?q?bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6?=
954 =?UTF-8?q?=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?=
955 =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f?=
956 =?UTF-8?q?=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar?=
957 =?UTF-8?q?=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20?=
958 =?UTF-8?q?bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6?=
959 =?UTF-8?q?=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?=
960 =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f?=
961 =?UTF-8?q?=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar?=
962 =?UTF-8?q?=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20?=
963 =?UTF-8?q?bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6?=
964 =?UTF-8?q?=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?=
965 =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f?=
966 =?UTF-8?q?=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar?=
967 =?UTF-8?q?=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20?=
968 =?UTF-8?q?bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6?=
969 =?UTF-8?q?=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6?=
970 =?UTF-8?q?=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f?=
971 =?UTF-8?q?=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar?=
972 =?UTF-8?q?=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20bar=20f=C3=B6=C3=B6=20?=
975 test_expect_success 'format-patch wraps extremely long subject (rfc2047)' '
977 echo content >>file &&
979 git commit -m "$M512" &&
980 git format-patch --stdout -1 >patch &&
981 sed -n "/^Subject/p; /^ /p; /^$/q" <patch >subject &&
982 test_cmp expect subject
986 echo content >>file &&
988 GIT_AUTHOR_NAME=$1 git commit -m author-check &&
989 git format-patch --stdout -1 >patch &&
990 sed -n "/^From: /p; /^ /p; /^$/q" <patch >actual &&
991 test_cmp expect actual
995 From: "Foo B. Bar" <author@example.com>
997 test_expect_success 'format-patch quotes dot in from-headers' '
998 check_author "Foo B. Bar"
1002 From: "Foo \"The Baz\" Bar" <author@example.com>
1004 test_expect_success 'format-patch quotes double-quote in from-headers' '
1005 check_author "Foo \"The Baz\" Bar"
1009 From: =?UTF-8?q?F=C3=B6o=20Bar?= <author@example.com>
1011 test_expect_success 'format-patch uses rfc2047-encoded from-headers when necessary' '
1012 check_author "Föo Bar"
1016 From: =?UTF-8?q?F=C3=B6o=20B=2E=20Bar?= <author@example.com>
1018 test_expect_success 'rfc2047-encoded from-headers leave no rfc822 specials' '
1019 check_author "Föo B. Bar"
1023 From: foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_
1024 <author@example.com>
1026 test_expect_success 'format-patch wraps moderately long from-header (ascii)' '
1027 check_author "foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_foo_bar_"
1031 From: Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar
1032 Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo
1033 Bar Foo Bar Foo Bar Foo Bar <author@example.com>
1035 test_expect_success 'format-patch wraps extremely long from-header (ascii)' '
1036 check_author "Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar"
1040 From: "Foo.Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar
1041 Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo
1042 Bar Foo Bar Foo Bar Foo Bar" <author@example.com>
1044 test_expect_success 'format-patch wraps extremely long from-header (rfc822)' '
1045 check_author "Foo.Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar"
1049 From: =?UTF-8?q?Fo=C3=B6=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo?=
1050 =?UTF-8?q?=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20?=
1051 =?UTF-8?q?Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar?=
1052 =?UTF-8?q?=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20Foo=20Bar=20?=
1053 =?UTF-8?q?Foo=20Bar=20Foo=20Bar?= <author@example.com>
1055 test_expect_success 'format-patch wraps extremely long from-header (rfc2047)' '
1056 check_author "Foö Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar Foo Bar"
1060 Subject: header with . in it
1062 test_expect_success 'subject lines do not have 822 atom-quoting' '
1063 echo content >>file &&
1065 git commit -m "header with . in it" &&
1066 git format-patch -k -1 --stdout >patch &&
1067 grep ^Subject: patch >actual &&
1068 test_cmp expect actual
1072 Subject: [PREFIX 1/1] header with . in it
1074 test_expect_success 'subject prefixes have space prepended' '
1075 git format-patch -n -1 --stdout --subject-prefix=PREFIX >patch &&
1076 grep ^Subject: patch >actual &&
1077 test_cmp expect actual
1081 Subject: [1/1] header with . in it
1083 test_expect_success 'empty subject prefix does not have extra space' '
1084 git format-patch -n -1 --stdout --subject-prefix= >patch &&
1085 grep ^Subject: patch >actual &&
1086 test_cmp expect actual
1089 test_expect_success '--rfc' '
1090 cat >expect <<-\EOF &&
1091 Subject: [RFC PATCH 1/1] header with . in it
1093 git format-patch -n -1 --stdout --rfc >patch &&
1094 grep ^Subject: patch >actual &&
1095 test_cmp expect actual
1098 test_expect_success '--from=ident notices bogus ident' '
1099 test_must_fail git format-patch -1 --stdout --from=foo >patch
1102 test_expect_success '--from=ident replaces author' '
1103 git format-patch -1 --stdout --from="Me <me@example.com>" >patch &&
1104 cat >expect <<-\EOF &&
1105 From: Me <me@example.com>
1107 From: A U Thor <author@example.com>
1110 sed -ne "/^From:/p; /^$/p; /^---$/q" <patch >patch.head &&
1111 test_cmp expect patch.head
1114 test_expect_success '--from uses committer ident' '
1115 git format-patch -1 --stdout --from >patch &&
1116 cat >expect <<-\EOF &&
1117 From: C O Mitter <committer@example.com>
1119 From: A U Thor <author@example.com>
1122 sed -ne "/^From:/p; /^$/p; /^---$/q" <patch >patch.head &&
1123 test_cmp expect patch.head
1126 test_expect_success '--from omits redundant in-body header' '
1127 git format-patch -1 --stdout --from="A U Thor <author@example.com>" >patch &&
1128 cat >expect <<-\EOF &&
1129 From: A U Thor <author@example.com>
1132 sed -ne "/^From:/p; /^$/p; /^---$/q" <patch >patch.head &&
1133 test_cmp expect patch.head
1136 test_expect_success 'in-body headers trigger content encoding' '
1137 test_env GIT_AUTHOR_NAME="éxötìc" test_commit exotic &&
1138 test_when_finished "git reset --hard HEAD^" &&
1139 git format-patch -1 --stdout --from >patch &&
1140 cat >expect <<-\EOF &&
1141 From: C O Mitter <committer@example.com>
1142 Content-Type: text/plain; charset=UTF-8
1144 From: éxötìc <author@example.com>
1147 sed -ne "/^From:/p; /^$/p; /^Content-Type/p; /^---$/q" <patch >patch.head &&
1148 test_cmp expect patch.head
1153 C=$(git commit-tree HEAD^^{tree} -p HEAD) &&
1154 git format-patch --stdout --signoff $C^..$C >append_signoff.patch &&
1155 sed -n -e "1,/^---$/p" append_signoff.patch |
1156 egrep -n "^Subject|Sign|^$"
1159 test_expect_success 'signoff: commit with no body' '
1160 append_signoff </dev/null >actual &&
1161 cat <<\EOF | sed "s/EOL$//" >expected &&
1162 4:Subject: [PATCH] EOL
1164 9:Signed-off-by: C O Mitter <committer@example.com>
1166 test_cmp expected actual
1169 test_expect_success 'signoff: commit with only subject' '
1170 echo subject | append_signoff >actual &&
1171 cat >expected <<\EOF &&
1172 4:Subject: [PATCH] subject
1174 9:Signed-off-by: C O Mitter <committer@example.com>
1176 test_cmp expected actual
1179 test_expect_success 'signoff: commit with only subject that does not end with NL' '
1180 printf subject | append_signoff >actual &&
1181 cat >expected <<\EOF &&
1182 4:Subject: [PATCH] subject
1184 9:Signed-off-by: C O Mitter <committer@example.com>
1186 test_cmp expected actual
1189 test_expect_success 'signoff: no existing signoffs' '
1190 append_signoff <<\EOF >actual &&
1195 cat >expected <<\EOF &&
1196 4:Subject: [PATCH] subject
1199 11:Signed-off-by: C O Mitter <committer@example.com>
1201 test_cmp expected actual
1204 test_expect_success 'signoff: no existing signoffs and no trailing NL' '
1205 printf "subject\n\nbody" | append_signoff >actual &&
1206 cat >expected <<\EOF &&
1207 4:Subject: [PATCH] subject
1210 11:Signed-off-by: C O Mitter <committer@example.com>
1212 test_cmp expected actual
1215 test_expect_success 'signoff: some random signoff' '
1216 append_signoff <<\EOF >actual &&
1221 Signed-off-by: my@house
1223 cat >expected <<\EOF &&
1224 4:Subject: [PATCH] subject
1227 11:Signed-off-by: my@house
1228 12:Signed-off-by: C O Mitter <committer@example.com>
1230 test_cmp expected actual
1233 test_expect_success 'signoff: misc conforming footer elements' '
1234 append_signoff <<\EOF >actual &&
1239 Signed-off-by: my@house
1240 (cherry picked from commit da39a3ee5e6b4b0d3255bfef95601890afd80709)
1241 Tested-by: Some One <someone@example.com>
1244 cat >expected <<\EOF &&
1245 4:Subject: [PATCH] subject
1248 11:Signed-off-by: my@house
1249 15:Signed-off-by: C O Mitter <committer@example.com>
1251 test_cmp expected actual
1254 test_expect_success 'signoff: some random signoff-alike' '
1255 append_signoff <<\EOF >actual &&
1259 Fooled-by-me: my@house
1261 cat >expected <<\EOF &&
1262 4:Subject: [PATCH] subject
1265 12:Signed-off-by: C O Mitter <committer@example.com>
1267 test_cmp expected actual
1270 test_expect_success 'signoff: not really a signoff' '
1271 append_signoff <<\EOF >actual &&
1274 I want to mention about Signed-off-by: here.
1276 cat >expected <<\EOF &&
1277 4:Subject: [PATCH] subject
1279 9:I want to mention about Signed-off-by: here.
1281 11:Signed-off-by: C O Mitter <committer@example.com>
1283 test_cmp expected actual
1286 test_expect_success 'signoff: not really a signoff (2)' '
1287 append_signoff <<\EOF >actual &&
1291 Signed-off-by: example happens to be wrapped here.
1293 cat >expected <<\EOF &&
1294 4:Subject: [PATCH] subject
1296 10:Signed-off-by: example happens to be wrapped here.
1297 11:Signed-off-by: C O Mitter <committer@example.com>
1299 test_cmp expected actual
1302 test_expect_success 'signoff: valid S-o-b paragraph in the middle' '
1303 append_signoff <<\EOF >actual &&
1306 Signed-off-by: my@house
1307 Signed-off-by: your@house
1311 cat >expected <<\EOF &&
1312 4:Subject: [PATCH] subject
1314 9:Signed-off-by: my@house
1315 10:Signed-off-by: your@house
1318 14:Signed-off-by: C O Mitter <committer@example.com>
1320 test_cmp expected actual
1323 test_expect_success 'signoff: the same signoff at the end' '
1324 append_signoff <<\EOF >actual &&
1329 Signed-off-by: C O Mitter <committer@example.com>
1331 cat >expected <<\EOF &&
1332 4:Subject: [PATCH] subject
1335 11:Signed-off-by: C O Mitter <committer@example.com>
1337 test_cmp expected actual
1340 test_expect_success 'signoff: the same signoff at the end, no trailing NL' '
1341 printf "subject\n\nSigned-off-by: C O Mitter <committer@example.com>" |
1342 append_signoff >actual &&
1343 cat >expected <<\EOF &&
1344 4:Subject: [PATCH] subject
1346 9:Signed-off-by: C O Mitter <committer@example.com>
1348 test_cmp expected actual
1351 test_expect_success 'signoff: the same signoff NOT at the end' '
1352 append_signoff <<\EOF >actual &&
1357 Signed-off-by: C O Mitter <committer@example.com>
1358 Signed-off-by: my@house
1360 cat >expected <<\EOF &&
1361 4:Subject: [PATCH] subject
1364 11:Signed-off-by: C O Mitter <committer@example.com>
1365 12:Signed-off-by: my@house
1367 test_cmp expected actual
1370 test_expect_success 'signoff: tolerate garbage in conforming footer' '
1371 append_signoff <<\EOF >actual &&
1378 Signed-off-by: C O Mitter <committer@example.com>
1380 cat >expected <<\EOF &&
1381 4:Subject: [PATCH] subject
1384 13:Signed-off-by: C O Mitter <committer@example.com>
1386 test_cmp expected actual
1389 test_expect_success 'signoff: respect trailer config' '
1390 append_signoff <<\EOF >actual &&
1396 cat >expected <<\EOF &&
1397 4:Subject: [PATCH] subject
1400 12:Signed-off-by: C O Mitter <committer@example.com>
1402 test_cmp expected actual &&
1404 test_config trailer.Myfooter.ifexists add &&
1405 append_signoff <<\EOF >actual &&
1411 cat >expected <<\EOF &&
1412 4:Subject: [PATCH] subject
1414 11:Signed-off-by: C O Mitter <committer@example.com>
1416 test_cmp expected actual
1419 test_expect_success 'signoff: footer begins with non-signoff without @ sign' '
1420 append_signoff <<\EOF >actual &&
1427 Change-id: Ideadbeef
1428 Signed-off-by: C O Mitter <committer@example.com>
1431 cat >expected <<\EOF &&
1432 4:Subject: [PATCH] subject
1435 14:Signed-off-by: C O Mitter <committer@example.com>
1437 test_cmp expected actual
1440 test_expect_success 'format patch ignores color.ui' '
1441 test_unconfig color.ui &&
1442 git format-patch --stdout -1 >expect &&
1443 test_config color.ui always &&
1444 git format-patch --stdout -1 >actual &&
1445 test_cmp expect actual
1448 test_expect_success 'cover letter using branch description (1)' '
1449 git checkout rebuild-1 &&
1450 test_config branch.rebuild-1.description hello &&
1451 git format-patch --stdout --cover-letter master >actual &&
1452 grep hello actual >/dev/null
1455 test_expect_success 'cover letter using branch description (2)' '
1456 git checkout rebuild-1 &&
1457 test_config branch.rebuild-1.description hello &&
1458 git format-patch --stdout --cover-letter rebuild-1~2..rebuild-1 >actual &&
1459 grep hello actual >/dev/null
1462 test_expect_success 'cover letter using branch description (3)' '
1463 git checkout rebuild-1 &&
1464 test_config branch.rebuild-1.description hello &&
1465 git format-patch --stdout --cover-letter ^master rebuild-1 >actual &&
1466 grep hello actual >/dev/null
1469 test_expect_success 'cover letter using branch description (4)' '
1470 git checkout rebuild-1 &&
1471 test_config branch.rebuild-1.description hello &&
1472 git format-patch --stdout --cover-letter master.. >actual &&
1473 grep hello actual >/dev/null
1476 test_expect_success 'cover letter using branch description (5)' '
1477 git checkout rebuild-1 &&
1478 test_config branch.rebuild-1.description hello &&
1479 git format-patch --stdout --cover-letter -2 HEAD >actual &&
1480 grep hello actual >/dev/null
1483 test_expect_success 'cover letter using branch description (6)' '
1484 git checkout rebuild-1 &&
1485 test_config branch.rebuild-1.description hello &&
1486 git format-patch --stdout --cover-letter -2 >actual &&
1487 grep hello actual >/dev/null
1490 test_expect_success 'cover letter with nothing' '
1491 git format-patch --stdout --cover-letter >actual &&
1492 test_line_count = 0 actual
1495 test_expect_success 'cover letter auto' '
1497 test_when_finished "rm -rf tmp;
1498 git config --unset format.coverletter" &&
1500 git config format.coverletter auto &&
1501 git format-patch -o tmp -1 >list &&
1502 test_line_count = 1 list &&
1503 git format-patch -o tmp -2 >list &&
1504 test_line_count = 3 list
1507 test_expect_success 'cover letter auto user override' '
1509 test_when_finished "rm -rf tmp;
1510 git config --unset format.coverletter" &&
1512 git config format.coverletter auto &&
1513 git format-patch -o tmp --cover-letter -1 >list &&
1514 test_line_count = 2 list &&
1515 git format-patch -o tmp --cover-letter -2 >list &&
1516 test_line_count = 3 list &&
1517 git format-patch -o tmp --no-cover-letter -1 >list &&
1518 test_line_count = 1 list &&
1519 git format-patch -o tmp --no-cover-letter -2 >list &&
1520 test_line_count = 2 list
1523 test_expect_success 'format-patch --zero-commit' '
1524 git format-patch --zero-commit --stdout v2..v1 >patch2 &&
1525 grep "^From " patch2 | sort | uniq >actual &&
1526 echo "From $_z40 Mon Sep 17 00:00:00 2001" >expect &&
1527 test_cmp expect actual
1530 test_expect_success 'From line has expected format' '
1531 git format-patch --stdout v2..v1 >patch2 &&
1532 grep "^From " patch2 >from &&
1533 grep "^From $_x40 Mon Sep 17 00:00:00 2001$" patch2 >filtered &&
1534 test_cmp from filtered
1537 test_expect_success 'format-patch format.outputDirectory option' '
1538 test_config format.outputDirectory patches &&
1540 git format-patch master..side &&
1541 test $(git rev-list master..side | wc -l) -eq $(ls patches | wc -l)
1544 test_expect_success 'format-patch -o overrides format.outputDirectory' '
1545 test_config format.outputDirectory patches &&
1546 rm -fr patches patchset &&
1547 git format-patch master..side -o patchset &&
1548 test_path_is_missing patches &&
1549 test_path_is_dir patchset
1552 test_expect_success 'format-patch --base' '
1553 git checkout side &&
1554 git format-patch --stdout --base=HEAD~3 -1 | tail -n 7 >actual &&
1556 echo "base-commit: $(git rev-parse HEAD~3)" >>expected &&
1557 echo "prerequisite-patch-id: $(git show --patch HEAD~2 | git patch-id --stable | awk "{print \$1}")" >>expected &&
1558 echo "prerequisite-patch-id: $(git show --patch HEAD~1 | git patch-id --stable | awk "{print \$1}")" >>expected &&
1559 signature >> expected &&
1560 test_cmp expected actual
1563 test_expect_success 'format-patch --base errors out when base commit is in revision list' '
1564 test_must_fail git format-patch --base=HEAD -2 &&
1565 test_must_fail git format-patch --base=HEAD~1 -2 &&
1566 git format-patch --stdout --base=HEAD~2 -2 >patch &&
1567 grep "^base-commit:" patch >actual &&
1568 echo "base-commit: $(git rev-parse HEAD~2)" >expected &&
1569 test_cmp expected actual
1572 test_expect_success 'format-patch --base errors out when base commit is not ancestor of revision list' '
1573 # For history as below:
1575 # ---Q---P---Z---Y---*---X
1579 # If "format-patch Z..X" is given, P and Z can not be specified as the base commit
1580 git checkout -b topic1 master &&
1581 git rev-parse HEAD >commit-id-base &&
1583 git rev-parse HEAD >commit-id-P &&
1585 git rev-parse HEAD >commit-id-Z &&
1587 git checkout -b topic2 master &&
1591 test_must_fail git format-patch --base=$(cat commit-id-P) -3 &&
1592 test_must_fail git format-patch --base=$(cat commit-id-Z) -3 &&
1593 git format-patch --stdout --base=$(cat commit-id-base) -3 >patch &&
1594 grep "^base-commit:" patch >actual &&
1595 echo "base-commit: $(cat commit-id-base)" >expected &&
1596 test_cmp expected actual
1599 test_expect_success 'format-patch --base=auto' '
1600 git checkout -b upstream master &&
1601 git checkout -b local upstream &&
1602 git branch --set-upstream-to=upstream &&
1605 git format-patch --stdout --base=auto -2 >patch &&
1606 grep "^base-commit:" patch >actual &&
1607 echo "base-commit: $(git rev-parse upstream)" >expected &&
1608 test_cmp expected actual
1611 test_expect_success 'format-patch errors out when history involves criss-cross' '
1612 # setup criss-cross history
1620 git checkout master &&
1622 git checkout -b xb master &&
1624 git checkout -b xc master &&
1626 git checkout -b xbc xb -- &&
1628 git checkout -b xcb xc -- &&
1629 git branch --set-upstream-to=xbc &&
1635 test_must_fail git format-patch --base=auto -1
1638 test_expect_success 'format-patch format.useAutoBaseoption' '
1639 test_when_finished "git config --unset format.useAutoBase" &&
1640 git checkout local &&
1641 git config format.useAutoBase true &&
1642 git format-patch --stdout -1 >patch &&
1643 grep "^base-commit:" patch >actual &&
1644 echo "base-commit: $(git rev-parse upstream)" >expected &&
1645 test_cmp expected actual
1648 test_expect_success 'format-patch --base overrides format.useAutoBase' '
1649 test_when_finished "git config --unset format.useAutoBase" &&
1650 git config format.useAutoBase true &&
1651 git format-patch --stdout --base=HEAD~1 -1 >patch &&
1652 grep "^base-commit:" patch >actual &&
1653 echo "base-commit: $(git rev-parse HEAD~1)" >expected &&
1654 test_cmp expected actual
1657 test_expect_success 'format-patch --base with --attach' '
1658 git format-patch --attach=mimemime --stdout --base=HEAD~ -1 >patch &&
1659 sed -n -e "/^base-commit:/s/.*/1/p" -e "/^---*mimemime--$/s/.*/2/p" \
1661 test_write_lines 1 2 >expect &&
1662 test_cmp expect actual
1664 test_expect_success 'format-patch --attach cover-letter only is non-multipart' '
1665 test_when_finished "rm -fr patches" &&
1666 git format-patch -o patches --cover-letter --attach=mimemime --base=HEAD~ -1 &&
1667 ! egrep "^--+mimemime" patches/0000*.patch &&
1668 egrep "^--+mimemime$" patches/0001*.patch >output &&
1669 test_line_count = 2 output &&
1670 egrep "^--+mimemime--$" patches/0001*.patch >output &&
1671 test_line_count = 1 output
1674 test_expect_success 'format-patch --pretty=mboxrd' '
1676 cat >msg <<-INPUT_END &&
1677 mboxrd should escape the body
1679 From could trip up a loose mbox parser
1680 >From extra escape for reversibility
1681 >>From extra escape for reversibility 2
1682 from lower case not escaped
1683 Fromm bad speling not escaped
1684 From with leading space not escaped
1693 cat >expect <<-INPUT_END &&
1694 >From could trip up a loose mbox parser
1695 >>From extra escape for reversibility
1696 >>>From extra escape for reversibility 2
1697 from lower case not escaped
1698 Fromm bad speling not escaped
1699 From with leading space not escaped
1708 C=$(git commit-tree HEAD^^{tree} -p HEAD <msg) &&
1709 git format-patch --pretty=mboxrd --stdout -1 $C~1..$C >patch &&
1710 git grep -h --no-index -A11 \
1711 "^>From could trip up a loose mbox parser" patch >actual &&
1712 test_cmp expect actual